I’m currently developing a framework that basically executes another application, e.g. rails within the context of another ruby program. My initial attempt was simply to boot the app like this:
def load_app!
# Load the rails application
require './config/application'
# Initialize the rails application
@app = App::Application.initialize!
end
Problem here, is that the framework’s requires conflict with the loaded application so the initialize! call never works although it would in a normal ruby program.
So my question is, if anyone knows a method to basically scope this calls into a unit that behaves like a blank RVM environment. So basically a behavior like this:
require 'json'
puts JSON.generate({:name => "test"})
blank_environment do
puts JSON.generate({:name => "test"})
#=> uninitialized constant JSON
require 'json'
puts JSON.generate({:name => "test"})
end
It’s not done with undefining or unloading the currently loaded constants because I don’t know all of them because I’m using gems that have other dependencies again.
So is there a cool way? Or any other way to handle this?
UPDATE:
Just came across an idea. Why is ruby’s require method always requiring for the global scope? Wouldn’t it be a very nice feature to actually scope the loaded modules under the the current module?
module ScopeA
require 'json' #> adds support for ScopeA::JSON
# due to normal ruby scoping everything can be called like normal in here
JSON.parse("something")
end
# JSON should not be available here
module ScopeB
require 'yaml'
YAML.parse("something") # but no JSON, of course
end
Doesn’t something like this exist? include already has to know the constants…
Thanks in advance!
Well, after some more research it really doesn’t seem possible the way I need it.
I now implemented a basic version using distributed ruby, which doesn’t quite satisfy me:
If anyone comes up with a better approach, it’s highly appreciated!