Class: Pinkman::Serializer::Scope

Inherits:
Object
  • Object
show all
Defined in:
lib/pinkman/serializer/scope.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hash) ⇒ Scope

Returns a new instance of Scope.



7
8
9
10
11
12
13
# File 'lib/pinkman/serializer/scope.rb', line 7

def initialize hash
  if hash.is_a?(Hash)
    self.serializer = hash[:serializer]
    self.name = hash[:name]
  end
  self
end

Instance Attribute Details

#accessObject

Returns the value of attribute access.



5
6
7
# File 'lib/pinkman/serializer/scope.rb', line 5

def access
  @access
end

#assoc_scopesObject

Returns the value of attribute assoc_scopes.



5
6
7
# File 'lib/pinkman/serializer/scope.rb', line 5

def assoc_scopes
  @assoc_scopes
end

#nameObject

Returns the value of attribute name.



5
6
7
# File 'lib/pinkman/serializer/scope.rb', line 5

def name
  @name
end

#readObject

Returns the value of attribute read.



5
6
7
# File 'lib/pinkman/serializer/scope.rb', line 5

def read
  @read
end

#serializerObject

Returns the value of attribute serializer.



5
6
7
# File 'lib/pinkman/serializer/scope.rb', line 5

def serializer
  @serializer
end

#writeObject

Returns the value of attribute write.



5
6
7
# File 'lib/pinkman/serializer/scope.rb', line 5

def write
  @write
end

Instance Method Details

#access_actions(*args) ⇒ Object



89
90
91
92
93
# File 'lib/pinkman/serializer/scope.rb', line 89

def access_actions *args
  self.access = args
  self.access = [] unless args.first
  access
end

#associationsObject



40
41
42
# File 'lib/pinkman/serializer/scope.rb', line 40

def associations
  read.select{ |attribute| attribute_is_association?(attribute) }
end

#associations_inclusionObject



95
96
97
# File 'lib/pinkman/serializer/scope.rb', line 95

def associations_inclusion
  @associations_inclusion ||= []
end

#associations_inclusion=(val) ⇒ Object



99
100
101
# File 'lib/pinkman/serializer/scope.rb', line 99

def associations_inclusion= val
  @associations_inclusion = val
end

#attribute_assoc_scope(attribute) ⇒ Object



176
177
178
179
180
181
182
183
184
# File 'lib/pinkman/serializer/scope.rb', line 176

def attribute_assoc_scope(attribute)
  assoc_serializer = get_associated_serializer(attribute)
  if assoc_serializer
    assoc_serializer.scope(name.to_sym) 
  else
    binding.pry
    raise ArgumentError, "#{serializer}.#{name}: association named - #{attribute} - found but I can't find its serializer."
  end
end

#attribute_has_nested_associated?(attribute) ⇒ Boolean

given that a attribute is a association, and the associated serializer has same scope defined, checks if a nested association is present

Returns:

  • (Boolean)


189
190
191
192
193
194
195
# File 'lib/pinkman/serializer/scope.rb', line 189

def attribute_has_nested_associated?(attribute)
  attribute = attribute.to_s
  if attribute_is_association?(attribute)
    assoc_scope = attribute_assoc_scope(attribute)
    assoc_scope && assoc_scope.associations.any? && assoc_scope.serializer.model != serializer.model
  end
end

#attribute_inclusion_clause(attribute) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/pinkman/serializer/scope.rb', line 145

def attribute_inclusion_clause attribute
  if attribute_has_nested_associated?(attribute)
    a = []
    assoc_scope = attribute_assoc_scope(attribute)
    assoc_scope.associations.each do |assoc_attribute|
      a << assoc_scope.attribute_inclusion_clause(assoc_attribute)
    end
    { attribute.to_sym => a }
  else
    attribute.to_sym
  end
end

#attribute_is_association?(attribute) ⇒ Boolean

Returns:

  • (Boolean)


141
142
143
# File 'lib/pinkman/serializer/scope.rb', line 141

def attribute_is_association?(attribute)
  attribute.to_s.in?(reflections.keys.map(&:to_s))
end

#attribute_is_in_db?(attribute) ⇒ Boolean

Returns:

  • (Boolean)


137
138
139
# File 'lib/pinkman/serializer/scope.rb', line 137

def attribute_is_in_db?(attribute)
  attribute.to_s.in?(serializer.model.column_names)
end

#can_accessObject



127
128
129
# File 'lib/pinkman/serializer/scope.rb', line 127

def can_access
  access
end

#can_access?(action) ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/pinkman/serializer/scope.rb', line 115

def can_access? action
  access.include?(:all) or access.include?(action.to_sym)
end

#can_readObject



119
120
121
# File 'lib/pinkman/serializer/scope.rb', line 119

def can_read
  read + read_ghost
end

#can_read?(attribute) ⇒ Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/pinkman/serializer/scope.rb', line 107

def can_read? attribute
  read.include?(:all) or read.include?(attribute.to_sym) or attribute.to_sym == :error or attribute.to_sym == :errors or read_ghost.include?(attribute.to_sym)
end

#can_writeObject



123
124
125
# File 'lib/pinkman/serializer/scope.rb', line 123

def can_write
  write
end

#can_write?(attribute) ⇒ Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/pinkman/serializer/scope.rb', line 111

def can_write? attribute
  (write.include?(:all) or write.include?(attribute.to_sym)) and (serializer.model.column_names.include?(attribute.to_s) or (serializer.model.instance_methods.include?("#{attribute.to_s}=".to_sym) and write.include?(attribute.to_sym)))
end

#fieldsObject



44
45
46
# File 'lib/pinkman/serializer/scope.rb', line 44

def fields
  read.select{ |attribute| attribute_is_in_db?(attribute) }
end

#get_associated_model(reflection) ⇒ Object



160
161
162
163
164
165
166
# File 'lib/pinkman/serializer/scope.rb', line 160

def get_associated_model(reflection)
  if reflection.options[:polymorphic]
    reflection.klass
  else
    reflection.active_record
  end
end

#get_associated_serializer(attribute) ⇒ Object



168
169
170
171
172
173
174
# File 'lib/pinkman/serializer/scope.rb', line 168

def get_associated_serializer(attribute)
  begin
    get_associated_model(reflections[attribute.to_s]).serializer if attribute_is_association?(attribute.to_s)
  rescue
    raise ArgumentError, "#{serializer}.#{name}: association named - #{attribute} - found but I can't find its serializer."
  end
end

#include_associations(*args) ⇒ Object



103
104
105
# File 'lib/pinkman/serializer/scope.rb', line 103

def include_associations *args
  self.associations_inclusion = args
end

#include_optimizerObject



62
63
64
65
66
67
# File 'lib/pinkman/serializer/scope.rb', line 62

def include_optimizer
  associations.each do |attribute|
    including << attribute_inclusion_clause(attribute)
  end
  including
end

#includingObject



73
74
75
# File 'lib/pinkman/serializer/scope.rb', line 73

def including
  @including ||= []
end

#query_optimizerObject



48
49
50
51
# File 'lib/pinkman/serializer/scope.rb', line 48

def query_optimizer 
  select_optimizer
  include_optimizer
end

#read_attributes(*args) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/pinkman/serializer/scope.rb', line 23

def read_attributes *args
  read_attrs = []
  assoc_scopes = {}
  args.each do |field|
    if field.is_a?(Hash)
     assoc_scopes.merge!(field)
     read_attrs = read_attrs + field.keys if field.any?
    else
     read_attrs << field
    end
  end
  self.read = read_attrs
  self.assoc_scopes = assoc_scopes
  query_optimizer
  read
end

#read_ghostObject



15
16
17
# File 'lib/pinkman/serializer/scope.rb', line 15

def read_ghost
  @read_ghost || []
end

#read_ghost=(value) ⇒ Object



19
20
21
# File 'lib/pinkman/serializer/scope.rb', line 19

def read_ghost= value
  @read_ghost = value
end

#read_ghost_attributes(*args) ⇒ Object



77
78
79
80
81
# File 'lib/pinkman/serializer/scope.rb', line 77

def read_ghost_attributes *args
  self.read_ghost = args
  self.read_ghost = [] unless args.first
  read_ghost
end

#reflectionsObject

private



133
134
135
# File 'lib/pinkman/serializer/scope.rb', line 133

def reflections
  serializer.reflections
end

#select_optimizerObject



53
54
55
56
57
58
59
60
# File 'lib/pinkman/serializer/scope.rb', line 53

def select_optimizer
  unless :all.in?(read.map { |read_attr| begin read_attr.to_sym rescue read_attr end})
    fields.each do |attribute|
      selecting << "#{serializer.table_name}.#{attribute}"
    end
  end
  selecting
end

#selectingObject



69
70
71
# File 'lib/pinkman/serializer/scope.rb', line 69

def selecting
  @selecting ||= []
end

#write_attributes(*args) ⇒ Object



83
84
85
86
87
# File 'lib/pinkman/serializer/scope.rb', line 83

def write_attributes *args
  self.write = args
  self.write = [] unless args.first
  write
end