lib/blueprints/root_namespace.rb in blueprints-0.3.4 vs lib/blueprints/root_namespace.rb in blueprints-0.4.0
- old
+ new
@@ -1,41 +1,51 @@
module Blueprints
+ # Defines a root namespace that is used when no other namespace is. Apart from functionality in namespace it also allows
+ # building blueprints/namespaces by name. Is also used for copying instance variables between blueprints/contexts/global
+ # context.
class RootNamespace < Namespace
attr_reader :context, :plans
attr_accessor :executed_plans
-
+
def initialize
@executed_plans = Set.new
@global_executed_plans = Set.new
- @global_context = Module.new
super ''
end
+ # Loads all instance variables from global context to current one.
def setup
- @context = YAML.load(@global_context)
+ @context = Blueprints::Context.new
+ YAML.load(@global_variables).each { |name, value| @context.instance_variable_set(name, value) }
@executed_plans = @global_executed_plans.clone
end
+ # Copies all instance variables from current context to another one.
def copy_ivars(to)
@context.instance_variables.each do |iv|
to.instance_variable_set(iv, @context.instance_variable_get(iv))
end
end
+ # Sets up global context and executes prebuilt blueprints against it.
def prebuild(plans)
- @context = @global_context
+ @context = Blueprints::Context.new
@global_scenarios = build(*plans) if plans
@global_executed_plans = @executed_plans
- @global_context = YAML.dump(@global_context)
+
+ @global_variables = YAML.dump(@context.instance_variables.each_with_object({}) {|iv, hash| hash[iv] = @context.instance_variable_get(iv) })
end
+ # Builds blueprints that are passed against current context.
def build(*names)
+ @context.options = names.extract_options!
names.map {|name| self[name].build}
end
+ # Sets instance variable in current context to passed value.
def add_variable(name, value)
- name = "@#{name}" unless name.to_s[0, 1] == "@"
+ name = "@#{name}" unless name.to_s[0, 1] == "@"
@context.instance_variable_set(name, value) unless @context.instance_variable_get(name)
end
@@root = RootNamespace.new
end