Class: Grape::Entity::Exposure::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/grape_entity/exposure/base.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attribute, options, conditions) ⇒ Base

Returns a new instance of Base.



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/grape_entity/exposure/base.rb', line 13

def initialize(attribute, options, conditions)
  @attribute = attribute.try(:to_sym)
  @options = options
  key = options[:as] || attribute
  @key = key.respond_to?(:to_sym) ? key.to_sym : key
  @is_safe = options[:safe]
  @default_value = options[:default]
  @for_merge = options[:merge]
  @attr_path_proc = options[:attr_path]
  @documentation = options[:documentation]
  @override = options[:override]
  @conditions = conditions
end

Instance Attribute Details

#attributeObject (readonly)

Returns the value of attribute attribute.



7
8
9
# File 'lib/grape_entity/exposure/base.rb', line 7

def attribute
  @attribute
end

#conditionsObject (readonly)

Returns the value of attribute conditions.



7
8
9
# File 'lib/grape_entity/exposure/base.rb', line 7

def conditions
  @conditions
end

#documentationObject (readonly)

Returns the value of attribute documentation.



7
8
9
# File 'lib/grape_entity/exposure/base.rb', line 7

def documentation
  @documentation
end

#for_mergeObject (readonly)

Returns the value of attribute for_merge.



7
8
9
# File 'lib/grape_entity/exposure/base.rb', line 7

def for_merge
  @for_merge
end

#is_safeObject (readonly)

Returns the value of attribute is_safe.



7
8
9
# File 'lib/grape_entity/exposure/base.rb', line 7

def is_safe
  @is_safe
end

#overrideObject (readonly)

Returns the value of attribute override.



7
8
9
# File 'lib/grape_entity/exposure/base.rb', line 7

def override
  @override
end

Class Method Details

.new(attribute, options, conditions, *args, &block) ⇒ Object



9
10
11
# File 'lib/grape_entity/exposure/base.rb', line 9

def self.new(attribute, options, conditions, *args, &block)
  super(attribute, options, conditions).tap { |e| e.setup(*args, &block) }
end

Instance Method Details

#==(other) ⇒ Object



35
36
37
38
39
40
# File 'lib/grape_entity/exposure/base.rb', line 35

def ==(other)
  self.class == other.class &&
    @attribute == other.attribute &&
    @options == other.options &&
    @conditions == other.conditions
end

#attr_path(entity, options) ⇒ Object



108
109
110
111
112
113
114
# File 'lib/grape_entity/exposure/base.rb', line 108

def attr_path(entity, options)
  if @attr_path_proc
    entity.exec_with_object(options, &@attr_path_proc)
  else
    @key
  end
end

#conditional?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/grape_entity/exposure/base.rb', line 96

def conditional?
  !@conditions.empty?
end

#conditions_met?(entity, options) ⇒ Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/grape_entity/exposure/base.rb', line 100

def conditions_met?(entity, options)
  @conditions.all? { |condition| condition.met? entity, options }
end

#deep_complex_nesting?(entity) ⇒ Boolean

if we have any nesting exposures with the same name.

Returns:

  • (Boolean)


49
50
51
# File 'lib/grape_entity/exposure/base.rb', line 49

def deep_complex_nesting?(entity) # rubocop:disable Lint/UnusedMethodArgument
  false
end

#dup(&block) ⇒ Object



27
28
29
# File 'lib/grape_entity/exposure/base.rb', line 27

def dup(&block)
  self.class.new(*dup_args, &block)
end

#dup_argsObject



31
32
33
# File 'lib/grape_entity/exposure/base.rb', line 31

def dup_args
  [@attribute, @options, @conditions.map(&:dup)]
end

#key(entity = nil) ⇒ Object



116
117
118
# File 'lib/grape_entity/exposure/base.rb', line 116

def key(entity = nil)
  @key.respond_to?(:call) ? entity.exec_with_object(@options, &@key) : @key
end

#nesting?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/grape_entity/exposure/base.rb', line 44

def nesting?
  false
end

#override?Boolean

Returns:

  • (Boolean)


125
126
127
# File 'lib/grape_entity/exposure/base.rb', line 125

def override?
  @override
end

#serializable_value(entity, options) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/grape_entity/exposure/base.rb', line 69

def serializable_value(entity, options)
  partial_output = valid_value(entity, options)

  if partial_output.respond_to?(:serializable_hash)
    partial_output.serializable_hash
  elsif partial_output.is_a?(Array) && partial_output.all? { |o| o.respond_to?(:serializable_hash) }
    partial_output.map(&:serializable_hash)
  elsif partial_output.is_a?(Hash)
    partial_output.each do |key, value|
      partial_output[key] = value.serializable_hash if value.respond_to?(:serializable_hash)
    end
  else
    partial_output
  end
end

#setupObject



42
# File 'lib/grape_entity/exposure/base.rb', line 42

def setup; end

#should_expose?(entity, options) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/grape_entity/exposure/base.rb', line 104

def should_expose?(entity, options)
  should_return_key?(options) && conditions_met?(entity, options)
end

#should_return_key?(options) ⇒ Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/grape_entity/exposure/base.rb', line 92

def should_return_key?(options)
  options.should_return_key?(@key)
end

#valid?(entity) ⇒ Boolean

Returns:

  • (Boolean)


53
54
55
56
57
58
59
60
61
62
63
# File 'lib/grape_entity/exposure/base.rb', line 53

def valid?(entity)
  is_delegatable = entity.delegator.delegatable?(@attribute) || entity.respond_to?(@attribute, true)
  if @is_safe
    is_delegatable
  else
    is_delegatable || raise(
      NoMethodError,
      "#{entity.class.name} missing attribute `#{@attribute}' on #{entity.object}"
    )
  end
end

#valid_value(entity, options) ⇒ Object



85
86
87
88
89
90
# File 'lib/grape_entity/exposure/base.rb', line 85

def valid_value(entity, options)
  return unless valid?(entity)

  output = value(entity, options)
  output.blank? && @default_value.present? ? @default_value : output
end

#value(_entity, _options) ⇒ Object

Raises:

  • (NotImplementedError)


65
66
67
# File 'lib/grape_entity/exposure/base.rb', line 65

def value(_entity, _options)
  raise NotImplementedError
end

#with_attr_path(entity, options, &block) ⇒ Object



120
121
122
123
# File 'lib/grape_entity/exposure/base.rb', line 120

def with_attr_path(entity, options, &block)
  path_part = attr_path(entity, options)
  options.with_attr_path(path_part, &block)
end