active_force 0.7.1 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +107 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +24 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.mailmap +3 -0
  6. data/CHANGELOG.md +115 -42
  7. data/CODEOWNERS +2 -0
  8. data/Gemfile +0 -1
  9. data/README.md +100 -21
  10. data/active_force.gemspec +11 -4
  11. data/lib/active_force/active_query.rb +107 -6
  12. data/lib/active_force/association/association.rb +47 -3
  13. data/lib/active_force/association/belongs_to_association.rb +25 -11
  14. data/lib/active_force/association/eager_load_projection_builder.rb +9 -3
  15. data/lib/active_force/association/has_many_association.rb +19 -19
  16. data/lib/active_force/association/has_one_association.rb +30 -0
  17. data/lib/active_force/association/relation_model_builder.rb +1 -1
  18. data/lib/active_force/association.rb +6 -4
  19. data/lib/active_force/{attribute.rb → field.rb} +3 -3
  20. data/lib/active_force/mapping.rb +6 -32
  21. data/lib/active_force/query.rb +21 -2
  22. data/lib/active_force/sobject.rb +74 -28
  23. data/lib/active_force/version.rb +3 -1
  24. data/lib/active_force.rb +2 -0
  25. data/lib/active_model/type/salesforce/multipicklist.rb +29 -0
  26. data/lib/active_model/type/salesforce/percent.rb +22 -0
  27. data/lib/generators/active_force/model/model_generator.rb +32 -21
  28. data/lib/generators/active_force/model/templates/model.rb.erb +3 -1
  29. data/spec/active_force/active_query_spec.rb +200 -8
  30. data/spec/active_force/association/relation_model_builder_spec.rb +22 -0
  31. data/spec/active_force/association_spec.rb +252 -9
  32. data/spec/active_force/field_spec.rb +34 -0
  33. data/spec/active_force/query_spec.rb +26 -0
  34. data/spec/active_force/sobject/includes_spec.rb +10 -10
  35. data/spec/active_force/sobject_spec.rb +221 -14
  36. data/spec/fixtures/sobject/single_sobject_hash.yml +1 -1
  37. data/spec/spec_helper.rb +5 -2
  38. data/spec/support/bangwhiz.rb +7 -0
  39. data/spec/support/restforce_factories.rb +1 -1
  40. data/spec/support/sobjects.rb +17 -1
  41. data/spec/support/whizbang.rb +2 -2
  42. metadata +64 -26
  43. data/lib/active_attr/dirty.rb +0 -24
  44. data/spec/active_force/attribute_spec.rb +0 -27
@@ -25,10 +25,10 @@ describe ActiveForce::SObject do
25
25
  expect(sobject.boolean).to be_an_instance_of TrueClass
26
26
  expect(sobject.checkbox).to be_an_instance_of FalseClass
27
27
  expect(sobject.date).to be_an_instance_of Date
28
- expect(sobject.datetime).to be_an_instance_of DateTime
28
+ expect(sobject.datetime).to be_an_instance_of Time
29
29
  expect(sobject.percent).to be_an_instance_of Float
30
30
  expect(sobject.text).to be_an_instance_of String
31
- expect(sobject.picklist_multiselect).to be_an_instance_of String
31
+ expect(sobject.picklist_multiselect).to be_an_instance_of Array
32
32
  end
33
33
  end
34
34
 
@@ -65,15 +65,60 @@ describe ActiveForce::SObject do
65
65
  end
66
66
  end
67
67
 
68
- context 'as: :multi_picklist' do
68
+ describe 'having a default value' do
69
+ subject { Bangwhiz }
70
+
71
+ context 'when using the default value' do
72
+ let(:instantiation_attributes) { {name: 'some name'} }
73
+ let(:percent) { 50.0 }
74
+
75
+ it 'sends percent to salesforce' do
76
+ expect(client).to receive(:create!)
77
+ .with(anything, hash_including('Percent_Label' => percent))
78
+ subject.create(**instantiation_attributes)
79
+ end
80
+
81
+ it 'sets percent field upon object instantiation' do
82
+ expect(subject.new(**instantiation_attributes)[:percent]).to eq(percent)
83
+ end
84
+ end
85
+
86
+ context 'when overriding a default value' do
87
+ let(:instantiation_attributes) { {name: 'some name', percent: percent} }
88
+ let(:percent) { 25.0 }
89
+
90
+ it 'sends percent to salesforce' do
91
+ expect(client).to receive(:create!)
92
+ .with(anything, hash_including('Percent_Label' => percent))
93
+ subject.create(**instantiation_attributes)
94
+ end
95
+
96
+ it 'sets percent field upon object instantiation' do
97
+ expect(subject.new(**instantiation_attributes)[:percent]).to eq(percent)
98
+ end
99
+ end
100
+ end
101
+
102
+ context 'as: :multipicklist' do
69
103
  before do
70
104
  class IceCream < ActiveForce::SObject
71
- field :flavors, as: :multi_picklist
105
+ field :flavors, as: :multipicklist
72
106
  end
73
- sundae.changed_attributes.clear
107
+ sundae.clear_changes_information
74
108
  sundae.flavors = %w(chocolate vanilla strawberry)
75
109
  end
76
110
 
111
+ context 'mutation of multipicklist' do
112
+ let(:sundae) { IceCream.new }
113
+
114
+ before { sundae.clear_changes_information }
115
+
116
+ it 'detects mutation' do
117
+ sundae.flavors.delete('chocolate')
118
+ expect(sundae.flavors_changed?).to be true
119
+ end
120
+ end
121
+
77
122
  context 'on create' do
78
123
  let(:sundae) { IceCream.new }
79
124
  it 'formats the picklist values' do
@@ -93,6 +138,25 @@ describe ActiveForce::SObject do
93
138
  end
94
139
  end
95
140
 
141
+ describe '.describe' do
142
+ subject { Whizbang.describe }
143
+
144
+ let(:describe_response) { { 'fields' => [] } }
145
+
146
+ before do
147
+ allow(client).to receive(:describe).and_return(describe_response)
148
+ end
149
+
150
+ it 'passes table_name to sfdc_client.describe' do
151
+ subject
152
+ expect(client).to have_received(:describe).with(Whizbang.table_name)
153
+ end
154
+
155
+ it 'returns response from describe' do
156
+ expect(subject).to eq(describe_response)
157
+ end
158
+ end
159
+
96
160
  describe "CRUD" do
97
161
  let(:instance){ Whizbang.new(id: '1') }
98
162
 
@@ -140,12 +204,12 @@ describe ActiveForce::SObject do
140
204
  end
141
205
 
142
206
  describe 'and with a ClientError' do
143
- let(:faraday_error){ Faraday::Error::ClientError.new('Some String') }
207
+ let(:faraday_error){ Faraday::ClientError.new('Some String') }
144
208
 
145
209
  before{ expect(client).to receive(:update!).and_raise(faraday_error) }
146
210
 
147
211
  it 'raises an error' do
148
- expect{ instance.update!( text: 'some text', boolean: false ) }.to raise_error(Faraday::Error::ClientError)
212
+ expect{ instance.update!( text: 'some text', boolean: false ) }.to raise_error(Faraday::ClientError)
149
213
  end
150
214
  end
151
215
  end
@@ -198,12 +262,12 @@ describe ActiveForce::SObject do
198
262
  end
199
263
 
200
264
  describe 'and with a ClientError' do
201
- let(:faraday_error){ Faraday::Error::ClientError.new('Some String') }
265
+ let(:faraday_error){ Faraday::ClientError.new('Some String') }
202
266
 
203
267
  before{ expect(client).to receive(:create!).and_raise(faraday_error) }
204
268
 
205
269
  it 'raises an error' do
206
- expect{ instance.create! }.to raise_error(Faraday::Error::ClientError)
270
+ expect{ instance.create! }.to raise_error(Faraday::ClientError)
207
271
  end
208
272
  end
209
273
  end
@@ -226,7 +290,9 @@ describe ActiveForce::SObject do
226
290
 
227
291
  describe 'self.create' do
228
292
  before do
229
- expect(client).to receive(:create!).with(Whizbang.table_name, 'Text_Label' => 'some text', 'Updated_From__c'=>'Rails').and_return('id')
293
+ expect(client).to receive(:create!)
294
+ .with(Whizbang.table_name, { 'Text_Label' => 'some text', 'Updated_From__c' => 'Rails' })
295
+ .and_return('id')
230
296
  end
231
297
 
232
298
  it 'should create a new instance' do
@@ -256,6 +322,103 @@ describe ActiveForce::SObject do
256
322
  end
257
323
  end
258
324
 
325
+ describe "#find_by!" do
326
+ it "queries the client, with the SFDC field names and correctly enclosed values" do
327
+ expect(client).to receive(:query).with("SELECT #{Whizbang.fields.join ', '} FROM Whizbang__c WHERE (Id = 123) AND (Text_Label = 'foo') LIMIT 1").and_return([Restforce::Mash.new(Id: 123, text: 'foo')])
328
+ Whizbang.find_by! id: 123, text: "foo"
329
+ end
330
+ it "raises if nothing found" do
331
+ expect(client).to receive(:query).with("SELECT #{Whizbang.fields.join ', '} FROM Whizbang__c WHERE (Id = 123) AND (Text_Label = 'foo') LIMIT 1")
332
+ expect { Whizbang.find_by! id: 123, text: "foo" }.to raise_error(ActiveForce::RecordNotFound)
333
+ end
334
+ end
335
+
336
+ describe '.find!' do
337
+ let(:id) { 'abc123' }
338
+
339
+ before do
340
+ allow(client).to receive(:query)
341
+ end
342
+
343
+ it 'returns found record' do
344
+ query = "SELECT #{Whizbang.fields.join ', '} FROM Whizbang__c WHERE (Id = '#{id}') LIMIT 1"
345
+ expected = Restforce::Mash.new(Id: id)
346
+ allow(client).to receive(:query).with(query).and_return([expected])
347
+ actual = Whizbang.find!(id)
348
+ expect(actual.id).to eq(expected.Id)
349
+ end
350
+
351
+ it 'raises RecordNotFound if nothing found' do
352
+ expect { Whizbang.find!(id) }
353
+ .to raise_error(ActiveForce::RecordNotFound, "Couldn't find #{Whizbang.table_name} with id #{id}")
354
+ end
355
+ end
356
+
357
+ describe '#pluck' do
358
+ let(:record_attributes) { [] }
359
+
360
+ before do
361
+ collection = build_restforce_collection(record_attributes.map { |a| build_restforce_sobject(a) })
362
+ allow(client).to receive(:query).and_return(collection)
363
+ end
364
+
365
+ it 'returns empty array if no records returned from query' do
366
+ expect(Whizbang.pluck).to eq([])
367
+ end
368
+
369
+ it 'works with another query' do
370
+ expected = 'SELECT Id, Text_Label FROM Whizbang__c WHERE (Checkbox_Label = true)'
371
+ Whizbang.where(checkbox: true).pluck(:id, :text)
372
+ expect(client).to have_received(:query).with(expected)
373
+ end
374
+
375
+ context 'when given no fields' do
376
+ it 'queries for all fields' do
377
+ expected = "SELECT #{Whizbang.fields.join ', '} FROM Whizbang__c"
378
+ Whizbang.pluck
379
+ expect(client).to have_received(:query).with(expected)
380
+ end
381
+ end
382
+
383
+ context 'when given one field' do
384
+ let(:ids) { ['a', 'b', 1] }
385
+ let(:record_attributes) { ids.map { |v| { 'Id' => v } } }
386
+
387
+ it 'queries for only that field' do
388
+ expected = 'SELECT Id FROM Whizbang__c'
389
+ Whizbang.pluck(:id)
390
+ expect(client).to have_received(:query).with(expected)
391
+ end
392
+
393
+ it 'returns an array of casted values for that field' do
394
+ expect(Whizbang.pluck(:id)).to match_array(ids.map(&:to_s))
395
+ end
396
+ end
397
+
398
+ context 'when given more than one field' do
399
+ let(:record_attributes) do
400
+ [
401
+ { 'Text_Label' => 'test1', 'Date_Label' => '2023-01-01' },
402
+ { 'Text_Label' => 'test2', 'Date_Label' => '2023-01-02' }
403
+ ]
404
+ end
405
+
406
+ it 'queries for only those fields' do
407
+ expected = 'SELECT Text_Label, Date_Label FROM Whizbang__c'
408
+ Whizbang.pluck(:text, :date)
409
+ expect(client).to have_received(:query).with(expected)
410
+ end
411
+
412
+ it 'returns an array of arrays of casted values in the correct order' do
413
+ expected = [
414
+ ['test1', Date.new(2023, 1, 1)],
415
+ ['test2', Date.new(2023, 1, 2)]
416
+ ]
417
+ expect(Whizbang.pluck(:text, :date)).to match_array(expected)
418
+ end
419
+ end
420
+ end
421
+
259
422
  describe '#reload' do
260
423
  let(:client) do
261
424
  double("sfdc_client", query: [Restforce::Mash.new(Id: 1, Name: 'Jeff')])
@@ -314,7 +477,7 @@ describe ActiveForce::SObject do
314
477
  let(:instance){ Whizbang.new }
315
478
 
316
479
  before do
317
- allow(instance).to receive(:create!).and_raise(Faraday::Error::ClientError.new(double))
480
+ allow(instance).to receive(:create!).and_raise(Faraday::ClientError.new(double))
318
481
  end
319
482
 
320
483
  it 'catches and logs the error' do
@@ -323,6 +486,22 @@ describe ActiveForce::SObject do
323
486
  end
324
487
  end
325
488
 
489
+ describe 'to_json' do
490
+ let(:instance) { Whizbang.new }
491
+
492
+ it 'responds to' do
493
+ expect(instance).to respond_to(:to_json)
494
+ end
495
+ end
496
+
497
+ describe 'as_json' do
498
+ let(:instance) { Whizbang.new }
499
+
500
+ it 'responds to' do
501
+ expect(instance).to respond_to(:as_json)
502
+ end
503
+ end
504
+
326
505
  describe ".save!" do
327
506
  let(:instance){ Whizbang.new }
328
507
 
@@ -335,12 +514,12 @@ describe ActiveForce::SObject do
335
514
  end
336
515
 
337
516
  describe 'and with a ClientError' do
338
- let(:faraday_error){ Faraday::Error::ClientError.new('Some String') }
517
+ let(:faraday_error){ Faraday::ClientError.new('Some String') }
339
518
 
340
519
  before{ expect(client).to receive(:create!).and_raise(faraday_error) }
341
520
 
342
521
  it 'raises an error' do
343
- expect{ instance.save! }.to raise_error(Faraday::Error::ClientError)
522
+ expect{ instance.save! }.to raise_error(Faraday::ClientError)
344
523
  end
345
524
  end
346
525
  end
@@ -354,6 +533,34 @@ describe ActiveForce::SObject do
354
533
  end
355
534
  end
356
535
 
536
+ describe '#[]' do
537
+ let(:sobject){ Whizbang.build sobject_hash }
538
+
539
+ it 'allows accessing the attribute values as if the Sobject were a Hash' do
540
+ expect(sobject[:boolean]).to eq sobject.boolean
541
+ expect(sobject[:checkbox]).to eq sobject.checkbox
542
+ expect(sobject[:date]).to eq sobject.date
543
+ expect(sobject[:datetime]).to eq sobject.datetime
544
+ expect(sobject[:percent]).to eq sobject.percent
545
+ expect(sobject[:text]).to eq sobject.text
546
+ expect(sobject[:picklist_multiselect]).to eq sobject.picklist_multiselect
547
+ end
548
+ end
549
+
550
+ describe '#[]=' do
551
+ let(:sobject){ Whizbang.new }
552
+
553
+ it 'allows modifying the attribute values as if the Sobject were a Hash' do
554
+ expect(sobject[:boolean]=false).to eq sobject.boolean
555
+ expect(sobject[:checkbox]=true).to eq sobject.checkbox
556
+ expect(sobject[:datetime]=Time.now).to eq sobject.datetime
557
+ expect(sobject[:percent]=50).to eq sobject.percent
558
+ expect(sobject[:text]='foo-bar').to eq sobject.text
559
+ sobject[:picklist_multiselect]='a;b'
560
+ expect(sobject.picklist_multiselect).to eq ['a', 'b']
561
+ end
562
+ end
563
+
357
564
  describe ".save" do
358
565
  let(:instance){ Whizbang.new }
359
566
 
@@ -366,7 +573,7 @@ describe ActiveForce::SObject do
366
573
  end
367
574
 
368
575
  describe 'and with a ClientError' do
369
- let(:faraday_error){ Faraday::Error::ClientError.new('Some String') }
576
+ let(:faraday_error){ Faraday::ClientError.new('Some String') }
370
577
  before{ expect(client).to receive(:create!).and_raise(faraday_error) }
371
578
  it 'returns false' do
372
579
  expect(instance.save).to eq(false)
@@ -6,7 +6,7 @@ Text_Label: 'Hi there!'
6
6
  Date_Label: '2010-01-01'
7
7
  DateTime_Label: '2011-07-07T00:37:00.000+0000'
8
8
  Picklist_Multiselect_Label: 'four;six'
9
- Percent_Label: 20
9
+ Percent_Label: 21
10
10
  Boolean_Label: true
11
11
 
12
12
  ParentWhizbang__r:
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,8 @@
1
- require "codeclimate-test-reporter"
2
- CodeClimate::TestReporter.start
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter '/vendor'
4
+ add_filter '/spec'
5
+ end
3
6
 
4
7
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
8
  require 'active_force'
@@ -0,0 +1,7 @@
1
+ class Bangwhiz < ActiveForce::SObject
2
+
3
+ field :id, from: 'Id'
4
+ field :name, from: 'Name'
5
+ field :percent, from: 'Percent_Label', as: :percent, default: -> { 50.0 }
6
+
7
+ end
@@ -1,5 +1,5 @@
1
1
  module RestforceFactories
2
- def build_restforce_collection(array)
2
+ def build_restforce_collection(array=[])
3
3
  Restforce::Collection.new({ 'records' => array }, nil)
4
4
  end
5
5
 
@@ -15,6 +15,8 @@ class Post < ActiveForce::SObject
15
15
  has_many :reply_comments, model: Comment, scoped_as: ->(post){ where(body: "RE: #{post.title}").order('CreationDate DESC') }
16
16
  has_many :ugly_comments, { model: Comment }
17
17
  has_many :poster_comments, { foreign_key: :poster_id, model: Comment }
18
+ has_one :last_comment, model: Comment, scoped_as: -> { where.not(body: nil).order('CreatedDate DESC') }
19
+ has_one :repeat_comment, model: Comment, scoped_as: ->(post) { where(body: post.title) }
18
20
  end
19
21
  class Territory < ActiveForce::SObject
20
22
  field :quota_id, from: "Quota__c"
@@ -47,6 +49,17 @@ class EnforcedTableName < ActiveForce::SObject
47
49
  self.table_name = 'Forced__c'
48
50
  end
49
51
 
52
+ class HasOneChild < ActiveForce::SObject
53
+ field :has_one_parent_id, from: 'has_one_parent_id__c'
54
+ field :fancy_parent_id, from: 'FancyParentId'
55
+ belongs_to :has_one_parent, foreign_key: :has_one_parent_id
56
+ end
57
+
58
+ class HasOneParent < ActiveForce::SObject
59
+ field :comment
60
+ has_one :has_one_child, model: HasOneChild
61
+ end
62
+
50
63
  module Foo
51
64
  class Bar < ActiveForce::SObject; end
52
65
  class Opportunity < ActiveForce::SObject
@@ -57,7 +70,10 @@ module Foo
57
70
  has_many :opportunities, model: Foo::Opportunity
58
71
  has_many :partner_opportunities, foreign_key: :partner_account_id, model: Foo::Opportunity
59
72
  end
60
- class Lead < ActiveForce::SObject; end
73
+ class Lead < ActiveForce::SObject
74
+ has_one :attachment, model: 'Foo::Attachment'
75
+ has_one :fancy_attachment, model: 'Foo::Attachment', foreign_key: :fancy_lead_id
76
+ end
61
77
  class Attachment < ActiveForce::SObject
62
78
  field :lead_id, from: 'Lead_Id__c'
63
79
  field :fancy_lead_id, from: 'LeadId'
@@ -9,7 +9,7 @@ class Whizbang < ActiveForce::SObject
9
9
  field :boolean, from: 'Boolean_Label', as: :boolean
10
10
  field :percent, from: 'Percent_Label', as: :percent
11
11
  field :estimated_close_date, as: :datetime
12
- field :updated_from, as: :datetime
12
+ field :updated_from, as: :string
13
13
  field :dirty_attribute, as: :boolean
14
14
 
15
15
  before_save :set_as_updated_from_rails
@@ -27,4 +27,4 @@ class Whizbang < ActiveForce::SObject
27
27
  self.dirty_attribute = true
28
28
  end
29
29
 
30
- end
30
+ end
metadata CHANGED
@@ -1,60 +1,60 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_force
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Espinaco
8
8
  - Pablo Oldani
9
9
  - Armando Andini
10
10
  - José Piccioni
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-10-29 00:00:00.000000000 Z
14
+ date: 2023-05-26 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: active_attr
17
+ name: activemodel
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
20
  - - "~>"
21
21
  - !ruby/object:Gem::Version
22
- version: '0.8'
22
+ version: '7.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '0.8'
29
+ version: '7.0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: restforce
31
+ name: activesupport
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
34
  - - "~>"
35
35
  - !ruby/object:Gem::Version
36
- version: '1.4'
36
+ version: '7.0'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: '1.4'
43
+ version: '7.0'
44
44
  - !ruby/object:Gem::Dependency
45
- name: bundler
45
+ name: restforce
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
- - - "~>"
48
+ - - ">="
49
49
  - !ruby/object:Gem::Version
50
- version: '1.3'
51
- type: :development
50
+ version: '5'
51
+ type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
- - - "~>"
55
+ - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: '1.3'
57
+ version: '5'
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
60
  requirement: !ruby/object:Gem::Requirement
@@ -83,6 +83,20 @@ dependencies:
83
83
  - - ">="
84
84
  - !ruby/object:Gem::Version
85
85
  version: '0'
86
+ - !ruby/object:Gem::Dependency
87
+ name: rspec_junit_formatter
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
86
100
  - !ruby/object:Gem::Dependency
87
101
  name: pry
88
102
  requirement: !ruby/object:Gem::Requirement
@@ -97,22 +111,40 @@ dependencies:
97
111
  - - ">="
98
112
  - !ruby/object:Gem::Version
99
113
  version: '0'
114
+ - !ruby/object:Gem::Dependency
115
+ name: simplecov
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
100
128
  description: Use SalesForce as an ActiveModel
101
129
  email: eloyesp@gmail.com
102
130
  executables: []
103
131
  extensions: []
104
132
  extra_rdoc_files: []
105
133
  files:
134
+ - ".circleci/config.yml"
135
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
136
+ - ".github/ISSUE_TEMPLATE/feature_request.md"
106
137
  - ".gitignore"
138
+ - ".mailmap"
107
139
  - ".rspec"
108
140
  - ".travis.yml"
109
141
  - CHANGELOG.md
142
+ - CODEOWNERS
110
143
  - Gemfile
111
144
  - LICENSE.txt
112
145
  - README.md
113
146
  - Rakefile
114
147
  - active_force.gemspec
115
- - lib/active_attr/dirty.rb
116
148
  - lib/active_force.rb
117
149
  - lib/active_force/active_query.rb
118
150
  - lib/active_force/association.rb
@@ -120,22 +152,25 @@ files:
120
152
  - lib/active_force/association/belongs_to_association.rb
121
153
  - lib/active_force/association/eager_load_projection_builder.rb
122
154
  - lib/active_force/association/has_many_association.rb
155
+ - lib/active_force/association/has_one_association.rb
123
156
  - lib/active_force/association/relation_model_builder.rb
124
- - lib/active_force/attribute.rb
157
+ - lib/active_force/field.rb
125
158
  - lib/active_force/mapping.rb
126
159
  - lib/active_force/query.rb
127
160
  - lib/active_force/sobject.rb
128
161
  - lib/active_force/standard_types.rb
129
162
  - lib/active_force/table.rb
130
163
  - lib/active_force/version.rb
164
+ - lib/active_model/type/salesforce/multipicklist.rb
165
+ - lib/active_model/type/salesforce/percent.rb
131
166
  - lib/generators/active_force/model/USAGE
132
167
  - lib/generators/active_force/model/model_generator.rb
133
168
  - lib/generators/active_force/model/templates/model.rb.erb
134
169
  - spec/active_force/active_query_spec.rb
135
170
  - spec/active_force/association/relation_model_builder_spec.rb
136
171
  - spec/active_force/association_spec.rb
137
- - spec/active_force/attribute_spec.rb
138
172
  - spec/active_force/callbacks_spec.rb
173
+ - spec/active_force/field_spec.rb
139
174
  - spec/active_force/mapping_spec.rb
140
175
  - spec/active_force/query_spec.rb
141
176
  - spec/active_force/sobject/includes_spec.rb
@@ -145,15 +180,19 @@ files:
145
180
  - spec/active_force_spec.rb
146
181
  - spec/fixtures/sobject/single_sobject_hash.yml
147
182
  - spec/spec_helper.rb
183
+ - spec/support/bangwhiz.rb
148
184
  - spec/support/fixture_helpers.rb
149
185
  - spec/support/restforce_factories.rb
150
186
  - spec/support/sobjects.rb
151
187
  - spec/support/whizbang.rb
152
- homepage: https://github.com/ionia-corporation/active_force
188
+ homepage: https://github.com/Beyond-Finance/active_force#readme
153
189
  licenses:
154
190
  - MIT
155
- metadata: {}
156
- post_install_message:
191
+ metadata:
192
+ bug_tracker_uri: https://github.com/Beyond-Finance/active_force/issues
193
+ changelog_uri: https://github.com/Beyond-Finance/active_force/blob/main/CHANGELOG.md
194
+ source_code_uri: https://github.com/Beyond-Finance/active_force
195
+ post_install_message:
157
196
  rdoc_options: []
158
197
  require_paths:
159
198
  - lib
@@ -168,17 +207,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
207
  - !ruby/object:Gem::Version
169
208
  version: '0'
170
209
  requirements: []
171
- rubyforge_project:
172
- rubygems_version: 2.2.2
173
- signing_key:
210
+ rubygems_version: 3.4.6
211
+ signing_key:
174
212
  specification_version: 4
175
213
  summary: Help you implement models persisting on Sales Force within Rails using RESTForce
176
214
  test_files:
177
215
  - spec/active_force/active_query_spec.rb
178
216
  - spec/active_force/association/relation_model_builder_spec.rb
179
217
  - spec/active_force/association_spec.rb
180
- - spec/active_force/attribute_spec.rb
181
218
  - spec/active_force/callbacks_spec.rb
219
+ - spec/active_force/field_spec.rb
182
220
  - spec/active_force/mapping_spec.rb
183
221
  - spec/active_force/query_spec.rb
184
222
  - spec/active_force/sobject/includes_spec.rb
@@ -188,8 +226,8 @@ test_files:
188
226
  - spec/active_force_spec.rb
189
227
  - spec/fixtures/sobject/single_sobject_hash.yml
190
228
  - spec/spec_helper.rb
229
+ - spec/support/bangwhiz.rb
191
230
  - spec/support/fixture_helpers.rb
192
231
  - spec/support/restforce_factories.rb
193
232
  - spec/support/sobjects.rb
194
233
  - spec/support/whizbang.rb
195
- has_rdoc:
@@ -1,24 +0,0 @@
1
- require 'active_support'
2
- require 'active_model/dirty'
3
- require 'active_attr'
4
-
5
- module ActiveAttr
6
- module Dirty
7
- extend ActiveSupport::Concern
8
- include ActiveModel::Dirty
9
-
10
- module ClassMethods
11
- def attribute!(name, options={})
12
- super(name, options)
13
- define_method("#{name}=") do |value|
14
- send("#{name}_will_change!") unless value == read_attribute(name)
15
- super(value)
16
- end
17
- end
18
- end
19
-
20
- def attributes_and_changes
21
- attributes.select{ |attr, key| changed.include? attr }
22
- end
23
- end
24
- end