Module: Gitlab::Patch::Prependable

Defined in:
lib/gitlab/patch/prependable.rb

Defined Under Namespace

Classes: MultiplePrependedBlocks

Instance Method Summary collapse

Instance Method Details

#class_methodsObject


44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/gitlab/patch/prependable.rb', line 44

def class_methods
  super

  class_methods_module = const_get(:ClassMethods, false)

  if instance_variable_defined?(:@_prepended_class_methods)
    class_methods_module.prepend @_prepended_class_methods
  end

  # Hack to resolve https://gitlab.com/gitlab-org/gitlab/-/issues/23932
  extend class_methods_module if ENV['STATIC_VERIFICATION']
end

#prepend_features(base) ⇒ Object


21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/gitlab/patch/prependable.rb', line 21

def prepend_features(base)
  return false if prepended?(base)

  # Rails 6.1 allows prepending of the modules, but it doesn't
  # work well when both modules extend ActiveSupport::Concern
  # https://github.com/rails/rails/pull/42067
  #
  # Let's keep our own implementation, until the issue is fixed
  Module.instance_method(:prepend_features).bind(self).call(base)

  if const_defined?(:ClassMethods)
    klass_methods = const_get(:ClassMethods, false)
    base.singleton_class.prepend klass_methods
    base.instance_variable_set(:@_prepended_class_methods, klass_methods)
  end

  if instance_variable_defined?(:@_prepended_block)
    base.class_eval(&@_prepended_block)
  end

  true
end

#prepended(base = nil, &block) ⇒ Object


57
58
59
60
61
62
63
64
65
66
# File 'lib/gitlab/patch/prependable.rb', line 57

def prepended(base = nil, &block)
  if base.nil?
    raise MultiplePrependedBlocks if
      instance_variable_defined?(:@_prepended_block)

    @_prepended_block = block
  else
    super
  end
end

#prepended?(base) ⇒ Boolean

Returns:

  • (Boolean)

68
69
70
71
72
# File 'lib/gitlab/patch/prependable.rb', line 68

def prepended?(base)
  index = base.ancestors.index(base)

  base.ancestors[0...index].index(self)
end