my_john_deere_api 2.5.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/my_john_deere_api.rb +1 -1
- data/lib/my_john_deere_api/authorize.rb +36 -27
- data/lib/my_john_deere_api/client.rb +38 -29
- data/lib/my_john_deere_api/consumer.rb +46 -35
- data/lib/my_john_deere_api/helpers/case_conversion.rb +5 -2
- data/lib/my_john_deere_api/helpers/uri_helpers.rb +1 -1
- data/lib/my_john_deere_api/model/contribution_definition.rb +1 -1
- data/lib/my_john_deere_api/net_http_retry/decorator.rb +10 -11
- data/lib/my_john_deere_api/net_http_retry/invalid_response_error.rb +2 -2
- data/lib/my_john_deere_api/request/collection/asset_locations.rb +1 -1
- data/lib/my_john_deere_api/request/collection/assets.rb +1 -1
- data/lib/my_john_deere_api/request/collection/base.rb +2 -14
- data/lib/my_john_deere_api/request/collection/contribution_definitions.rb +1 -1
- data/lib/my_john_deere_api/request/collection/contribution_products.rb +1 -1
- data/lib/my_john_deere_api/request/collection/fields.rb +1 -1
- data/lib/my_john_deere_api/request/collection/flags.rb +1 -1
- data/lib/my_john_deere_api/request/collection/organizations.rb +1 -1
- data/lib/my_john_deere_api/request/create/asset.rb +8 -11
- data/lib/my_john_deere_api/request/create/asset_location.rb +24 -25
- data/lib/my_john_deere_api/request/create/base.rb +2 -20
- data/lib/my_john_deere_api/request/individual/asset.rb +2 -2
- data/lib/my_john_deere_api/request/individual/base.rb +6 -24
- data/lib/my_john_deere_api/request/individual/contribution_definition.rb +1 -1
- data/lib/my_john_deere_api/request/individual/contribution_product.rb +1 -1
- data/lib/my_john_deere_api/request/individual/field.rb +1 -1
- data/lib/my_john_deere_api/request/individual/organization.rb +1 -1
- data/lib/my_john_deere_api/request/update/asset.rb +2 -2
- data/lib/my_john_deere_api/request/update/base.rb +1 -19
- data/lib/my_john_deere_api/version.rb +1 -1
- data/test/lib/my_john_deere_api/authorize_test.rb +37 -25
- data/test/lib/my_john_deere_api/client_test.rb +22 -56
- data/test/lib/my_john_deere_api/consumer_test.rb +16 -28
- data/test/lib/my_john_deere_api/helpers/uri_helpers_test.rb +0 -10
- data/test/lib/my_john_deere_api/model/asset_location_test.rb +0 -4
- data/test/lib/my_john_deere_api/model/asset_test.rb +9 -8
- data/test/lib/my_john_deere_api/model/base_test.rb +4 -8
- data/test/lib/my_john_deere_api/model/contribution_definition_test.rb +3 -7
- data/test/lib/my_john_deere_api/model/contribution_product_test.rb +4 -7
- data/test/lib/my_john_deere_api/model/field_test.rb +4 -6
- data/test/lib/my_john_deere_api/model/flag_test.rb +6 -7
- data/test/lib/my_john_deere_api/model/organization_test.rb +3 -5
- data/test/lib/my_john_deere_api/net_http_retry/decorator_test.rb +14 -14
- data/test/lib/my_john_deere_api/net_http_retry/invalid_response_error_test.rb +22 -2
- data/test/lib/my_john_deere_api/request/collection/asset_locations_test.rb +2 -2
- data/test/lib/my_john_deere_api/request/collection/assets_test.rb +2 -2
- data/test/lib/my_john_deere_api/request/collection/contribution_definitions_test.rb +2 -2
- data/test/lib/my_john_deere_api/request/collection/contribution_products_test.rb +2 -2
- data/test/lib/my_john_deere_api/request/collection/fields_test.rb +2 -2
- data/test/lib/my_john_deere_api/request/collection/flags_test.rb +2 -2
- data/test/lib/my_john_deere_api/request/collection/organizations_test.rb +2 -2
- data/test/lib/my_john_deere_api/request/create/asset_location_test.rb +3 -2
- data/test/lib/my_john_deere_api/request/create/asset_test.rb +5 -4
- data/test/lib/my_john_deere_api/request/create/base_test.rb +0 -14
- data/test/lib/my_john_deere_api/request/individual/asset_test.rb +2 -3
- data/test/lib/my_john_deere_api/request/individual/base_test.rb +0 -1
- data/test/lib/my_john_deere_api/request/individual/contribution_definition_test.rb +2 -3
- data/test/lib/my_john_deere_api/request/individual/contribution_product_test.rb +2 -3
- data/test/lib/my_john_deere_api/request/individual/field_test.rb +2 -3
- data/test/lib/my_john_deere_api/request/individual/organization_test.rb +2 -3
- data/test/lib/my_john_deere_api/request/update/asset_test.rb +5 -17
- data/test/lib/my_john_deere_api/request/update/base_test.rb +0 -14
- data/test/support/helper.rb +14 -5
- data/test/support/link_helpers.rb +14 -0
- data/test/support/response_helpers.rb +18 -0
- data/test/support/vcr/catalog.yml +44 -37
- data/test/support/vcr/get_access_token.yml +90 -17
- data/test/support/vcr/get_refresh_token.yml +159 -0
- data/test/support/vcr/get_request_url.yml +51 -0
- data/test/support/vcr_setup.rb +80 -19
- metadata +11 -8
- data/test/support/vcr/get_request_token.yml +0 -83
@@ -15,14 +15,6 @@ module MyJohnDeereApi
|
|
15
15
|
@items = []
|
16
16
|
end
|
17
17
|
|
18
|
-
##
|
19
|
-
# client accessor
|
20
|
-
|
21
|
-
def accessor
|
22
|
-
return @accessor if defined?(@accessor)
|
23
|
-
@accessor = client&.accessor
|
24
|
-
end
|
25
|
-
|
26
18
|
##
|
27
19
|
# Iterate lazily through all records in the collection, fetching
|
28
20
|
# additional pages as needed.
|
@@ -54,7 +46,7 @@ module MyJohnDeereApi
|
|
54
46
|
def first_page
|
55
47
|
return @first_page if defined?(@first_page)
|
56
48
|
|
57
|
-
@first_page =
|
49
|
+
@first_page = client.get(resource)
|
58
50
|
extract_page_contents(@first_page)
|
59
51
|
|
60
52
|
@first_page
|
@@ -63,14 +55,10 @@ module MyJohnDeereApi
|
|
63
55
|
def fetch
|
64
56
|
return unless @next_page
|
65
57
|
|
66
|
-
page =
|
58
|
+
page = client.get(@next_page)
|
67
59
|
extract_page_contents(page)
|
68
60
|
end
|
69
61
|
|
70
|
-
def headers
|
71
|
-
@headers ||= {accept: 'application/vnd.deere.axiom.v3+json'}
|
72
|
-
end
|
73
|
-
|
74
62
|
def extract_page_contents(page)
|
75
63
|
add_items_from_page(page)
|
76
64
|
set_next_page(page)
|
@@ -6,7 +6,7 @@ module MyJohnDeereApi::Request
|
|
6
6
|
# The resource path for the first page in the collection
|
7
7
|
|
8
8
|
def resource
|
9
|
-
"/contributionProducts/#{associations[:contribution_product]}/contributionDefinitions"
|
9
|
+
"/platform/contributionProducts/#{associations[:contribution_product]}/contributionDefinitions"
|
10
10
|
end
|
11
11
|
|
12
12
|
##
|
@@ -6,7 +6,7 @@ module MyJohnDeereApi::Request
|
|
6
6
|
# The resource path for the first page in the collection
|
7
7
|
|
8
8
|
def resource
|
9
|
-
"/organizations/#{associations[:organization]}/fields/#{associations[:field]}/flags"
|
9
|
+
"/platform/organizations/#{associations[:organization]}/fields/#{associations[:field]}/flags"
|
10
10
|
end
|
11
11
|
|
12
12
|
##
|
@@ -8,27 +8,24 @@ module MyJohnDeereApi
|
|
8
8
|
private
|
9
9
|
|
10
10
|
##
|
11
|
-
#
|
11
|
+
# id of newly created record
|
12
12
|
|
13
|
-
def
|
14
|
-
|
15
|
-
result = accessor.get(path, headers)
|
16
|
-
|
17
|
-
JSON.parse(result.body)
|
13
|
+
def record_id
|
14
|
+
response.headers['location'].split('/').last
|
18
15
|
end
|
19
16
|
|
20
17
|
##
|
21
|
-
# This is the class used to
|
18
|
+
# This is the class used to fetch an individual item
|
22
19
|
|
23
|
-
def
|
24
|
-
|
20
|
+
def individual_class
|
21
|
+
Request::Individual::Asset
|
25
22
|
end
|
26
23
|
|
27
24
|
##
|
28
25
|
# Path supplied to API
|
29
26
|
|
30
27
|
def resource
|
31
|
-
@resource ||= "/organizations/#{attributes[:organization_id]}/assets"
|
28
|
+
@resource ||= "/platform/organizations/#{attributes[:organization_id]}/assets"
|
32
29
|
end
|
33
30
|
|
34
31
|
##
|
@@ -48,7 +45,7 @@ module MyJohnDeereApi
|
|
48
45
|
{
|
49
46
|
'@type' => 'Link',
|
50
47
|
'rel' => 'contributionDefinition',
|
51
|
-
'uri' =>
|
48
|
+
'uri' => client.contribution_definition_uri,
|
52
49
|
}
|
53
50
|
]
|
54
51
|
}
|
@@ -3,6 +3,29 @@ require 'date'
|
|
3
3
|
module MyJohnDeereApi
|
4
4
|
class Request::Create::AssetLocation < Request::Create::Base
|
5
5
|
include Validators::AssetLocation
|
6
|
+
include Helpers::UriHelpers
|
7
|
+
|
8
|
+
##
|
9
|
+
# Object created by request
|
10
|
+
#
|
11
|
+
# There is no endpoint to fetch a single location by id, so we have to
|
12
|
+
# override the `object` method from the base class.
|
13
|
+
#
|
14
|
+
# We have to fetch locations in bulk via the asset, but there could be
|
15
|
+
# thousands. We limit the request to just the first record from the
|
16
|
+
# location list endpoint, since locations are returned newest to oldest.
|
17
|
+
|
18
|
+
def object
|
19
|
+
return @object if defined?(@object)
|
20
|
+
|
21
|
+
request unless response
|
22
|
+
|
23
|
+
path = uri_path(response.headers['location']) + '?count=1'
|
24
|
+
result = client.get(path)
|
25
|
+
record = result['values'].first
|
26
|
+
|
27
|
+
@object = Model::AssetLocation.new(client, record)
|
28
|
+
end
|
6
29
|
|
7
30
|
private
|
8
31
|
|
@@ -72,24 +95,7 @@ module MyJohnDeereApi
|
|
72
95
|
# Path supplied to API
|
73
96
|
|
74
97
|
def resource
|
75
|
-
@resource ||= "/assets/#{attributes[:asset_id]}/locations"
|
76
|
-
end
|
77
|
-
|
78
|
-
##
|
79
|
-
# Retrieve newly created record
|
80
|
-
|
81
|
-
def fetch_record
|
82
|
-
# There is no endpoint to fetch a single location by id. We have to fetch
|
83
|
-
# them in bulk via the asset, but there could be thousands. We limit the
|
84
|
-
# request to just the first record from the location list endpoint, since
|
85
|
-
# locations are returned newest to oldest.
|
86
|
-
|
87
|
-
path = response['location'].split('/platform').last
|
88
|
-
path += "?count=1"
|
89
|
-
|
90
|
-
result = accessor.get(path, headers)
|
91
|
-
|
92
|
-
JSON.parse(result.body)['values'].first
|
98
|
+
@resource ||= "/platform/assets/#{attributes[:asset_id]}/locations"
|
93
99
|
end
|
94
100
|
|
95
101
|
##
|
@@ -99,12 +105,5 @@ module MyJohnDeereApi
|
|
99
105
|
stamp = DateTime.parse(timestamp).to_time + seconds
|
100
106
|
stamp.to_datetime.strftime('%Y-%m-%dT%H:%M:%SZ')
|
101
107
|
end
|
102
|
-
|
103
|
-
##
|
104
|
-
# This is the class used to model the data
|
105
|
-
|
106
|
-
def model
|
107
|
-
Model::AssetLocation
|
108
|
-
end
|
109
108
|
end
|
110
109
|
end
|
@@ -16,21 +16,13 @@ module MyJohnDeereApi
|
|
16
16
|
process_attributes
|
17
17
|
end
|
18
18
|
|
19
|
-
##
|
20
|
-
# client accessor
|
21
|
-
|
22
|
-
def accessor
|
23
|
-
return @accessor if defined?(@accessor)
|
24
|
-
@accessor = client&.accessor
|
25
|
-
end
|
26
|
-
|
27
19
|
##
|
28
20
|
# Make the request, if the instance is valid
|
29
21
|
|
30
22
|
def request
|
31
23
|
validate!
|
32
24
|
|
33
|
-
@response =
|
25
|
+
@response = client.post(resource, request_body)
|
34
26
|
end
|
35
27
|
|
36
28
|
##
|
@@ -41,7 +33,7 @@ module MyJohnDeereApi
|
|
41
33
|
|
42
34
|
request unless response
|
43
35
|
|
44
|
-
@object =
|
36
|
+
@object = individual_class.new(client, record_id).object
|
45
37
|
end
|
46
38
|
|
47
39
|
private
|
@@ -53,15 +45,5 @@ module MyJohnDeereApi
|
|
53
45
|
|
54
46
|
def process_attributes
|
55
47
|
end
|
56
|
-
|
57
|
-
##
|
58
|
-
# Headers for POST request
|
59
|
-
|
60
|
-
def headers
|
61
|
-
@headers ||= {
|
62
|
-
'Accept' => 'application/vnd.deere.axiom.v3+json',
|
63
|
-
'Content-Type' => 'application/vnd.deere.axiom.v3+json'
|
64
|
-
}
|
65
|
-
end
|
66
48
|
end
|
67
49
|
end
|
@@ -3,10 +3,10 @@ require 'json'
|
|
3
3
|
module MyJohnDeereApi::Request
|
4
4
|
class Individual::Asset < Individual::Base
|
5
5
|
##
|
6
|
-
# The resource path for the
|
6
|
+
# The resource path for the object
|
7
7
|
|
8
8
|
def resource
|
9
|
-
"/assets/#{id}"
|
9
|
+
"/platform/assets/#{id}"
|
10
10
|
end
|
11
11
|
|
12
12
|
##
|
@@ -2,7 +2,7 @@ require 'json'
|
|
2
2
|
|
3
3
|
module MyJohnDeereApi::Request
|
4
4
|
class Individual::Base
|
5
|
-
attr_reader :client, :id, :associations
|
5
|
+
attr_reader :client, :id, :associations
|
6
6
|
|
7
7
|
##
|
8
8
|
# Initialize with a client, and asset id
|
@@ -13,40 +13,22 @@ module MyJohnDeereApi::Request
|
|
13
13
|
@associations = associations
|
14
14
|
end
|
15
15
|
|
16
|
-
##
|
17
|
-
# client accessor
|
18
|
-
|
19
|
-
def accessor
|
20
|
-
return @accessor if defined?(@accessor)
|
21
|
-
@accessor = client&.accessor
|
22
|
-
end
|
23
|
-
|
24
16
|
##
|
25
17
|
# The object being requested, an asset in this case
|
26
18
|
|
27
19
|
def object
|
28
20
|
return @object if defined?(@object)
|
29
|
-
|
30
|
-
request unless response
|
31
|
-
@object = model.new(client, JSON.parse(response.body))
|
21
|
+
@object = model.new(client, response)
|
32
22
|
end
|
33
23
|
|
34
24
|
private
|
35
25
|
|
36
26
|
##
|
37
|
-
#
|
38
|
-
|
39
|
-
def request
|
40
|
-
@response = accessor.get(resource, headers)
|
41
|
-
end
|
42
|
-
|
43
|
-
##
|
44
|
-
# Headers for GET request
|
27
|
+
# response from object request
|
45
28
|
|
46
|
-
def
|
47
|
-
@
|
48
|
-
|
49
|
-
}
|
29
|
+
def response
|
30
|
+
return @response if defined?(@response)
|
31
|
+
@response = client.get(resource)
|
50
32
|
end
|
51
33
|
end
|
52
34
|
end
|
@@ -11,7 +11,7 @@ module MyJohnDeereApi
|
|
11
11
|
# Path supplied to API
|
12
12
|
|
13
13
|
def resource
|
14
|
-
@resource ||= "/assets/#{attributes[:id]}"
|
14
|
+
@resource ||= "/platform/assets/#{attributes[:id]}"
|
15
15
|
end
|
16
16
|
|
17
17
|
##
|
@@ -31,7 +31,7 @@ module MyJohnDeereApi
|
|
31
31
|
{
|
32
32
|
'@type' => 'Link',
|
33
33
|
'rel' => 'contributionDefinition',
|
34
|
-
'uri' =>
|
34
|
+
'uri' => client.contribution_definition_uri,
|
35
35
|
}
|
36
36
|
]
|
37
37
|
}
|
@@ -20,21 +20,13 @@ module MyJohnDeereApi
|
|
20
20
|
process_attributes
|
21
21
|
end
|
22
22
|
|
23
|
-
#
|
24
|
-
# client accessor
|
25
|
-
|
26
|
-
def accessor
|
27
|
-
return @accessor if defined?(@accessor)
|
28
|
-
@accessor = client&.accessor
|
29
|
-
end
|
30
|
-
|
31
23
|
##
|
32
24
|
# Make the request, if the instance is valid
|
33
25
|
|
34
26
|
def request
|
35
27
|
validate!
|
36
28
|
|
37
|
-
@response =
|
29
|
+
@response = client.put(resource, request_body.to_json)
|
38
30
|
end
|
39
31
|
|
40
32
|
##
|
@@ -53,15 +45,5 @@ module MyJohnDeereApi
|
|
53
45
|
|
54
46
|
def process_attributes
|
55
47
|
end
|
56
|
-
|
57
|
-
##
|
58
|
-
# Headers for PUT request
|
59
|
-
|
60
|
-
def headers
|
61
|
-
@headers ||= {
|
62
|
-
'Accept' => 'application/vnd.deere.axiom.v3+json',
|
63
|
-
'Content-Type' => 'application/vnd.deere.axiom.v3+json'
|
64
|
-
}
|
65
|
-
end
|
66
48
|
end
|
67
49
|
end
|