diff --git a/lib/magic/lookup.rb b/lib/magic/lookup.rb index d815589..0772750 100644 --- a/lib/magic/lookup.rb +++ b/lib/magic/lookup.rb @@ -6,6 +6,8 @@ module Magic module Lookup + autoload :Error, 'magic/lookup/error' + include Memery memoize def for object_class diff --git a/lib/magic/lookup/error.rb b/lib/magic/lookup/error.rb new file mode 100644 index 0000000..c028b4c --- /dev/null +++ b/lib/magic/lookup/error.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Magic + module Lookup + class Error < NameError + def self.for object, lookup_class + default_name = lookup_class.name_for object.class + + new "no #{lookup_class} found for #{object.class}, default name is #{default_name}", + default_name, receiver: object + end + end + end +end diff --git a/sig/magic/lookup/error.rbs b/sig/magic/lookup/error.rbs new file mode 100644 index 0000000..9f2973a --- /dev/null +++ b/sig/magic/lookup/error.rbs @@ -0,0 +1,7 @@ +module Magic + module Lookup + class Error < NameError + def self.for: (any) -> Error + end + end +end diff --git a/spec/magic/lookup/error_spec.rb b/spec/magic/lookup/error_spec.rb new file mode 100644 index 0000000..7d5a2e3 --- /dev/null +++ b/spec/magic/lookup/error_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class Scope + extend Magic::Lookup + + def self.name_for(object_class) = "#{object_class}Scope" +end + +module Magic + module Lookup + RSpec.describe Error do + subject { described_class.new } + + describe '.for', :method do + its([[], Scope]) do + is_expected.to be_instance_of described_class + end + + its([[], Scope]) do + is_expected.to be_a StandardError + end + + its([[], Scope]) do + is_expected.to have_attributes to_s: /no Scope found/, + name: 'ArrayScope', receiver: [] + end + end + end + end +end