Class: Scopa::Base

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Attributes, ActiveModel::Model, ActiveModel::Validations
Defined in:
lib/scopa/base.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(scope: nil, **params) ⇒ Base

Returns a new instance of Base.



63
64
65
66
# File 'lib/scopa/base.rb', line 63

def initialize(scope: nil, **params)
  @scope = scope
  super(**params)
end

Instance Attribute Details

#scopeObject (readonly)

Returns the value of attribute scope.



61
62
63
# File 'lib/scopa/base.rb', line 61

def scope
  @scope
end

Class Method Details

.call(scope: nil, **params) ⇒ Object



56
57
58
# File 'lib/scopa/base.rb', line 56

def call(scope: nil, **params)
  new(scope: scope, **params).call
end

.filter(name, if: nil, &block) ⇒ Object



48
49
50
# File 'lib/scopa/base.rb', line 48

def filter(name, if: nil, &block)
  self._filters = _filters + [Filter.new(name, condition: binding.local_variable_get(:if), block: block)]
end

.inherited(subclass) ⇒ Object



17
18
19
20
21
# File 'lib/scopa/base.rb', line 17

def inherited(subclass)
  super
  subclass._filters = _filters.dup
  subclass._parameters = _parameters.dup
end

.model(klass = nil) ⇒ Object



23
24
25
26
27
28
29
# File 'lib/scopa/base.rb', line 23

def model(klass = nil)
  if klass
    self._model = klass
  else
    _model
  end
end

.on_invalid(behavior) ⇒ Object



52
53
54
# File 'lib/scopa/base.rb', line 52

def on_invalid(behavior)
  self._on_invalid = behavior
end

.parameter(name, type = nil, default: nil, optional: false) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/scopa/base.rb', line 31

def parameter(name, type = nil, default: nil, optional: false)
  _parameters[name] = { default: default, optional: optional }

  if default.respond_to?(:call)
    attribute name, type
    define_method(name) do
      value = super()
      return value unless value.nil?
      instance_exec(&self.class._parameters[name][:default])
    end
  else
    attribute name, type, default: default
  end

  validates name, presence: true unless optional
end

Instance Method Details

#callObject



68
69
70
71
72
73
74
75
76
# File 'lib/scopa/base.rb', line 68

def call
  return handle_invalid unless valid?

  instrument do
    _filters.reduce(base_scope) do |relation, filter|
      apply_filter(filter, relation)
    end
  end
end