active_force 0.7.1 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 856379b1407c72d56da2e86be62b2a54af211d85
4
- data.tar.gz: f35e9f84f5278754333157b749df193ce9f60034
2
+ SHA256:
3
+ metadata.gz: 661e75020c19d46986c8556c2e39799831468741b96909bab00f40d3ffb1294c
4
+ data.tar.gz: c2549061250e05f2f145c3129c4f83c1d973b09097c77e03592b68b892f54e02
5
5
  SHA512:
6
- metadata.gz: 15db0f8a8df68c7db8cf3eb8e2ebf5304748807823957b61e2348a90459615a7140b7fdf20753ad832ce7c2a24fb9a76e3df612bbde1b44e780d220f8f0f451c
7
- data.tar.gz: e571dcf6b46d18b2d7fe1927600b7aafccbb5d12506ddaba558dbe3f18373967e5514818542b1d17d7cab455bfc9fea4f474ece36aed8fe768359e52cd14b65a
6
+ metadata.gz: 2bb66f6e4278cc3552200adef1cf4bff72ee01681253b573aa28fb1f8f410bb09a836c043b0b9dc1f1df744167050a03c8ca538f0a1cbc025645ca6ebe90a6ef
7
+ data.tar.gz: e5e52a99e28c971a1fe7e4a7135031bfa15cbeeadb1c782a1252915ba593699bda99b0f1a6f832c673d129cdc10ed2527ecff391144c4db30783af87bd40090b
@@ -0,0 +1,107 @@
1
+ version: 2
2
+
3
+ references:
4
+ default_docker_ruby_executor: &default_docker_ruby_executor
5
+ image: cimg/ruby:2.7.7
6
+ environment:
7
+ BUNDLE_PATH: vendor/bundle
8
+ RAILS_ENV: test
9
+ COVERAGE: true
10
+ TZ: /usr/share/zoneinfo/America/Chicago
11
+ CC_TEST_REPORTER_ID: bd3425becf01f0b46ac11dd33e1e935d65d89f55051c087bfa035e0f89b290a2
12
+
13
+ jobs:
14
+ build:
15
+ working_directory: ~/active_force/active_force_index
16
+ docker:
17
+ - *default_docker_ruby_executor
18
+ steps:
19
+ - checkout
20
+ - restore_cache:
21
+ keys:
22
+ - active_force-{{ checksum "active_force.gemspec" }}
23
+ - active_force-
24
+ - run:
25
+ name: Bundle Install
26
+ command: |
27
+ gem install bundler
28
+ bundle check || bundle install
29
+ - save_cache:
30
+ key: active_force-{{ checksum "active_force.gemspec" }}
31
+ paths:
32
+ - ~/active_force/active_force_index/vendor/bundle
33
+
34
+ rspec-test:
35
+ working_directory: ~/active_force/active_force_index
36
+ parallelism: 1
37
+ docker:
38
+ - *default_docker_ruby_executor
39
+ steps:
40
+ - checkout
41
+ - restore_cache:
42
+ keys:
43
+ - active_force-{{ checksum "active_force.gemspec" }}
44
+ - active_force-
45
+ - run:
46
+ name: Bundle Install
47
+ command: |
48
+ gem install bundler
49
+ bundle check || bundle install
50
+ - save_cache:
51
+ key: active_force-{{ checksum "active_force.gemspec" }}
52
+ paths:
53
+ - ~/active_force/active_force_index/vendor/bundle
54
+ - run:
55
+ name: Install Code Climate Test Reporter
56
+ command: |
57
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
58
+ chmod +x ./cc-test-reporter
59
+ - run:
60
+ name: Run RSpec
61
+ command: |
62
+ mkdir /tmp/test-results
63
+ ./cc-test-reporter before-build
64
+ TESTFILES=$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
65
+ bundle exec rspec $TESTFILES --profile 10 --format RspecJunitFormatter --out /tmp/test-results/rspec.xml --format progress
66
+ - run:
67
+ name: Code Climate Test Coverage
68
+ command: |
69
+ ./cc-test-reporter format-coverage -t simplecov -o "coverage/codeclimate.$CIRCLE_NODE_INDEX.json"
70
+ - persist_to_workspace:
71
+ root: coverage
72
+ paths:
73
+ - codeclimate.*.json
74
+ - store_test_results:
75
+ path: /tmp/test-results
76
+ - store_artifacts:
77
+ path: /tmp/test-results
78
+ destination: test-results
79
+ - store_artifacts:
80
+ path: coverage
81
+ upload-coverage:
82
+ working_directory: ~/active_force/active_force_index
83
+ docker:
84
+ - *default_docker_ruby_executor
85
+ steps:
86
+ - attach_workspace:
87
+ at: ~/active_force/active_force_index
88
+ - run:
89
+ name: Install Code Climate Test Reporter
90
+ command: |
91
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
92
+ chmod +x ./cc-test-reporter
93
+ - run:
94
+ name: Combine and Upload Coverage
95
+ command: |
96
+ ./cc-test-reporter sum-coverage --output - codeclimate.*.json | ./cc-test-reporter upload-coverage --debug --input -
97
+ workflows:
98
+ version: 2
99
+ build_and_test:
100
+ jobs:
101
+ - build
102
+ - rspec-test:
103
+ requires:
104
+ - build
105
+ - upload-coverage:
106
+ requires:
107
+ - rspec-test
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: "[BUG]"
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+ 1. Go to '...'
16
+ 2. Click on '....'
17
+ 3. Scroll down to '....'
18
+ 4. See error
19
+
20
+ **Expected behavior**
21
+ A clear and concise description of what you expected to happen.
22
+
23
+ **Additional context**
24
+ Add any other context about the problem here.
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
data/.mailmap ADDED
@@ -0,0 +1,3 @@
1
+ Armando Andini <armando.andini@hotmail.com>
2
+ Jose Piccioni <josepiccioni@gmail.com> <jackson@jackPc.(none)>
3
+ Pablo Oldani <oldani.pablo@gmail.com>
data/CHANGELOG.md CHANGED
@@ -1,78 +1,151 @@
1
1
  # Changelog
2
2
 
3
3
  ## Not released
4
+ ## 0.15.0
5
+ - Fix model defaults so data is persisted in Salesforce (https://github.com/Beyond-Finance/active_force/pull/55)
6
+ - Add `pluck` query method (https://github.com/Beyond-Finance/active_force/pull/51)
7
+ - Add `#order` method to active query that accepts arguments in several formats ( symbol, string that has raw soql) (https://github.com/Beyond-Finance/active_force/pull/58)
8
+
9
+
10
+ ## 0.14.0
11
+
12
+ - Add `scoped_as` option to `has_one` association (https://github.com/Beyond-Finance/active_force/pull/50)
13
+ - Add `default` to model fields (https://github.com/Beyond-Finance/active_force/pull/49)
14
+ - Allow `nil` datetimes as `:datetime` fields (https://github.com/Beyond-Finance/active_force/pull/52)
15
+
16
+ ## 0.13.2
17
+ - Add `#loaded?` method for ActiveQueries to allow the detection of records loaded in memory or pending to be loaded. (https://github.com/Beyond-Finance/active_force/pull/45)
18
+ - Use attributes' values_for_database (serialize) value instead of using the type casted value to allow more flexibility when creating your own ActiveModel type
19
+
20
+ ## 0.13.1
21
+
22
+ - Fix constructor of `ActiveForce::RecordNotFound` (https://github.com/Beyond-Finance/active_force/pull/44)
23
+ - Add `.to_json` and `.as_json` to `SObject` to allow JSON serialization (https://github.com/Beyond-Finance/active_force/pull/37)
24
+ - Memoize the `ActiveForce::Mapping#mappings` Hash since it is based on the fields and those are generally only set when the class is loaded. Also use `Hash#key` which returns the key for a value rather than `Hash#invert` which creates a new Hash with key/value inverted. (https://github.com/Beyond-Finance/active_force/pull/41)
25
+
26
+ ## 0.13.0
27
+
28
+ - Add `.find!` to `SObject` (https://github.com/Beyond-Finance/active_force/pull/39)
29
+
30
+ ## 0.12.0
31
+
32
+ - Add `.describe` to `SObject` to allow convenient metadata fetching (https://github.com/Beyond-Finance/active_force/pull/36)
33
+
34
+ ## 0.11.4
35
+
36
+ - Properly escape single quote (https://github.com/Beyond-Finance/active_force/pull/29)
37
+ - Fix `Time` value formatting in `.where` (https://github.com/Beyond-Finance/active_force/pull/28)
38
+
39
+ ## 0.11.3
40
+
41
+ - Fix has_one assignment when receiver does not have id (https://github.com/Beyond-Finance/active_force/pull/23)
42
+
43
+ ## 0.11.2
44
+
45
+ - Fix: prevent association methods from running queries when keys do not exist (https://github.com/Beyond-Finance/active_force/pull/20)
46
+
47
+ ## 0.11.1
48
+
49
+ - Fix `datetime` fields of SObjects to use iso(8601) format when sending to SF (https://github.com/Beyond-Finance/active_force/pull/18)
50
+
51
+ ## 0.11.0
52
+
53
+ - Added support for 'or' and 'not' clauses (https://github.com/Beyond-Finance/active_force/pull/13)
54
+ - Added support for the SUM aggregate function (https://github.com/Beyond-Finance/active_force/pull/14)
55
+ - Allow `model` to be passed as a string or a constant (https://github.com/Beyond-Finance/active_force/pull/16)
56
+
57
+ ## 0.10.0
58
+
59
+ - Fix `#where` chaining on `ActiveQuery` (https://github.com/Beyond-Finance/active_force/pull/7)
60
+ - Add `#find_by!` which raises `ActiveForce::RecordNotFound` if nothing is found. (https://github.com/Beyond-Finance/active_force/pull/8)
61
+ - Fix `#includes` to find, build, and set the association. (https://github.com/Beyond-Finance/active_force/pull/12)
62
+
63
+ ## 0.9.1
64
+
65
+ - Fix invalid error class (https://github.com/Beyond-Finance/active_force/pull/6)
66
+
67
+ ## 0.9.0
68
+
69
+ - Add support for Rails 7 and update Restforce dependency to newer version. (https://github.com/Beyond-Finance/active_force/pull/3)
70
+ - Add `has_one` association. (https://github.com/Beyond-Finance/active_force/pull/3)
71
+ - Model generator enhancements (https://github.com/Beyond-Finance/active_force/pull/3):
72
+ - automatically add types to fields
73
+ - sort fields alphabetically
74
+ - add `table_name` to class
75
+ - add optional namespace parameter so generated models can be namespaced
76
+ - Add get/set via `[]` and `[]=` for `SObject` attributes. (https://github.com/Beyond-Finance/active_force/pull/3)
4
77
 
5
78
  ## 0.7.1
6
79
 
7
- * Allow sfdc_client to be set. ([#92][])
80
+ - Allow sfdc_client to be set. ([#92][])
8
81
 
9
82
  ## 0.7.0
10
83
 
11
- * Rails4-style conditional has_many associations ([Dan Olson][])
12
- * Add `#includes` query method to eager load has_many association. ([Dan Olson][])
13
- * Add `#includes` query method to eager load belongs_to association. ([#65][])
14
- * SObject#destroy method.
84
+ - Rails4-style conditional has_many associations ([Dan Olson][])
85
+ - Add `#includes` query method to eager load has_many association. ([Dan Olson][])
86
+ - Add `#includes` query method to eager load belongs_to association. ([#65][])
87
+ - SObject#destroy method.
15
88
 
16
89
  ## 0.6.1
17
90
 
18
- * Fix missing require of 'restforce'. Now clients don't need to add an initializer.
91
+ - Fix missing require of 'restforce'. Now clients don't need to add an initializer.
19
92
 
20
93
  ## 0.6.0
21
94
 
22
- * Add select statement functionality. ([Pablo Oldani][], [#33][])
23
- * Add callback functionality ([Pablo Oldani][], [#20][])
24
- * Support bind parameters. ([Dan Olson][], [#29][])
25
- * Fix when passing nil value in a :where condition. ([Armando Andini][])
26
- * Model generator complete ([Armando Andini][], [#19][])
95
+ - Add select statement functionality. ([Pablo Oldani][], [#33][])
96
+ - Add callback functionality ([Pablo Oldani][], [#20][])
97
+ - Support bind parameters. ([Dan Olson][], [#29][])
98
+ - Fix when passing nil value in a :where condition. ([Armando Andini][])
99
+ - Model generator complete ([Armando Andini][], [#19][])
27
100
 
28
101
  ## 0.5.0
29
102
 
30
- * Provide a default id field for all SObject subclassees ([Dan Olson][], [#30][])
31
- * Fix Ruby 2.0 compatibility issue ([Dan Olson][], [Pablo Oldani][], [#28][])
32
- * Normalize rspec syntax to remove deprecation warnings ([Dan Olson][], [#26][])
33
- * Remove namespace when inferring default SObject.table_name ([Dan Olson][], [#24][])
34
- * Add create! and save! methods. ([Pablo Oldani][], [#21][])
35
- * Refactor update and create methods. ([Pablo Oldani][], [#21][])
36
- * Add a generator. ([José Piccioni][], [#19][])
37
- * ActiveQuery now provides :each, :map and :inspect. ([Armando Andini][])
38
- * Add SObject.create class mehtod. ([Pablo Oldani][], [#10][])
39
- * SObject.field default mapping value follows SFDC API naming convention.
103
+ - Provide a default id field for all SObject subclassees ([Dan Olson][], [#30][])
104
+ - Fix Ruby 2.0 compatibility issue ([Dan Olson][], [Pablo Oldani][], [#28][])
105
+ - Normalize rspec syntax to remove deprecation warnings ([Dan Olson][], [#26][])
106
+ - Remove namespace when inferring default SObject.table_name ([Dan Olson][], [#24][])
107
+ - Add create! and save! methods. ([Pablo Oldani][], [#21][])
108
+ - Refactor update and create methods. ([Pablo Oldani][], [#21][])
109
+ - Add a generator. ([José Piccioni][], [#19][])
110
+ - ActiveQuery now provides :each, :map and :inspect. ([Armando Andini][])
111
+ - Add SObject.create class mehtod. ([Pablo Oldani][], [#10][])
112
+ - SObject.field default mapping value follows SFDC API naming convention.
40
113
  ([Dan Olson][], [#14][] [#15][])
41
114
 
42
115
  ## 0.4.2
43
116
 
44
- * Use ActiveQuery instead of Query. ([Armando Andini][])
45
- * Add instructions to use validations ([José Piccioni][])
46
- * Lots of refactoring.
117
+ - Use ActiveQuery instead of Query. ([Armando Andini][])
118
+ - Add instructions to use validations ([José Piccioni][])
119
+ - Lots of refactoring.
47
120
 
48
121
  ## 0.3.2
49
122
 
50
- * Fixed gemspec.
123
+ - Fixed gemspec.
51
124
 
52
125
  ## 0.3.1
53
126
 
54
- * Create different classes for associations. ([#4][])
55
- * Big refactor on has_many association. ([Armando Andini][])
56
- * Add a lot of specs and refactors. ([Armando Andini][])
57
- * Add a Finders module. ([Armando Andini][])
58
- * Add fist and last method to SObject.
127
+ - Create different classes for associations. ([#4][])
128
+ - Big refactor on has_many association. ([Armando Andini][])
129
+ - Add a lot of specs and refactors. ([Armando Andini][])
130
+ - Add a Finders module. ([Armando Andini][])
131
+ - Add fist and last method to SObject.
59
132
 
60
133
  ## 0.2.0
61
134
 
62
- * Add belogns_to and has_many associations.
63
- * Changed when the SOQL query is sent to the client.
64
- * Add join method to query to use associtations.
135
+ - Add belogns_to and has_many associations.
136
+ - Changed when the SOQL query is sent to the client.
137
+ - Add join method to query to use associtations.
65
138
 
66
139
  ## 0.1.0
67
140
 
68
- * Add query builder object to chain conditions.
69
- * Update update and create methods.
70
- * Add Campaing standard table name.
141
+ - Add query builder object to chain conditions.
142
+ - Update update and create methods.
143
+ - Add Campaing standard table name.
71
144
 
72
145
  ## 0.0.6.alfa
73
146
 
74
- * ActiveForce::SObject#table_name is auto populated using the class
75
- name. It adds "__c" to all non standard types.
147
+ - ActiveForce::SObject#table_name is auto populated using the class
148
+ name. It adds "\_\_c" to all non standard types.
76
149
 
77
150
  <!--- The following link definition list is generated by PimpMyChangelog --->
78
151
 
@@ -92,7 +165,7 @@
92
165
  [#33]: https://github.com/ionia-corporation/active_force/issues/33
93
166
  [#65]: https://github.com/ionia-corporation/active_force/issues/65
94
167
  [#92]: https://github.com/ionia-corporation/active_force/issues/92
95
- [Pablo Oldani]: https://github.com/olvap
96
- [Armando Andini]: https://github.com/antico5
97
- [José Piccioni]: https://github.com/lmhsjackson
98
- [Dan Olson]: https://github.com/DanOlson
168
+ [pablo oldani]: https://github.com/olvap
169
+ [armando andini]: https://github.com/antico5
170
+ [josé piccioni]: https://github.com/lmhsjackson
171
+ [dan olson]: https://github.com/DanOlson
data/CODEOWNERS ADDED
@@ -0,0 +1,2 @@
1
+ # Comment line immediately above ownership line is reserved for related gus information. Please be careful while editing.
2
+ #ECCN:Open Source
data/Gemfile CHANGED
@@ -1,5 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in active_force.gemspec
4
- gem "codeclimate-test-reporter", group: :test, require: nil
5
4
  gemspec
data/README.md CHANGED
@@ -1,29 +1,26 @@
1
- [![Gem Version](http://img.shields.io/gem/v/active_force.svg)](http://badge.fury.io/rb/active_force)
2
- [![Build Status](http://img.shields.io/travis/ionia-corporation/active_force.svg)](https://travis-ci.org/ionia-corporation/active_force)
3
- [![Code Climate](http://img.shields.io/codeclimate/github/ionia-corporation/active_force.svg)](https://codeclimate.com/github/ionia-corporation/active_force)
4
- [![Dependency Status](http://img.shields.io/gemnasium/ionia-corporation/active_force.svg)](https://gemnasium.com/ionia-corporation/active_force)
5
- [![Test Coverage](https://codeclimate.com/github/ionia-corporation/active_force/badges/coverage.svg)](https://codeclimate.com/github/ionia-corporation/active_force)
6
- [![Inline docs](http://inch-ci.org/github/ionia-corporation/active_force.png?branch=master)](http://inch-ci.org/github/ionia-corporation/active_force)
7
- [![Chat](http://img.shields.io/badge/chat-gitter-brightgreen.svg)](https://gitter.im/ionia-corporation/active_force)
8
-
9
1
  # ActiveForce
10
2
 
11
3
  A ruby gem to interact with [SalesForce][1] as if it were Active Record. It
12
4
  uses [Restforce][2] to interact with the API, so it is fast and stable.
13
5
 
6
+ ### Beyond Finance Fork
7
+
8
+ This version is forked from the work done by
9
+ https://github.com/heroku/active_force which was in turn forked from
10
+ https://github.com/ionia-corporation/active_force.
11
+ It includes upgrades for Rails 7, as
12
+ well as additional functionality.
13
+
14
14
  ## Installation
15
15
 
16
- Add this line to your application's Gemfile:
16
+ Add this line to your application's `Gemfile`:
17
17
 
18
- gem 'active_force'
18
+ gem 'active_force', github: "Beyond-Finance/active_force"
19
19
 
20
20
  And then execute:
21
21
 
22
22
  $ bundle
23
23
 
24
- Or install it yourself as:
25
-
26
- $ gem install active_force
27
24
 
28
25
  ## Setup credentials
29
26
 
@@ -42,7 +39,7 @@ Also, you may specify which client to use as a configuration option, which is us
42
39
  when having to reauthenticate utilizing oauth.
43
40
 
44
41
  ```ruby
45
- ActiveForce.sfdc_client = Restforce.new()
42
+ ActiveForce.sfdc_client = Restforce.new(
46
43
  oauth_token: current_user.oauth_token,
47
44
  refresh_token: current_user.refresh_token,
48
45
  instance_url: current_user.instance_url,
@@ -60,14 +57,14 @@ class Medication < ActiveForce::SObject
60
57
 
61
58
  field :max_dossage # defaults to "Max_Dossage__c"
62
59
  field :updated_from
63
-
60
+
64
61
  ##
65
62
  # You can cast field value using `as`
66
63
  # field :address_primary_active, from: 's360a__AddressPrimaryActive__c', as: :boolean
67
- #
68
- # Available options are :boolean, :int, :double, :percent, :date, :datetime, :string, :base64,
69
- # :byte, :ID, :reference, :currency, :textarea, :phone, :url, :email, :combobox, :picklist,
70
- # :multipicklist, :anyType, :location
64
+ #
65
+ # Available options are :boolean, :int, :double, :percent, :date, :datetime, :string, :base64,
66
+ # :byte, :ID, :reference, :currency, :textarea, :phone, :url, :email, :combobox, :picklist,
67
+ # :multipicklist, :anyType, :location, :compound
71
68
 
72
69
  ##
73
70
  # Table name is inferred from class name.
@@ -85,11 +82,19 @@ class Medication < ActiveForce::SObject
85
82
  # validates :size, inclusion: { in: %w(small medium large),
86
83
  # message: "%{value} is not a valid size" }
87
84
 
85
+ ##
86
+ # Defaults
87
+ #
88
+ # Set a default on any field using `default`.
89
+ field :name, from: 'Name', default: -> { 'default_name' }
90
+
88
91
  ##
89
92
  # Callbacks
90
93
  #
91
94
  before_save :set_as_updated_from_rails
92
95
 
96
+ # Supported callbacks include :build, :create, :update, :save, :destroy
97
+
93
98
  private
94
99
 
95
100
  def set_as_updated_from_rails
@@ -101,7 +106,11 @@ end
101
106
 
102
107
  Altenative you can try the generator. (requires setting up the connection)
103
108
 
104
- rails generate active_force_model Medication__c
109
+ rails generate active_force:model Medication__c
110
+
111
+ The model generator also supports an optional namespace which will add a namespace to the generated model
112
+
113
+ rails generate active_force:model Medication__c SomeNamespace
105
114
 
106
115
  ### Associations
107
116
 
@@ -117,7 +126,7 @@ class Account < ActiveForce::SObject
117
126
  scoped_as: ->{ where("Discontinued__c > ? OR Discontinued__c = ?", Date.today.strftime("%Y-%m-%d"), nil) }
118
127
 
119
128
  has_many :today_log_entries,
120
- model: DailyLogEntry,
129
+ model: 'DailyLogEntry',
121
130
  scoped_as: ->{ where(date: Time.now.in_time_zone.strftime("%Y-%m-%d")) }
122
131
 
123
132
  has_many :labs,
@@ -126,6 +135,15 @@ class Account < ActiveForce::SObject
126
135
  end
127
136
  ```
128
137
 
138
+ #### Has One
139
+
140
+ ```ruby
141
+ class Car < ActiveForce::SObject
142
+ has_one :engine, model: 'CarEngine'
143
+ has_one :driver_seat, model: 'Seat', scoped_as: -> { where(can_access_steering_wheel: true).order('Position ASC') }
144
+ end
145
+ ```
146
+
129
147
  #### Belongs to
130
148
 
131
149
  ```ruby
@@ -149,12 +167,73 @@ Account.where(web_enable: 1, contact_by: ['web', 'email']).limit(2)
149
167
  # LIMIT 2
150
168
  ```
151
169
 
170
+ You can query using _NOT_ (negated conditions):
171
+
172
+ ```ruby
173
+ Account.where.not(web_enable: 1)
174
+ #=> this will query "SELECT Id, Name...
175
+ # FROM Account
176
+ # WHERE NOT WebEnable__c = 1"
177
+ ```
178
+
179
+ You can create _OR_ queries:
180
+
181
+ ```ruby
182
+ Account.where(contact_by: 'web').or(Account.where(contact_by: 'email'))
183
+ #=> this will query "SELECT Id, Name...
184
+ # FROM Account
185
+ # WHERE (contact_by__c = 'web')
186
+ # OR (contact_by__c = 'email')"
187
+ ```
188
+
152
189
  It is also possible to eager load associations:
153
190
 
154
191
  ```ruby
155
192
  Comment.includes(:post)
156
193
  ```
157
194
 
195
+ ### Aggregates
196
+
197
+ Summing the values of a column:
198
+ ```ruby
199
+ Transaction.where(offer_id: 'ABD832024').sum(:amount)
200
+ #=> This will query "SELECT SUM(Amount__c)
201
+ # FROM Transaction__c
202
+ # WHERE offer_id = 'ABD832024'"
203
+ ```
204
+
205
+ #### Decorator
206
+
207
+ You can specify a `self.decorate(records)` method on the class, which will be called once with
208
+ the Restforce API results passed as the only argument. This allows you to decorate the results in one pass
209
+ through method, which is helpful if you need to bulk modify the returned API results and
210
+ don't want to incur any N+1 penalties. You must return the new altered array from
211
+ the decorate method.
212
+
213
+ ```ruby
214
+ class Account < ActiveForce::SObject
215
+
216
+ ##
217
+ # Decorator
218
+ #
219
+ def self.decorate account_records
220
+ # Perform other API call once for all account_records ids
221
+ other_things = OtherAPI.find_things_with_ids(account_records.map{ |a| a["Id"] } )
222
+ account_records.map do |a|
223
+ # Find other_thing that corresponds to the current account_record
224
+ other_thing_for_account = other_things.detect{ |o| o["Id"] == a["Id"]}
225
+
226
+ # make updates to each record
227
+ a.merge_in_other_stuff(other_thing_for_account)
228
+ end # the mapped array will be returned
229
+ end
230
+ end
231
+
232
+ accounts = Account.where(web_enabled: 1).limit(2)
233
+ # This finds the records from the RestForce API, and then decorate all results
234
+ with data from another API, and will only query the other API once.
235
+ ```
236
+
158
237
  ### Model generator
159
238
 
160
239
  When using rails, you can generate a model with all the fields you have on your SFDC table by running:
data/active_force.gemspec CHANGED
@@ -10,8 +10,13 @@ Gem::Specification.new do |spec|
10
10
  spec.email = "eloyesp@gmail.com"
11
11
  spec.description = %q{Use SalesForce as an ActiveModel}
12
12
  spec.summary = %q{Help you implement models persisting on Sales Force within Rails using RESTForce}
13
- spec.homepage = "https://github.com/ionia-corporation/active_force"
13
+ spec.homepage = "https://github.com/Beyond-Finance/active_force#readme"
14
14
  spec.license = "MIT"
15
+ spec.metadata = {
16
+ "bug_tracker_uri" => "https://github.com/Beyond-Finance/active_force/issues",
17
+ "changelog_uri" => "https://github.com/Beyond-Finance/active_force/blob/main/CHANGELOG.md",
18
+ "source_code_uri" => "https://github.com/Beyond-Finance/active_force",
19
+ }
15
20
 
16
21
  spec.files = `git ls-files`.split($/)
17
22
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -20,10 +25,12 @@ Gem::Specification.new do |spec|
20
25
 
21
26
  spec.required_ruby_version = '>= 1.9.3'
22
27
 
23
- spec.add_dependency 'active_attr', '~> 0.8'
24
- spec.add_dependency 'restforce', '~> 1.4'
25
- spec.add_development_dependency 'bundler', '~> 1.3'
28
+ spec.add_dependency 'activemodel', '~> 7.0'
29
+ spec.add_dependency 'activesupport', '~> 7.0'
30
+ spec.add_dependency 'restforce', '>= 5'
26
31
  spec.add_development_dependency 'rake', '>= 0'
27
32
  spec.add_development_dependency 'rspec', '>= 0'
33
+ spec.add_development_dependency 'rspec_junit_formatter'
28
34
  spec.add_development_dependency 'pry', '>= 0'
35
+ spec.add_development_dependency 'simplecov', '>= 0'
29
36
  end