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

Instance Method Summary collapse

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.message}, 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

#clearObject



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

Returns:

  • (Boolean)

    true if the model could be registered and false



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_prefixObject



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

Returns:

  • (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

Parameters:

  • (Boolean)

    value

Returns:

  • (Boolean)


52
# File 'lib/syskit/orogen_namespace.rb', line 52

attr_predicate :syskit_model_constant_registration?, true

#syskit_model_constant_registration?Boolean

Returns:

  • (Boolean)


52
# File 'lib/syskit/orogen_namespace.rb', line 52

attr_predicate :syskit_model_constant_registration?, true

#syskit_model_toplevel_constant_registration=(value) ⇒ Boolean

Parameters:

  • (Boolean)

    value

Returns:

  • (Boolean)


53
# File 'lib/syskit/orogen_namespace.rb', line 53

attr_predicate :syskit_model_toplevel_constant_registration?, true

#syskit_model_toplevel_constant_registration?Boolean

Returns:

  • (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

Returns:

  • ((String,String))

    the namespace and class names



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