Skip to content

Commit

Permalink
Merge pull request #172 from rock-core/improve_orogen_namespace_error…
Browse files Browse the repository at this point in the history
…_messages

Improve orogen namespace error messages
  • Loading branch information
doudou authored Apr 24, 2018
2 parents 49dc38b + f80cc8f commit 7fc28e4
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 7 deletions.
26 changes: 20 additions & 6 deletions lib/syskit/orogen_namespace.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ def initialize(name)
def register_syskit_model(model)
orogen_name = model.orogen_model.name
prefix = "#{project_name}::"
if !orogen_name.start_with?(prefix)
::Kernel.raise ::ArgumentError, "#{model} does not seem to be part of the #{project_name} project"
unless orogen_name.start_with?(prefix)
::Kernel.raise ::ArgumentError,
"#{model} does not seem to be part of the #{project_name} project"
end

@registered_models[orogen_name[prefix.size..-1].to_sym] = model
Expand All @@ -37,10 +38,14 @@ def method_missing(m, *args, &block)
if args.empty?
return model
else
raise ArgumentError, "expected 0 arguments, got #{args.size}"
::Kernel.raise ::ArgumentError,
"expected 0 arguments, got #{args.size}"
end
end
super
rescue ::NoMethodError => e
::Kernel.raise e, "no task #{m} on #{project_name}, available tasks: "\
"#{@registered_models.keys.map(&:to_s).sort.join(', ')}"
end
end

Expand Down Expand Up @@ -91,6 +96,9 @@ def method_missing(m, *args, &block)
end
end
super
rescue NoMethodError => e
raise e, "#{e.message}, available OroGen projects: "\
"#{@project_namespaces.keys.map(&:to_s).join(", ")}"
end

def register_syskit_model(model)
Expand Down Expand Up @@ -136,11 +144,15 @@ def register_syskit_model_as_constant(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)
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)
if namespace_mod =
OroGenNamespace.register_syskit_model_as_constant(
self, namespace, basename, model)
@registered_constants << [self, namespace_mod, basename]
end
end
Expand All @@ -154,7 +166,9 @@ def self.register_syskit_model_as_constant(mod, namespace, basename, model)
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"
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)
Expand Down
37 changes: 36 additions & 1 deletion test/test_orogen_namespace.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,30 @@ module Syskit
assert_same obj, @object.project.Task
end

it "raises if given arguments" do
obj = flexmock(
orogen_model: flexmock(
project: flexmock(name: 'project'),
name: 'project::Task'))
@object.register_syskit_model(obj)
e = assert_raises(ArgumentError) do
@object.project.Task('something')
end
assert_equal "expected 0 arguments, got 1", e.message
end

it "raises if resolving a task that does not exist" do
obj = flexmock(
orogen_model: flexmock(
project: flexmock(name: 'project'),
name: 'project::Task'))
@object.register_syskit_model(obj)
e = assert_raises(NoMethodError) do
@object.project.Other
end
assert_equal "no task Other on project, available tasks: Task", e.message
end

it "allows to resolve a project by its orogen name" do
obj = flexmock(
orogen_model: flexmock(
Expand All @@ -25,6 +49,18 @@ module Syskit
assert_same obj, @object.syskit_model_by_orogen_name('project::Task')
end

it "raises if resolving a project that does not exist" do
obj = flexmock(
orogen_model: flexmock(
project: flexmock(name: 'project'),
name: 'project::Task'))
@object.register_syskit_model(obj)
e = assert_raises(NoMethodError) do
@object.does_not_exist.Other
end
assert_equal "undefined method `does_not_exist' for #{@object}, available OroGen projects: project", e.message
end

it "does not register a model by constant by default" do
obj = flexmock(
orogen_model: flexmock(
Expand Down Expand Up @@ -55,4 +91,3 @@ module Syskit
end
end
end

0 comments on commit 7fc28e4

Please sign in to comment.