deferring 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDI2ZGZlZTRiMjIzMmE3NGUxYjE5N2Y1NThiNDA2ZWJmYzc4NGRhMQ==
4
+ M2Q5NGQyOGY3MTViMzE1ODA4ODgwNzdjZTRmNDhjMjMyYWI4MDc3OA==
5
5
  data.tar.gz: !binary |-
6
- MWE1NDE1MTI2YTY0OGI5YzQyMTk3NDg1NjczNGNhMDE5YThhMWE2ZQ==
6
+ MDQ5ZTg4NTUyYmM3ZjgyNDM0NzI5ZTdhY2ZiMzMwMzkxM2M4NmM0Yw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZjYzZmRmNGY2YmNmMDM3YjZmM2ViZDliYWZhN2IyOThiNDIxYjE0ZDhkZmI2
10
- ZGY5ZWJiYjhiMjMxZDM4ZjlhNmM3N2Y0NWI2NWQ2Zjc1ZmEwMjA2M2E1YmI5
11
- MWUwMmNkMmI4YzQxNGNhNTJmNzk3MDNlOTlkYzAwYTM2M2QxOGU=
9
+ ZmI0YTk4ZDIwOGZhNjFlMWViOTc3NGRmODhmYmE0YmI0NzgxZWM3ODI1ZGZl
10
+ YmEwODQ3YjRlN2JlYzJmODY2MTI3Y2FhZjM5MTlkMjBjNWI4YjYwNDkxZTBh
11
+ MTdhM2QxYzdhMjk1MGViM2JkOTQ0N2ZjZWRmYTlkYjAxNjVhOTU=
12
12
  data.tar.gz: !binary |-
13
- MGVjYzM2MjA3NDFkYjU2NjA0ZDU0Yzk2ZWYzMmVjYzdhNTA0MTYwZTcwZWNj
14
- YTY5MmJiNmQ1M2U2MGI4MDk1M2I4YTU3ZmE1NGU0MGI2NWZlMWU4MGFiMzI3
15
- Yzc3MWFlZDVmZjIzODVkZDU3YTY5MWM4NjNlNGMyMTc1NGYyNzQ=
13
+ ZGE0NGE5ODhiYmQwMzMzMjg0ZmZmOTc0YTVlMjJmMjQxZGZkMjExYTJlNGI2
14
+ ZmEzZmZhMmM0MGFmNjk4OTk2NmVkNzM0ZmUwMmUwMTEyZjc4ODhhZTM3MzRk
15
+ MjU4NDdhNTE1OTIzYTVmMjE2NmNjYWFkOTIzOTNjMDQ4YWIyMTk=
@@ -62,24 +62,26 @@ module Deferring
62
62
  attributes = attributes.with_indifferent_access
63
63
 
64
64
  if attributes['id'].blank?
65
- if !reject_new_record?(attributes)
66
- send(:"#{association_name}").build(attributes.except(*unassignable_keys))
65
+ if !deferred_reject_new_record?(attributes)
66
+ send(:"#{association_name}").build(attributes.except(*deferred_unassignable_keys))
67
67
  end
68
68
 
69
69
  elsif existing_record = send(:"#{association_name}").detect { |record| record.id.to_s == attributes['id'].to_s }
70
- if !call_reject_if(attributes)
70
+ if !deferred_call_reject_if(attributes)
71
71
 
72
- existing_record.attributes = attributes.except(*unassignable_keys)
72
+ existing_record.attributes = attributes.except(*deferred_unassignable_keys)
73
73
 
74
74
  # TODO: Implement value_to_boolean code from rails for checking _destroy field.
75
75
  if attributes['_destroy'] == '1' && options[:allow_destroy]
76
- # remove from existing records
76
+ # remove from existing records and mark for destruction upon
77
+ # saving
77
78
  send(:"#{association_name}").delete(existing_record)
79
+ existing_record.mark_for_destruction
78
80
  end
79
81
  end
80
82
 
81
83
  else # new record referenced by id
82
- if !call_reject_if(attributes)
84
+ if !deferred_call_reject_if(attributes)
83
85
  klass = self.class.reflect_on_association(:"#{association_name}").klass
84
86
 
85
87
  attribute_ids = attributes_collection.map { |a| a['id'] || a[:id] }.compact
@@ -96,12 +98,12 @@ module Deferring
96
98
  # Determines if a new record should be build by checking for
97
99
  # has_destroy_flag? or if a <tt>:reject_if</tt> proc exists for this
98
100
  # association and evaluates to +true+.
99
- define_method :reject_new_record? do |attributes|
101
+ define_method :deferred_reject_new_record? do |attributes|
100
102
  # TODO: Implement value_to_boolean code from rails for checking _destroy field.
101
- attributes['_destroy'] == '1' || call_reject_if(attributes)
103
+ attributes['_destroy'] == '1' || deferred_call_reject_if(attributes)
102
104
  end
103
105
 
104
- define_method :call_reject_if do |attributes|
106
+ define_method :deferred_call_reject_if do |attributes|
105
107
  return false if attributes['_destroy'] == '1'
106
108
  case callback = reject_if
107
109
  when Symbol
@@ -111,8 +113,8 @@ module Deferring
111
113
  end
112
114
  end
113
115
 
114
- define_method :unassignable_keys do
115
- %w(_destroy)
116
+ define_method :deferred_unassignable_keys do
117
+ %w(_destroy id)
116
118
  end
117
119
 
118
120
  generate_find_or_create_deferred_association_method
@@ -43,7 +43,7 @@ module Deferring
43
43
 
44
44
  # Delegates methods from Ruby's Array module to the object in the deferred
45
45
  # association.
46
- delegate :[]=, :[], :clear, :reject, :reject!, :flatten, :flatten!, :sort!,
46
+ delegate :[]=, :[], :clear, :select!, :reject!, :flatten, :flatten!, :sort!,
47
47
  :sort_by!, :empty?, :size, :length, to: :objects
48
48
 
49
49
  # Delegates Ruby's Enumerable#find method to the original association.
@@ -90,13 +90,7 @@ module Deferring
90
90
  @original_objects = original_association.to_a.clone
91
91
  objects_loaded!
92
92
 
93
- pending_deletes.each do |record|
94
- run_deferring_callbacks(:unlink, record) do
95
- if inverse_name && record.class.reflect_on_association(inverse_name)
96
- record.send(:"#{inverse_name}=", nil)
97
- end
98
- end
99
- end
93
+ pending_deletes.each { |record| run_deferring_callbacks(:unlink, record) }
100
94
  pending_creates.each { |record| run_deferring_callbacks(:link, record) }
101
95
 
102
96
  @objects
@@ -126,13 +120,7 @@ module Deferring
126
120
 
127
121
  def delete(records)
128
122
  Array(records).flatten.uniq.each do |record|
129
- run_deferring_callbacks(:unlink, record) do
130
- if inverse_name && record.class.reflect_on_association(inverse_name)
131
- record.send(:"#{inverse_name}=", nil)
132
- end
133
-
134
- objects.delete(record)
135
- end
123
+ run_deferring_callbacks(:unlink, record) { objects.delete(record) }
136
124
  end
137
125
  self
138
126
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Deferring
4
- VERSION = '0.0.9'
4
+ VERSION = '0.0.10'
5
5
  end
@@ -102,24 +102,31 @@ RSpec.describe 'deferred has_many associations' do
102
102
 
103
103
  describe 'accepts_nested_attributes' do
104
104
  it 'sets associated records when posting an array of hashes' do
105
- p = Person.first
106
- p.issues << printer_issue << db_issue << sandwich_issue
107
- p.save
108
-
109
- # Destroy db and sandwich issues. Keep printer issue and create a new one.
110
105
  p = Person.first
111
106
  p.attributes = {
112
107
  issues_attributes: [
113
108
  { id: printer_issue.id },
114
109
  { subject: 'Kapow!' },
115
- { id: sandwich_issue.id, _destroy: '1' },
116
- { id: db_issue.id, _destroy: '1' }
117
110
  ]
118
111
  }
119
112
  expect(p.issues.length).to eq(2)
120
113
  expect(p.issue_ids).to eq([printer_issue.id, nil])
121
114
 
122
- expect{ p.save! }.to change{ Person.first.issues.size }.from(3).to(2)
115
+ expect{ p.save! }.to change{ Person.first.issues.size }.from(0).to(2)
116
+ end
117
+
118
+ it 'sets associated records when posting a hash of hashes' do
119
+ p = Person.first
120
+ p.attributes = {
121
+ issues_attributes: {
122
+ first: { subject: 'Kapow!' },
123
+ second: { id: printer_issue.id }
124
+ }
125
+ }
126
+ expect(p.issues.length).to eq(2)
127
+ expect(p.issue_ids).to eq([nil, printer_issue.id])
128
+
129
+ expect{ p.save! }.to change{ Person.first.issues.size }.from(0).to(2)
123
130
  end
124
131
 
125
132
  it 'updates associated records' do
@@ -137,26 +144,54 @@ RSpec.describe 'deferred has_many associations' do
137
144
  expect(Issue.find(printer_issue.id).subject).to eq 'Toner low!'
138
145
  end
139
146
 
140
- it 'sets associated records when posting a hash of hashes' do
147
+ it 'sets the belongs_to association of the associated record' do
148
+ expect(printer_issue.person).to be_nil
149
+ bob.attributes = {
150
+ issues_attributes: [{ id: printer_issue.id }]
151
+ }
152
+ expect(bob.issues.first.person).to eq bob
153
+ end
154
+
155
+ it 'destroys an associated record when :allow_destroy is true' do
156
+ p = Person.first
157
+ p.issues << printer_issue << db_issue << sandwich_issue
158
+ p.save
159
+
160
+ # Destroy db and sandwich issues. Keep printer issue and create a new one.
141
161
  p = Person.first
142
162
  p.attributes = {
143
- issues_attributes: {
144
- first: { subject: 'Kapow!' },
145
- second: { id: printer_issue.id }
146
- }
163
+ issues_attributes: [{ id: sandwich_issue.id, _destroy: '1' }]
147
164
  }
165
+
148
166
  expect(p.issues.length).to eq(2)
149
- expect(p.issue_ids).to eq([nil, printer_issue.id])
167
+ expect(p.issue_ids).to eq([printer_issue.id, db_issue.id])
150
168
 
151
- expect{ p.save! }.to change{ Person.first.issues.size }.from(0).to(2)
169
+ expect(p.issues.unlinks.first).to eq(sandwich_issue)
170
+
171
+ expect{ p.save! }.to change{ Issue.count }.from(3).to(2)
152
172
  end
153
173
 
154
- it 'sets the belongs_to association of the associated record' do
155
- expect(printer_issue.person).to be_nil
156
- bob.attributes = {
157
- issues_attributes: [{ id: printer_issue.id }]
174
+ it 'does not destroy an associated record when :allow_destroy is false' do
175
+ Person.deferred_accepts_nested_attributes_for :issues, allow_destroy: false
176
+
177
+ p = Person.first
178
+ p.issues << printer_issue << db_issue << sandwich_issue
179
+ p.save
180
+
181
+ # Destroy db and sandwich issues. Keep printer issue and create a new one.
182
+ p = Person.first
183
+ p.attributes = {
184
+ issues_attributes: [{ id: sandwich_issue.id, _destroy: '1' }]
158
185
  }
159
- expect(bob.issues.first.person).to eq bob
186
+
187
+ expect(p.issues.length).to eq(3)
188
+ expect(p.issue_ids).to eq([printer_issue.id, db_issue.id, sandwich_issue.id])
189
+
190
+ expect(p.issues.unlinks.size).to eq(0)
191
+
192
+ expect{ p.save! }.to_not change{ Issue.count }
193
+
194
+ Person.deferred_accepts_nested_attributes_for :issues, allow_destroy: true
160
195
  end
161
196
  end # accepts_nested_attributes
162
197
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deferring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robin Roestenburg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-08 00:00:00.000000000 Z
11
+ date: 2014-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord