Module: Syskit::OroGenNamespace
- Included in:
- OroGen
- Defined in:
- lib/syskit/orogen_namespace.rb
Overview
Implementation of the model access as available through the OroGen toplevel constant
Assuming a test project that has a test::Task component, one can access it through OroGen.test.Task
It replaces the now-deprecated access through constants (OroGen::Test::Task)
Defined Under Namespace
Classes: ProjectNamespace
Class Method Summary collapse
- .extend_object(m) ⇒ Object
- .register_syskit_model_as_constant(mod, namespace, basename, model) ⇒ Object
Instance Method Summary collapse
- #clear ⇒ Object
- #method_missing(m, *args, &block) ⇒ Object
- #register_syskit_model(model) ⇒ Object
-
#register_syskit_model_as_constant(model) ⇒ Boolean
private
Registers the given syskit model on the class hierarchy, using the (camelized) orogen name as a basis.
- #registered_model_name_prefix ⇒ Object
- #respond_to_missing?(m, include_private = false) ⇒ Boolean
-
#syskit_model_by_orogen_name(name) ⇒ Object
Resolve the registered syskit model that has the given orogen name.
- #syskit_model_constant_registration=(value) ⇒ Boolean
- #syskit_model_constant_registration? ⇒ Boolean
- #syskit_model_toplevel_constant_registration=(value) ⇒ Boolean
- #syskit_model_toplevel_constant_registration? ⇒ Boolean
-
#syskit_names_from_orogen_name(orogen_name) ⇒ (String,String)
private
Translates an orogen task context model name into the syskit equivalent.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(m, *args, &block) ⇒ Object
90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/syskit/orogen_namespace.rb', line 90 def method_missing(m, *args, &block) if project = @project_namespaces[m] if args.empty? return project else raise ArgumentError, "expected 0 arguments, got #{args.size}" end end super rescue NoMethodError => e raise e, "#{e.}, available OroGen projects: "\ "#{@project_namespaces.keys.map(&:to_s).join(", ")}" end |
Class Method Details
.extend_object(m) ⇒ Object
55 56 57 58 59 |
# File 'lib/syskit/orogen_namespace.rb', line 55 def self.extend_object(m) super m.instance_variable_set :@registered_constants, Set.new m.clear end |
.register_syskit_model_as_constant(mod, namespace, basename, model) ⇒ Object
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/syskit/orogen_namespace.rb', line 160 def self.register_syskit_model_as_constant(mod, namespace, basename, model) namespace = if mod.const_defined_here?(namespace) mod.const_get(namespace) else mod.const_set(namespace, Module.new) end if namespace.const_defined_here?(basename) Syskit::TaskContext.warn "there is already a constant with the name" \ "#{namespace.name}::#{basename}, I am not registering the model" \ "for #{model.orogen_model.name} there" false else namespace.const_set(basename, model) namespace end end |
Instance Method Details
#clear ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/syskit/orogen_namespace.rb', line 61 def clear @registered_constants.delete_if do |root, namespace, name| begin namespace.send(:remove_const, name) rescue NameError end true end @project_namespaces = Hash.new @registered_models = Hash.new end |
#register_syskit_model(model) ⇒ Object
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/syskit/orogen_namespace.rb', line 104 def register_syskit_model(model) if syskit_model_constant_registration? register_syskit_model_as_constant(model) end project_name = model.orogen_model.name.split("::").first if !project_name raise ArgumentError, "cannot register a project with no name" end project_ns = (@project_namespaces[project_name.to_sym] ||= ProjectNamespace.new(project_name)) project_ns.register_syskit_model(model) @registered_models[model.orogen_model.name] = model registered_model_name_prefix + model.orogen_model.name.split("::").join(".") end |
#register_syskit_model_as_constant(model) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Registers the given syskit model on the class hierarchy, using the (camelized) orogen name as a basis
If there is a constant clash, the model will not be registered but its #name method will return the “right” value enclosed in <>
otherwise
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'lib/syskit/orogen_namespace.rb', line 142 def register_syskit_model_as_constant(model) orogen_model = model.orogen_model namespace, basename = syskit_names_from_orogen_name(orogen_model.name) if syskit_model_toplevel_constant_registration? if namespace_mod = OroGenNamespace.register_syskit_model_as_constant( Object, namespace, basename, model) @registered_constants << [Object, namespace_mod, basename] end end if namespace_mod = OroGenNamespace.register_syskit_model_as_constant( self, namespace, basename, model) @registered_constants << [self, namespace_mod, basename] end end |
#registered_model_name_prefix ⇒ Object
81 82 83 |
# File 'lib/syskit/orogen_namespace.rb', line 81 def registered_model_name_prefix @registered_model_name_prefix ||= "#{name || to_s}." end |
#respond_to_missing?(m, include_private = false) ⇒ Boolean
86 87 88 |
# File 'lib/syskit/orogen_namespace.rb', line 86 def respond_to_missing?(m, include_private = false) @project_namespaces.has_key?(m) end |
#syskit_model_by_orogen_name(name) ⇒ Object
Resolve the registered syskit model that has the given orogen name
74 75 76 77 78 79 |
# File 'lib/syskit/orogen_namespace.rb', line 74 def syskit_model_by_orogen_name(name) if model = @registered_models[name] model else raise ArgumentError, "#{name} is not registered on #{self}" end end |
#syskit_model_constant_registration=(value) ⇒ Boolean
52 |
# File 'lib/syskit/orogen_namespace.rb', line 52 attr_predicate :syskit_model_constant_registration?, true |
#syskit_model_constant_registration? ⇒ Boolean
52 |
# File 'lib/syskit/orogen_namespace.rb', line 52 attr_predicate :syskit_model_constant_registration?, true |
#syskit_model_toplevel_constant_registration=(value) ⇒ Boolean
53 |
# File 'lib/syskit/orogen_namespace.rb', line 53 attr_predicate :syskit_model_toplevel_constant_registration?, true |
#syskit_model_toplevel_constant_registration? ⇒ Boolean
53 |
# File 'lib/syskit/orogen_namespace.rb', line 53 attr_predicate :syskit_model_toplevel_constant_registration?, true |
#syskit_names_from_orogen_name(orogen_name) ⇒ (String,String)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Translates an orogen task context model name into the syskit equivalent
127 128 129 130 |
# File 'lib/syskit/orogen_namespace.rb', line 127 def syskit_names_from_orogen_name(orogen_name) namespace, basename = orogen_name.split '::' return namespace.camelcase(:upper), basename.camelcase(:upper) end |