module Syskit::OroGenNamespace

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)

Public Class Methods

extend_object(m) click to toggle source
Calls superclass method
# 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) click to toggle source
# 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

Public Instance Methods

clear() click to toggle source
# 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
method_missing(m, *args, &block) click to toggle source
Calls superclass method
# 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
register_syskit_model(model) click to toggle source
# 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) click to toggle source

@api private

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

@return [Boolean] true if the model could be registered and false otherwise

# 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() click to toggle source
# 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) click to toggle source
# 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) click to toggle source

Resolve the registered syskit model that has the given orogen name

# 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_names_from_orogen_name(orogen_name) click to toggle source

@api private

Translates an orogen task context model name into the syskit equivalent

@return [(String,String)] the namespace and class names

# 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