my_john_deere_api 2.4.1
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 +7 -0
- data/README.md +813 -0
- data/Rakefile +9 -0
- data/lib/my_john_deere_api.rb +17 -0
- data/lib/my_john_deere_api/authorize.rb +69 -0
- data/lib/my_john_deere_api/client.rb +151 -0
- data/lib/my_john_deere_api/consumer.rb +90 -0
- data/lib/my_john_deere_api/errors.rb +7 -0
- data/lib/my_john_deere_api/errors/invalid_record_error.rb +29 -0
- data/lib/my_john_deere_api/errors/missing_contribution_definition_id_error.rb +12 -0
- data/lib/my_john_deere_api/errors/not_yet_implemented_error.rb +12 -0
- data/lib/my_john_deere_api/errors/type_mismatch_error.rb +12 -0
- data/lib/my_john_deere_api/errors/unsupported_environment_error.rb +18 -0
- data/lib/my_john_deere_api/helpers.rb +6 -0
- data/lib/my_john_deere_api/helpers/case_conversion.rb +37 -0
- data/lib/my_john_deere_api/helpers/environment_helper.rb +25 -0
- data/lib/my_john_deere_api/helpers/uri_helpers.rb +19 -0
- data/lib/my_john_deere_api/helpers/validate_contribution_definition.rb +18 -0
- data/lib/my_john_deere_api/model.rb +10 -0
- data/lib/my_john_deere_api/model/asset.rb +69 -0
- data/lib/my_john_deere_api/model/asset_location.rb +19 -0
- data/lib/my_john_deere_api/model/base.rb +97 -0
- data/lib/my_john_deere_api/model/contribution_definition.rb +15 -0
- data/lib/my_john_deere_api/model/contribution_product.rb +33 -0
- data/lib/my_john_deere_api/model/field.rb +40 -0
- data/lib/my_john_deere_api/model/flag.rb +36 -0
- data/lib/my_john_deere_api/model/organization.rb +43 -0
- data/lib/my_john_deere_api/net_http_retry.rb +2 -0
- data/lib/my_john_deere_api/net_http_retry/decorator.rb +53 -0
- data/lib/my_john_deere_api/net_http_retry/max_retries_exceeded_error.rb +20 -0
- data/lib/my_john_deere_api/request.rb +6 -0
- data/lib/my_john_deere_api/request/collection.rb +10 -0
- data/lib/my_john_deere_api/request/collection/asset_locations.rb +27 -0
- data/lib/my_john_deere_api/request/collection/assets.rb +34 -0
- data/lib/my_john_deere_api/request/collection/base.rb +91 -0
- data/lib/my_john_deere_api/request/collection/contribution_definitions.rb +26 -0
- data/lib/my_john_deere_api/request/collection/contribution_products.rb +26 -0
- data/lib/my_john_deere_api/request/collection/fields.rb +26 -0
- data/lib/my_john_deere_api/request/collection/flags.rb +33 -0
- data/lib/my_john_deere_api/request/collection/organizations.rb +26 -0
- data/lib/my_john_deere_api/request/create.rb +5 -0
- data/lib/my_john_deere_api/request/create/asset.rb +57 -0
- data/lib/my_john_deere_api/request/create/asset_location.rb +110 -0
- data/lib/my_john_deere_api/request/create/base.rb +67 -0
- data/lib/my_john_deere_api/request/individual.rb +8 -0
- data/lib/my_john_deere_api/request/individual/asset.rb +19 -0
- data/lib/my_john_deere_api/request/individual/base.rb +52 -0
- data/lib/my_john_deere_api/request/individual/contribution_definition.rb +19 -0
- data/lib/my_john_deere_api/request/individual/contribution_product.rb +19 -0
- data/lib/my_john_deere_api/request/individual/field.rb +19 -0
- data/lib/my_john_deere_api/request/individual/organization.rb +19 -0
- data/lib/my_john_deere_api/request/update.rb +4 -0
- data/lib/my_john_deere_api/request/update/asset.rb +40 -0
- data/lib/my_john_deere_api/request/update/base.rb +67 -0
- data/lib/my_john_deere_api/validators.rb +5 -0
- data/lib/my_john_deere_api/validators/asset.rb +35 -0
- data/lib/my_john_deere_api/validators/asset_location.rb +34 -0
- data/lib/my_john_deere_api/validators/base.rb +67 -0
- data/lib/my_john_deere_api/version.rb +3 -0
- data/test/lib/my_john_deere_api/authorize_test.rb +81 -0
- data/test/lib/my_john_deere_api/client_test.rb +225 -0
- data/test/lib/my_john_deere_api/consumer_test.rb +58 -0
- data/test/lib/my_john_deere_api/errors/invalid_record_error_test.rb +26 -0
- data/test/lib/my_john_deere_api/errors/max_retries_exceeded_error_test.rb +13 -0
- data/test/lib/my_john_deere_api/errors/missing_contribution_definition_id_error_test.rb +14 -0
- data/test/lib/my_john_deere_api/errors/not_yet_implemented_error_test.rb +13 -0
- data/test/lib/my_john_deere_api/errors/type_mismatch_error_test.rb +13 -0
- data/test/lib/my_john_deere_api/errors/unsupported_environment_error_test.rb +18 -0
- data/test/lib/my_john_deere_api/errors_test.rb +25 -0
- data/test/lib/my_john_deere_api/helpers/case_conversion_test.rb +100 -0
- data/test/lib/my_john_deere_api/helpers/environment_helper_test.rb +67 -0
- data/test/lib/my_john_deere_api/helpers/uri_helpers_test.rb +58 -0
- data/test/lib/my_john_deere_api/helpers/validate_contribution_definition_test.rb +74 -0
- data/test/lib/my_john_deere_api/helpers_test.rb +21 -0
- data/test/lib/my_john_deere_api/model/asset_location_test.rb +38 -0
- data/test/lib/my_john_deere_api/model/asset_test.rb +133 -0
- data/test/lib/my_john_deere_api/model/base_test.rb +76 -0
- data/test/lib/my_john_deere_api/model/contribution_definition_test.rb +52 -0
- data/test/lib/my_john_deere_api/model/contribution_product_test.rb +82 -0
- data/test/lib/my_john_deere_api/model/field_test.rb +65 -0
- data/test/lib/my_john_deere_api/model/flag_test.rb +48 -0
- data/test/lib/my_john_deere_api/model/organization_test.rb +84 -0
- data/test/lib/my_john_deere_api/model_test.rb +37 -0
- data/test/lib/my_john_deere_api/net_http_retry/decorator_test.rb +163 -0
- data/test/lib/my_john_deere_api/request/collection/asset_locations_test.rb +102 -0
- data/test/lib/my_john_deere_api/request/collection/assets_test.rb +99 -0
- data/test/lib/my_john_deere_api/request/collection/base_test.rb +27 -0
- data/test/lib/my_john_deere_api/request/collection/contribution_definitions_test.rb +88 -0
- data/test/lib/my_john_deere_api/request/collection/contribution_products_test.rb +88 -0
- data/test/lib/my_john_deere_api/request/collection/fields_test.rb +86 -0
- data/test/lib/my_john_deere_api/request/collection/flags_test.rb +92 -0
- data/test/lib/my_john_deere_api/request/collection/organizations_test.rb +87 -0
- data/test/lib/my_john_deere_api/request/collection_test.rb +37 -0
- data/test/lib/my_john_deere_api/request/create/asset_location_test.rb +163 -0
- data/test/lib/my_john_deere_api/request/create/asset_test.rb +182 -0
- data/test/lib/my_john_deere_api/request/create/base_test.rb +29 -0
- data/test/lib/my_john_deere_api/request/create_test.rb +17 -0
- data/test/lib/my_john_deere_api/request/individual/asset_test.rb +33 -0
- data/test/lib/my_john_deere_api/request/individual/base_test.rb +18 -0
- data/test/lib/my_john_deere_api/request/individual/contribution_definition_test.rb +33 -0
- data/test/lib/my_john_deere_api/request/individual/contribution_product_test.rb +33 -0
- data/test/lib/my_john_deere_api/request/individual/field_test.rb +37 -0
- data/test/lib/my_john_deere_api/request/individual/organization_test.rb +33 -0
- data/test/lib/my_john_deere_api/request/individual_test.rb +29 -0
- data/test/lib/my_john_deere_api/request/update/asset_test.rb +99 -0
- data/test/lib/my_john_deere_api/request/update/base_test.rb +60 -0
- data/test/lib/my_john_deere_api/request/update_test.rb +13 -0
- data/test/lib/my_john_deere_api/request_test.rb +21 -0
- data/test/lib/my_john_deere_api/validators/asset_location_test.rb +61 -0
- data/test/lib/my_john_deere_api/validators/asset_test.rb +93 -0
- data/test/lib/my_john_deere_api/validators/base_test.rb +92 -0
- data/test/lib/my_john_deere_api/validators_test.rb +17 -0
- data/test/lib/my_john_deere_api/version_test.rb +9 -0
- data/test/my_john_deere_api_test.rb +37 -0
- data/test/support/helper.rb +97 -0
- data/test/support/vcr/accessor/delete_failed.yml +327 -0
- data/test/support/vcr/accessor/delete_max_failed.yml +615 -0
- data/test/support/vcr/accessor/delete_retry.yml +191 -0
- data/test/support/vcr/accessor/delete_retry_too_soon.yml +191 -0
- data/test/support/vcr/accessor/get_failed.yml +390 -0
- data/test/support/vcr/accessor/get_max_failed.yml +734 -0
- data/test/support/vcr/accessor/get_retry.yml +226 -0
- data/test/support/vcr/accessor/get_retry_too_soon.yml +226 -0
- data/test/support/vcr/accessor/post_failed.yml +417 -0
- data/test/support/vcr/accessor/post_max_failed.yml +785 -0
- data/test/support/vcr/accessor/post_retry.yml +241 -0
- data/test/support/vcr/accessor/post_retry_too_soon.yml +241 -0
- data/test/support/vcr/accessor/put_failed.yml +372 -0
- data/test/support/vcr/accessor/put_max_failed.yml +700 -0
- data/test/support/vcr/accessor/put_retry.yml +216 -0
- data/test/support/vcr/accessor/put_retry_too_soon.yml +216 -0
- data/test/support/vcr/catalog.yml +89 -0
- data/test/support/vcr/delete_asset.yml +82 -0
- data/test/support/vcr/get_access_token.yml +41 -0
- data/test/support/vcr/get_asset.yml +144 -0
- data/test/support/vcr/get_asset_locations.yml +196 -0
- data/test/support/vcr/get_assets.yml +152 -0
- data/test/support/vcr/get_contribution_definition.yml +90 -0
- data/test/support/vcr/get_contribution_definitions.yml +91 -0
- data/test/support/vcr/get_contribution_product.yml +91 -0
- data/test/support/vcr/get_contribution_products.yml +91 -0
- data/test/support/vcr/get_field.yml +144 -0
- data/test/support/vcr/get_fields.yml +146 -0
- data/test/support/vcr/get_flags.yml +47 -0
- data/test/support/vcr/get_organization.yml +90 -0
- data/test/support/vcr/get_organizations.yml +149 -0
- data/test/support/vcr/get_request_token.yml +83 -0
- data/test/support/vcr/post_asset_locations.yml +244 -0
- data/test/support/vcr/post_assets.yml +192 -0
- data/test/support/vcr/put_asset.yml +87 -0
- data/test/support/vcr/warning.txt +28 -0
- data/test/support/vcr_setup.rb +488 -0
- metadata +277 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module MyJohnDeereApi
|
4
|
+
class Request::Create::AssetLocation < Request::Create::Base
|
5
|
+
include Validators::AssetLocation
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
##
|
10
|
+
# Set defaults and generate some attributes from others.
|
11
|
+
# Overridden from parent class.
|
12
|
+
|
13
|
+
def process_attributes
|
14
|
+
process_timestamp
|
15
|
+
process_geometry
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Request body
|
20
|
+
|
21
|
+
def request_body
|
22
|
+
return @body if defined?(@body)
|
23
|
+
|
24
|
+
@body = [{
|
25
|
+
timestamp: attributes[:timestamp],
|
26
|
+
geometry: attributes[:geometry],
|
27
|
+
measurementData: attributes[:measurement_data]
|
28
|
+
}]
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Custom-process timestamp
|
33
|
+
|
34
|
+
def process_timestamp
|
35
|
+
attributes[:timestamp] ||= Time.now.utc
|
36
|
+
|
37
|
+
attributes[:timestamp] = attributes[:timestamp].is_a?(String) ?
|
38
|
+
attributes[:timestamp] :
|
39
|
+
attributes[:timestamp].strftime('%Y-%m-%dT%H:%M:%SZ')
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# Custom-process geometry
|
44
|
+
|
45
|
+
def process_geometry
|
46
|
+
attributes[:geometry] = if attributes[:geometry]
|
47
|
+
attributes[:geometry].is_a?(String) ?
|
48
|
+
attributes[:geometry] :
|
49
|
+
attributes[:geometry].to_json
|
50
|
+
elsif attributes[:coordinates]
|
51
|
+
geometry_from_coordinates
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# Convert just coordinates into valid geometry hash
|
57
|
+
|
58
|
+
def geometry_from_coordinates
|
59
|
+
{
|
60
|
+
type: 'Feature',
|
61
|
+
geometry: {
|
62
|
+
geometries: [
|
63
|
+
coordinates: attributes[:coordinates],
|
64
|
+
type: 'Point'
|
65
|
+
],
|
66
|
+
type: 'GeometryCollection'
|
67
|
+
}
|
68
|
+
}.to_json
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Path supplied to API
|
73
|
+
|
74
|
+
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
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Create a new timestamp adjusted by X minutes
|
97
|
+
|
98
|
+
def timestamp_add(timestamp, seconds)
|
99
|
+
stamp = DateTime.parse(timestamp).to_time + seconds
|
100
|
+
stamp.to_datetime.strftime('%Y-%m-%dT%H:%M:%SZ')
|
101
|
+
end
|
102
|
+
|
103
|
+
##
|
104
|
+
# This is the class used to model the data
|
105
|
+
|
106
|
+
def model
|
107
|
+
Model::AssetLocation
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi
|
4
|
+
class Request::Create::Base
|
5
|
+
include Validators::Base
|
6
|
+
|
7
|
+
attr_reader :client, :attributes, :response
|
8
|
+
|
9
|
+
##
|
10
|
+
# Accepts a valid oAuth AccessToken, and a hash of attributes.
|
11
|
+
|
12
|
+
def initialize(client, attributes)
|
13
|
+
@client = client
|
14
|
+
@attributes = attributes
|
15
|
+
|
16
|
+
process_attributes
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# client accessor
|
21
|
+
|
22
|
+
def accessor
|
23
|
+
return @accessor if defined?(@accessor)
|
24
|
+
@accessor = client&.accessor
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# Make the request, if the instance is valid
|
29
|
+
|
30
|
+
def request
|
31
|
+
validate!
|
32
|
+
|
33
|
+
@response = accessor.post(resource, request_body.to_json, headers)
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# Object created by request
|
38
|
+
|
39
|
+
def object
|
40
|
+
return @object if defined?(@object)
|
41
|
+
|
42
|
+
request unless response
|
43
|
+
|
44
|
+
@object = model.new(client, fetch_record)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
##
|
50
|
+
# Convert inputs into working attributes. This allows us to auto-create
|
51
|
+
# some attributes from others, or set defaults, on a class-by-class basis.
|
52
|
+
# See Request::Create::AssetLocation for an example.
|
53
|
+
|
54
|
+
def process_attributes
|
55
|
+
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
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module MyJohnDeereApi::Request::Individual
|
2
|
+
autoload :Base, 'my_john_deere_api/request/individual/base'
|
3
|
+
autoload :Asset, 'my_john_deere_api/request/individual/asset'
|
4
|
+
autoload :ContributionProduct, 'my_john_deere_api/request/individual/contribution_product'
|
5
|
+
autoload :ContributionDefinition, 'my_john_deere_api/request/individual/contribution_definition'
|
6
|
+
autoload :Field, 'my_john_deere_api/request/individual/field'
|
7
|
+
autoload :Organization, 'my_john_deere_api/request/individual/organization'
|
8
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Request
|
4
|
+
class Individual::Asset < Individual::Base
|
5
|
+
##
|
6
|
+
# The resource path for the first page in the collection
|
7
|
+
|
8
|
+
def resource
|
9
|
+
"/assets/#{id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# This is the class used to model the data
|
14
|
+
|
15
|
+
def model
|
16
|
+
MyJohnDeereApi::Model::Asset
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Request
|
4
|
+
class Individual::Base
|
5
|
+
attr_reader :client, :id, :associations, :response
|
6
|
+
|
7
|
+
##
|
8
|
+
# Initialize with a client, and asset id
|
9
|
+
|
10
|
+
def initialize(client, id, associations = {})
|
11
|
+
@client = client
|
12
|
+
@id = id
|
13
|
+
@associations = associations
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# client accessor
|
18
|
+
|
19
|
+
def accessor
|
20
|
+
return @accessor if defined?(@accessor)
|
21
|
+
@accessor = client&.accessor
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# The object being requested, an asset in this case
|
26
|
+
|
27
|
+
def object
|
28
|
+
return @object if defined?(@object)
|
29
|
+
|
30
|
+
request unless response
|
31
|
+
@object = model.new(client, JSON.parse(response.body))
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
##
|
37
|
+
# Make the request
|
38
|
+
|
39
|
+
def request
|
40
|
+
@response = accessor.get(resource, headers)
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Headers for GET request
|
45
|
+
|
46
|
+
def headers
|
47
|
+
@headers ||= {
|
48
|
+
'Accept' => 'application/vnd.deere.axiom.v3+json',
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Request
|
4
|
+
class Individual::ContributionDefinition < Individual::Base
|
5
|
+
##
|
6
|
+
# The resource path for the first page in the collection
|
7
|
+
|
8
|
+
def resource
|
9
|
+
"/contributionDefinitions/#{id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# This is the class used to model the data
|
14
|
+
|
15
|
+
def model
|
16
|
+
MyJohnDeereApi::Model::ContributionDefinition
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Request
|
4
|
+
class Individual::ContributionProduct < Individual::Base
|
5
|
+
##
|
6
|
+
# The resource path for the first page in the collection
|
7
|
+
|
8
|
+
def resource
|
9
|
+
"/contributionProducts/#{id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# This is the class used to model the data
|
14
|
+
|
15
|
+
def model
|
16
|
+
MyJohnDeereApi::Model::ContributionProduct
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Request
|
4
|
+
class Individual::Field < Individual::Base
|
5
|
+
##
|
6
|
+
# The resource path for the first page in the collection
|
7
|
+
|
8
|
+
def resource
|
9
|
+
"/organizations/#{associations[:organization]}/fields/#{id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# This is the class used to model the data
|
14
|
+
|
15
|
+
def model
|
16
|
+
MyJohnDeereApi::Model::Field
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Request
|
4
|
+
class Individual::Organization < Individual::Base
|
5
|
+
##
|
6
|
+
# The resource path for the first page in the collection
|
7
|
+
|
8
|
+
def resource
|
9
|
+
"/organizations/#{id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# This is the class used to model the data
|
14
|
+
|
15
|
+
def model
|
16
|
+
MyJohnDeereApi::Model::Organization
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi
|
4
|
+
class Request::Update::Asset < Request::Update::Base
|
5
|
+
include Validators::Asset
|
6
|
+
include Helpers::ValidateContributionDefinition
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
##
|
11
|
+
# Path supplied to API
|
12
|
+
|
13
|
+
def resource
|
14
|
+
@resource ||= "/assets/#{attributes[:id]}"
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Request body
|
19
|
+
|
20
|
+
def request_body
|
21
|
+
return @body if defined?(@body)
|
22
|
+
|
23
|
+
validate_contribution_definition
|
24
|
+
|
25
|
+
@body = {
|
26
|
+
title: attributes[:title],
|
27
|
+
assetCategory: attributes[:asset_category],
|
28
|
+
assetType: attributes[:asset_type],
|
29
|
+
assetSubType: attributes[:asset_sub_type],
|
30
|
+
links: [
|
31
|
+
{
|
32
|
+
'@type' => 'Link',
|
33
|
+
'rel' => 'contributionDefinition',
|
34
|
+
'uri' => "#{accessor.consumer.site}/contributionDefinitions/#{client.contribution_definition_id}"
|
35
|
+
}
|
36
|
+
]
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi
|
4
|
+
class Request::Update::Base
|
5
|
+
include Validators::Base
|
6
|
+
|
7
|
+
attr_reader :client, :item, :attributes, :response
|
8
|
+
|
9
|
+
##
|
10
|
+
# Accepts a valid oAuth AccessToken, the item to be updated,
|
11
|
+
# and a hash of attributes.
|
12
|
+
#
|
13
|
+
# category/type/subtype must be a recognized combination as defined above.
|
14
|
+
|
15
|
+
def initialize(client, item, attributes)
|
16
|
+
@client = client
|
17
|
+
@item = item
|
18
|
+
@attributes = item.attributes.merge(attributes)
|
19
|
+
|
20
|
+
process_attributes
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# client accessor
|
25
|
+
|
26
|
+
def accessor
|
27
|
+
return @accessor if defined?(@accessor)
|
28
|
+
@accessor = client&.accessor
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Make the request, if the instance is valid
|
33
|
+
|
34
|
+
def request
|
35
|
+
validate!
|
36
|
+
|
37
|
+
@response = accessor.put(resource, request_body.to_json, headers)
|
38
|
+
end
|
39
|
+
|
40
|
+
##
|
41
|
+
# Object, same as item for updates
|
42
|
+
|
43
|
+
def object
|
44
|
+
@object ||= item
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
##
|
50
|
+
# Convert inputs into working attributes. This allows us to auto-create
|
51
|
+
# some attributes from others, or set defaults, on a class-by-class basis.
|
52
|
+
# See Request::Create::AssetLocation for an example.
|
53
|
+
|
54
|
+
def process_attributes
|
55
|
+
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
|
+
end
|
67
|
+
end
|