gecko-ruby 0.2.2 → 0.2.3
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/.rubocop.yml +9 -9
- data/CHANGELOG.md +5 -0
- data/README.md +1 -1
- data/lib/gecko/record/base.rb +5 -2
- data/lib/gecko/record/base_adapter.rb +19 -8
- data/lib/gecko/record/company.rb +1 -1
- data/lib/gecko/record/order.rb +0 -1
- data/lib/gecko/version.rb +1 -1
- data/test/client_test.rb +1 -1
- data/test/helpers/serialization_helper_test.rb +1 -1
- data/test/record/account_adapter_test.rb +1 -0
- data/test/record/user_adapter_test.rb +1 -0
- data/test/support/shared_adapter_examples.rb +18 -1
- data/test/support/shared_record_examples.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c85728687e6bc4e59c11d5214181af686b350033
|
4
|
+
data.tar.gz: 18cc56bd3df2520071e796eb191eb8c341bc4666
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14c2cd95c537a35fb6a574c8991703333bd856a882f93bbca0f08922f7d2804ce0c512c7e91c40522be97fbe5d15e0e7fc40042705393c3c1a3e0dc818301aa5
|
7
|
+
data.tar.gz: 94114cbea7468c93308b60a8a68904874cd30f12588a2c801a27346f6767ccf3644911411ebecb52c94959d6be94d726c16c76894779c5e51ee2b348ff23d0f7
|
data/.rubocop.yml
CHANGED
@@ -6,7 +6,7 @@ AllCops:
|
|
6
6
|
# private
|
7
7
|
# ...
|
8
8
|
# end
|
9
|
-
|
9
|
+
Layout/AccessModifierIndentation:
|
10
10
|
EnforcedStyle: outdent
|
11
11
|
|
12
12
|
Style/Blocks:
|
@@ -16,26 +16,26 @@ Style/Blocks:
|
|
16
16
|
Style/BracesAroundHashParameters:
|
17
17
|
Enabled: false
|
18
18
|
|
19
|
-
|
19
|
+
Layout/DotPosition:
|
20
20
|
EnforcedStyle: leading
|
21
21
|
|
22
|
-
|
22
|
+
Layout/IndentHash:
|
23
23
|
EnforcedStyle: consistent
|
24
24
|
|
25
|
-
|
25
|
+
Metrics/LineLength:
|
26
26
|
Max: 120
|
27
27
|
|
28
28
|
Style/RedundantSelf:
|
29
29
|
Enabled: false
|
30
30
|
|
31
31
|
# We like neatly-aligned code
|
32
|
-
|
32
|
+
Layout/SpaceBeforeFirstArg:
|
33
33
|
Enabled: false
|
34
34
|
|
35
|
-
|
35
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
36
36
|
Enabled: false
|
37
37
|
|
38
|
-
|
38
|
+
Layout/SpaceInsideHashLiteralBraces:
|
39
39
|
Enabled: false
|
40
40
|
|
41
41
|
# Allow single or double quotes
|
@@ -44,7 +44,7 @@ Style/StringLiterals:
|
|
44
44
|
|
45
45
|
# Disable this until we can work out how to allow aligning of assignments
|
46
46
|
# https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/extra_spacing_spec.rb#L23
|
47
|
-
|
47
|
+
Layout/ExtraSpacing:
|
48
48
|
Enabled: false
|
49
49
|
|
50
50
|
Style/WordArray:
|
@@ -59,7 +59,7 @@ Style/SignalException:
|
|
59
59
|
Metrics/ClassLength:
|
60
60
|
Enabled: false
|
61
61
|
|
62
|
-
|
62
|
+
Layout/MultilineOperationIndentation:
|
63
63
|
Enabled: false
|
64
64
|
|
65
65
|
Style/ClassAndModuleChildren:
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
+
## 0.2.3 (2017-08-14)
|
2
|
+
- Add support for API idempotency @client.Record.save(idempotency_key: 'ABCDEF123456')
|
3
|
+
- Marked a couple of fields as readonly that weren't correctly marked so
|
4
|
+
|
1
5
|
## 0.2.2 (2016-06-06)
|
2
6
|
- Add `@client.Record.peek_all` to return all items currently in identity map
|
7
|
+
|
3
8
|
## 0.2.1 (2016-06-06) (Yanked)
|
4
9
|
## 0.2.0 (2016-06-06)
|
5
10
|
- Support `writeable_on :create` for attributes
|
data/README.md
CHANGED
data/lib/gecko/record/base.rb
CHANGED
@@ -43,11 +43,14 @@ module Gecko
|
|
43
43
|
|
44
44
|
# Save a record
|
45
45
|
#
|
46
|
+
# @param [Hash] opts the options to save the record with
|
47
|
+
# @option opts [Hash] :idempotency_key A unique identifier for this action
|
48
|
+
#
|
46
49
|
# @return <Gecko::Record::Base>
|
47
50
|
#
|
48
51
|
# @api public
|
49
|
-
def save
|
50
|
-
@client.adapter_for(self.class.demodulized_name).save(self)
|
52
|
+
def save(opts = {})
|
53
|
+
@client.adapter_for(self.class.demodulized_name).save(self, opts)
|
51
54
|
end
|
52
55
|
|
53
56
|
# Return the demodulized class name
|
@@ -185,7 +185,7 @@ module Gecko
|
|
185
185
|
#
|
186
186
|
# @api public
|
187
187
|
def size
|
188
|
-
(@pagination && @pagination['total_records']) || count
|
188
|
+
(defined?(@pagination) && @pagination['total_records']) || count
|
189
189
|
end
|
190
190
|
|
191
191
|
# Fetch a record via API, regardless of whether it is already in identity map.
|
@@ -264,16 +264,18 @@ module Gecko
|
|
264
264
|
# Save a record
|
265
265
|
#
|
266
266
|
# @params [Object] :record A Gecko::Record object
|
267
|
+
# @param [Hash] opts the options to make the request with
|
268
|
+
# @option opts [Hash] :idempotency_key A unique identifier for this action
|
267
269
|
#
|
268
270
|
# @return [Boolean] whether the save was successful.
|
269
271
|
# If false the record will contain an errors hash
|
270
272
|
#
|
271
273
|
# @api private
|
272
|
-
def save(record)
|
274
|
+
def save(record, opts = {})
|
273
275
|
if record.persisted?
|
274
|
-
update_record(record)
|
276
|
+
update_record(record, opts)
|
275
277
|
else
|
276
|
-
create_record(record)
|
278
|
+
create_record(record, opts)
|
277
279
|
end
|
278
280
|
end
|
279
281
|
|
@@ -338,11 +340,11 @@ module Gecko
|
|
338
340
|
# @return [OAuth2::Response]
|
339
341
|
#
|
340
342
|
# @api private
|
341
|
-
def create_record(record)
|
343
|
+
def create_record(record, opts = {})
|
342
344
|
response = request(:post, plural_path, {
|
343
345
|
body: record.as_json,
|
344
346
|
raise_errors: false
|
345
|
-
})
|
347
|
+
}.merge(headers: headers_from_opts(opts)))
|
346
348
|
handle_response(record, response)
|
347
349
|
end
|
348
350
|
|
@@ -351,11 +353,11 @@ module Gecko
|
|
351
353
|
# @return [OAuth2::Response]
|
352
354
|
#
|
353
355
|
# @api private
|
354
|
-
def update_record(record)
|
356
|
+
def update_record(record, opts = {})
|
355
357
|
response = request(:put, plural_path + "/" + record.id.to_s, {
|
356
358
|
body: record.as_json,
|
357
359
|
raise_errors: false
|
358
|
-
})
|
360
|
+
}.merge(headers: headers_from_opts(opts)))
|
359
361
|
handle_response(record, response)
|
360
362
|
end
|
361
363
|
|
@@ -389,6 +391,15 @@ module Gecko
|
|
389
391
|
@pagination = JSON.parse(headers["x-pagination"]) if headers["x-pagination"]
|
390
392
|
end
|
391
393
|
|
394
|
+
# Applies an idempotency key to the request if provided
|
395
|
+
#
|
396
|
+
# @api private
|
397
|
+
def headers_from_opts(opts)
|
398
|
+
headers = {}
|
399
|
+
headers['Idempotency-Key'] = opts[:idempotency_key] if opts[:idempotency_key]
|
400
|
+
headers
|
401
|
+
end
|
402
|
+
|
392
403
|
# Parse and instantiate sideloaded records
|
393
404
|
#
|
394
405
|
# @api private
|
data/lib/gecko/record/company.rb
CHANGED
data/lib/gecko/record/order.rb
CHANGED
@@ -11,7 +11,6 @@ module Gecko
|
|
11
11
|
belongs_to :contact
|
12
12
|
belongs_to :shipping_address, class_name: 'Address'
|
13
13
|
belongs_to :billing_address, class_name: 'Address'
|
14
|
-
belongs_to :contact, class_name: 'Contact'
|
15
14
|
belongs_to :user, readonly: true
|
16
15
|
belongs_to :assignee, class_name: 'User'
|
17
16
|
belongs_to :stock_location, class_name: 'Location'
|
data/lib/gecko/version.rb
CHANGED
data/test/client_test.rb
CHANGED
@@ -13,7 +13,7 @@ class ClientTest < Minitest::Test
|
|
13
13
|
def test_custom_user_agent
|
14
14
|
client = Gecko::Client.new("ABC", "DEF")
|
15
15
|
agent = client.oauth_client.connection.headers["User-Agent"]
|
16
|
-
assert_match(%r|Gecko/#{Gecko::VERSION} OAuth2/\d
|
16
|
+
assert_match(%r|Gecko/#{Gecko::VERSION} OAuth2/\d\.\d\.\d Faraday/\d\.\d+\.\d Ruby/\d\.\d\.\d|, agent)
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_allows_test_URLs
|
@@ -76,7 +76,7 @@ class Gecko::Helpers::SerializationHelperTest < Minitest::Test
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def test_root_key
|
79
|
-
record = Gecko::Record::OrderLineItem.new(@client,
|
79
|
+
record = Gecko::Record::OrderLineItem.new(@client, {})
|
80
80
|
assert_equal(:order_line_item, record.root)
|
81
81
|
end
|
82
82
|
|
@@ -10,6 +10,7 @@ class Gecko::Record::AccountAdapterTest < Minitest::Test
|
|
10
10
|
undef :test_build_with_attributes
|
11
11
|
undef :test_saving_new_record
|
12
12
|
undef :test_saving_new_invalid_record
|
13
|
+
undef :test_saving_record_with_idempotency_key
|
13
14
|
|
14
15
|
let(:adapter) { @client.Account }
|
15
16
|
let(:plural_name) { 'accounts' }
|
@@ -17,6 +17,7 @@ class Gecko::Record::UserAdapterTest < Minitest::Test
|
|
17
17
|
undef :test_build_with_attributes
|
18
18
|
undef :test_saving_new_record
|
19
19
|
undef :test_saving_new_invalid_record
|
20
|
+
undef :test_saving_record_with_idempotency_key
|
20
21
|
|
21
22
|
def test_current
|
22
23
|
VCR.use_cassette('users#current') do
|
@@ -66,7 +66,7 @@ module SharedAdapterExamples
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def test_fetch_miss
|
69
|
-
|
69
|
+
stub_request(:get, /#{plural_name}\/\d+/)
|
70
70
|
.to_return({
|
71
71
|
status: 404,
|
72
72
|
headers: {"Content-Type" => "application/json"},
|
@@ -145,6 +145,23 @@ module SharedAdapterExamples
|
|
145
145
|
assert(record.errors[:title].any?)
|
146
146
|
end
|
147
147
|
|
148
|
+
def test_saving_record_with_idempotency_key
|
149
|
+
record = adapter.build
|
150
|
+
mock_token = mock
|
151
|
+
mock_response = mock(status: 200, parsed: {plural_name.singularize => {id: 123}})
|
152
|
+
mock_token.expects(:request)
|
153
|
+
.with(:post, plural_name, {
|
154
|
+
body: record.as_json.to_json,
|
155
|
+
raise_errors: false,
|
156
|
+
headers: {
|
157
|
+
'Content-Type' => 'application/json',
|
158
|
+
'Idempotency-Key' => 'abcdefghijkl'
|
159
|
+
}
|
160
|
+
}).returns(mock_response)
|
161
|
+
adapter.client.access_token = mock_token
|
162
|
+
adapter.save(record, idempotency_key: 'abcdefghijkl')
|
163
|
+
end
|
164
|
+
|
148
165
|
private
|
149
166
|
def mock_api_request(record, request, response)
|
150
167
|
mock_token = mock
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gecko-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bradley Priest
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -357,7 +357,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
357
357
|
version: '0'
|
358
358
|
requirements: []
|
359
359
|
rubyforge_project:
|
360
|
-
rubygems_version: 2.
|
360
|
+
rubygems_version: 2.5.2
|
361
361
|
signing_key:
|
362
362
|
specification_version: 4
|
363
363
|
summary: A Ruby interface to the TradeGecko API.
|