my_john_deere_api 0.5.0 → 0.5.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 +4 -4
- data/lib/my_john_deere_api/errors.rb +1 -0
- data/lib/my_john_deere_api/errors/type_mismatch_error.rb +12 -0
- data/lib/my_john_deere_api/model.rb +1 -0
- data/lib/my_john_deere_api/model/asset.rb +12 -30
- data/lib/my_john_deere_api/model/asset_location.rb +4 -16
- data/lib/my_john_deere_api/model/base.rb +49 -0
- data/lib/my_john_deere_api/model/field.rb +7 -27
- data/lib/my_john_deere_api/model/flag.rb +11 -30
- data/lib/my_john_deere_api/model/organization.rb +10 -28
- data/lib/my_john_deere_api/version.rb +1 -1
- data/test/lib/my_john_deere_api/errors/type_mismatch_error_test.rb +13 -0
- data/test/lib/my_john_deere_api/errors_test.rb +4 -0
- data/test/lib/my_john_deere_api/model/base_test.rb +64 -0
- data/test/lib/my_john_deere_api/model_test.rb +4 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73cbc5de675267d73f21bf1adc0624236ad833ff0e7174dcec7e7198d9b1d1cb
|
4
|
+
data.tar.gz: '0840ae125650b4f307f74e21b4b255d5bc50878fd748ec1e1835bbf2e17c885c'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07e8d738e0ecc1e3ba071cf4e09d61be831e8851c190bc805d9cc11903a445126d0a66f5c414043d4cea3bf203c014d8bd377bde18ea79ba6312fbeda3a061d7
|
7
|
+
data.tar.gz: d590a803bf509ac80ff6dc3ab1645ccacc580a733ca9cf8d53bb6d5e7ea1cfd4f2d61a6fc495ca7dc8d509fc1dede65307dbd59cb0024dd4b65d1f466e2d5af8
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module MyJohnDeereApi
|
2
|
+
##
|
3
|
+
# This error is used in a context that will fail in the absence of
|
4
|
+
# a valid oAuth access token. We have classes that may only need
|
5
|
+
# access tokens for some use cases.
|
6
|
+
|
7
|
+
class TypeMismatchError < StandardError
|
8
|
+
def initialize(message = "Record type does not match what was expected")
|
9
|
+
super
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,34 +1,6 @@
|
|
1
1
|
module MyJohnDeereApi
|
2
|
-
class Model::Asset
|
3
|
-
|
4
|
-
|
5
|
-
attr_reader :accessor, :id, :title, :asset_category, :asset_type, :asset_sub_type, :last_modified_date, :links
|
6
|
-
|
7
|
-
##
|
8
|
-
# arguments:
|
9
|
-
#
|
10
|
-
# [record] a JSON object of type 'Field', returned from the API.
|
11
|
-
#
|
12
|
-
# [accessor (optional)] a valid oAuth Access Token. This is only
|
13
|
-
# needed if further API requests are going
|
14
|
-
# to be made, as is the case with *flags*.
|
15
|
-
|
16
|
-
def initialize(record, accessor = nil)
|
17
|
-
@accessor = accessor
|
18
|
-
|
19
|
-
@id = record['id']
|
20
|
-
@title = record['title']
|
21
|
-
@asset_category = record['assetCategory']
|
22
|
-
@asset_type = record['assetType']
|
23
|
-
@asset_sub_type = record['assetSubType']
|
24
|
-
@last_modified_date = record['lastModifiedDate']
|
25
|
-
|
26
|
-
@links = {}
|
27
|
-
|
28
|
-
record['links'].each do |association|
|
29
|
-
@links[association['rel']] = uri_path(association['uri'])
|
30
|
-
end
|
31
|
-
end
|
2
|
+
class Model::Asset < Model::Base
|
3
|
+
attr_reader :title, :asset_category, :asset_type, :asset_sub_type, :last_modified_date
|
32
4
|
|
33
5
|
##
|
34
6
|
# locations associated with this asset
|
@@ -39,5 +11,15 @@ module MyJohnDeereApi
|
|
39
11
|
return @locations if defined?(@locations)
|
40
12
|
@locations = MyJohnDeereApi::Request::Collection::AssetLocations.new(accessor, asset: id).all
|
41
13
|
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def map_attributes(record)
|
18
|
+
@title = record['title']
|
19
|
+
@asset_category = record['assetCategory']
|
20
|
+
@asset_type = record['assetType']
|
21
|
+
@asset_sub_type = record['assetSubType']
|
22
|
+
@last_modified_date = record['lastModifiedDate']
|
23
|
+
end
|
42
24
|
end
|
43
25
|
end
|
@@ -1,27 +1,15 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
3
|
module MyJohnDeereApi
|
4
|
-
class Model::AssetLocation
|
5
|
-
|
4
|
+
class Model::AssetLocation < Model::Base
|
5
|
+
attr_reader :timestamp, :geometry, :measurement_data
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
##
|
10
|
-
# arguments:
|
11
|
-
#
|
12
|
-
# [record] a JSON object of type 'Field', returned from the API.
|
13
|
-
#
|
14
|
-
# [accessor (optional)] a valid oAuth Access Token. This is only
|
15
|
-
# needed if further API requests are going
|
16
|
-
# to be made, as is the case with *flags*.
|
17
|
-
|
18
|
-
def initialize(record, accessor = nil)
|
19
|
-
@accessor = accessor
|
7
|
+
private
|
20
8
|
|
9
|
+
def map_attributes(record)
|
21
10
|
@timestamp = record['timestamp']
|
22
11
|
@geometry = JSON.parse(record['geometry'])
|
23
12
|
@measurement_data = record['measurementData']
|
24
|
-
@links = {}
|
25
13
|
end
|
26
14
|
end
|
27
15
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module MyJohnDeereApi
|
2
|
+
class Model::Base
|
3
|
+
include Helpers::CaseConversion
|
4
|
+
include Helpers::UriHelpers
|
5
|
+
|
6
|
+
attr_reader :id, :record_type, :accessor, :links
|
7
|
+
|
8
|
+
##
|
9
|
+
# arguments:
|
10
|
+
#
|
11
|
+
# [record] a JSON object of type 'Field', returned from the API.
|
12
|
+
#
|
13
|
+
# [accessor (optional)] a valid oAuth Access Token. This is only
|
14
|
+
# needed if further API requests are going
|
15
|
+
# to be made, as is the case with *flags*.
|
16
|
+
|
17
|
+
def initialize(record, accessor = nil)
|
18
|
+
@id = record['id']
|
19
|
+
@record_type = record['@type']
|
20
|
+
@accessor = accessor
|
21
|
+
|
22
|
+
map_attributes(record)
|
23
|
+
|
24
|
+
@links = {}
|
25
|
+
|
26
|
+
record['links'].each do |association|
|
27
|
+
@links[underscore(association['rel'])] = uri_path(association['uri'])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
##
|
34
|
+
# This method receives the full record hash and extracts whatever extra
|
35
|
+
# attributes are needed for the given base class. This is intended to
|
36
|
+
# be overridden by child classes instead of monkeypatching #initialize.
|
37
|
+
|
38
|
+
def map_attributes(record)
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# Expected record type. Override in child classes.
|
44
|
+
|
45
|
+
def expected_record_type
|
46
|
+
'Base'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,31 +1,6 @@
|
|
1
1
|
module MyJohnDeereApi
|
2
|
-
class Model::Field
|
3
|
-
|
4
|
-
|
5
|
-
attr_reader :name, :id, :links, :accessor
|
6
|
-
|
7
|
-
##
|
8
|
-
# arguments:
|
9
|
-
#
|
10
|
-
# [record] a JSON object of type 'Field', returned from the API.
|
11
|
-
#
|
12
|
-
# [accessor (optional)] a valid oAuth Access Token. This is only
|
13
|
-
# needed if further API requests are going
|
14
|
-
# to be made, as is the case with *flags*.
|
15
|
-
|
16
|
-
def initialize(record, accessor = nil)
|
17
|
-
@accessor = accessor
|
18
|
-
|
19
|
-
@name = record['name']
|
20
|
-
@id = record['id']
|
21
|
-
@archived = record['archived']
|
22
|
-
|
23
|
-
@links = {}
|
24
|
-
|
25
|
-
record['links'].each do |association|
|
26
|
-
@links[association['rel']] = uri_path(association['uri'])
|
27
|
-
end
|
28
|
-
end
|
2
|
+
class Model::Field < Model::Base
|
3
|
+
attr_reader :name
|
29
4
|
|
30
5
|
##
|
31
6
|
# Since the archived attribute is boolean, we reflect this in the
|
@@ -47,6 +22,11 @@ module MyJohnDeereApi
|
|
47
22
|
|
48
23
|
private
|
49
24
|
|
25
|
+
def map_attributes(record)
|
26
|
+
@name = record['name']
|
27
|
+
@archived = record['archived']
|
28
|
+
end
|
29
|
+
|
50
30
|
##
|
51
31
|
# Infer the organization_id from the 'self' link
|
52
32
|
|
@@ -1,36 +1,8 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
3
|
module MyJohnDeereApi
|
4
|
-
class Model::Flag
|
5
|
-
|
6
|
-
include Helpers::UriHelpers
|
7
|
-
|
8
|
-
attr_reader :id, :notes, :geometry, :links, :accessor
|
9
|
-
|
10
|
-
##
|
11
|
-
# arguments:
|
12
|
-
#
|
13
|
-
# [record] a JSON object of type 'Flag', returned from the API.
|
14
|
-
#
|
15
|
-
# [accessor (optional)] a valid oAuth Access Token. This is only
|
16
|
-
# needed if further API requests are going
|
17
|
-
# to be made.
|
18
|
-
|
19
|
-
def initialize(record, accessor = nil)
|
20
|
-
@accessor = accessor
|
21
|
-
|
22
|
-
@id = record['id']
|
23
|
-
@notes = record['notes']
|
24
|
-
@geometry =JSON.parse(record['geometry'])
|
25
|
-
@proximity_alert_enabled = record['proximityAlertEnabled']
|
26
|
-
@archived = record['archived']
|
27
|
-
|
28
|
-
@links = {}
|
29
|
-
|
30
|
-
record['links'].each do |association|
|
31
|
-
@links[underscore(association['rel'])] = uri_path(association['uri'])
|
32
|
-
end
|
33
|
-
end
|
4
|
+
class Model::Flag < Model::Base
|
5
|
+
attr_reader :notes, :geometry
|
34
6
|
|
35
7
|
##
|
36
8
|
# Since the archived attribute is boolean, we reflect this in the
|
@@ -47,5 +19,14 @@ module MyJohnDeereApi
|
|
47
19
|
def proximity_alert_enabled?
|
48
20
|
@proximity_alert_enabled
|
49
21
|
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def map_attributes(record)
|
26
|
+
@notes = record['notes']
|
27
|
+
@geometry =JSON.parse(record['geometry'])
|
28
|
+
@proximity_alert_enabled = record['proximityAlertEnabled']
|
29
|
+
@archived = record['archived']
|
30
|
+
end
|
50
31
|
end
|
51
32
|
end
|
@@ -1,34 +1,8 @@
|
|
1
1
|
require 'uri'
|
2
2
|
|
3
3
|
module MyJohnDeereApi
|
4
|
-
class Model::Organization
|
5
|
-
|
6
|
-
|
7
|
-
attr_reader :name, :type, :id, :links, :accessor
|
8
|
-
|
9
|
-
##
|
10
|
-
# arguments:
|
11
|
-
#
|
12
|
-
# [record] a JSON object of type 'Organization', returned from the API.
|
13
|
-
#
|
14
|
-
# [accessor (optional)] a valid oAuth Access Token. This is only
|
15
|
-
# needed if further API requests are going
|
16
|
-
# to be made, as is the case with *fields*.
|
17
|
-
|
18
|
-
def initialize(record, accessor = nil)
|
19
|
-
@accessor = accessor
|
20
|
-
|
21
|
-
@name = record['name']
|
22
|
-
@type = record['type']
|
23
|
-
@id = record['id']
|
24
|
-
@member = record['member']
|
25
|
-
|
26
|
-
@links = {}
|
27
|
-
|
28
|
-
record['links'].each do |association|
|
29
|
-
@links[association['rel']] = uri_path(association['uri'])
|
30
|
-
end
|
31
|
-
end
|
4
|
+
class Model::Organization < Model::Base
|
5
|
+
attr_reader :name, :type
|
32
6
|
|
33
7
|
##
|
34
8
|
# Since the member attribute is boolean, we reflect this in the
|
@@ -57,5 +31,13 @@ module MyJohnDeereApi
|
|
57
31
|
return @assets if defined?(@assets)
|
58
32
|
@assets = MyJohnDeereApi::Request::Collection::Assets.new(accessor, organization: id).all
|
59
33
|
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def map_attributes(record)
|
38
|
+
@name = record['name']
|
39
|
+
@type = record['type']
|
40
|
+
@member = record['member']
|
41
|
+
end
|
60
42
|
end
|
61
43
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'support/helper'
|
2
|
+
|
3
|
+
describe 'MyJohnDeereApi::TypeMismatchError' do
|
4
|
+
it 'inherits from StandardError' do
|
5
|
+
error = MyJohnDeereApi::TypeMismatchError.new
|
6
|
+
assert_kind_of StandardError, error
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'has a default message' do
|
10
|
+
error = MyJohnDeereApi::TypeMismatchError.new
|
11
|
+
assert_includes error.message, 'Record type does not match'
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'support/helper'
|
2
|
+
|
3
|
+
class SampleModel < JD::Model::Base
|
4
|
+
attr_reader :somefield
|
5
|
+
|
6
|
+
def map_attributes(record)
|
7
|
+
@somefield = record['somefield']
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'MyJohnDeereApi::Model::Base' do
|
12
|
+
let(:object) { JD::Model::Base.new(record, accessor) }
|
13
|
+
let(:accessor) { 'accessor' }
|
14
|
+
|
15
|
+
let(:record) do
|
16
|
+
{
|
17
|
+
'@type'=>'Base',
|
18
|
+
'id'=>'123',
|
19
|
+
'somefield'=>'somevalue',
|
20
|
+
"links"=>[
|
21
|
+
{"@type"=>"Link", "rel"=>"self", "uri"=>"https://sandboxapi.deere.com/platform/assets/123456"},
|
22
|
+
{"@type"=>"Link", "rel"=>"organization", "uri"=>"https://sandboxapi.deere.com/platform/organizations/234567"},
|
23
|
+
{"@type"=>"Link", "rel"=>"locations", "uri"=>"https://sandboxapi.deere.com/platform/assets/123456/locations"},
|
24
|
+
]
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'includes UriHelpers' do
|
29
|
+
assert_includes object.private_methods, :uri_path
|
30
|
+
assert_includes object.private_methods, :id_from_uri
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#initialize(record, accessor = nil)' do
|
34
|
+
def link_for label
|
35
|
+
record['links'].detect{|link| link['rel'] == label}['uri'].gsub('https://sandboxapi.deere.com/platform', '')
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'sets the base attributes' do
|
39
|
+
assert_equal record['id'], object.id
|
40
|
+
assert_equal record['@type'], object.record_type
|
41
|
+
assert_equal accessor, object.accessor
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'sets the links' do
|
45
|
+
links = object.links
|
46
|
+
|
47
|
+
assert_kind_of Hash, links
|
48
|
+
|
49
|
+
['self', 'organization', 'locations'].each do |link|
|
50
|
+
assert_equal link_for(link), links[link]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'maps additional fields in subclasses' do
|
55
|
+
object = SampleModel.new(record)
|
56
|
+
assert_equal 'somevalue', object.somefield
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'does not require accessor' do
|
60
|
+
object = JD::Model::Base.new(record)
|
61
|
+
assert_nil object.accessor
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: my_john_deere_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaime. Bellmyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: vcr
|
@@ -101,12 +101,14 @@ files:
|
|
101
101
|
- lib/my_john_deere_api/consumer.rb
|
102
102
|
- lib/my_john_deere_api/errors.rb
|
103
103
|
- lib/my_john_deere_api/errors/access_token_error.rb
|
104
|
+
- lib/my_john_deere_api/errors/type_mismatch_error.rb
|
104
105
|
- lib/my_john_deere_api/helpers.rb
|
105
106
|
- lib/my_john_deere_api/helpers/case_conversion.rb
|
106
107
|
- lib/my_john_deere_api/helpers/uri_helpers.rb
|
107
108
|
- lib/my_john_deere_api/model.rb
|
108
109
|
- lib/my_john_deere_api/model/asset.rb
|
109
110
|
- lib/my_john_deere_api/model/asset_location.rb
|
111
|
+
- lib/my_john_deere_api/model/base.rb
|
110
112
|
- lib/my_john_deere_api/model/field.rb
|
111
113
|
- lib/my_john_deere_api/model/flag.rb
|
112
114
|
- lib/my_john_deere_api/model/organization.rb
|
@@ -123,12 +125,14 @@ files:
|
|
123
125
|
- test/lib/my_john_deere_api/client_test.rb
|
124
126
|
- test/lib/my_john_deere_api/consumer_test.rb
|
125
127
|
- test/lib/my_john_deere_api/errors/access_token_error_test.rb
|
128
|
+
- test/lib/my_john_deere_api/errors/type_mismatch_error_test.rb
|
126
129
|
- test/lib/my_john_deere_api/errors_test.rb
|
127
130
|
- test/lib/my_john_deere_api/helpers/case_conversion_test.rb
|
128
131
|
- test/lib/my_john_deere_api/helpers/uri_helpers_test.rb
|
129
132
|
- test/lib/my_john_deere_api/helpers_test.rb
|
130
133
|
- test/lib/my_john_deere_api/model/asset_location_test.rb
|
131
134
|
- test/lib/my_john_deere_api/model/asset_test.rb
|
135
|
+
- test/lib/my_john_deere_api/model/base_test.rb
|
132
136
|
- test/lib/my_john_deere_api/model/field_test.rb
|
133
137
|
- test/lib/my_john_deere_api/model/flag_test.rb
|
134
138
|
- test/lib/my_john_deere_api/model/organization_test.rb
|