Class: Gitlab::Utils::Override::Extension
- Inherits:
-
Object
- Object
- Gitlab::Utils::Override::Extension
- Defined in:
- lib/gitlab/utils/override.rb
Instance Attribute Summary collapse
-
#subject ⇒ Object
readonly
Returns the value of attribute subject.
Class Method Summary collapse
Instance Method Summary collapse
- #add_class(klass) ⇒ Object
- #add_method_name(method_name, arity = nil) ⇒ Object
-
#initialize(subject) ⇒ Extension
constructor
A new instance of Extension.
- #parents_for(klass) ⇒ Object
- #verify! ⇒ Object
- #verify_method!(klass:, parents:, method_name:, sub_method_arity:) ⇒ Object
- #verify_override?(method_name) ⇒ Boolean
Constructor Details
#initialize(subject) ⇒ Extension
Returns a new instance of Extension.
22 23 24 |
# File 'lib/gitlab/utils/override.rb', line 22 def initialize(subject) @subject = subject end |
Instance Attribute Details
#subject ⇒ Object (readonly)
Returns the value of attribute subject.
20 21 22 |
# File 'lib/gitlab/utils/override.rb', line 20 def subject @subject end |
Class Method Details
.verify_class!(klass, method_name, arity) ⇒ Object
13 14 15 16 17 18 |
# File 'lib/gitlab/utils/override.rb', line 13 def self.verify_class!(klass, method_name, arity) extension = new(klass) parents = extension.parents_for(klass) extension.verify_method!( klass: klass, parents: parents, method_name: method_name, sub_method_arity: arity) end |
Instance Method Details
#add_class(klass) ⇒ Object
63 64 65 |
# File 'lib/gitlab/utils/override.rb', line 63 def add_class(klass) classes << klass end |
#add_method_name(method_name, arity = nil) ⇒ Object
59 60 61 |
# File 'lib/gitlab/utils/override.rb', line 59 def add_method_name(method_name, arity = nil) method_names[method_name] = arity end |
#parents_for(klass) ⇒ Object
26 27 28 29 |
# File 'lib/gitlab/utils/override.rb', line 26 def parents_for(klass) index = klass.ancestors.index(subject) klass.ancestors.drop(index + 1) end |
#verify! ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/gitlab/utils/override.rb', line 31 def verify! classes.each do |klass| parents = parents_for(klass) method_names.each_pair do |method_name, arity| verify_method!( klass: klass, parents: parents, method_name: method_name, sub_method_arity: arity) end end end |
#verify_method!(klass:, parents:, method_name:, sub_method_arity:) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/gitlab/utils/override.rb', line 45 def verify_method!(klass:, parents:, method_name:, sub_method_arity:) overridden_parent = parents.find do |parent| instance_method_defined?(parent, method_name) end raise NotImplementedError, "#{klass}\##{method_name} doesn't exist!" unless overridden_parent super_method_arity = find_direct_method(overridden_parent, method_name).arity unless arity_compatible?(sub_method_arity, super_method_arity) raise NotImplementedError, "#{subject}\##{method_name} has arity of #{sub_method_arity}, but #{overridden_parent}\##{method_name} has arity of #{super_method_arity}" end end |
#verify_override?(method_name) ⇒ Boolean
67 68 69 |
# File 'lib/gitlab/utils/override.rb', line 67 def verify_override?(method_name) method_names.has_key?(method_name) end |