hyper-mesh 1.0.0.lap27 → 1.0.0.lap28

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +6 -2
  4. data/Gemfile +0 -1
  5. data/Rakefile +2 -2
  6. data/hyper-mesh.gemspec +1 -1
  7. data/lib/active_record_base.rb +39 -27
  8. data/lib/hyper-mesh.rb +6 -1
  9. data/lib/hypermesh/version.rb +1 -1
  10. data/lib/object/tap.rb +7 -0
  11. data/lib/reactive_record/active_record/associations.rb +14 -3
  12. data/lib/reactive_record/active_record/base.rb +1 -2
  13. data/lib/reactive_record/active_record/class_methods.rb +120 -67
  14. data/lib/reactive_record/active_record/error.rb +17 -12
  15. data/lib/reactive_record/active_record/errors.rb +374 -0
  16. data/lib/reactive_record/active_record/instance_methods.rb +58 -67
  17. data/lib/reactive_record/active_record/reactive_record/backing_record_inspector.rb +1 -4
  18. data/lib/reactive_record/active_record/reactive_record/base.rb +129 -234
  19. data/lib/reactive_record/active_record/reactive_record/collection.rb +51 -18
  20. data/lib/reactive_record/active_record/reactive_record/column_types.rb +5 -3
  21. data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +6 -4
  22. data/lib/reactive_record/active_record/reactive_record/getters.rb +133 -0
  23. data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +99 -87
  24. data/lib/reactive_record/active_record/reactive_record/lookup_tables.rb +54 -0
  25. data/lib/reactive_record/active_record/reactive_record/operations.rb +2 -1
  26. data/lib/reactive_record/active_record/reactive_record/scoped_collection.rb +1 -1
  27. data/lib/reactive_record/active_record/reactive_record/setters.rb +194 -0
  28. data/lib/reactive_record/active_record/reactive_record/while_loading.rb +4 -5
  29. data/lib/reactive_record/active_record_error.rb +4 -0
  30. data/lib/reactive_record/broadcast.rb +55 -18
  31. data/lib/reactive_record/permissions.rb +5 -4
  32. data/lib/reactive_record/scope_description.rb +14 -6
  33. data/lib/reactive_record/server_data_cache.rb +119 -70
  34. metadata +16 -13
  35. data/lib/reactive_record/active_record/reactive_record/reactive_set_relationship_helpers.rb +0 -189
@@ -1,189 +0,0 @@
1
- module ReactiveRecord
2
- # methods to update aggregrations and relations, called from reactive_set!
3
- class Base
4
- def update_aggregate(attribute, value)
5
- # if attribute is an aggregate then
6
- # match and update all fields in the aggregate from value and return true
7
- # otherwise return false
8
- aggregation = @model.reflect_on_aggregation(attribute)
9
- return false unless aggregation && (aggregation.klass < ActiveRecord::Base)
10
- if value
11
- value_attributes = value.backing_record.attributes
12
- update_mapped_attributes(aggregation) { |attr| value_attributes[attr] }
13
- else
14
- update_mapped_attributes(aggregation) { nil }
15
- end
16
- true
17
- end
18
-
19
- def update_mapped_attributes(aggregation)
20
- # insure the aggregate attr is initialized, clear the virt flag, the caller
21
- # will yield each of the matching attribute values
22
- attr = aggregation.attribute
23
- attributes[attr] ||= aggregation.klass.new if new?
24
- aggregate_record = attributes[attr]
25
- raise 'uninitialized aggregate attribute - should never happen' unless aggregate_record
26
- aggregate_backing_record = aggregate_record.backing_record
27
- aggregate_backing_record.virgin = false
28
- aggregation.mapped_attributes.each do |mapped_attribute|
29
- aggregate_backing_record.update_attribute(mapped_attribute, yield(mapped_attribute))
30
- end
31
- end
32
-
33
- def update_relationships(attr, value)
34
- # update the inverse relationship, and any through relationships
35
- # return either the value, or in the case of updating a collection
36
- # return the new collection after value is overwritten into it.
37
- association = @model.reflect_on_association(attr)
38
- return value unless association
39
- if association.collection?
40
- overwrite_has_many_collection(association, value)
41
- else
42
- update_belongs_to_association(association, value)
43
- value
44
- end
45
- end
46
-
47
- def overwrite_has_many_collection(association, value)
48
- # create a new collection to hold value, shove it in, and return the new collection
49
- # the replace method will take care of updating the inverse belongs_to links as
50
- # the collection is overwritten
51
- Collection.new(association.klass, @ar_instance, association).tap do |collection|
52
- collection.replace(value || [])
53
- end
54
- end
55
-
56
- def update_belongs_to_association(association, value)
57
- # either update update the inverse has_many collection or individual belongs_to
58
- # inverse values
59
- if association.inverse.collection?
60
- update_has_many_through_associations(association, value)
61
- update_inverse_collections(association, value)
62
- else
63
- update_inverse_attribute(association, value)
64
- end
65
- end
66
-
67
- def update_inverse_attribute(association, value)
68
- # when updating the inverse attribute of a belongs_to that is itself a belongs_to
69
- # (i.e. 1-1 relationship) we clear the existing inverse value and then
70
- # write the current record to the new value
71
- current_value = attributes[association.attribute]
72
- inverse_attr = association.inverse.attribute
73
- current_value.attributes[inverse_attr] = nil unless current_value.nil?
74
- return if value.nil?
75
- value.attributes[inverse_attr] = @ar_instance
76
- return if data_loading?
77
- React::State.set_state(value.backing_record, inverse_attr, @ar_instance)
78
- end
79
-
80
- def update_inverse_collections(association, value)
81
- # when updating an inverse attribute of a belongs_to that is a has_many (i.e. a collection)
82
- # we need to first remove the current associated value (if non-nil), then add the new
83
- # value to the collection. If the inverse collection is not yet initialized we do it here.
84
- current_value = attributes[association.attribute]
85
- inverse_attr = association.inverse.attribute
86
- if value.nil?
87
- current_value.attributes[inverse_attr].delete(@ar_instance) unless current_value.nil?
88
- else
89
- value.backing_record.push_onto_collection(@model, association.inverse, @ar_instance)
90
- end
91
- end
92
-
93
- def push_onto_collection(model, association, ar_instance)
94
- attributes[association.attribute] ||= Collection.new(model, @ar_instance, association)
95
- attributes[association.attribute] << ar_instance
96
- end
97
-
98
- def update_has_many_through_associations(association, value)
99
- association.through_associations.each { |ta| update_through_association(ta, value) }
100
- association.source_associations.each { |sa| update_source_association(sa, value) }
101
- end
102
-
103
- def update_through_association(ta, new_belongs_to_value)
104
- # appointment.doctor = doctor_new_value (i.e. through association is changing)
105
- # means appointment.doctor_new_value.patients << appointment.patient
106
- # and we have to appointment.doctor_current_value.patients.delete(appointment.patient)
107
- source_value = attributes[ta.source]
108
- current_belongs_to_value = attributes[ta.inverse.attribute]
109
- return unless source_value
110
- unless current_belongs_to_value.nil? || current_belongs_to_value.attributes[ta.attribute].nil?
111
- current_belongs_to_value.attributes[ta.attribute].delete(source_value)
112
- end
113
- return unless new_belongs_to_value
114
- new_belongs_to_value.attributes[ta.attribute] ||= Collection.new(ta.klass, new_belongs_to_value, ta)
115
- new_belongs_to_value.attributes[ta.attribute] << source_value
116
- end
117
-
118
- def update_source_association(sa, new_source_value)
119
- # appointment.patient = patient_value (i.e. source is changing)
120
- # means appointment.doctor.patients.delete(appointment.patient)
121
- # means appointment.doctor.patients << patient_value
122
- belongs_to_value = attributes[sa.inverse.attribute]
123
- current_source_value = attributes[sa.source]
124
- return unless belongs_to_value
125
- unless belongs_to_value.attributes[sa.attribute].nil? || current_source_value.nil?
126
- belongs_to_value.attributes[sa.attribute].delete(current_source_value)
127
- end
128
- return unless new_source_value
129
- belongs_to_value.attributes[sa.attribute] ||= Collection.new(sa.klass, belongs_to_value, sa)
130
- belongs_to_value.attributes[sa.attribute] << new_source_value
131
- end
132
- end
133
- end
134
-
135
- # def reactive_set!(attribute, value)
136
- # @virgin = false unless data_loading?
137
- # unless @destroyed or (!(attributes[attribute].is_a? DummyValue) and attributes.has_key?(attribute) and attributes[attribute] == value)
138
- # if association = @model.reflect_on_association(attribute)
139
- # if association.collection?
140
- # collection = Collection.new(association.klass, @ar_instance, association)
141
- # collection.replace(value || [])
142
- # value = collection
143
- # else
144
- # inverse_of = association.inverse_of
145
- # inverse_association = association.klass.reflect_on_association(inverse_of)
146
- # if inverse_association.collection?
147
- # if value.nil?
148
- # attributes[attribute].attributes[inverse_of].delete(@ar_instance) unless attributes[attribute].nil?
149
- # elsif value.attributes[inverse_of]
150
- # value.attributes[inverse_of] << @ar_instance
151
- # else
152
- # value.attributes[inverse_of] = Collection.new(@model, value, inverse_association)
153
- # # value.attributes[inverse_of].replace [@ar_instance]
154
- # # why was the above not just the below???? fixed 10/28/2016
155
- # value.attributes[inverse_of] << @ar_instance
156
- # end
157
- # elsif !value.nil?
158
- # attributes[attribute].attributes[inverse_of] = nil unless attributes[attribute].nil?
159
- # value.attributes[inverse_of] = @ar_instance
160
- # React::State.set_state(value.backing_record, inverse_of, @ar_instance) unless data_loading?
161
- # elsif attributes[attribute]
162
- # attributes[attribute].attributes[inverse_of] = nil
163
- # end
164
- # end
165
- # elsif aggregation = @model.reflect_on_aggregation(attribute) and (aggregation.klass < ActiveRecord::Base)
166
- #
167
- # if new?
168
- # attributes[attribute] ||= aggregation.klass.new
169
- # elsif !attributes[attribute]
170
- # raise "uninitialized aggregate attribute - should never happen"
171
- # end
172
- #
173
- # aggregate_record = attributes[attribute].backing_record
174
- # aggregate_record.virgin = false
175
- #
176
- # if value
177
- # value_attributes = value.backing_record.attributes
178
- # aggregation.mapped_attributes.each { |mapped_attribute| aggregate_record.update_attribute(mapped_attribute, value_attributes[mapped_attribute])}
179
- # else
180
- # aggregation.mapped_attributes.each { |mapped_attribute| aggregate_record.update_attribute(mapped_attribute, nil) }
181
- # end
182
- #
183
- # return attributes[attribute]
184
- #
185
- # end
186
- # update_attribute(attribute, value)
187
- # end
188
- # value
189
- # end