summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/gitlab/patch/prependable.rb48
-rw-r--r--spec/lib/gitlab/patch/prependable_spec.rb29
2 files changed, 41 insertions, 36 deletions
diff --git a/lib/gitlab/patch/prependable.rb b/lib/gitlab/patch/prependable.rb
index 45fac0ed4a7..617c6eeacd2 100644
--- a/lib/gitlab/patch/prependable.rb
+++ b/lib/gitlab/patch/prependable.rb
@@ -10,42 +10,29 @@ module Gitlab
end
end
- module MetaConcern
- def extended(base)
- super
- base.instance_variable_set(:@_prepend_dependencies, [])
- end
- end
-
- def self.prepended(base)
- super
- base.singleton_class.prepend MetaConcern
- end
+ def prepend_features(base)
+ return false if prepended?(base)
- def append_features(base)
super
- prepend_features(base)
- end
-
- def prepend_features(base)
- if base.instance_variable_defined?(:@_prepend_dependencies)
- base.instance_variable_get(:@_prepend_dependencies) << self
- false
- else
- return false if prepended?(base)
+ if const_defined?(:ClassMethods)
+ klass_methods = const_get(:ClassMethods)
+ base.singleton_class.prepend klass_methods
+ base.instance_variable_set(:@_prepended_class_methods, klass_methods)
+ end
- @_prepend_dependencies.each { |dep| base.prepend(dep) }
+ if instance_variable_defined?(:@_prepended_block)
+ base.class_eval(&@_prepended_block)
+ end
- super
+ true
+ end
- if const_defined?(:ClassMethods)
- base.singleton_class.prepend const_get(:ClassMethods)
- end
+ def class_methods
+ super
- if instance_variable_defined?(:@_prepended_block)
- base.class_eval(&@_prepended_block)
- end
+ if instance_variable_defined?(:@_prepended_class_methods)
+ const_get(:ClassMethods).prepend @_prepended_class_methods
end
end
@@ -63,8 +50,7 @@ module Gitlab
def prepended?(base)
index = base.ancestors.index(base)
- @_prepend_dependencies.index(self) ||
- base.ancestors[0...index].index(self)
+ base.ancestors[0...index].index(self)
end
end
end
diff --git a/spec/lib/gitlab/patch/prependable_spec.rb b/spec/lib/gitlab/patch/prependable_spec.rb
index b902f174c6d..d33c14e8b15 100644
--- a/spec/lib/gitlab/patch/prependable_spec.rb
+++ b/spec/lib/gitlab/patch/prependable_spec.rb
@@ -71,22 +71,41 @@ describe Gitlab::Patch::Prependable do
subject
- expect(prepended_modules).to eq([[subject, ee], [subject, ce]])
+ expect(prepended_modules).to eq([[ce, ee]])
+ end
+
+ context 'overriding a method' do
+ before do
+ subject.module_eval do
+ def self.class_name
+ 'Custom'
+ end
+
+ def name
+ 'custom'
+ end
+ end
+ end
+
+ it 'returns values from the class' do
+ expect(subject.new.name).to eq('custom')
+ expect(subject.class_name).to eq('Custom')
+ end
end
end
describe 'a class prepending a concern prepending a concern' do
subject { Class.new.prepend(ce) }
- it 'returns values from prepended module ce' do
- expect(subject.new.name).to eq('ce')
- expect(subject.class_name).to eq('CE')
+ it 'returns values from prepended module ee' do
+ expect(subject.new.name).to eq('ee')
+ expect(subject.class_name).to eq('EE')
end
it 'prepends only once' do
subject.prepend(ce)
- expect(prepended_modules).to eq([[subject, ee], [subject, ce]])
+ expect(prepended_modules).to eq([[ce, ee], [subject, ce]])
end
end