Expiremental approach for providing reloading of Grape-based rack applications in dev environment.
It uses Ripper to extract class usage and definitions from code and reloads files and API classes based on dependency map.
Add this line to your application's Gemfile:
gem 'grape-reload'
And then execute:
$ bundle
Or install it yourself as:
$ gem install grape-reload
In your config.ru you use Grape::RackBuilder to mount your apps:
Grape::RackBuilder.setup do
logger Logger.new(STDOUT)
add_source_path File.expand_path('**/*.rb', YOUR_APP_ROOT)
reload_threshold 1 # Reload sources not often one second
force_reloading true # Force reloading for any environment (not just dev), useful for testing
mount 'Your::App', to: '/'
mount 'Your::App1', to: '/app1'
end
run Grape::RackBuilder.boot!.application
Grape::Reload will resolve all class dependencies and load your files in appropriate order, so you don't need to include 'require' or 'require_relative' in your sources.
If you want to monkey-patch class in code, you want to be reloaded, for any reason, you should use
AlreadyDefined.class_eval do
end
instead of
class AlreadyDefined
end
because it confuses dependency resolver
Consider code
require 'some_file' # (declares SomeModule::SomeClass)
here_is_your_code(SomeClass)
Ruby will resolve SomeClass to SomeModule::SomeClass in runtime. Dependency resolver will display an error, because it expects you to use full-qualified class name in this situation. Anyway, it would not raise exception anymore (since e5b58f4)
here_is_your_code(SomeModule::SomeClass)
Avoid declaring constants as follows
class AlreadyDeclaredModule::MyClass
end
use
module AlreadyDeclaredModule
class MyClass
end
end
instead
- It still lacks of good design :(
- MOAR TESTS!!!!111
## TODO
- example Grape application with Grape::Reload
- Spork integration example
- Fork it ( https://github.com/AlexYankee/grape-reload/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request