my_john_deere_api 0.4.1 → 0.5.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/Rakefile +1 -1
- data/lib/my_john_deere_api/helpers/case_conversion.rb +2 -4
- data/lib/my_john_deere_api/helpers/uri_helpers.rb +19 -0
- data/lib/my_john_deere_api/helpers.rb +1 -1
- data/lib/my_john_deere_api/model/asset.rb +43 -0
- data/lib/my_john_deere_api/model/asset_location.rb +27 -0
- data/lib/my_john_deere_api/model/field.rb +2 -4
- data/lib/my_john_deere_api/model/flag.rb +1 -1
- data/lib/my_john_deere_api/model/organization.rb +11 -1
- data/lib/my_john_deere_api/model.rb +2 -0
- data/lib/my_john_deere_api/request/collection/asset_locations.rb +19 -0
- data/lib/my_john_deere_api/request/collection/assets.rb +19 -0
- data/lib/my_john_deere_api/request/collection/base.rb +1 -1
- data/lib/my_john_deere_api/request/collection.rb +3 -1
- data/lib/my_john_deere_api/version.rb +1 -1
- data/test/lib/my_john_deere_api/{test_authorize.rb → authorize_test.rb} +0 -0
- data/test/lib/my_john_deere_api/{test_client.rb → client_test.rb} +0 -0
- data/test/lib/my_john_deere_api/{test_consumer.rb → consumer_test.rb} +0 -0
- data/test/lib/my_john_deere_api/errors/{test_access_token_error.rb → access_token_error_test.rb} +0 -0
- data/test/lib/my_john_deere_api/{test_errors.rb → errors_test.rb} +0 -0
- data/test/lib/my_john_deere_api/helpers/{test_case_conversion.rb → case_conversion_test.rb} +12 -2
- data/test/lib/my_john_deere_api/helpers/uri_helpers_test.rb +58 -0
- data/test/lib/my_john_deere_api/{test_helpers.rb → helpers_test.rb} +2 -2
- data/test/lib/my_john_deere_api/model/asset_location_test.rb +57 -0
- data/test/lib/my_john_deere_api/model/asset_test.rb +79 -0
- data/test/lib/my_john_deere_api/model/{test_field.rb → field_test.rb} +7 -0
- data/test/lib/my_john_deere_api/model/{test_flag.rb → flag_test.rb} +0 -0
- data/test/lib/my_john_deere_api/model/{test_organization.rb → organization_test.rb} +21 -0
- data/test/lib/my_john_deere_api/{test_model.rb → model_test.rb} +8 -0
- data/test/lib/my_john_deere_api/request/collection/asset_locations_test.rb +85 -0
- data/test/lib/my_john_deere_api/request/collection/assets_test.rb +83 -0
- data/test/lib/my_john_deere_api/request/collection/{test_base.rb → base_test.rb} +0 -0
- data/test/lib/my_john_deere_api/request/collection/{test_fields.rb → fields_test.rb} +0 -0
- data/test/lib/my_john_deere_api/request/collection/{test_flags.rb → flags_test.rb} +0 -0
- data/test/lib/my_john_deere_api/request/collection/{test_organizations.rb → organizations_test.rb} +0 -0
- data/test/lib/my_john_deere_api/request/{test_collection.rb → collection_test.rb} +8 -0
- data/test/lib/my_john_deere_api/{test_request.rb → request_test.rb} +0 -0
- data/test/lib/my_john_deere_api/{test_version.rb → version_test.rb} +0 -0
- data/test/{test_my_john_deere_api.rb → my_john_deere_api_test.rb} +0 -0
- data/test/support/vcr/get_asset_locations.yml +55 -0
- data/test/support/vcr/get_assets.yml +48 -0
- metadata +32 -22
- data/lib/my_john_deere_api/helpers/uri_path.rb +0 -9
- data/test/lib/my_john_deere_api/helpers/test_uri_path.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f27839609fe2e86e82d918edae99dd77d78cb9d7dad78c061d8ab198837953d
|
4
|
+
data.tar.gz: b302429624cc3f1a504e77235c105f94af9363bc075809f46f1659bf1b59859c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b2509a126cf7aef80dc4984865660eb20285a4ccbb5aaec61a622449eebc3eb0628d1a44f3de78bfc95af42f639bbecd5a5796219b3d8be3ea4be7612e90b96
|
7
|
+
data.tar.gz: 2b401cacbc5c4fc8e9b224c89639689ceb681d8b697dfdd1b1f3ff62b1b91c5ea40508a2de61ade9ad8744773a90358067e9240faaa3f4088803c3caac1eb196
|
data/Rakefile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'uri'
|
2
2
|
|
3
3
|
module MyJohnDeereApi::Helpers::CaseConversion
|
4
|
+
private
|
5
|
+
|
4
6
|
##
|
5
7
|
# convert a text or camelcase string to underscore
|
6
8
|
|
@@ -8,8 +10,6 @@ module MyJohnDeereApi::Helpers::CaseConversion
|
|
8
10
|
string.gsub(/([a-z])([A-Z])/, '\1_\2').gsub(/\s+/, '_').gsub(/_+/, '_').downcase
|
9
11
|
end
|
10
12
|
|
11
|
-
private :underscore
|
12
|
-
|
13
13
|
##
|
14
14
|
# convert text or underscored string to camelcase
|
15
15
|
|
@@ -22,6 +22,4 @@ module MyJohnDeereApi::Helpers::CaseConversion
|
|
22
22
|
|
23
23
|
new_list.join('')
|
24
24
|
end
|
25
|
-
|
26
|
-
private :camelize
|
27
25
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Helpers::UriHelpers
|
4
|
+
private
|
5
|
+
|
6
|
+
##
|
7
|
+
# extract just the path from the uri, excluding the platform prefix
|
8
|
+
def uri_path(uri)
|
9
|
+
URI.parse(uri).path.gsub(/^\/platform/, '')
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# infer id from uri
|
14
|
+
|
15
|
+
def id_from_uri(uri, label)
|
16
|
+
parts = uri.split('/')
|
17
|
+
parts[parts.index(label.to_s) + 1]
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module MyJohnDeereApi
|
2
|
+
class Model::Asset
|
3
|
+
include Helpers::UriHelpers
|
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
|
32
|
+
|
33
|
+
##
|
34
|
+
# locations associated with this asset
|
35
|
+
|
36
|
+
def locations
|
37
|
+
raise AccessTokenError unless accessor
|
38
|
+
|
39
|
+
return @locations if defined?(@locations)
|
40
|
+
@locations = MyJohnDeereApi::Request::Collection::AssetLocations.new(accessor, asset: id).all
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi
|
4
|
+
class Model::AssetLocation
|
5
|
+
include Helpers::UriHelpers
|
6
|
+
|
7
|
+
attr_reader :accessor, :timestamp, :geometry, :measurement_data, :links
|
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
|
20
|
+
|
21
|
+
@timestamp = record['timestamp']
|
22
|
+
@geometry = JSON.parse(record['geometry'])
|
23
|
+
@measurement_data = record['measurementData']
|
24
|
+
@links = {}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module MyJohnDeereApi
|
2
2
|
class Model::Field
|
3
|
-
include Helpers::
|
3
|
+
include Helpers::UriHelpers
|
4
4
|
|
5
5
|
attr_reader :name, :id, :links, :accessor
|
6
6
|
|
@@ -52,9 +52,7 @@ module MyJohnDeereApi
|
|
52
52
|
|
53
53
|
def organization_id
|
54
54
|
return @organization_id if defined?(@organization_id)
|
55
|
-
|
56
|
-
parts = links['self'].split('/')
|
57
|
-
@organization_id = parts[parts.index('organizations') + 1]
|
55
|
+
@organization_id = id_from_uri(links['self'], :organizations)
|
58
56
|
end
|
59
57
|
end
|
60
58
|
end
|
@@ -2,7 +2,7 @@ require 'uri'
|
|
2
2
|
|
3
3
|
module MyJohnDeereApi
|
4
4
|
class Model::Organization
|
5
|
-
include Helpers::
|
5
|
+
include Helpers::UriHelpers
|
6
6
|
|
7
7
|
attr_reader :name, :type, :id, :links, :accessor
|
8
8
|
|
@@ -47,5 +47,15 @@ module MyJohnDeereApi
|
|
47
47
|
return @fields if defined?(@fields)
|
48
48
|
@fields = MyJohnDeereApi::Request::Collection::Fields.new(accessor, organization: id).all
|
49
49
|
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# assets associated with this organization
|
53
|
+
|
54
|
+
def assets
|
55
|
+
raise AccessTokenError unless accessor
|
56
|
+
|
57
|
+
return @assets if defined?(@assets)
|
58
|
+
@assets = MyJohnDeereApi::Request::Collection::Assets.new(accessor, organization: id).all
|
59
|
+
end
|
50
60
|
end
|
51
61
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
module MyJohnDeereApi::Model
|
2
|
+
autoload :Asset, 'my_john_deere_api/model/asset'
|
3
|
+
autoload :AssetLocation, 'my_john_deere_api/model/asset_location'
|
2
4
|
autoload :Organization, 'my_john_deere_api/model/organization'
|
3
5
|
autoload :Field, 'my_john_deere_api/model/field'
|
4
6
|
autoload :Flag, 'my_john_deere_api/model/flag'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Request
|
4
|
+
class Collection::AssetLocations < Collection::Base
|
5
|
+
##
|
6
|
+
# The resource path for the first page in the collection
|
7
|
+
|
8
|
+
def resource
|
9
|
+
"/assets/#{associations[:asset]}/locations"
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# This is the class used to model the data
|
14
|
+
|
15
|
+
def model
|
16
|
+
MyJohnDeereApi::Model::AssetLocation
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MyJohnDeereApi::Request
|
4
|
+
class Collection::Assets < Collection::Base
|
5
|
+
##
|
6
|
+
# The resource path for the first page in the collection
|
7
|
+
|
8
|
+
def resource
|
9
|
+
"/organizations/#{associations[:organization]}/assets"
|
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
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module MyJohnDeereApi::Request::Collection
|
2
2
|
autoload :Base, 'my_john_deere_api/request/collection/base'
|
3
|
+
autoload :Assets, 'my_john_deere_api/request/collection/assets'
|
4
|
+
autoload :AssetLocations, 'my_john_deere_api/request/collection/asset_locations'
|
3
5
|
autoload :Organizations, 'my_john_deere_api/request/collection/organizations'
|
4
6
|
autoload :Fields, 'my_john_deere_api/request/collection/fields'
|
5
|
-
autoload :Flags,
|
7
|
+
autoload :Flags, 'my_john_deere_api/request/collection/flags'
|
6
8
|
end
|
File without changes
|
File without changes
|
File without changes
|
data/test/lib/my_john_deere_api/errors/{test_access_token_error.rb → access_token_error_test.rb}
RENAMED
File without changes
|
File without changes
|
@@ -2,6 +2,10 @@ require 'support/helper'
|
|
2
2
|
|
3
3
|
class CaseConversionHelperSample
|
4
4
|
include JD::Helpers::CaseConversion
|
5
|
+
|
6
|
+
def test
|
7
|
+
'test'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
|
7
11
|
describe 'Helpers::CaseConversion' do
|
@@ -29,7 +33,8 @@ describe 'Helpers::CaseConversion' do
|
|
29
33
|
end
|
30
34
|
|
31
35
|
it 'is a private method' do
|
32
|
-
assert_raises(NoMethodError) { object.underscore('test') }
|
36
|
+
exception = assert_raises(NoMethodError) { object.underscore('test') }
|
37
|
+
assert_includes exception.message, 'private method'
|
33
38
|
end
|
34
39
|
end
|
35
40
|
|
@@ -50,7 +55,12 @@ describe 'Helpers::CaseConversion' do
|
|
50
55
|
end
|
51
56
|
|
52
57
|
it 'is a private method' do
|
53
|
-
assert_raises(NoMethodError) { object.camelize('test') }
|
58
|
+
exception = assert_raises(NoMethodError) { object.camelize('test') }
|
59
|
+
assert_includes exception.message, 'private method'
|
54
60
|
end
|
55
61
|
end
|
62
|
+
|
63
|
+
it "preserves the public nature of the including class's other methods" do
|
64
|
+
assert_equal 'test', object.test
|
65
|
+
end
|
56
66
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'support/helper'
|
2
|
+
|
3
|
+
class UriHelpersHelperSample
|
4
|
+
include JD::Helpers::UriHelpers
|
5
|
+
|
6
|
+
def test
|
7
|
+
'test'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'UriHelpers' do
|
12
|
+
let(:object) { UriHelpersHelperSample.new }
|
13
|
+
|
14
|
+
describe '#uri_path' do
|
15
|
+
it 'extracts the path from the uri' do
|
16
|
+
path = object.send(:uri_path, 'https://example.com/turtles')
|
17
|
+
assert_equal '/turtles', path
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'removes leading /platform from the path' do
|
21
|
+
path = object.send(:uri_path, 'https://example.com/platform/turtles')
|
22
|
+
assert_equal '/turtles', path
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'preserves /platform in any other part of the path' do
|
26
|
+
path = object.send(:uri_path, 'https://example.com/platform/turtles/platform')
|
27
|
+
assert_equal '/turtles/platform', path
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'is a private method' do
|
31
|
+
exception = assert_raises(NoMethodError) { object.uri_path('https://example.com/turtles')}
|
32
|
+
assert_includes exception.message, 'private method'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#id_from_uri(uri, label)' do
|
37
|
+
it 'extracts the id immediately following a given label' do
|
38
|
+
uri = 'https://example.com/cows/123/pigs/456/turtles/789/birds/012'
|
39
|
+
assert_equal '789', object.send(:id_from_uri, uri, 'turtles')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'accepts a symbol for the label' do
|
43
|
+
uri = 'https://example.com/cows/123/pigs/456/turtles/789/birds/012'
|
44
|
+
assert_equal '789', object.send(:id_from_uri, uri, :turtles)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'is a private method' do
|
48
|
+
uri = 'https://example.com/cows/123/pigs/456/turtles/789/birds/012'
|
49
|
+
|
50
|
+
exception = assert_raises(NoMethodError) { object.id_from_uri(uri, 'turtles') }
|
51
|
+
assert_includes exception.message, 'private method'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it "preserves the public nature of the including class's other methods" do
|
56
|
+
assert_equal 'test', object.test
|
57
|
+
end
|
58
|
+
end
|
@@ -2,8 +2,8 @@ require 'support/helper'
|
|
2
2
|
|
3
3
|
describe 'MyJohnDeereApi::Helpers' do
|
4
4
|
describe 'loading dependencies' do
|
5
|
-
it 'loads Helpers::
|
6
|
-
assert JD::Helpers::
|
5
|
+
it 'loads Helpers::UriHelpers' do
|
6
|
+
assert JD::Helpers::UriHelpers
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'loads Helpers::CaseConversion' do
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'support/helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe 'MyJohnDeereApi::Model::AssetLocation' do
|
5
|
+
let(:record) do
|
6
|
+
{
|
7
|
+
"@type"=>"ContributedAssetLocation",
|
8
|
+
"timestamp"=>"2017-09-20T21:30:59.000Z",
|
9
|
+
"geometry"=>"{\"type\": \"Feature\",\"geometry\": {\"geometries\": [{\"coordinates\": [ -103.115633, 41.670166],\"type\": \"Point\"}],\"type\": \"GeometryCollection\"}}",
|
10
|
+
"measurementData"=>[
|
11
|
+
{
|
12
|
+
"@type"=>"BasicMeasurement",
|
13
|
+
"name"=>"[1 Foot](https://app.realmfive.com/map?device=0x0080CDEF)",
|
14
|
+
"value"=>"82",
|
15
|
+
"unit"=>"cB"
|
16
|
+
}, {
|
17
|
+
"@type"=>"BasicMeasurement",
|
18
|
+
"name"=>"[2 Feet](https://app.realmfive.com/map?device=0x0080CDEF)",
|
19
|
+
"value"=>"31",
|
20
|
+
"unit"=>"cB"
|
21
|
+
}
|
22
|
+
],
|
23
|
+
"links"=>[]
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:client) { JD::Client.new(API_KEY, API_SECRET, environment: :sandbox, access: [ACCESS_TOKEN, ACCESS_SECRET]) }
|
28
|
+
let(:accessor) { VCR.use_cassette('catalog') { client.send(:accessor) } }
|
29
|
+
|
30
|
+
describe '#initialize' do
|
31
|
+
def link_for label
|
32
|
+
record['links'].detect{|link| link['rel'] == label}['uri'].gsub('https://sandboxapi.deere.com/platform', '')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'sets the attributes from the given record' do
|
36
|
+
location = JD::Model::AssetLocation.new(record)
|
37
|
+
|
38
|
+
assert_nil location.accessor
|
39
|
+
|
40
|
+
# basic attributes
|
41
|
+
assert_equal record['timestamp'], location.timestamp
|
42
|
+
assert_equal JSON.parse(record['geometry']), location.geometry
|
43
|
+
assert_equal record['measurementData'], location.measurement_data
|
44
|
+
|
45
|
+
# links to other things
|
46
|
+
assert_kind_of Hash, location.links
|
47
|
+
assert_equal 0, location.links.size
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'accepts an optional accessor' do
|
51
|
+
accessor = 'mock-accessor'
|
52
|
+
|
53
|
+
location = JD::Model::AssetLocation.new(record, accessor)
|
54
|
+
assert_equal accessor, location.accessor
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'support/helper'
|
2
|
+
|
3
|
+
describe 'MyJohnDeereApi::Model::Asset' do
|
4
|
+
let(:record) do
|
5
|
+
{
|
6
|
+
"@type"=>"ContributedAsset",
|
7
|
+
"title"=>"Happy Device",
|
8
|
+
"assetCategory"=>"DEVICE",
|
9
|
+
"assetType"=>"SENSOR",
|
10
|
+
"assetSubType"=>"OTHER",
|
11
|
+
"id"=>"123456",
|
12
|
+
"lastModifiedDate"=>"2018-01-31T20:36:16.727Z",
|
13
|
+
"links"=>[
|
14
|
+
{"@type"=>"Link", "rel"=>"self", "uri"=>"https://sandboxapi.deere.com/platform/assets/123456"},
|
15
|
+
{"@type"=>"Link", "rel"=>"organization", "uri"=>"https://sandboxapi.deere.com/platform/organizations/234567"},
|
16
|
+
{"@type"=>"Link", "rel"=>"locations", "uri"=>"https://sandboxapi.deere.com/platform/assets/123456/locations"},
|
17
|
+
]
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:client) { JD::Client.new(API_KEY, API_SECRET, environment: :sandbox, access: [ACCESS_TOKEN, ACCESS_SECRET]) }
|
22
|
+
let(:accessor) { VCR.use_cassette('catalog') { client.send(:accessor) } }
|
23
|
+
|
24
|
+
describe '#initialize' do
|
25
|
+
def link_for label
|
26
|
+
record['links'].detect{|link| link['rel'] == label}['uri'].gsub('https://sandboxapi.deere.com/platform', '')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets the attributes from the given record' do
|
30
|
+
asset = JD::Model::Asset.new(record)
|
31
|
+
|
32
|
+
assert_nil asset.accessor
|
33
|
+
|
34
|
+
# basic attributes
|
35
|
+
assert_equal record['id'], asset.id
|
36
|
+
assert_equal record['title'], asset.title
|
37
|
+
assert_equal record['assetCategory'], asset.asset_category
|
38
|
+
assert_equal record['assetType'], asset.asset_type
|
39
|
+
assert_equal record['assetSubType'], asset.asset_sub_type
|
40
|
+
assert_equal record['lastModifiedDate'], asset.last_modified_date
|
41
|
+
|
42
|
+
# links to other things
|
43
|
+
assert_kind_of Hash, asset.links
|
44
|
+
|
45
|
+
['self', 'organization', 'locations'].each do |association|
|
46
|
+
assert_equal link_for(association), asset.links[association]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'accepts an optional accessor' do
|
51
|
+
accessor = 'mock-accessor'
|
52
|
+
|
53
|
+
asset = JD::Model::Asset.new(record, accessor)
|
54
|
+
assert_equal accessor, asset.accessor
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#locations' do
|
59
|
+
it 'returns a collection of locations for this asset' do
|
60
|
+
accessor
|
61
|
+
organization = VCR.use_cassette('get_organizations') { client.organizations.first }
|
62
|
+
asset = VCR.use_cassette('get_assets') { organization.assets.first }
|
63
|
+
locations = VCR.use_cassette('get_asset_locations') { asset.locations }
|
64
|
+
|
65
|
+
assert_kind_of Array, locations
|
66
|
+
|
67
|
+
locations.each do |location|
|
68
|
+
assert_kind_of JD::Model::AssetLocation, location
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'raises an exception if an accessor is not available' do
|
73
|
+
asset = JD::Model::Asset.new(record)
|
74
|
+
|
75
|
+
exception = assert_raises(JD::AccessTokenError) { asset.locations }
|
76
|
+
assert_includes exception.message, 'Access Token must be supplied'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -71,4 +71,11 @@ describe 'MyJohnDeereApi::Model::Field' do
|
|
71
71
|
assert_includes exception.message, 'Access Token must be supplied'
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
75
|
+
describe 'private #organization_id' do
|
76
|
+
it "infers the organization_id from links" do
|
77
|
+
field = JD::Model::Field.new(record)
|
78
|
+
assert_equal '123456', field.send(:organization_id)
|
79
|
+
end
|
80
|
+
end
|
74
81
|
end
|
File without changes
|
@@ -83,4 +83,25 @@ describe 'MyJohnDeereApi::Model::Organization' do
|
|
83
83
|
assert_includes exception.message, 'Access Token must be supplied'
|
84
84
|
end
|
85
85
|
end
|
86
|
+
|
87
|
+
describe '#assets' do
|
88
|
+
it 'returns a collection of assets for this organization' do
|
89
|
+
accessor
|
90
|
+
organization = VCR.use_cassette('get_organizations') { client.organizations.first }
|
91
|
+
assets = VCR.use_cassette('get_assets') { organization.assets }
|
92
|
+
|
93
|
+
assert_kind_of Array, assets
|
94
|
+
|
95
|
+
assets.each do |assets|
|
96
|
+
assert_kind_of JD::Model::Asset, assets
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'raises an exception if an accessor is not available' do
|
101
|
+
organization = JD::Model::Organization.new(record)
|
102
|
+
|
103
|
+
exception = assert_raises(JD::AccessTokenError) { organization.assets }
|
104
|
+
assert_includes exception.message, 'Access Token must be supplied'
|
105
|
+
end
|
106
|
+
end
|
86
107
|
end
|
@@ -2,6 +2,14 @@ require 'support/helper'
|
|
2
2
|
|
3
3
|
describe 'MyJohnDeereApi::Model' do
|
4
4
|
describe 'loading dependencies' do
|
5
|
+
it 'loads Model::Asset' do
|
6
|
+
assert JD::Model::Asset
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'loads Model::AssetLocation' do
|
10
|
+
assert JD::Model::AssetLocation
|
11
|
+
end
|
12
|
+
|
5
13
|
it 'loads Model::Organization' do
|
6
14
|
assert JD::Model::Organization
|
7
15
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'support/helper'
|
2
|
+
require 'yaml'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
describe 'MyJohnDeereApi::Request::Collection::AssetLocations' do
|
6
|
+
let(:asset_id) do
|
7
|
+
contents = File.read('test/support/vcr/get_assets.yml')
|
8
|
+
body = YAML.load(contents)['http_interactions'].first['response']['body']['string']
|
9
|
+
JSON.parse(body)['values'].first['id']
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:client) { JD::Client.new(API_KEY, API_SECRET, environment: :sandbox, access: [ACCESS_TOKEN, ACCESS_SECRET]) }
|
13
|
+
let(:accessor) { VCR.use_cassette('catalog') { client.send(:accessor) } }
|
14
|
+
let(:collection) { JD::Request::Collection::AssetLocations.new(accessor, asset: asset_id) }
|
15
|
+
|
16
|
+
describe '#initialize(access_token)' do
|
17
|
+
it 'accepts an access token' do
|
18
|
+
assert_kind_of OAuth::AccessToken, collection.accessor
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'accepts associations' do
|
22
|
+
collection = JD::Request::Collection::AssetLocations.new(accessor, asset: '123')
|
23
|
+
|
24
|
+
assert_kind_of Hash, collection.associations
|
25
|
+
assert_equal '123', collection.associations[:asset]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#resource' do
|
30
|
+
it 'returns /assets/{asset_id}/locations' do
|
31
|
+
assert_equal "/assets/#{asset_id}/locations", collection.resource
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#all' do
|
36
|
+
it 'returns all records' do
|
37
|
+
all = VCR.use_cassette('get_asset_locations', record: :new_episodes) { collection.all }
|
38
|
+
|
39
|
+
assert_kind_of Array, all
|
40
|
+
assert_equal collection.count, all.size
|
41
|
+
assert all.size > 0
|
42
|
+
|
43
|
+
all.each do |item|
|
44
|
+
assert_kind_of JD::Model::AssetLocation, item
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#count' do
|
50
|
+
let(:server_response) do
|
51
|
+
contents = File.read('test/support/vcr/get_asset_locations.yml')
|
52
|
+
body = YAML.load(contents)['http_interactions'].first['response']['body']['string']
|
53
|
+
JSON.parse(body)
|
54
|
+
end
|
55
|
+
|
56
|
+
let(:server_count) { server_response['total'] }
|
57
|
+
|
58
|
+
it 'returns the total count of records in the collection' do
|
59
|
+
count = VCR.use_cassette('get_asset_locations') { collection.count }
|
60
|
+
|
61
|
+
assert_equal server_count, count
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe 'results' do
|
66
|
+
let(:location_timestamps) do
|
67
|
+
contents = File.read('test/support/vcr/get_asset_locations.yml')
|
68
|
+
body = YAML.load(contents)['http_interactions'].first['response']['body']['string']
|
69
|
+
JSON.parse(body)['values'].map{|v| v['timestamp']}
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'returns all records as a single enumerator' do
|
73
|
+
count = VCR.use_cassette('get_asset_locations') { collection.count }
|
74
|
+
timestamps = VCR.use_cassette('get_asset_locations', record: :new_episodes) { collection.map(&:timestamp) }
|
75
|
+
|
76
|
+
assert_kind_of Array, timestamps
|
77
|
+
assert_equal count, timestamps.size
|
78
|
+
assert timestamps.size > 0
|
79
|
+
|
80
|
+
location_timestamps.each do |expected_timestamp|
|
81
|
+
assert_includes timestamps, expected_timestamp
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'support/helper'
|
2
|
+
require 'yaml'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
describe 'MyJohnDeereApi::Request::Collection::Assets' do
|
6
|
+
let(:organization_id) do
|
7
|
+
contents = File.read('test/support/vcr/get_organizations.yml')
|
8
|
+
body = YAML.load(contents)['http_interactions'].first['response']['body']['string']
|
9
|
+
JSON.parse(body)['values'].first['id']
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:client) { JD::Client.new(API_KEY, API_SECRET, environment: :sandbox, access: [ACCESS_TOKEN, ACCESS_SECRET]) }
|
13
|
+
let(:accessor) { VCR.use_cassette('catalog') { client.send(:accessor) } }
|
14
|
+
let(:collection) { JD::Request::Collection::Assets.new(accessor, organization: organization_id) }
|
15
|
+
|
16
|
+
describe '#initialize(access_token)' do
|
17
|
+
it 'accepts an access token' do
|
18
|
+
assert_kind_of OAuth::AccessToken, collection.accessor
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'accepts associations' do
|
22
|
+
collection = JD::Request::Collection::Assets.new(accessor, organization: '123')
|
23
|
+
|
24
|
+
assert_kind_of Hash, collection.associations
|
25
|
+
assert_equal '123', collection.associations[:organization]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#resource' do
|
30
|
+
it 'returns /organizations/{org_id}/assets' do
|
31
|
+
assert_equal "/organizations/#{organization_id}/assets", collection.resource
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#all' do
|
36
|
+
it 'returns all records' do
|
37
|
+
all = VCR.use_cassette('get_assets', record: :new_episodes) { collection.all }
|
38
|
+
|
39
|
+
assert_kind_of Array, all
|
40
|
+
assert_equal collection.count, all.size
|
41
|
+
|
42
|
+
all.each do |item|
|
43
|
+
assert_kind_of JD::Model::Asset, item
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#count' do
|
49
|
+
let(:server_response) do
|
50
|
+
contents = File.read('test/support/vcr/get_assets.yml')
|
51
|
+
body = YAML.load(contents)['http_interactions'].first['response']['body']['string']
|
52
|
+
JSON.parse(body)
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:server_count) { server_response['total'] }
|
56
|
+
|
57
|
+
it 'returns the total count of records in the collection' do
|
58
|
+
count = VCR.use_cassette('get_assets') { collection.count }
|
59
|
+
|
60
|
+
assert_equal server_count, count
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'results' do
|
65
|
+
let(:asset_titles) do
|
66
|
+
contents = File.read('test/support/vcr/get_assets.yml')
|
67
|
+
body = YAML.load(contents)['http_interactions'].first['response']['body']['string']
|
68
|
+
JSON.parse(body)['values'].map{|v| v['title']}
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns all records as a single enumerator' do
|
72
|
+
count = VCR.use_cassette('get_assets') { collection.count }
|
73
|
+
titles = VCR.use_cassette('get_assets', record: :new_episodes) { collection.map(&:title) }
|
74
|
+
|
75
|
+
assert_kind_of Array, titles
|
76
|
+
assert_equal count, titles.size
|
77
|
+
|
78
|
+
asset_titles.each do |expected_title|
|
79
|
+
assert_includes titles, expected_title
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/test/lib/my_john_deere_api/request/collection/{test_organizations.rb → organizations_test.rb}
RENAMED
File without changes
|
@@ -6,6 +6,14 @@ describe 'MyJohnDeereApi::Request::Collection' do
|
|
6
6
|
assert JD::Request::Collection::Base
|
7
7
|
end
|
8
8
|
|
9
|
+
it 'loads Request::Collection::Assets' do
|
10
|
+
assert JD::Request::Collection::Assets
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'loads Request::Collection::AssetLocations' do
|
14
|
+
assert JD::Request::Collection::AssetLocations
|
15
|
+
end
|
16
|
+
|
9
17
|
it 'loads Request::Collection::Organizations' do
|
10
18
|
assert JD::Request::Collection::Organizations
|
11
19
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,55 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://sandboxapi.deere.com/platform/assets/029c288a-14d9-459f-8ee6-b4e840e672a1/locations
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/vnd.deere.axiom.v3+json
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
User-Agent:
|
15
|
+
- OAuth gem v0.5.4
|
16
|
+
Authorization:
|
17
|
+
- OAuth oauth_consumer_key="johndeere-wgmADngYCRmfpEbVgSyc709wnyRux5J7PAv8SE7B",
|
18
|
+
oauth_nonce="qTv5xV20gMbjd7IiRtg8xZlNfZHXX7Dmo1JrfP6xY1A", oauth_signature="exY2Q9m%2FlxXM%2BryRe6b9P7FmT1c%3D",
|
19
|
+
oauth_signature_method="HMAC-SHA1", oauth_timestamp="1578698931", oauth_token="47bbb9c9-41a8-4bec-8127-e3c5760af2f6",
|
20
|
+
oauth_version="1.0"
|
21
|
+
response:
|
22
|
+
status:
|
23
|
+
code: 200
|
24
|
+
message: OK
|
25
|
+
headers:
|
26
|
+
Date:
|
27
|
+
- Fri, 10 Jan 2020 23:28:51 GMT
|
28
|
+
Content-Type:
|
29
|
+
- application/vnd.deere.axiom.v3+json;charset=UTF-8
|
30
|
+
X-Deere-Handling-Server:
|
31
|
+
- ip-10-214-44-15
|
32
|
+
X-Frame-Options:
|
33
|
+
- SAMEORIGIN
|
34
|
+
X-Deere-Elapsed-Ms:
|
35
|
+
- '58'
|
36
|
+
Cache-Control:
|
37
|
+
- no-store
|
38
|
+
Content-Language:
|
39
|
+
- en-US
|
40
|
+
Transfer-Encoding:
|
41
|
+
- chunked
|
42
|
+
body:
|
43
|
+
encoding: ASCII-8BIT
|
44
|
+
string: '{"links":[{"rel":"self","uri":"https://sandboxapi.deere.com/platform/assets/029c288a-14d9-459f-8ee6-b4e840e672a1/locations"}],"total":2,"values":[{"@type":"ContributedAssetLocation","timestamp":"2017-09-20T21:30:59.000Z","geometry":"{\"type\":
|
45
|
+
\"Feature\",\"geometry\": {\"geometries\": [{\"coordinates\": [ -103.115633,
|
46
|
+
41.670166],\"type\": \"Point\"}],\"type\": \"GeometryCollection\"}}","measurementData":[{"@type":"BasicMeasurement","name":"[1
|
47
|
+
Foot](https://app.realmfive.com/map?device=0x0080CDEF)","value":"82","unit":"cB"},{"@type":"BasicMeasurement","name":"[2
|
48
|
+
Feet](https://app.realmfive.com/map?device=0x0080CDEF)","value":"31","unit":"cB"}],"links":[]},{"@type":"ContributedAssetLocation","timestamp":"2017-09-20T21:29:59.000Z","geometry":"{\"type\":
|
49
|
+
\"Feature\",\"geometry\": {\"geometries\": [{\"coordinates\": [ -103.115633,
|
50
|
+
41.670166],\"type\": \"Point\"}],\"type\": \"GeometryCollection\"}}","measurementData":[{"@type":"BasicMeasurement","name":"[Moisture
|
51
|
+
- 1 Foot](https://app.realmfive.com/map?device=0x0080CDEF)","value":"82","unit":"cB"},{"@type":"BasicMeasurement","name":"[Moisture
|
52
|
+
- 2 Feet](https://app.realmfive.com/map?device=0x0080CDEF)","value":"31","unit":"cB"}],"links":[]}]}'
|
53
|
+
http_version:
|
54
|
+
recorded_at: Fri, 10 Jan 2020 23:28:52 GMT
|
55
|
+
recorded_with: VCR 5.0.0
|
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://sandboxapi.deere.com/platform/organizations/444563/assets
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/vnd.deere.axiom.v3+json
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
User-Agent:
|
15
|
+
- OAuth gem v0.5.4
|
16
|
+
Authorization:
|
17
|
+
- OAuth oauth_consumer_key="johndeere-wgmADngYCRmfpEbVgSyc709wnyRux5J7PAv8SE7B",
|
18
|
+
oauth_nonce="6Q43mOlqL5POK9tW4g378nTYY2NzAPxtWCpE6ngfM", oauth_signature="ECsBHW1vv01ybBLwrHTne421c%2Bw%3D",
|
19
|
+
oauth_signature_method="HMAC-SHA1", oauth_timestamp="1578694864", oauth_token="47bbb9c9-41a8-4bec-8127-e3c5760af2f6",
|
20
|
+
oauth_version="1.0"
|
21
|
+
response:
|
22
|
+
status:
|
23
|
+
code: 200
|
24
|
+
message: OK
|
25
|
+
headers:
|
26
|
+
Date:
|
27
|
+
- Fri, 10 Jan 2020 22:21:04 GMT
|
28
|
+
Content-Type:
|
29
|
+
- application/vnd.deere.axiom.v3+json;charset=UTF-8
|
30
|
+
X-Deere-Handling-Server:
|
31
|
+
- ip-10-214-44-225
|
32
|
+
X-Frame-Options:
|
33
|
+
- SAMEORIGIN
|
34
|
+
X-Deere-Elapsed-Ms:
|
35
|
+
- '32'
|
36
|
+
Cache-Control:
|
37
|
+
- no-store
|
38
|
+
Content-Language:
|
39
|
+
- en-US
|
40
|
+
Transfer-Encoding:
|
41
|
+
- chunked
|
42
|
+
body:
|
43
|
+
encoding: ASCII-8BIT
|
44
|
+
string: '{"links":[{"rel":"self","uri":"https://sandboxapi.deere.com/platform/organizations/444563/assets"}],"total":3,"values":[{"@type":"ContributedAsset","title":"Flex
|
45
|
+
(Watermark)","assetCategory":"DEVICE","assetType":"SENSOR","assetSubType":"ENVIRONMENTAL","lastModifiedDate":"2019-09-20T21:13:38.232Z","id":"029c288a-14d9-459f-8ee6-b4e840e672a1","links":[{"@type":"Link","rel":"self","uri":"https://sandboxapi.deere.com/platform/assets/029c288a-14d9-459f-8ee6-b4e840e672a1"},{"@type":"Link","rel":"contributionDefinition","uri":"https://sandboxapi.deere.com/platform/contributionDefinitions/d93611c7-6f74-474f-9569-2cf88f866a32"},{"@type":"Link","rel":"organization","uri":"https://sandboxapi.deere.com/platform/organizations/444563"},{"@type":"Link","rel":"locations","uri":"https://sandboxapi.deere.com/platform/assets/029c288a-14d9-459f-8ee6-b4e840e672a1/locations"},{"@type":"Link","rel":"lastKnownLocation","uri":"https://sandboxapi.deere.com/platform/assets/029c288a-14d9-459f-8ee6-b4e840e672a1/locations?lastKnown=true"}]},{"@type":"ContributedAsset","title":"Pivot","assetCategory":"DEVICE","assetType":"SENSOR","assetSubType":"IRRIGATION_PIVOT","lastModifiedDate":"2019-09-20T21:14:13.931Z","id":"900b3657-0868-46b7-8322-70f204d44281","links":[{"@type":"Link","rel":"self","uri":"https://sandboxapi.deere.com/platform/assets/900b3657-0868-46b7-8322-70f204d44281"},{"@type":"Link","rel":"contributionDefinition","uri":"https://sandboxapi.deere.com/platform/contributionDefinitions/d93611c7-6f74-474f-9569-2cf88f866a32"},{"@type":"Link","rel":"organization","uri":"https://sandboxapi.deere.com/platform/organizations/444563"},{"@type":"Link","rel":"locations","uri":"https://sandboxapi.deere.com/platform/assets/900b3657-0868-46b7-8322-70f204d44281/locations"},{"@type":"Link","rel":"lastKnownLocation","uri":"https://sandboxapi.deere.com/platform/assets/900b3657-0868-46b7-8322-70f204d44281/locations?lastKnown=true"}]},{"@type":"ContributedAsset","title":"Float","assetCategory":"DEVICE","assetType":"SENSOR","assetSubType":"ENVIRONMENTAL","lastModifiedDate":"2019-09-20T21:13:58.799Z","id":"da668043-a366-4dac-bfc9-3aeafe1175dd","links":[{"@type":"Link","rel":"self","uri":"https://sandboxapi.deere.com/platform/assets/da668043-a366-4dac-bfc9-3aeafe1175dd"},{"@type":"Link","rel":"contributionDefinition","uri":"https://sandboxapi.deere.com/platform/contributionDefinitions/d93611c7-6f74-474f-9569-2cf88f866a32"},{"@type":"Link","rel":"organization","uri":"https://sandboxapi.deere.com/platform/organizations/444563"},{"@type":"Link","rel":"locations","uri":"https://sandboxapi.deere.com/platform/assets/da668043-a366-4dac-bfc9-3aeafe1175dd/locations"},{"@type":"Link","rel":"lastKnownLocation","uri":"https://sandboxapi.deere.com/platform/assets/da668043-a366-4dac-bfc9-3aeafe1175dd/locations?lastKnown=true"}]}]}'
|
46
|
+
http_version:
|
47
|
+
recorded_at: Fri, 10 Jan 2020 22:21:05 GMT
|
48
|
+
recorded_with: VCR 5.0.0
|
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: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaime. Bellmyer
|
@@ -103,46 +103,56 @@ files:
|
|
103
103
|
- lib/my_john_deere_api/errors/access_token_error.rb
|
104
104
|
- lib/my_john_deere_api/helpers.rb
|
105
105
|
- lib/my_john_deere_api/helpers/case_conversion.rb
|
106
|
-
- lib/my_john_deere_api/helpers/
|
106
|
+
- lib/my_john_deere_api/helpers/uri_helpers.rb
|
107
107
|
- lib/my_john_deere_api/model.rb
|
108
|
+
- lib/my_john_deere_api/model/asset.rb
|
109
|
+
- lib/my_john_deere_api/model/asset_location.rb
|
108
110
|
- lib/my_john_deere_api/model/field.rb
|
109
111
|
- lib/my_john_deere_api/model/flag.rb
|
110
112
|
- lib/my_john_deere_api/model/organization.rb
|
111
113
|
- lib/my_john_deere_api/request.rb
|
112
114
|
- lib/my_john_deere_api/request/collection.rb
|
115
|
+
- lib/my_john_deere_api/request/collection/asset_locations.rb
|
116
|
+
- lib/my_john_deere_api/request/collection/assets.rb
|
113
117
|
- lib/my_john_deere_api/request/collection/base.rb
|
114
118
|
- lib/my_john_deere_api/request/collection/fields.rb
|
115
119
|
- lib/my_john_deere_api/request/collection/flags.rb
|
116
120
|
- lib/my_john_deere_api/request/collection/organizations.rb
|
117
121
|
- lib/my_john_deere_api/version.rb
|
118
|
-
- test/lib/my_john_deere_api/
|
119
|
-
- test/lib/my_john_deere_api/
|
120
|
-
- test/lib/my_john_deere_api/
|
121
|
-
- test/lib/my_john_deere_api/
|
122
|
-
- test/lib/my_john_deere_api/
|
123
|
-
- test/lib/my_john_deere_api/
|
124
|
-
- test/lib/my_john_deere_api/
|
125
|
-
- test/lib/my_john_deere_api/
|
126
|
-
- test/lib/my_john_deere_api/
|
127
|
-
- test/lib/my_john_deere_api/
|
128
|
-
- test/lib/my_john_deere_api/
|
129
|
-
- test/lib/my_john_deere_api/
|
130
|
-
- test/lib/my_john_deere_api/
|
131
|
-
- test/lib/my_john_deere_api/
|
132
|
-
- test/lib/my_john_deere_api/
|
133
|
-
- test/lib/my_john_deere_api/
|
134
|
-
- test/lib/my_john_deere_api/
|
135
|
-
- test/lib/my_john_deere_api/
|
136
|
-
- test/lib/my_john_deere_api/
|
122
|
+
- test/lib/my_john_deere_api/authorize_test.rb
|
123
|
+
- test/lib/my_john_deere_api/client_test.rb
|
124
|
+
- test/lib/my_john_deere_api/consumer_test.rb
|
125
|
+
- test/lib/my_john_deere_api/errors/access_token_error_test.rb
|
126
|
+
- test/lib/my_john_deere_api/errors_test.rb
|
127
|
+
- test/lib/my_john_deere_api/helpers/case_conversion_test.rb
|
128
|
+
- test/lib/my_john_deere_api/helpers/uri_helpers_test.rb
|
129
|
+
- test/lib/my_john_deere_api/helpers_test.rb
|
130
|
+
- test/lib/my_john_deere_api/model/asset_location_test.rb
|
131
|
+
- test/lib/my_john_deere_api/model/asset_test.rb
|
132
|
+
- test/lib/my_john_deere_api/model/field_test.rb
|
133
|
+
- test/lib/my_john_deere_api/model/flag_test.rb
|
134
|
+
- test/lib/my_john_deere_api/model/organization_test.rb
|
135
|
+
- test/lib/my_john_deere_api/model_test.rb
|
136
|
+
- test/lib/my_john_deere_api/request/collection/asset_locations_test.rb
|
137
|
+
- test/lib/my_john_deere_api/request/collection/assets_test.rb
|
138
|
+
- test/lib/my_john_deere_api/request/collection/base_test.rb
|
139
|
+
- test/lib/my_john_deere_api/request/collection/fields_test.rb
|
140
|
+
- test/lib/my_john_deere_api/request/collection/flags_test.rb
|
141
|
+
- test/lib/my_john_deere_api/request/collection/organizations_test.rb
|
142
|
+
- test/lib/my_john_deere_api/request/collection_test.rb
|
143
|
+
- test/lib/my_john_deere_api/request_test.rb
|
144
|
+
- test/lib/my_john_deere_api/version_test.rb
|
145
|
+
- test/my_john_deere_api_test.rb
|
137
146
|
- test/support/helper.rb
|
138
147
|
- test/support/vcr/app_consumer.yml
|
139
148
|
- test/support/vcr/catalog.yml
|
140
149
|
- test/support/vcr/get_access_token.yml
|
150
|
+
- test/support/vcr/get_asset_locations.yml
|
151
|
+
- test/support/vcr/get_assets.yml
|
141
152
|
- test/support/vcr/get_fields.yml
|
142
153
|
- test/support/vcr/get_flags.yml
|
143
154
|
- test/support/vcr/get_organizations.yml
|
144
155
|
- test/support/vcr/get_request_token.yml
|
145
|
-
- test/test_my_john_deere_api.rb
|
146
156
|
homepage: https://github.com/Intellifarm/my_john_deere_api
|
147
157
|
licenses:
|
148
158
|
- MIT
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'support/helper'
|
2
|
-
|
3
|
-
class UriPathHelperSample
|
4
|
-
include JD::Helpers::UriPath
|
5
|
-
end
|
6
|
-
|
7
|
-
describe 'UriPath' do
|
8
|
-
let(:object) { UriPathHelperSample.new }
|
9
|
-
|
10
|
-
it 'extracts the path from the uri' do
|
11
|
-
path = object.send(:uri_path, 'https://example.com/turtles')
|
12
|
-
assert_equal '/turtles', path
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'removes leading /platform from the path' do
|
16
|
-
path = object.send(:uri_path, 'https://example.com/platform/turtles')
|
17
|
-
assert_equal '/turtles', path
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'preserves /platform in any other part of the path' do
|
21
|
-
path = object.send(:uri_path, 'https://example.com/platform/turtles/platform')
|
22
|
-
assert_equal '/turtles/platform', path
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'is a private method' do
|
26
|
-
assert_raises(NoMethodError) { object.uri_path('https://example.com/turtles')}
|
27
|
-
end
|
28
|
-
end
|