diff options
author | Lin Jen-Shin <godfat@godfat.org> | 2018-06-04 17:54:50 +0300 |
---|---|---|
committer | Lin Jen-Shin <godfat@godfat.org> | 2018-06-05 08:40:52 +0300 |
commit | f71fc9328c42bb67c0ad209dd6503de57fa2bcf8 (patch) | |
tree | 2df43a56a13bffe1b484c1135d8e4af8387f46f9 /lib/gitlab/utils | |
parent | 9c2961947826442e780285cb551583b09cf6dae9 (diff) |
Also verify if extending would override a class method
Since extending a class means including on the singleton class of the
class, this should now complain this:
``` ruby
module M
extend Gitlab::Utils::Override
override :f
def f
super.succ
end
end
class C
extend M
def self.f
0
end
end
```
It should complain because `C.f` wasn't calling `M#f`.
This should pass verification:
``` ruby
module M
extend Gitlab::Utils::Override
override :f
def f
super.succ
end
end
class B
def self.f
0
end
end
class C < B
extend M
end
```
Because `C.f` would now call `M#f`, and `M#f` does override something.
Diffstat (limited to 'lib/gitlab/utils')
-rw-r--r-- | lib/gitlab/utils/override.rb | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/gitlab/utils/override.rb b/lib/gitlab/utils/override.rb index 8bf6bcb1fe2..7b2a62fed48 100644 --- a/lib/gitlab/utils/override.rb +++ b/lib/gitlab/utils/override.rb @@ -87,18 +87,28 @@ module Gitlab end def included(base = nil) - return super if base.nil? # Rails concern, ignoring it + super + + queue_verification(base) + end + alias_method :prepended, :included + + def extended(mod) super + queue_verification(mod.singleton_class) + end + + def queue_verification(base) + return unless ENV['STATIC_VERIFICATION'] + if base.is_a?(Class) # We could check for Class in `override` # This could be `nil` if `override` was never called Override.extensions[self]&.add_class(base) end end - alias_method :prepended, :included - def self.extensions @extensions ||= {} end |