restforce 6.2.2 → 7.3.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.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +2 -2
- data/.github/workflows/faraday.yml +2 -2
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +32 -1
- data/Gemfile +5 -5
- data/README.md +15 -11
- data/UPGRADING.md +12 -0
- data/lib/restforce/concerns/authentication.rb +8 -0
- data/lib/restforce/concerns/composite_api.rb +8 -0
- data/lib/restforce/concerns/connection.rb +2 -2
- data/lib/restforce/error_code.rb +18 -0
- data/lib/restforce/middleware/authentication/client_credential.rb +15 -0
- data/lib/restforce/middleware/authentication.rb +2 -1
- data/lib/restforce/middleware/json_request.rb +2 -2
- data/lib/restforce/middleware/json_response.rb +1 -1
- data/lib/restforce/middleware/raise_error.rb +1 -1
- data/lib/restforce/version.rb +1 -1
- data/restforce.gemspec +2 -2
- data/spec/unit/concerns/authentication_spec.rb +33 -0
- data/spec/unit/concerns/composite_api_spec.rb +17 -0
- data/spec/unit/middleware/authentication/client_credential_spec.rb +36 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6654e481c857ecb9ac254b03727287038371662899d1ef0a136c49c1cd5e86d6
|
4
|
+
data.tar.gz: 5a78a982b7bc65c3332320682d44bc7f2a46a234b9afc5360bca79fa0c8eddeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62fdf7157d265d3d8af5b37ecec52a98f1462a1dcc62e72471b2ddb29380821a90b0e38cb5cd111dc4b925182af169bda56f131e0798277e1f2c55f1132ec5d8
|
7
|
+
data.tar.gz: a62df632fca2528e5dd991dbf4ab95f5cb7cc201819dbfeed5dfb4d021bdf47b567a10eda7ed9cc2e7436acbf89951cd7f85e0d57bd421438a7b9870aa2ed8fb
|
data/.github/workflows/build.yml
CHANGED
@@ -6,10 +6,10 @@ jobs:
|
|
6
6
|
strategy:
|
7
7
|
fail-fast: false
|
8
8
|
matrix:
|
9
|
-
ruby_version: ['
|
9
|
+
ruby_version: ['3.0', '3.1', '3.2', '3.3']
|
10
10
|
steps:
|
11
11
|
- name: Checkout code
|
12
|
-
uses: actions/checkout@
|
12
|
+
uses: actions/checkout@v4
|
13
13
|
- name: Setup Ruby ${{ matrix.ruby_version }}
|
14
14
|
uses: ruby/setup-ruby@v1
|
15
15
|
with:
|
@@ -10,12 +10,12 @@ jobs:
|
|
10
10
|
# For v2.0.x, we test v2.0.0 and v2.0.1 because v2.0.0 has a special behaviour where
|
11
11
|
# the Net::HTTP adapter is not included. See
|
12
12
|
# https://github.com/lostisland/faraday/blob/main/UPGRADING.md#faraday-20.
|
13
|
-
faraday_version: ['1.1.0', '1.2.0', '1.3.1', '1.4.3', '1.5.1', '1.6.0', '1.7.2', '1.8.0', '1.9.3', '1.10.3', '2.0.0', '2.0.1', '2.1.0', '2.2.0', '2.3.0', '2.4.0', '2.5.2', '2.6.0', '2.7.
|
13
|
+
faraday_version: ['1.1.0', '1.2.0', '1.3.1', '1.4.3', '1.5.1', '1.6.0', '1.7.2', '1.8.0', '1.9.3', '1.10.3', '2.0.0', '2.0.1', '2.1.0', '2.2.0', '2.3.0', '2.4.0', '2.5.2', '2.6.0', '2.7.12', '2.8.1', '2.9.0']
|
14
14
|
env:
|
15
15
|
FARADAY_VERSION: ~> ${{ matrix.faraday_version }}
|
16
16
|
steps:
|
17
17
|
- name: Checkout code
|
18
|
-
uses: actions/checkout@
|
18
|
+
uses: actions/checkout@v4
|
19
19
|
- name: Setup Ruby ${{ matrix.ruby_version }}
|
20
20
|
uses: ruby/setup-ruby@v1
|
21
21
|
with:
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,34 @@
|
|
1
|
+
# 7.3.0 (Feb 14, 2024 🧡)
|
2
|
+
|
3
|
+
- Add support for making `GET` requests using the Composite API (@shravan097)
|
4
|
+
|
5
|
+
# 7.2.0 (Jan 23, 2024)
|
6
|
+
|
7
|
+
- Add support for `faraday` v2.9.x (@timrogers)
|
8
|
+
|
9
|
+
# 7.1.1 (Jan 23, 2024)
|
10
|
+
|
11
|
+
- Handle the `APEX_REST_SERVICES_DISABLED` error returned by the Salesforce API (@timrogers)
|
12
|
+
|
13
|
+
# 7.1.0 (Dec 20, 2023)
|
14
|
+
|
15
|
+
- Add support for the [OAuth 2.0 Client Credentials authentication flow](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_client_credentials_flow.htm&type=5) (@rh-taro)
|
16
|
+
- Add support for `faraday` v2.8.x (@timrogers)
|
17
|
+
|
18
|
+
# 7.0.0 (Oct 6, 2023)
|
19
|
+
|
20
|
+
__This version contains breaking changes. For help with upgrading, see [`UPGRADING.md`](https://github.com/restforce/restforce/blob/main/UPGRADING.md).__
|
21
|
+
|
22
|
+
* __⚠️ Drop support for Ruby 2.7__, since [Ruby 2.7 has reached its end-of-life](https://www.ruby-lang.org/en/downloads/) (@timrogers)
|
23
|
+
|
24
|
+
# 6.2.4 (Oct 6, 2023)
|
25
|
+
|
26
|
+
* Register the custom JSON middleware for Faraday with a more unique name to avoid clashes with other middleware (@dbackeus)
|
27
|
+
|
28
|
+
# 6.2.3 (Jun 18 2023)
|
29
|
+
|
30
|
+
* Handle the `CANNOT_DELETE_OWNER`, `CANNOT_POST_TO_ARCHIVED_GROUP`, `INVALID_INPUT`, `INVALID_MARKUP` and `INVALID_SEARCH` errors returned by the Salesforce API (@spurton)
|
31
|
+
|
1
32
|
# 6.2.2 (Mar 24 2023)
|
2
33
|
|
3
34
|
* Handle the `INSUFFICIENT_ACCESS` error returned by the Salesforce API (@timrogers, @nstuart-at-salesforce)
|
@@ -9,7 +40,7 @@
|
|
9
40
|
# 6.2.0 (Jan 18 2023)
|
10
41
|
|
11
42
|
* Add support for `faraday` v2.7.x (@timrogers)
|
12
|
-
* Expose the Faraday `Response` on `CompositeAPIError`s (@shravan097)
|
43
|
+
* Expose the Faraday `Response` on` `CompositeAPIError`s (@shravan097)
|
13
44
|
|
14
45
|
# 6.1.0 (Nov 18 2022)
|
15
46
|
|
data/Gemfile
CHANGED
@@ -3,20 +3,20 @@
|
|
3
3
|
source 'https://rubygems.org'
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
faraday_version = ENV.fetch('FARADAY_VERSION', '~> 2.
|
6
|
+
faraday_version = ENV.fetch('FARADAY_VERSION', '~> 2.9.0')
|
7
7
|
|
8
8
|
# Enable us to explicitly pick a Faraday version when running tests
|
9
9
|
gem 'faraday', faraday_version
|
10
|
-
gem 'faraday-typhoeus', '~> 1.
|
10
|
+
gem 'faraday-typhoeus', '~> 1.1.0' unless faraday_version.start_with?("~> 1")
|
11
11
|
gem 'faye' unless RUBY_PLATFORM == 'java'
|
12
12
|
gem 'guard-rspec'
|
13
13
|
gem 'guard-rubocop'
|
14
14
|
gem 'jruby-openssl', platforms: :jruby
|
15
15
|
gem 'rake'
|
16
|
-
gem 'rspec', '~> 3.
|
16
|
+
gem 'rspec', '~> 3.13.0'
|
17
17
|
gem 'rspec-collection_matchers', '~> 1.2.0'
|
18
18
|
gem 'rspec-its', '~> 1.3.0'
|
19
19
|
gem 'rspec_junit_formatter', '~> 0.6.0'
|
20
|
-
gem 'rubocop', '~> 1.
|
20
|
+
gem 'rubocop', '~> 1.60.1'
|
21
21
|
gem 'simplecov', '~> 0.22.0'
|
22
|
-
gem 'webmock', '~> 3.
|
22
|
+
gem 'webmock', '~> 3.20.0'
|
data/README.md
CHANGED
@@ -27,7 +27,7 @@ Features include:
|
|
27
27
|
|
28
28
|
Add this line to your application's Gemfile:
|
29
29
|
|
30
|
-
gem 'restforce', '~>
|
30
|
+
gem 'restforce', '~> 7.3.0'
|
31
31
|
|
32
32
|
And then execute:
|
33
33
|
|
@@ -37,8 +37,9 @@ Or install it yourself as:
|
|
37
37
|
|
38
38
|
$ gem install restforce
|
39
39
|
|
40
|
-
__As of version
|
40
|
+
__As of version 7.0.0, this gem is only compatible with Ruby 3.0.0 and later.__ If you're using an earlier Ruby version:
|
41
41
|
|
42
|
+
* for Ruby 2.7, use version 6.2.4 or earlier
|
42
43
|
* for Ruby 2.6, use version 5.3.1 or earlier
|
43
44
|
* for Ruby 2.5, use version 5.0.6 or earlier
|
44
45
|
* for Ruby 2.4, use version 4.3.0 or earlier
|
@@ -58,7 +59,7 @@ so you can do things like `client.query('select Id, (select Name from Children__
|
|
58
59
|
|
59
60
|
Which authentication method you use really depends on your use case. If you're
|
60
61
|
building an application where many users from different organizations are authenticated
|
61
|
-
through
|
62
|
+
through OAuth and you need to interact with data in their org on their behalf,
|
62
63
|
you should use the OAuth token authentication method.
|
63
64
|
|
64
65
|
If you're using the gem to interact with a single org (maybe you're building some
|
@@ -154,6 +155,17 @@ client = Restforce.new
|
|
154
155
|
|
155
156
|
**Note:** Restforce library does not cache JWT Bearer tokens automatically. This means that every instantiation of the Restforce class will be treated as a new login by Salesforce. Remember that Salesforce enforces [rate limits on login requests](https://help.salesforce.com/s/articleView?id=000312767&type=1). If you are building an application that will instantiate the Restforce class more than this specified rate limit, you might want to consider caching the Bearer token either in-memory or in your own storage by leveraging the `authentication_callback` method.
|
156
157
|
|
158
|
+
## Client Credentials
|
159
|
+
|
160
|
+
If you want to authenticate as an application, you can use the [Client Credentials flow](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_client_credentials_flow.htm&type=5):
|
161
|
+
|
162
|
+
```ruby
|
163
|
+
client = Restforce.new(client_id: 'client_id',
|
164
|
+
client_secret: 'client_secret',
|
165
|
+
api_version: '55.0',
|
166
|
+
instance_url: 'instance_url')
|
167
|
+
```
|
168
|
+
|
157
169
|
#### Sandbox Organizations
|
158
170
|
|
159
171
|
You can connect to sandbox organizations by specifying a host. The default host is
|
@@ -588,7 +600,6 @@ This feature permits the user to send a composite object—that is, a complex
|
|
588
600
|
object with nested children—in a single API call. Up to 25 requests may be
|
589
601
|
included in a single composite.
|
590
602
|
|
591
|
-
Note that `GET` is not yet implemented for this API.
|
592
603
|
|
593
604
|
```ruby
|
594
605
|
# build up an array of requests:
|
@@ -831,13 +842,6 @@ client.create!("CustomField", {
|
|
831
842
|
})
|
832
843
|
```
|
833
844
|
|
834
|
-
## Links
|
835
|
-
|
836
|
-
If you need a full Active Record experience, may be you can use
|
837
|
-
[ActiveForce](https://github.com/ionia-corporation/active_force) that wraps
|
838
|
-
Restforce and adds Associations, Query Building (like AREL), Validations and
|
839
|
-
Callbacks.
|
840
|
-
|
841
845
|
## Contributing
|
842
846
|
|
843
847
|
We welcome all contributions - they help us make Restforce the best gem possible.
|
data/UPGRADING.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# Upgrading from Restforce 6.x to 7.x
|
2
|
+
|
3
|
+
## Ruby 2.7 is no longer supported
|
4
|
+
|
5
|
+
__Likelyhood of impact__: Moderate
|
6
|
+
|
7
|
+
Ruby 2.7 is no longer officially supported as an active version of the Ruby language. That means that it will not receive patches and security fixes.
|
8
|
+
|
9
|
+
Accordingly, we've dropped support for Ruby 2.7 in the Restforce library. The gemspec now specifies that only 3.0 onwards is supported, and this will be enforced by RubyGems.
|
10
|
+
|
11
|
+
Before you update to Restforce 7.x, you'll need to switch to Ruby 3.0.0 or later. The current version of Ruby at the time of writing is 3.2.2.
|
12
|
+
|
1
13
|
# Upgrading from Restforce 5.x to 6.x
|
2
14
|
|
3
15
|
__There are two breaking changes introduced in Restforce 6.x__. In this guide, you'll learn about these changes and what you should check in your code to make sure that it will work with the latest version of the library.
|
@@ -21,6 +21,8 @@ module Restforce
|
|
21
21
|
Restforce::Middleware::Authentication::Token
|
22
22
|
elsif jwt?
|
23
23
|
Restforce::Middleware::Authentication::JWTBearer
|
24
|
+
elsif client_credential?
|
25
|
+
Restforce::Middleware::Authentication::ClientCredential
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
@@ -48,6 +50,12 @@ module Restforce
|
|
48
50
|
options[:username] &&
|
49
51
|
options[:client_id]
|
50
52
|
end
|
53
|
+
|
54
|
+
# Internal: Returns true if client credential flow should be used for
|
55
|
+
# authentication.
|
56
|
+
def client_credential?
|
57
|
+
options[:client_id] && options[:client_secret]
|
58
|
+
end
|
51
59
|
end
|
52
60
|
end
|
53
61
|
end
|
@@ -93,6 +93,14 @@ module Restforce
|
|
93
93
|
}
|
94
94
|
end
|
95
95
|
|
96
|
+
def find(sobject, reference_id, id)
|
97
|
+
requests << {
|
98
|
+
method: 'GET',
|
99
|
+
url: composite_api_path("#{sobject}/#{id}"),
|
100
|
+
referenceId: reference_id
|
101
|
+
}
|
102
|
+
end
|
103
|
+
|
96
104
|
private
|
97
105
|
|
98
106
|
def composite_api_path(path)
|
@@ -33,7 +33,7 @@ module Restforce
|
|
33
33
|
# Handles multipart file uploads for blobs.
|
34
34
|
builder.use Restforce::Middleware::Multipart
|
35
35
|
# Converts the request into JSON.
|
36
|
-
builder.request :
|
36
|
+
builder.request :restforce_json
|
37
37
|
# Handles reauthentication for 403 responses.
|
38
38
|
if authentication_middleware
|
39
39
|
builder.use authentication_middleware, self, options
|
@@ -52,7 +52,7 @@ module Restforce
|
|
52
52
|
# Raises errors for 40x responses.
|
53
53
|
builder.use Restforce::Middleware::RaiseError
|
54
54
|
# Parses returned JSON response into a hash.
|
55
|
-
builder.response :
|
55
|
+
builder.response :restforce_json, content_type: /\bjson$/
|
56
56
|
# Compress/Decompress the request/response
|
57
57
|
unless adapter == :httpclient
|
58
58
|
builder.use Restforce::Middleware::Gzip, self, options
|
data/lib/restforce/error_code.rb
CHANGED
@@ -19,6 +19,8 @@ module Restforce
|
|
19
19
|
|
20
20
|
class ApexError < ResponseError; end
|
21
21
|
|
22
|
+
class ApexRestServicesDisabled < ResponseError; end
|
23
|
+
|
22
24
|
class ApiCurrentlyDisabled < ResponseError; end
|
23
25
|
|
24
26
|
class ApiDisabledForOrg < ResponseError; end
|
@@ -43,6 +45,8 @@ module Restforce
|
|
43
45
|
|
44
46
|
class CannotDeleteLastDatedConversionRate < ResponseError; end
|
45
47
|
|
48
|
+
class CannotDeleteOwner < ResponseError; end
|
49
|
+
|
46
50
|
class CannotDeleteManagedObject < ResponseError; end
|
47
51
|
|
48
52
|
class CannotDisableLastAdmin < ResponseError; end
|
@@ -55,6 +59,8 @@ module Restforce
|
|
55
59
|
|
56
60
|
class CannotModifyManagedObject < ResponseError; end
|
57
61
|
|
62
|
+
class CannotPostToArchivedGroup < ResponseError; end
|
63
|
+
|
58
64
|
class CannotRenameApexReferencedField < ResponseError; end
|
59
65
|
|
60
66
|
class CannotRenameApexReferencedObject < ResponseError; end
|
@@ -219,8 +225,12 @@ module Restforce
|
|
219
225
|
|
220
226
|
class InvalidInetAddress < ResponseError; end
|
221
227
|
|
228
|
+
class InvalidInput < ResponseError; end
|
229
|
+
|
222
230
|
class InvalidLineitemCloneState < ResponseError; end
|
223
231
|
|
232
|
+
class InvalidMarkup < ResponseError; end
|
233
|
+
|
224
234
|
class InvalidMasterOrTranslatedSolution < ResponseError; end
|
225
235
|
|
226
236
|
class InvalidMessageIdReference < ResponseError; end
|
@@ -247,6 +257,8 @@ module Restforce
|
|
247
257
|
|
248
258
|
class InvalidSaveAsActivityFlag < ResponseError; end
|
249
259
|
|
260
|
+
class InvalidSearch < ResponseError; end
|
261
|
+
|
250
262
|
class InvalidSessionId < ResponseError; end
|
251
263
|
|
252
264
|
class InvalidSignupCountry < ResponseError; end
|
@@ -419,6 +431,7 @@ module Restforce
|
|
419
431
|
"ALL_OR_NONE_OPERATION_ROLLED_BACK" => AllOrNoneOperationRolledBack,
|
420
432
|
"ALREADY_IN_PROCESS" => AlreadyInProcess,
|
421
433
|
"APEX_ERROR" => ApexError,
|
434
|
+
"APEX_REST_SERVICES_DISABLED" => ApexRestServicesDisabled,
|
422
435
|
"API_CURRENTLY_DISABLED" => ApiCurrentlyDisabled,
|
423
436
|
"API_DISABLED_FOR_ORG" => ApiDisabledForOrg,
|
424
437
|
"ASSIGNEE_TYPE_REQUIRED" => AssigneeTypeRequired,
|
@@ -436,11 +449,13 @@ module Restforce
|
|
436
449
|
"CANNOT_DELETE_LAST_DATED_CONVERSION_RATE" =>
|
437
450
|
CannotDeleteLastDatedConversionRate,
|
438
451
|
"CANNOT_DELETE_MANAGED_OBJECT" => CannotDeleteManagedObject,
|
452
|
+
"CANNOT_DELETE_OWNER" => CannotDeleteOwner,
|
439
453
|
"CANNOT_DISABLE_LAST_ADMIN" => CannotDisableLastAdmin,
|
440
454
|
"CANNOT_ENABLE_IP_RESTRICT_REQUESTS" => CannotEnableIpRestrictRequests,
|
441
455
|
"CANNOT_EXECUTE_FLOW_TRIGGER" => CannotExecuteFlowTrigger,
|
442
456
|
"CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY" => CannotInsertUpdateActivateEntity,
|
443
457
|
"CANNOT_MODIFY_MANAGED_OBJECT" => CannotModifyManagedObject,
|
458
|
+
"CANNOT_POST_TO_ARCHIVED_GROUP" => CannotPostToArchivedGroup,
|
444
459
|
"CANNOT_RENAME_APEX_REFERENCED_FIELD" => CannotRenameApexReferencedField,
|
445
460
|
"CANNOT_RENAME_APEX_REFERENCED_OBJECT" => CannotRenameApexReferencedObject,
|
446
461
|
"CANNOT_REPARENT_RECORD" => CannotReparentRecord,
|
@@ -528,7 +543,9 @@ module Restforce
|
|
528
543
|
"INVALID_FILTER_ACTION" => InvalidFilterAction,
|
529
544
|
"INVALID_ID_FIELD" => InvalidIdField,
|
530
545
|
"INVALID_INET_ADDRESS" => InvalidInetAddress,
|
546
|
+
"INVALID_INPUT" => InvalidInput,
|
531
547
|
"INVALID_LINEITEM_CLONE_STATE" => InvalidLineitemCloneState,
|
548
|
+
"INVALID_MARKUP" => InvalidMarkup,
|
532
549
|
"INVALID_MASTER_OR_TRANSLATED_SOLUTION" => InvalidMasterOrTranslatedSolution,
|
533
550
|
"INVALID_MESSAGE_ID_REFERENCE" => InvalidMessageIdReference,
|
534
551
|
"INVALID_OPERATION" => InvalidOperation,
|
@@ -543,6 +560,7 @@ module Restforce
|
|
543
560
|
"INVALID_READ_ONLY_USER_DML" => InvalidReadOnlyUserDml,
|
544
561
|
"INVALID_REPLICATION_DATE" => InvalidReplicationDate,
|
545
562
|
"INVALID_SAVE_AS_ACTIVITY_FLAG" => InvalidSaveAsActivityFlag,
|
563
|
+
"INVALID_SEARCH" => InvalidSearch,
|
546
564
|
"INVALID_SESSION_ID" => InvalidSessionId,
|
547
565
|
"INVALID_SIGNUP_COUNTRY" => InvalidSignupCountry,
|
548
566
|
"INVALID_STATUS" => InvalidStatus,
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Restforce
|
4
|
+
class Middleware
|
5
|
+
class Authentication
|
6
|
+
class ClientCredential < Restforce::Middleware::Authentication
|
7
|
+
def params
|
8
|
+
{ grant_type: 'client_credentials',
|
9
|
+
client_id: @options[:client_id],
|
10
|
+
client_secret: @options[:client_secret] }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -9,6 +9,7 @@ module Restforce
|
|
9
9
|
autoload :Password, 'restforce/middleware/authentication/password'
|
10
10
|
autoload :Token, 'restforce/middleware/authentication/token'
|
11
11
|
autoload :JWTBearer, 'restforce/middleware/authentication/jwt_bearer'
|
12
|
+
autoload :ClientCredential, 'restforce/middleware/authentication/client_credential'
|
12
13
|
|
13
14
|
# Rescue from 401's, authenticate then raise the error again so the client
|
14
15
|
# can reissue the request.
|
@@ -50,7 +51,7 @@ module Restforce
|
|
50
51
|
builder.use Faraday::Request::UrlEncoded
|
51
52
|
builder.use Restforce::Middleware::Mashify, nil, @options
|
52
53
|
builder.use Faraday::FollowRedirects::Middleware
|
53
|
-
builder.response :
|
54
|
+
builder.response :restforce_json
|
54
55
|
|
55
56
|
if Restforce.log?
|
56
57
|
builder.use Restforce::Middleware::Logger,
|
@@ -31,7 +31,7 @@ module Restforce
|
|
31
31
|
CONTENT_TYPE = 'Content-Type'
|
32
32
|
|
33
33
|
MIME_TYPE = 'application/json'
|
34
|
-
MIME_TYPE_REGEX = %r{^application/(vnd\..+\+)?json$}
|
34
|
+
MIME_TYPE_REGEX = %r{^application/(vnd\..+\+)?json$}
|
35
35
|
|
36
36
|
#
|
37
37
|
# Taken from `lib/faraday/middleware.rb` in the `faraday`
|
@@ -87,4 +87,4 @@ module Restforce
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
Faraday::Request.register_middleware(
|
90
|
+
Faraday::Request.register_middleware(restforce_json: Restforce::Middleware::JsonRequest)
|
data/lib/restforce/version.rb
CHANGED
data/restforce.gemspec
CHANGED
@@ -22,9 +22,9 @@ Gem::Specification.new do |gem|
|
|
22
22
|
'rubygems_mfa_required' => 'true'
|
23
23
|
}
|
24
24
|
|
25
|
-
gem.required_ruby_version = '>=
|
25
|
+
gem.required_ruby_version = '>= 3.0'
|
26
26
|
|
27
|
-
gem.add_dependency 'faraday', '< 2.
|
27
|
+
gem.add_dependency 'faraday', '< 2.10.0', '>= 1.1.0'
|
28
28
|
gem.add_dependency 'faraday-follow_redirects', '<= 0.3.0', '< 1.0.0'
|
29
29
|
gem.add_dependency 'faraday-multipart', '>= 1.0.0', '< 2.0.0'
|
30
30
|
gem.add_dependency 'faraday-net_http', '< 4.0.0'
|
@@ -62,6 +62,17 @@ describe Restforce::Concerns::Authentication do
|
|
62
62
|
|
63
63
|
it { should eq Restforce::Middleware::Authentication::JWTBearer }
|
64
64
|
end
|
65
|
+
|
66
|
+
context 'when client_id and client_secret options are provided' do
|
67
|
+
before do
|
68
|
+
client.stub username_password?: false
|
69
|
+
client.stub oauth_refresh?: false
|
70
|
+
client.stub jwt?: false
|
71
|
+
client.stub client_credential?: true
|
72
|
+
end
|
73
|
+
|
74
|
+
it { should eq Restforce::Middleware::Authentication::ClientCredential }
|
75
|
+
end
|
65
76
|
end
|
66
77
|
|
67
78
|
describe '.username_password?' do
|
@@ -135,4 +146,26 @@ describe Restforce::Concerns::Authentication do
|
|
135
146
|
it { should_not be true }
|
136
147
|
end
|
137
148
|
end
|
149
|
+
|
150
|
+
describe '.client_credential?' do
|
151
|
+
subject { client.client_credential? }
|
152
|
+
let(:options) { {} }
|
153
|
+
|
154
|
+
before do
|
155
|
+
client.stub options: options
|
156
|
+
end
|
157
|
+
|
158
|
+
context 'when oauth client credential options are provided' do
|
159
|
+
let(:options) do
|
160
|
+
{ client_id: 'client',
|
161
|
+
client_secret: 'secret' }
|
162
|
+
end
|
163
|
+
|
164
|
+
it { should be_truthy }
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'when oauth client credential options are not provided' do
|
168
|
+
it { should_not be true }
|
169
|
+
end
|
170
|
+
end
|
138
171
|
end
|
@@ -82,6 +82,23 @@ describe Restforce::Concerns::CompositeAPI do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
it '#find' do
|
86
|
+
client.
|
87
|
+
should_receive(:api_post).
|
88
|
+
with(endpoint, { compositeRequest: [
|
89
|
+
{
|
90
|
+
method: 'GET',
|
91
|
+
url: "/services/data/v38.0/sobjects/Object/00312345",
|
92
|
+
referenceId: 'find_ref'
|
93
|
+
}
|
94
|
+
], allOrNone: all_or_none, collateSubrequests: false }.to_json).
|
95
|
+
and_return(response)
|
96
|
+
|
97
|
+
client.send(method) do |subrequests|
|
98
|
+
subrequests.find('Object', 'find_ref', '00312345')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
85
102
|
it 'multiple subrequests' do
|
86
103
|
client.
|
87
104
|
should_receive(:api_post).
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Restforce::Middleware::Authentication::ClientCredential do
|
6
|
+
let(:options) do
|
7
|
+
{ host: 'login.salesforce.com',
|
8
|
+
client_id: 'client_id',
|
9
|
+
client_secret: 'client_secret',
|
10
|
+
adapter: :net_http }
|
11
|
+
end
|
12
|
+
|
13
|
+
it_behaves_like 'authentication middleware' do
|
14
|
+
let(:success_request) do
|
15
|
+
stub_login_request(
|
16
|
+
body: "grant_type=client_credentials&" \
|
17
|
+
"client_id=client_id&client_secret=client_secret"
|
18
|
+
).to_return(
|
19
|
+
status: 200,
|
20
|
+
body: fixture(:auth_success_response),
|
21
|
+
headers: { "Content-Type" => "application/json" }
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:fail_request) do
|
26
|
+
stub_login_request(
|
27
|
+
body: "grant_type=client_credentials&" \
|
28
|
+
"client_id=client_id&client_secret=client_secret"
|
29
|
+
).to_return(
|
30
|
+
status: 400,
|
31
|
+
body: fixture(:refresh_error_response),
|
32
|
+
headers: { "Content-Type" => "application/json" }
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restforce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Rogers
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-02-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -17,7 +17,7 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "<"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 2.
|
20
|
+
version: 2.10.0
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 1.1.0
|
@@ -27,7 +27,7 @@ dependencies:
|
|
27
27
|
requirements:
|
28
28
|
- - "<"
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version: 2.
|
30
|
+
version: 2.10.0
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.1.0
|
@@ -170,6 +170,7 @@ files:
|
|
170
170
|
- lib/restforce/mash.rb
|
171
171
|
- lib/restforce/middleware.rb
|
172
172
|
- lib/restforce/middleware/authentication.rb
|
173
|
+
- lib/restforce/middleware/authentication/client_credential.rb
|
173
174
|
- lib/restforce/middleware/authentication/jwt_bearer.rb
|
174
175
|
- lib/restforce/middleware/authentication/password.rb
|
175
176
|
- lib/restforce/middleware/authentication/token.rb
|
@@ -257,6 +258,7 @@ files:
|
|
257
258
|
- spec/unit/document_spec.rb
|
258
259
|
- spec/unit/error_code_spec.rb
|
259
260
|
- spec/unit/mash_spec.rb
|
261
|
+
- spec/unit/middleware/authentication/client_credential_spec.rb
|
260
262
|
- spec/unit/middleware/authentication/jwt_bearer_spec.rb
|
261
263
|
- spec/unit/middleware/authentication/password_spec.rb
|
262
264
|
- spec/unit/middleware/authentication/token_spec.rb
|
@@ -286,14 +288,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
286
288
|
requirements:
|
287
289
|
- - ">="
|
288
290
|
- !ruby/object:Gem::Version
|
289
|
-
version: '
|
291
|
+
version: '3.0'
|
290
292
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
291
293
|
requirements:
|
292
294
|
- - ">="
|
293
295
|
- !ruby/object:Gem::Version
|
294
296
|
version: '0'
|
295
297
|
requirements: []
|
296
|
-
rubygems_version: 3.
|
298
|
+
rubygems_version: 3.5.3
|
297
299
|
signing_key:
|
298
300
|
specification_version: 4
|
299
301
|
summary: A lightweight Ruby client for the Salesforce REST API
|