my_john_deere_api 3.0.0 → 3.1.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/lib/my_john_deere_api/authorize.rb +20 -1
- data/lib/my_john_deere_api/helpers/case_conversion.rb +8 -9
- data/lib/my_john_deere_api/model/base.rb +2 -1
- data/lib/my_john_deere_api/model/organization.rb +15 -1
- data/lib/my_john_deere_api/version.rb +1 -1
- data/test/lib/my_john_deere_api/authorize_test.rb +1 -1
- data/test/lib/my_john_deere_api/helpers/case_conversion_test.rb +18 -0
- data/test/lib/my_john_deere_api/model/organization_test.rb +74 -27
- data/test/support/vcr_setup.rb +15 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba2b1a3274a3f5ae20bdfeaf13a770db0aa6b5b5cf9a0d87b0894e99a17d2423
|
4
|
+
data.tar.gz: 806bb77756d614db71ebdc06d3ffd68e7ea1a4afc5dac0612444501acafafc22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cba9de4b20f90959a9c9c3103515345cad97346fd1515d8d2d6e1aaa5e44e463e9d991724b52d9b7f58f5cee27960e512c0def8715eea00782a5cbaaeb47ef5f
|
7
|
+
data.tar.gz: 81273181c21ecd1ceba98f265f5d7c22f9050e96e036e2899fe1ccaa66a6855ccb1bf190c454920890daca38872359753c828f80f8431b0ee5a8e7b9bdbcc66f
|
@@ -13,6 +13,25 @@ module MyJohnDeereApi
|
|
13
13
|
#
|
14
14
|
# This is used to obtain authentication an access key/secret
|
15
15
|
# on behalf of a user.
|
16
|
+
#
|
17
|
+
# parameters:
|
18
|
+
#
|
19
|
+
# api_key - required JD API key for client application
|
20
|
+
# api_secret - required JD API secret for client application
|
21
|
+
# options - options hash, see below for details
|
22
|
+
#
|
23
|
+
# options:
|
24
|
+
#
|
25
|
+
# :environment - one of [:live, :staging]
|
26
|
+
# :scope - a space-delimited list of scopes requested
|
27
|
+
# :scopes - an array of scopes requested. 'offline_access' will be added if
|
28
|
+
# it isn't included already. This will overwrite :scope option if
|
29
|
+
# both are provided.
|
30
|
+
# :state - a unique identifier for this request. JD will return this when
|
31
|
+
# it redirects back after authorization, so that the client can identify
|
32
|
+
# which of its users this request belongs to.
|
33
|
+
# :redirect_uri - the uri for JD to redirect back to, after authorization.
|
34
|
+
|
16
35
|
|
17
36
|
def initialize(api_key, api_secret, options = {})
|
18
37
|
@options = DEFAULTS.merge(options)
|
@@ -62,7 +81,7 @@ module MyJohnDeereApi
|
|
62
81
|
token = oauth_client.auth_code.get_token(code, redirect_uri: options[:redirect_uri])
|
63
82
|
|
64
83
|
# normalize hash
|
65
|
-
@token_hash =
|
84
|
+
@token_hash = token.to_hash.transform_keys(&:to_s)
|
66
85
|
end
|
67
86
|
|
68
87
|
##
|
@@ -7,12 +7,13 @@ module MyJohnDeereApi::Helpers::CaseConversion
|
|
7
7
|
# convert a text or camelcase string to underscore
|
8
8
|
|
9
9
|
def underscore(something)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
elsif something.is_a?(Hash)
|
10
|
+
case something
|
11
|
+
when Symbol, String
|
12
|
+
something.to_s.gsub(/([a-z])([A-Z])/, '\1_\2').gsub(/\s+/, '_').gsub(/_+/, '_').downcase
|
13
|
+
when Hash
|
15
14
|
something.transform_keys{ |key| underscore(key) }
|
15
|
+
when Array
|
16
|
+
something.map{|element| underscore(element)}
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -20,11 +21,9 @@ module MyJohnDeereApi::Helpers::CaseConversion
|
|
20
21
|
# convert text or underscored string to camelcase
|
21
22
|
|
22
23
|
def camelize(something)
|
23
|
-
something = something.to_s if something.is_a?(Symbol)
|
24
|
-
|
25
24
|
case something
|
26
|
-
when String
|
27
|
-
list = something.strip.split(/[_\s]+/)
|
25
|
+
when Symbol, String
|
26
|
+
list = something.to_s.strip.split(/[_\s]+/)
|
28
27
|
|
29
28
|
# preserve case of the first element
|
30
29
|
new_list = [list.shift]
|
@@ -3,7 +3,7 @@ module MyJohnDeereApi
|
|
3
3
|
include Helpers::CaseConversion
|
4
4
|
include Helpers::UriHelpers
|
5
5
|
|
6
|
-
attr_reader :id, :record_type, :client, :links
|
6
|
+
attr_reader :id, :record, :record_type, :client, :links
|
7
7
|
|
8
8
|
##
|
9
9
|
# arguments:
|
@@ -19,6 +19,7 @@ module MyJohnDeereApi
|
|
19
19
|
verify_record_type(record['@type'])
|
20
20
|
|
21
21
|
@id = record['id']
|
22
|
+
@record = record
|
22
23
|
@record_type = record['@type']
|
23
24
|
@client = client
|
24
25
|
@unsaved = false
|
@@ -28,6 +28,20 @@ module MyJohnDeereApi
|
|
28
28
|
@assets = MyJohnDeereApi::Request::Collection::Assets.new(client, organization: id)
|
29
29
|
end
|
30
30
|
|
31
|
+
##
|
32
|
+
# whether this organization still needs to be approved in JD "connections"
|
33
|
+
|
34
|
+
def needs_connection?
|
35
|
+
links.key?('connections')
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# the URI for JD connections page, if available
|
40
|
+
|
41
|
+
def connections_uri
|
42
|
+
record['links'].detect{|link| link['rel'] == 'connections'}&.fetch('uri')
|
43
|
+
end
|
44
|
+
|
31
45
|
private
|
32
46
|
|
33
47
|
def map_attributes(record)
|
@@ -40,4 +54,4 @@ module MyJohnDeereApi
|
|
40
54
|
'Organization'
|
41
55
|
end
|
42
56
|
end
|
43
|
-
end
|
57
|
+
end
|
@@ -85,7 +85,7 @@ describe 'MyJohnDeereApi::Authorize' do
|
|
85
85
|
new_hash = VCR.use_cassette('get_refresh_token') { subject }
|
86
86
|
|
87
87
|
# normalize response hash
|
88
|
-
new_hash =
|
88
|
+
new_hash = new_hash.transform_keys(&:to_s)
|
89
89
|
|
90
90
|
assert_equal new_access_token, new_hash['access_token']
|
91
91
|
end
|
@@ -34,6 +34,15 @@ describe 'Helpers::CaseConversion' do
|
|
34
34
|
assert_equal new_hash['asset_type'], hash[:assetType]
|
35
35
|
end
|
36
36
|
|
37
|
+
it 'converts the elements of an array' do
|
38
|
+
array = ['assetCategory', 'assetType']
|
39
|
+
|
40
|
+
new_array = object.send(:underscore, array)
|
41
|
+
|
42
|
+
assert_includes new_array, 'asset_category'
|
43
|
+
assert_includes new_array, 'asset_type'
|
44
|
+
end
|
45
|
+
|
37
46
|
it 'handles leading uppercase' do
|
38
47
|
string = object.send(:underscore, 'CamelCaseExample')
|
39
48
|
assert_equal 'camel_case_example', string
|
@@ -88,6 +97,15 @@ describe 'Helpers::CaseConversion' do
|
|
88
97
|
assert_equal new_hash['assetType'], hash[:asset_type]
|
89
98
|
end
|
90
99
|
|
100
|
+
it 'converts the elements of an array' do
|
101
|
+
array = ['asset_category', 'asset_type']
|
102
|
+
|
103
|
+
new_array = object.send(:camelize, array)
|
104
|
+
|
105
|
+
assert_includes new_array, 'assetCategory'
|
106
|
+
assert_includes new_array, 'assetType'
|
107
|
+
end
|
108
|
+
|
91
109
|
it 'is a private method' do
|
92
110
|
exception = assert_raises(NoMethodError) { object.camelize('test') }
|
93
111
|
assert_includes exception.message, 'private method'
|
@@ -4,6 +4,7 @@ describe 'MyJohnDeereApi::Model::Organization' do
|
|
4
4
|
include JD::LinkHelpers
|
5
5
|
|
6
6
|
let(:klass) { JD::Model::Organization }
|
7
|
+
let(:object) { klass.new(client, record) }
|
7
8
|
|
8
9
|
let(:record) do
|
9
10
|
{
|
@@ -12,44 +13,54 @@ describe 'MyJohnDeereApi::Model::Organization' do
|
|
12
13
|
"type"=>"customer",
|
13
14
|
"member"=>true,
|
14
15
|
"id"=>"123456",
|
15
|
-
"links"=>
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
16
|
+
"links"=> links,
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:links) do
|
21
|
+
[
|
22
|
+
{"@type"=>"Link", "rel"=>"self", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}"},
|
23
|
+
{"@type"=>"Link", "rel"=>"machines", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/machines"},
|
24
|
+
{"@type"=>"Link", "rel"=>"wdtCapableMachines", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/machines?capability=wdt"},
|
25
|
+
{"@type"=>"Link", "rel"=>"files", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/files"},
|
26
|
+
{"@type"=>"Link", "rel"=>"transferableFiles", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/files?transferable=true"},
|
27
|
+
{"@type"=>"Link", "rel"=>"uploadFile", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/files"},
|
28
|
+
{"@type"=>"Link", "rel"=>"sendFileToMachine", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/fileTransfers"},
|
29
|
+
{"@type"=>"Link", "rel"=>"addMachine", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/machines"},
|
30
|
+
{"@type"=>"Link", "rel"=>"addField", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/fields"},
|
31
|
+
{"@type"=>"Link", "rel"=>"assets", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/assets"},
|
32
|
+
{"@type"=>"Link", "rel"=>"fields", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/fields"},
|
33
|
+
{"@type"=>"Link", "rel"=>"farms", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/farms"},
|
34
|
+
{"@type"=>"Link", "rel"=>"boundaries", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/boundaries"},
|
35
|
+
{"@type"=>"Link", "rel"=>"clients", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/clients"},
|
36
|
+
{"@type"=>"Link", "rel"=>"controllers", "uri"=>"https://sandboxapi.deere.com/platform/organizations/#{organization_id}/orgController"}
|
37
|
+
]
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:connections_link) do
|
41
|
+
{
|
42
|
+
"@type"=>"Link",
|
43
|
+
"rel"=>"connections",
|
44
|
+
"uri"=>"https://connections.deere.com/connections/johndeere-0000000000000000000000000000000000000000/organizations"
|
32
45
|
}
|
33
46
|
end
|
34
47
|
|
35
48
|
describe '#initialize(record, client = nil)' do
|
36
49
|
it 'sets the attributes from the given record' do
|
37
|
-
|
38
|
-
|
39
|
-
assert_equal client, organization.client
|
40
|
-
assert_equal accessor, organization.accessor
|
50
|
+
assert_equal client, object.client
|
51
|
+
assert_equal accessor, object.accessor
|
41
52
|
|
42
53
|
# basic attributes
|
43
|
-
assert_equal record['name'],
|
44
|
-
assert_equal record['type'],
|
45
|
-
assert_equal record['member'],
|
46
|
-
assert_equal record['id'],
|
54
|
+
assert_equal record['name'], object.name
|
55
|
+
assert_equal record['type'], object.type
|
56
|
+
assert_equal record['member'], object.member?
|
57
|
+
assert_equal record['id'], object.id
|
47
58
|
|
48
59
|
# links to other things
|
49
|
-
assert_kind_of Hash,
|
60
|
+
assert_kind_of Hash, object.links
|
50
61
|
|
51
62
|
['fields', 'machines', 'files', 'assets', 'farms', 'boundaries', 'clients', 'controllers'].each do |association|
|
52
|
-
assert_link_for(
|
63
|
+
assert_link_for(object, association)
|
53
64
|
end
|
54
65
|
end
|
55
66
|
end
|
@@ -79,4 +90,40 @@ describe 'MyJohnDeereApi::Model::Organization' do
|
|
79
90
|
end
|
80
91
|
end
|
81
92
|
end
|
93
|
+
|
94
|
+
describe '#needs_connection?' do
|
95
|
+
subject { object.needs_connection? }
|
96
|
+
|
97
|
+
describe 'when user needs to connect organization within JD platform' do
|
98
|
+
let(:links) { [connections_link] }
|
99
|
+
|
100
|
+
it 'returns true' do
|
101
|
+
assert subject
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "when user doesn't need to connect org" do
|
106
|
+
it 'returns false' do
|
107
|
+
refute subject
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe '#connections_uri' do
|
113
|
+
subject { object.connections_uri }
|
114
|
+
|
115
|
+
describe 'when user needs to connect organization within JD platform' do
|
116
|
+
let(:links) { [connections_link] }
|
117
|
+
|
118
|
+
it 'returns the URI for JD connections' do
|
119
|
+
assert_includes subject, 'https://connections.deere.com/connections'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "when user doesn't need to connect org" do
|
124
|
+
it 'returns nil' do
|
125
|
+
assert_nil subject
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
82
129
|
end
|
data/test/support/vcr_setup.rb
CHANGED
@@ -170,13 +170,23 @@ class VcrSetup
|
|
170
170
|
def token_hash
|
171
171
|
return @token_hash if defined?(@token_hash)
|
172
172
|
|
173
|
-
|
173
|
+
if File.exist?(token_file)
|
174
|
+
@token_hash = JSON.parse(File.read(token_file))
|
174
175
|
|
175
|
-
|
176
|
+
token = OAuth2::AccessToken.from_hash(auth_client, @token_hash)
|
176
177
|
|
177
|
-
|
178
|
-
|
179
|
-
|
178
|
+
if token.expired?
|
179
|
+
new_token = token.refresh!
|
180
|
+
set_token_hash(new_token)
|
181
|
+
end
|
182
|
+
else
|
183
|
+
@token_hash = {
|
184
|
+
"token_type": "Bearer",
|
185
|
+
"scope": "ag2 ag1 offline_access ag3",
|
186
|
+
"access_token": access_token,
|
187
|
+
"refresh_token": refresh_token,
|
188
|
+
"expires_at": 1616484631
|
189
|
+
}
|
180
190
|
end
|
181
191
|
|
182
192
|
@token_hash
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: my_john_deere_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaime Bellmyer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-03-
|
12
|
+
date: 2021-03-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: vcr
|