restforce 5.1.0 → 5.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01b1e2a0404ca613dba1e5bf8dd0cac2672e8ae05a939693c9b06451379bc3f4
4
- data.tar.gz: 93fc9d6f07255f56a0bc6b93fc89402f0b6f8b5b4c616f8924e02cb791d21c01
3
+ metadata.gz: dc09f4586a150366a59119a46d6ccee41a72f6b63efa96224e7fe9bb31a65574
4
+ data.tar.gz: 71c415929a9ecb427cf528fbb1ac57630cb503cdad2ecd2b17769f1000b174dd
5
5
  SHA512:
6
- metadata.gz: 24394432042f990f2ef634a7721917fae4bc671c7b9c1a44c16e5bfc11811262ff1489418e769cb5177baacf8ad30e1f0c3fa3506b2e817c3465b324f78fd719
7
- data.tar.gz: 5f12f8479aaab44b75a4e0c93832ed245767d5acc659f2a7d854116423e3701aa8e2203cd3ef5018e5894c504b037dee30132a4f0c09cd8b410165c6e612ebc8
6
+ metadata.gz: ac1bd7610aec45c963fad5feac34f0f4bc0bd847bbd80bc4b2ad7895cf7a0ee35d68904419ffb5ea2b74d205a7897a06558e7661d1e03c9ed00644438047b87b
7
+ data.tar.gz: c3107f9a4a125e1fb89f107477eab41379a4347fce3689204e1d2dd3817a7cf0c465cfabdb25cf01246cfe428719147b7ccbba73b330d4211856712fb744a6a0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # 5.2.2 (Dec 16, 2021)
2
+
3
+ * Handle the `MALFORMED_SEARCH` error returned by Salesforce (@timrogers)
4
+
5
+ # 5.2.1 (Dec 8, 2021)
6
+
7
+ * Handle the `OPERATION_TOO_LARGE` error returned by Salesforce (@timrogers)
8
+ * Handle the `INVALID_SIGNUP_COUNTRY` error returned by Salesforce (@timrogers)
9
+
10
+ ## 5.2.0 (Oct 15, 2021)
11
+
12
+ * Add support for Salesforce's Composite API and Composite Batch API (@meenie, @amacdougall)
13
+ * Improve the performance of counting numbers of query results with `Restforce::Collection#count`, avoiding unnecessary API requests (@jhass)
14
+
15
+ ## 5.1.1 (Oct 13, 2021)
16
+
17
+ * Handle the `INVALID_REPLICATION_DATE` error returned by Salesforce (@michaelwnyc)
18
+ * Handle the `BIG_OBJECT_UNSUPPORTED_OPERATION` error returned by Salesforce (@remon)
19
+
1
20
  ## 5.1.0 (Aug 26, 2021)
2
21
 
3
22
  * Add official support for Ruby 3.0 (@timrogers)
data/Gemfile CHANGED
@@ -12,6 +12,6 @@ gem 'rspec', '~> 3.10.0'
12
12
  gem 'rspec-collection_matchers', '~> 1.2.0'
13
13
  gem 'rspec-its', '~> 1.3.0'
14
14
  gem 'rspec_junit_formatter', '~> 0.4.1'
15
- gem 'rubocop', '~> 1.20.0'
15
+ gem 'rubocop', '~> 1.23.0'
16
16
  gem 'simplecov', '~> 0.21.2'
17
17
  gem 'webmock', '~> 3.14.0'
data/README.md CHANGED
@@ -12,6 +12,8 @@ Features include:
12
12
  * Support for parent-to-child relationships.
13
13
  * Support for aggregate queries.
14
14
  * Support for the [Streaming API](#streaming)
15
+ * Support for the [Composite API](#composite-api)
16
+ * Support for the [Composite Batch API](#composite-batch-api)
15
17
  * Support for the GetUpdated API
16
18
  * Support for blob data types.
17
19
  * Support for GZIP compression.
@@ -25,7 +27,7 @@ Features include:
25
27
 
26
28
  Add this line to your application's Gemfile:
27
29
 
28
- gem 'restforce', '~> 5.1.0'
30
+ gem 'restforce', '~> 5.2.2'
29
31
 
30
32
  And then execute:
31
33
 
@@ -35,7 +37,7 @@ Or install it yourself as:
35
37
 
36
38
  $ gem install restforce
37
39
 
38
- __As of version 5.0.0, this gem is only compatible with Ruby 2.6.0 and later.__ If you're using an earlier Ruby version:
40
+ __As of version 5.1.0, this gem is only compatible with Ruby 2.6.0 and later.__ If you're using an earlier Ruby version:
39
41
 
40
42
  * for Ruby 2.5, use version 5.0.6 or earlier
41
43
  * for Ruby 2.4, use version 4.3.0 or earlier
@@ -573,6 +575,52 @@ end
573
575
  Boom, you're now receiving push notifications when Accounts are
574
576
  created/updated.
575
577
 
578
+ #### Composite API
579
+
580
+ Restforce supports the [Composite API](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_composite.htm).
581
+ This feature permits the user to send a composite object—that is, a complex
582
+ object with nested children—in a single API call. Up to 25 requests may be
583
+ included in a single composite.
584
+
585
+ Note that `GET` is not yet implemented for this API.
586
+
587
+ ```ruby
588
+ # build up an array of requests:
589
+ requests << {
590
+ method: :update,
591
+ sobject: sobject, # e.g. "Contact"
592
+ reference_id: reference_id,
593
+ data: data
594
+ }
595
+
596
+ # send every 25 requests as a subrequest in a single composite call
597
+ requests.each_slice(25).map do |req_slice|
598
+ client.composite do |subrequest|
599
+ req_slice.each do |r|
600
+ subrequest.send *r.values
601
+ end
602
+ end
603
+ end
604
+
605
+ # note that we're using `map` to return an array of each responses to each
606
+ # composite call; 100 requests will produce 4 responses
607
+ ```
608
+
609
+ #### Composite Batch API
610
+
611
+ Restforce supports the [Composite Batch API](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_batch.htm).
612
+ This feature permits up to 25 subrequests in a single request, though each
613
+ subrequest counts against the API limit. On the other hand, it has fewer
614
+ limitations than the Composite API.
615
+
616
+ ```
617
+ client.batch do |subrequests|
618
+ subrequests.create('Object', name: 'test')
619
+ subrequests.update('Object', id: '123', name: 'test')
620
+ subrequests.destroy('Object', '123')
621
+ end
622
+ ```
623
+
576
624
  #### Replaying Events
577
625
 
578
626
  Since API version 37.0, Salesforce stores events for 24 hours and they can be
@@ -8,5 +8,6 @@ module Restforce
8
8
  include Restforce::Concerns::Caching
9
9
  include Restforce::Concerns::API
10
10
  include Restforce::Concerns::BatchAPI
11
+ include Restforce::Concerns::CompositeAPI
11
12
  end
12
13
  end
@@ -27,12 +27,26 @@ module Restforce
27
27
  @raw_page['records'].size
28
28
  end
29
29
 
30
- # Return the size of the Collection without making any additional requests.
30
+ # Return the number of items in the Collection without making any additional
31
+ # requests and going through all of the pages of results, one by one. Instead,
32
+ # we can rely on the total count of results which Salesforce returns.
31
33
  def size
32
34
  @raw_page['totalSize']
33
35
  end
34
36
  alias length size
35
37
 
38
+ def count(*args)
39
+ # By default, `Enumerable`'s `#count` uses `#each`, which means going through all
40
+ # of the pages of results, one by one. Instead, we can use `#size` which we have
41
+ # already overridden to work in a smarter, more efficient way. This only works for
42
+ # the simple version of `#count` with no arguments. When called with an argument or
43
+ # a block, you need to know what the items in the collection actually are, so we
44
+ # call `super` and end up iterating through each item in the collection.
45
+ return size unless block_given? || !args.empty?
46
+
47
+ super
48
+ end
49
+
36
50
  # Returns true if the size of the Collection is zero.
37
51
  def empty?
38
52
  size.zero?
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'restforce/concerns/verbs'
4
+
5
+ module Restforce
6
+ module Concerns
7
+ module CompositeAPI
8
+ extend Restforce::Concerns::Verbs
9
+
10
+ define_verbs :post
11
+
12
+ def composite(all_or_none: false, collate_subrequests: false)
13
+ subrequests = Subrequests.new(options)
14
+ yield(subrequests)
15
+
16
+ if subrequests.requests.length > 25
17
+ raise ArgumentError, 'Cannot have more than 25 subrequests.'
18
+ end
19
+
20
+ properties = {
21
+ compositeRequest: subrequests.requests,
22
+ allOrNone: all_or_none,
23
+ collateSubrequests: collate_subrequests
24
+ }
25
+ response = api_post('composite', properties.to_json)
26
+
27
+ results = response.body['CompositeResponse']
28
+ has_errors = results.any? { |result| result['HttpStatusCode'].digits.last == 4 }
29
+ if all_or_none && has_errors
30
+ last_error_index = results.rindex { |result| result['HttpStatusCode'] != 412 }
31
+ last_error = results[last_error_index]
32
+ raise CompositeAPIError, last_error['Body'][0]['errorCode']
33
+ end
34
+
35
+ results
36
+ end
37
+
38
+ def composite!(collate_subrequests: false, &block)
39
+ composite(all_or_none: true, collate_subrequests: collate_subrequests, &block)
40
+ end
41
+
42
+ class Subrequests
43
+ def initialize(options)
44
+ @options = options
45
+ @requests = []
46
+ end
47
+ attr_reader :options, :requests
48
+
49
+ def create(sobject, reference_id, attrs)
50
+ requests << {
51
+ method: 'POST',
52
+ url: composite_api_path(sobject),
53
+ body: attrs,
54
+ referenceId: reference_id
55
+ }
56
+ end
57
+
58
+ def update(sobject, reference_id, attrs)
59
+ id = attrs.fetch(attrs.keys.find { |k, _v| k.to_s.casecmp?('id') }, nil)
60
+ raise ArgumentError, 'Id field missing from attrs.' unless id
61
+
62
+ attrs_without_id = attrs.reject { |k, _v| k.to_s.casecmp?('id') }
63
+ requests << {
64
+ method: 'PATCH',
65
+ url: composite_api_path("#{sobject}/#{id}"),
66
+ body: attrs_without_id,
67
+ referenceId: reference_id
68
+ }
69
+ end
70
+
71
+ def destroy(sobject, reference_id, id)
72
+ requests << {
73
+ method: 'DELETE',
74
+ url: composite_api_path("#{sobject}/#{id}"),
75
+ referenceId: reference_id
76
+ }
77
+ end
78
+
79
+ def upsert(sobject, reference_id, ext_field, attrs)
80
+ raise ArgumentError, 'External id field missing.' unless ext_field
81
+
82
+ ext_id = attrs.fetch(attrs.keys.find do |k, _v|
83
+ k.to_s.casecmp?(ext_field.to_s)
84
+ end, nil)
85
+ raise ArgumentError, 'External id missing from attrs.' unless ext_id
86
+
87
+ attrs_without_ext_id = attrs.reject { |k, _v| k.to_s.casecmp?(ext_field) }
88
+ requests << {
89
+ method: 'PATCH',
90
+ url: composite_api_path("#{sobject}/#{ext_field}/#{ext_id}"),
91
+ body: attrs_without_ext_id,
92
+ referenceId: reference_id
93
+ }
94
+ end
95
+
96
+ private
97
+
98
+ def composite_api_path(path)
99
+ "/services/data/v#{options[:api_version]}/sobjects/#{path}"
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -85,7 +85,7 @@ module Restforce
85
85
  def valid?(picklist_entry)
86
86
  valid_for = picklist_entry['validFor'].ljust(16, 'A').unpack1('m').
87
87
  unpack('C*')
88
- (valid_for[index >> 3] & (0x80 >> index % 8)).positive?
88
+ (valid_for[index >> 3] & (0x80 >> (index % 8))).positive?
89
89
  end
90
90
  end
91
91
  end
@@ -31,6 +31,8 @@ module Restforce
31
31
 
32
32
  class BccSelfNotAllowedIfBccComplianceEnabled < ResponseError; end
33
33
 
34
+ class BigObjectUnsupportedOperation < ResponseError; end
35
+
34
36
  class CannotCascadeProductActive < ResponseError; end
35
37
 
36
38
  class CannotChangeFieldTypeOfApexReferencedField < ResponseError; end
@@ -237,10 +239,14 @@ module Restforce
237
239
 
238
240
  class InvalidReadOnlyUserDml < ResponseError; end
239
241
 
242
+ class InvalidReplicationDate < ResponseError; end
243
+
240
244
  class InvalidSaveAsActivityFlag < ResponseError; end
241
245
 
242
246
  class InvalidSessionId < ResponseError; end
243
247
 
248
+ class InvalidSignupCountry < ResponseError; end
249
+
244
250
  class InvalidStatus < ResponseError; end
245
251
 
246
252
  class InvalidType < ResponseError; end
@@ -271,6 +277,8 @@ module Restforce
271
277
 
272
278
  class MalformedQuery < ResponseError; end
273
279
 
280
+ class MalformedSearch < ResponseError; end
281
+
274
282
  class ManagerNotDefined < ResponseError; end
275
283
 
276
284
  class MassmailRetryLimitExceeded < ResponseError; end
@@ -327,6 +335,8 @@ module Restforce
327
335
 
328
336
  class OpWithInvalidUserTypeException < ResponseError; end
329
337
 
338
+ class OperationTooLarge < ResponseError; end
339
+
330
340
  class OptedOutOfMassMail < ResponseError; end
331
341
 
332
342
  class PackageLicenseRequired < ResponseError; end
@@ -413,6 +423,7 @@ module Restforce
413
423
  BccNotAllowedIfBccComplianceEnabled,
414
424
  "BCC_SELF_NOT_ALLOWED_IF_BCC_COMPLIANCE_ENABLED" =>
415
425
  BccSelfNotAllowedIfBccComplianceEnabled,
426
+ "BIG_OBJECT_UNSUPPORTED_OPERATION" => BigObjectUnsupportedOperation,
416
427
  "CANNOT_CASCADE_PRODUCT_ACTIVE" => CannotCascadeProductActive,
417
428
  "CANNOT_CHANGE_FIELD_TYPE_OF_APEX_REFERENCED_FIELD" =>
418
429
  CannotChangeFieldTypeOfApexReferencedField,
@@ -523,8 +534,10 @@ module Restforce
523
534
  "INVALID_PARTNER_NETWORK_STATUS" => InvalidPartnerNetworkStatus,
524
535
  "INVALID_PERSON_ACCOUNT_OPERATION" => InvalidPersonAccountOperation,
525
536
  "INVALID_READ_ONLY_USER_DML" => InvalidReadOnlyUserDml,
537
+ "INVALID_REPLICATION_DATE" => InvalidReplicationDate,
526
538
  "INVALID_SAVE_AS_ACTIVITY_FLAG" => InvalidSaveAsActivityFlag,
527
539
  "INVALID_SESSION_ID" => InvalidSessionId,
540
+ "INVALID_SIGNUP_COUNTRY" => InvalidSignupCountry,
528
541
  "INVALID_STATUS" => InvalidStatus,
529
542
  "INVALID_TYPE" => InvalidType,
530
543
  "INVALID_TYPE_FOR_OPERATION" => InvalidTypeForOperation,
@@ -540,6 +553,7 @@ module Restforce
540
553
  "LOGIN_MUST_USE_SECURITY_TOKEN" => LoginMustUseSecurityToken,
541
554
  "MALFORMED_ID" => MalformedId,
542
555
  "MALFORMED_QUERY" => MalformedQuery,
556
+ "MALFORMED_SEARCH" => MalformedSearch,
543
557
  "MANAGER_NOT_DEFINED" => ManagerNotDefined,
544
558
  "MASSMAIL_RETRY_LIMIT_EXCEEDED" => MassmailRetryLimitExceeded,
545
559
  "MASS_MAIL_LIMIT_EXCEEDED" => MassMailLimitExceeded,
@@ -568,6 +582,7 @@ module Restforce
568
582
  "NUMBER_OUTSIDE_VALID_RANGE" => NumberOutsideValidRange,
569
583
  "NUM_HISTORY_FIELDS_BY_SOBJECT_EXCEEDED" => NumHistoryFieldsBySobjectExceeded,
570
584
  "OP_WITH_INVALID_USER_TYPE_EXCEPTION" => OpWithInvalidUserTypeException,
585
+ "OPERATION_TOO_LARGE" => OperationTooLarge,
571
586
  "OPTED_OUT_OF_MASS_MAIL" => OptedOutOfMassMail,
572
587
  "PACKAGE_LICENSE_REQUIRED" => PackageLicenseRequired,
573
588
  "PLATFORM_EVENT_ENCRYPTION_ERROR" => PlatformEventEncryptionError,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Restforce
4
- VERSION = '5.1.0'
4
+ VERSION = '5.2.2'
5
5
  end
data/lib/restforce.rb CHANGED
@@ -32,6 +32,7 @@ module Restforce
32
32
  autoload :Base, 'restforce/concerns/base'
33
33
  autoload :API, 'restforce/concerns/api'
34
34
  autoload :BatchAPI, 'restforce/concerns/batch_api'
35
+ autoload :CompositeAPI, 'restforce/concerns/composite_api'
35
36
  end
36
37
 
37
38
  module Data
@@ -48,6 +49,7 @@ module Restforce
48
49
  UnauthorizedError = Class.new(Faraday::ClientError)
49
50
  APIVersionError = Class.new(Error)
50
51
  BatchAPIError = Class.new(Error)
52
+ CompositeAPIError = Class.new(Error)
51
53
 
52
54
  # Inherit from Faraday::ResourceNotFound for backwards-compatibility
53
55
  # Consumers of this library that rescue and handle Faraday::ResourceNotFound
data/restforce.gemspec CHANGED
@@ -19,13 +19,14 @@ Gem::Specification.new do |gem|
19
19
 
20
20
  gem.metadata = {
21
21
  'source_code_uri' => 'https://github.com/restforce/restforce',
22
- 'changelog_uri' => 'https://github.com/restforce/restforce/blob/master/CHANGELOG.md'
22
+ 'changelog_uri' => 'https://github.com/restforce/restforce/blob/master/CHANGELOG.md',
23
+ 'rubygems_mfa_required' => 'true'
23
24
  }
24
25
 
25
26
  gem.required_ruby_version = '>= 2.6'
26
27
 
27
28
  gem.add_dependency 'faraday', '<= 2.0', '>= 0.9.0'
28
29
  gem.add_dependency 'faraday_middleware', ['>= 0.8.8', '<= 2.0']
29
- gem.add_dependency 'hashie', '>= 1.2.0', '< 5.0'
30
+ gem.add_dependency 'hashie', '>= 1.2.0', '< 6.0'
30
31
  gem.add_dependency 'jwt', ['>= 1.5.6']
31
32
  end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Restforce::Concerns::CompositeAPI do
6
+ let(:endpoint) { 'composite' }
7
+
8
+ before do
9
+ client.should_receive(:options).and_return(api_version: 38.0)
10
+ end
11
+
12
+ shared_examples_for 'composite requests' do
13
+ it '#create' do
14
+ client.
15
+ should_receive(:api_post).
16
+ with(endpoint, { compositeRequest: [
17
+ {
18
+ method: 'POST',
19
+ url: '/services/data/v38.0/sobjects/Object',
20
+ body: { name: 'test' },
21
+ referenceId: 'create_ref'
22
+ }
23
+ ], allOrNone: all_or_none, collateSubrequests: false }.to_json).
24
+ and_return(response)
25
+
26
+ client.send(method) do |subrequests|
27
+ subrequests.create('Object', 'create_ref', name: 'test')
28
+ end
29
+ end
30
+
31
+ it '#update' do
32
+ client.
33
+ should_receive(:api_post).
34
+ with(endpoint, { compositeRequest: [
35
+ {
36
+ method: 'PATCH',
37
+ url: '/services/data/v38.0/sobjects/Object/123',
38
+ body: { name: 'test' },
39
+ referenceId: 'update_ref'
40
+ }
41
+ ], allOrNone: all_or_none, collateSubrequests: false }.to_json).
42
+ and_return(response)
43
+
44
+ client.send(method) do |subrequests|
45
+ subrequests.update('Object', 'update_ref', id: '123', name: 'test')
46
+ end
47
+ end
48
+
49
+ it '#destroy' do
50
+ client.
51
+ should_receive(:api_post).
52
+ with(endpoint, { compositeRequest: [
53
+ {
54
+ method: 'DELETE',
55
+ url: '/services/data/v38.0/sobjects/Object/123',
56
+ referenceId: 'destroy_ref'
57
+ }
58
+ ], allOrNone: all_or_none, collateSubrequests: false }.to_json).
59
+ and_return(response)
60
+
61
+ client.send(method) do |subrequests|
62
+ subrequests.destroy('Object', 'destroy_ref', '123')
63
+ end
64
+ end
65
+
66
+ it '#upsert' do
67
+ client.
68
+ should_receive(:api_post).
69
+ with(endpoint, { compositeRequest: [
70
+ {
71
+ method: 'PATCH',
72
+ url: '/services/data/v38.0/sobjects/Object/extIdField__c/456',
73
+ body: { name: 'test' },
74
+ referenceId: 'upsert_ref'
75
+ }
76
+ ], allOrNone: all_or_none, collateSubrequests: false }.to_json).
77
+ and_return(response)
78
+
79
+ client.send(method) do |subrequests|
80
+ subrequests.upsert('Object', 'upsert_ref', 'extIdField__c',
81
+ extIdField__c: '456', name: 'test')
82
+ end
83
+ end
84
+
85
+ it 'multiple subrequests' do
86
+ client.
87
+ should_receive(:api_post).
88
+ with(endpoint, { compositeRequest: [
89
+ {
90
+ method: 'POST',
91
+ url: '/services/data/v38.0/sobjects/Object',
92
+ body: { name: 'test' },
93
+ referenceId: 'create_ref'
94
+ },
95
+ {
96
+ method: 'PATCH',
97
+ url: '/services/data/v38.0/sobjects/Object/123',
98
+ body: { name: 'test' },
99
+ referenceId: 'update_ref'
100
+ },
101
+ {
102
+ method: 'DELETE',
103
+ url: '/services/data/v38.0/sobjects/Object/123',
104
+ referenceId: 'destroy_ref'
105
+ }
106
+ ], allOrNone: all_or_none, collateSubrequests: false }.to_json).
107
+ and_return(response)
108
+
109
+ client.send(method) do |subrequests|
110
+ subrequests.create('Object', 'create_ref', name: 'test')
111
+ subrequests.update('Object', 'update_ref', id: '123', name: 'test')
112
+ subrequests.destroy('Object', 'destroy_ref', '123')
113
+ end
114
+ end
115
+
116
+ it 'fails if more than 25 requests' do
117
+ expect do
118
+ client.send(method) do |subrequests|
119
+ 26.times do |i|
120
+ subrequests.upsert('Object', "upsert_ref_#{i}", 'extIdField__c',
121
+ extIdField__c: '456', name: 'test')
122
+ end
123
+ end
124
+ end.to raise_error(ArgumentError)
125
+ end
126
+ end
127
+
128
+ describe '#composite' do
129
+ let(:method) { :composite }
130
+ let(:all_or_none) { false }
131
+ let(:response) { double('Faraday::Response', body: { 'CompositeResponse' => [] }) }
132
+ it_behaves_like 'composite requests'
133
+ end
134
+
135
+ describe '#composite!' do
136
+ let(:method) { :composite! }
137
+ let(:all_or_none) { true }
138
+ let(:response) do
139
+ double('Faraday::Response', body: { 'CompositeResponse' => [] })
140
+ end
141
+ it_behaves_like 'composite requests'
142
+ end
143
+ end
@@ -87,7 +87,7 @@ describe Restforce::Concerns::Streaming, event_machine: true do
87
87
  end
88
88
 
89
89
  it 'connects to the streaming api' do
90
- client.stub authenticate!: OpenStruct.new(access_token: 'secret2')
90
+ client.stub authenticate!: double(access_token: 'secret2')
91
91
  faye_double = double('Faye::Client')
92
92
  Faye::Client.
93
93
  should_receive(:new).
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: 5.1.0
4
+ version: 5.2.2
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: 2021-08-26 00:00:00.000000000 Z
12
+ date: 2021-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -60,7 +60,7 @@ dependencies:
60
60
  version: 1.2.0
61
61
  - - "<"
62
62
  - !ruby/object:Gem::Version
63
- version: '5.0'
63
+ version: '6.0'
64
64
  type: :runtime
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
@@ -70,7 +70,7 @@ dependencies:
70
70
  version: 1.2.0
71
71
  - - "<"
72
72
  - !ruby/object:Gem::Version
73
- version: '5.0'
73
+ version: '6.0'
74
74
  - !ruby/object:Gem::Dependency
75
75
  name: jwt
76
76
  requirement: !ruby/object:Gem::Requirement
@@ -121,6 +121,7 @@ files:
121
121
  - lib/restforce/concerns/batch_api.rb
122
122
  - lib/restforce/concerns/caching.rb
123
123
  - lib/restforce/concerns/canvas.rb
124
+ - lib/restforce/concerns/composite_api.rb
124
125
  - lib/restforce/concerns/connection.rb
125
126
  - lib/restforce/concerns/picklists.rb
126
127
  - lib/restforce/concerns/streaming.rb
@@ -209,6 +210,7 @@ files:
209
210
  - spec/unit/concerns/batch_api_spec.rb
210
211
  - spec/unit/concerns/caching_spec.rb
211
212
  - spec/unit/concerns/canvas_spec.rb
213
+ - spec/unit/concerns/composite_api_spec.rb
212
214
  - spec/unit/concerns/connection_spec.rb
213
215
  - spec/unit/concerns/streaming_spec.rb
214
216
  - spec/unit/config_spec.rb
@@ -236,6 +238,7 @@ licenses:
236
238
  metadata:
237
239
  source_code_uri: https://github.com/restforce/restforce
238
240
  changelog_uri: https://github.com/restforce/restforce/blob/master/CHANGELOG.md
241
+ rubygems_mfa_required: 'true'
239
242
  post_install_message:
240
243
  rdoc_options: []
241
244
  require_paths:
@@ -251,7 +254,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
251
254
  - !ruby/object:Gem::Version
252
255
  version: '0'
253
256
  requirements: []
254
- rubygems_version: 3.1.6
257
+ rubygems_version: 3.2.22
255
258
  signing_key:
256
259
  specification_version: 4
257
260
  summary: A lightweight Ruby client for the Salesforce REST API
@@ -310,6 +313,7 @@ test_files:
310
313
  - spec/unit/concerns/batch_api_spec.rb
311
314
  - spec/unit/concerns/caching_spec.rb
312
315
  - spec/unit/concerns/canvas_spec.rb
316
+ - spec/unit/concerns/composite_api_spec.rb
313
317
  - spec/unit/concerns/connection_spec.rb
314
318
  - spec/unit/concerns/streaming_spec.rb
315
319
  - spec/unit/config_spec.rb