my_john_deere_api 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9e4802c00252cf2770981858362b93cd8b97791e33107bcb7f5edb75c4466bc
4
- data.tar.gz: bb0b07d289995ecd438978c6b5754e9e348e8f2cf7073d865f0e4b19c4afb934
3
+ metadata.gz: 1972b07d8f4e72723a8984e459a5fc97e7587914b06415dcd2ce181d6db3c43b
4
+ data.tar.gz: 6ecea1bd5fef0c60e04c510674c54adae3dd80967f3132fbba68e54d199a57e9
5
5
  SHA512:
6
- metadata.gz: 46140b980eff6e3c8c8299b290219e168c822b4b91a405a6685af3453717e0d93e49e0eb9fba2fc601022279488802d638d5416dc8a406dda7fce2035bb5e275
7
- data.tar.gz: ad162f92e55a7012997a15ee91b1c6040af309455e78bf25fcc7114770534f53cceb9fe69d1def94cc6ff0ab053de7c7459efc8776100abac55192ecad5e165a
6
+ metadata.gz: 905162ea13bdb92ef6a7a1c0d86db73e351c0edf8f3b8420a8cb93193eb6e0e4e717436ca535b705636c0fe01256ee2797e9ae20f9e020b515cc15ad0e649c3b
7
+ data.tar.gz: 28a612aab3944a40bf19e23bc3640db8cdcff1e78faed99e374320df64ceb7441df5b92171e5aa2c0beb56ef90c26aa3dd2bae3cd5a061d4c3ba96277142f837
@@ -1,34 +1,25 @@
1
1
  class MyJohnDeereApi::Authorize
2
- attr_reader :api_key, :api_secret, :request_token, :request_secret, :access_token, :access_secret, :environment
3
- attr_accessor :base_url
4
-
5
- URLS = {
6
- sandbox: 'https://sandboxapi.deere.com',
7
- production: 'https://api.soa-proxy.deere.com',
8
- }
2
+ attr_reader :api_key, :api_secret,
3
+ :request_token, :request_secret,
4
+ :access_token, :access_secret,
5
+ :environment
9
6
 
10
7
  DEFAULTS = {
11
- environment: :production,
8
+ environment: :production
12
9
  }
13
10
 
14
11
  ##
15
- # Create an Authorize object using your John Deere API key/secret.
16
- #
17
- # Options:
18
- #
19
- # [:environment] *:production* or *:sandbox*, determines the base url
20
- # used to make oauth requests.
12
+ # Create an Authorize object.
21
13
  #
22
- # [:base_url] set the base url directly, since in the future,
23
- # *environment* may affect other things.
14
+ # This is used to obtain authentication an access key/secret
15
+ # on behalf of a user.
24
16
 
25
- def initialize(api_key, api_secret, options={})
17
+ def initialize(api_key, api_secret, options = {})
26
18
  options = DEFAULTS.merge(options)
27
19
 
28
20
  @api_key = api_key
29
21
  @api_secret = api_secret
30
22
  @environment = options[:environment]
31
- @base_url = options[:base_url] || URLS[@environment]
32
23
  end
33
24
 
34
25
  ##
@@ -38,13 +29,21 @@ class MyJohnDeereApi::Authorize
38
29
  def authorize_url
39
30
  return @authorize_url if defined?(@authorize_url)
40
31
 
41
- requester = app_consumer.get_request_token
32
+ requester = consumer.get_request_token
42
33
  @request_token = requester.token
43
34
  @request_secret = requester.secret
44
35
 
45
36
  @authorize_url = requester.authorize_url
46
37
  end
47
38
 
39
+ ##
40
+ # API consumer that makes non-user-specific GET requests
41
+
42
+ def consumer
43
+ return @consumer if defined?(@consumer)
44
+ @consumer = MyJohnDeereApi::Consumer.new(@api_key, @api_secret, environment: environment).app_get
45
+ end
46
+
48
47
  ##
49
48
  # Turn a verification code into access tokens. If this is
50
49
  # run from a separate process than the one that created
@@ -55,72 +54,10 @@ class MyJohnDeereApi::Authorize
55
54
  token ||= request_token
56
55
  secret ||= request_secret
57
56
 
58
- requester = OAuth::RequestToken.new(app_consumer, token, secret)
57
+ requester = OAuth::RequestToken.new(consumer, token, secret)
59
58
  access_object = requester.get_access_token(oauth_verifier: code)
60
59
  @access_token = access_object.token
61
60
  @access_secret = access_object.secret
62
61
  nil
63
62
  end
64
-
65
- ##
66
- # oAuth Consumer which uses just the base url, for
67
- # app-wide, non user-specific requests.
68
-
69
- def app_consumer
70
- @app_consumer ||= consumer(base_url)
71
- end
72
-
73
- ##
74
- # oAuth Consumer which uses the proper url for user-specific requests.
75
-
76
- def user_consumer
77
- @user_consumer ||= consumer("#{base_url}/platform")
78
- end
79
-
80
- private
81
-
82
- def consumer(site)
83
- OAuth::Consumer.new(
84
- api_key,
85
- api_secret,
86
- site: site,
87
- header: header,
88
- http_method: :get,
89
- request_token_url: links[:request_token],
90
- access_token_url: links[:access_token],
91
- authorize_url: links[:authorize_request_token]
92
- )
93
- end
94
-
95
- def links
96
- return @links if defined?(@links)
97
-
98
- catalog = OAuth::Consumer.new(api_key, api_secret)
99
- .request(
100
- :get,
101
- "#{base_url}/platform/",
102
- nil,
103
- {},
104
- header
105
- ).body
106
-
107
- @links = {}
108
-
109
- JSON.parse(catalog)['links'].each do |link|
110
- uri = URI.parse(link['uri'])
111
- uri.query = nil
112
-
113
- @links[keyify(link['rel'])] = uri.to_s
114
- end
115
-
116
- @links
117
- end
118
-
119
- def header
120
- {accept: 'application/vnd.deere.axiom.v3+json'}
121
- end
122
-
123
- def keyify key_name
124
- key_name.gsub(/^oauth/, '').gsub(/([a-z])([A-Z])/, '\1_\2').downcase.to_sym
125
- end
126
63
  end
@@ -0,0 +1,51 @@
1
+ class MyJohnDeereApi::Client
2
+ attr_reader :api_key, :api_secret, :access_token, :access_secret, :environment
3
+
4
+ DEFAULTS = {
5
+ environment: :production
6
+ }
7
+
8
+ ##
9
+ # Creates the client with everthing it needs to perform API requests.
10
+ # User-specific credentials are optional, but user-specific API
11
+ # requests are only possible if they are supplied.
12
+ #
13
+ # options:
14
+ #
15
+ # [:environment] :sandbox or :production
16
+ #
17
+ # [:access] an array with two elements, the access_token
18
+ # and the access_secret of the given user
19
+
20
+ def initialize(api_key, api_secret, options = {})
21
+ options = DEFAULTS.merge(options)
22
+
23
+ @api_key = api_key
24
+ @api_secret = api_secret
25
+
26
+ if options.has_key?(:access) && options[:access].is_a?(Array)
27
+ @access_token, @access_secret = options[:access]
28
+ end
29
+
30
+ @environment = options[:environment]
31
+ end
32
+
33
+ private
34
+
35
+ ##
36
+ # Returns an oAuth consumer which can be used to build requests
37
+
38
+ def consumer
39
+ return @consumer if defined?(@consumer)
40
+ @consumer = MyJohnDeereApi::Consumer.new(@api_key, @api_secret, environment: environment)
41
+ end
42
+
43
+ ##
44
+ # Returns an oAuth AccessToken object which can be used to make
45
+ # user-specific API requests
46
+
47
+ def accessor
48
+ return @accessor if defined?(@accessor)
49
+ @accessor = OAuth::AccessToken.new(consumer.user_get, access_token, access_secret)
50
+ end
51
+ end
@@ -0,0 +1,85 @@
1
+ class MyJohnDeereApi::Consumer
2
+ attr_reader :api_key, :api_secret, :environment, :base_url
3
+
4
+ # valid API urls
5
+ URLS = {
6
+ sandbox: 'https://sandboxapi.deere.com',
7
+ production: 'https://api.soa-proxy.deere.com',
8
+ }
9
+
10
+ DEFAULTS = {
11
+ environment: :production
12
+ }
13
+
14
+ def initialize(api_key, api_secret, options={})
15
+ options = DEFAULTS.merge(options)
16
+
17
+ @api_key = api_key
18
+ @api_secret = api_secret
19
+
20
+ @environment = options[:environment]
21
+ @base_url = options[:base_url] || URLS[@environment]
22
+ end
23
+
24
+ ##
25
+ # oAuth Consumer which uses just the base url, for
26
+ # app-wide, non user-specific GET requests.
27
+
28
+ def app_get
29
+ @app_get ||= consumer(base_url)
30
+ end
31
+
32
+ ##
33
+ # oAuth Consumer which uses the proper url for user-specific GET requests.
34
+
35
+ def user_get
36
+ @user_get ||= consumer("#{base_url}/platform")
37
+ end
38
+
39
+ private
40
+
41
+ def consumer(site)
42
+ OAuth::Consumer.new(
43
+ api_key,
44
+ api_secret,
45
+ site: site,
46
+ header: header,
47
+ http_method: :get,
48
+ request_token_url: links[:request_token],
49
+ access_token_url: links[:access_token],
50
+ authorize_url: links[:authorize_request_token]
51
+ )
52
+ end
53
+
54
+ def links
55
+ return @links if defined?(@links)
56
+
57
+ catalog = OAuth::Consumer.new(api_key, api_secret)
58
+ .request(
59
+ :get,
60
+ "#{base_url}/platform/",
61
+ nil,
62
+ {},
63
+ header
64
+ ).body
65
+
66
+ @links = {}
67
+
68
+ JSON.parse(catalog)['links'].each do |link|
69
+ uri = URI.parse(link['uri'])
70
+ uri.query = nil
71
+
72
+ @links[keyify(link['rel'])] = uri.to_s
73
+ end
74
+
75
+ @links
76
+ end
77
+
78
+ def header
79
+ @header ||= {accept: 'application/vnd.deere.axiom.v3+json'}
80
+ end
81
+
82
+ def keyify key_name
83
+ key_name.gsub(/^oauth/, '').gsub(/([a-z])([A-Z])/, '\1_\2').downcase.to_sym
84
+ end
85
+ end
@@ -1,3 +1,3 @@
1
1
  module MyJohnDeereApi
2
- VERSION='0.0.3'
2
+ VERSION='0.0.4'
3
3
  end
@@ -5,4 +5,6 @@ require 'json'
5
5
  module MyJohnDeereApi
6
6
  autoload :VERSION, 'my_john_deere_api/version'
7
7
  autoload :Authorize, 'my_john_deere_api/authorize'
8
+ autoload :Client, 'my_john_deere_api/client'
9
+ autoload :Consumer, 'my_john_deere_api/consumer'
8
10
  end
@@ -2,50 +2,49 @@ require 'uri'
2
2
  require 'cgi'
3
3
  require 'support/helper'
4
4
 
5
- TOKEN_PATTERN = /^[0-9a-z\-]+$/
6
- SECRET_PATTERN = /^[0-9A-Za-z\-+=\/]+$/
7
- API_KEY = ENV['API_KEY']
8
- API_SECRET = ENV['API_SECRET']
9
-
10
5
  def contains_parameters?(uri)
11
6
  !URI.parse(uri).query.nil?
12
7
  end
13
8
 
14
9
  def create_authorize
15
- JD::Authorize.new(API_KEY, API_SECRET, environment: :sandbox)
10
+ VCR.use_cassette('catalog'){ JD::Authorize.new(API_KEY, API_SECRET, environment: :sandbox) }
16
11
  end
17
12
 
18
13
  def fancy_url
19
14
  'https://example.com/turtles'
20
15
  end
21
16
 
22
- class AuthorizeTest < MiniTest::Test
17
+ describe 'MyJohnDeereApi::Authorize' do
23
18
  describe 'initialization' do
24
- it "accepts an API key and secret" do
25
- authorize = JD::Authorize.new('key', 'secret')
19
+ it 'sets the api key/secret' do
20
+ authorize = VCR.use_cassette('catalog') { JD::Authorize.new(API_KEY, API_SECRET) }
26
21
 
27
- assert_equal 'key', authorize.api_key
28
- assert_equal 'secret', authorize.api_secret
22
+ assert_equal API_KEY, authorize.api_key
23
+ assert_equal API_SECRET, authorize.api_secret
29
24
  end
30
25
 
31
- it 'defaults to production environment' do
32
- authorize = JD::Authorize.new('key', 'secret')
33
- assert_equal :production, authorize.environment
34
- end
26
+ it 'sets the environment' do
27
+ environment = :sandbox
35
28
 
36
- it 'defaults to production oauth url' do
37
- authorize = JD::Authorize.new('key', 'secret')
38
- assert_equal 'https://api.soa-proxy.deere.com', authorize.base_url
29
+ authorize = VCR.use_cassette('catalog') { JD::Authorize.new(API_KEY, API_SECRET, environment: environment) }
30
+ assert_equal environment, authorize.environment
39
31
  end
40
32
 
41
- it "can set the environment" do
42
- authorize = JD::Authorize.new('key', 'secret', environment: :sandbox)
43
- assert_equal :sandbox, authorize.environment
33
+ it 'defaults the environment to production' do
34
+ environment = :production
35
+
36
+ authorize = VCR.use_cassette('catalog') { JD::Authorize.new(API_KEY, API_SECRET) }
37
+ assert_equal environment, authorize.environment
44
38
  end
39
+ end
45
40
 
46
- it "can set the base_url via the environment" do
47
- authorize = JD::Authorize.new('key', 'secret', environment: :sandbox)
48
- assert_equal 'https://sandboxapi.deere.com', authorize.base_url
41
+ describe '#consumer' do
42
+ it "returns a non-user-specific consumer configured for GET requests" do
43
+ authorize = create_authorize
44
+ consumer = VCR.use_cassette('catalog') { authorize.consumer }
45
+
46
+ assert_kind_of OAuth::Consumer, consumer
47
+ assert_equal :get, consumer.http_method
49
48
  end
50
49
  end
51
50
 
@@ -54,8 +53,9 @@ class AuthorizeTest < MiniTest::Test
54
53
  authorize = create_authorize
55
54
 
56
55
  url = VCR.use_cassette('get_request_token') { authorize.authorize_url }
56
+ links = VCR.use_cassette('catalog') { JD::Consumer.new(API_KEY, API_SECRET, environment: :sandbox).send(:links) }
57
57
 
58
- assert_includes url, "#{authorize.send(:links)[:authorize_request_token]}?oauth_token="
58
+ assert_includes url, "#{links[:authorize_request_token]}?oauth_token="
59
59
 
60
60
  query = URI.parse(url).query
61
61
  params = CGI::parse(query)
@@ -85,57 +85,4 @@ class AuthorizeTest < MiniTest::Test
85
85
  assert_match SECRET_PATTERN, authorize.access_secret
86
86
  end
87
87
  end
88
-
89
- describe '#links' do
90
- it "returns a list of catalog urls" do
91
- authorize = create_authorize
92
-
93
- links = VCR.use_cassette("catalog"){ authorize.send(:links) }
94
-
95
- assert_kind_of Hash, links
96
-
97
- [:request_token, :authorize_request_token, :access_token].each do |link|
98
- assert links.has_key?(link)
99
- refute contains_parameters?(links[link])
100
- end
101
- end
102
- end
103
-
104
- describe '#base_url' do
105
- it 'defaults to production deere url' do
106
- authorize = JD::Authorize.new('key', 'secret')
107
- assert_equal 'https://api.soa-proxy.deere.com', authorize.base_url
108
- end
109
-
110
- it 'can be set via accessor' do
111
- authorize = create_authorize
112
- authorize.base_url = fancy_url
113
-
114
- assert_equal fancy_url, authorize.base_url
115
- end
116
- end
117
-
118
- describe '#app_consumer' do
119
- it 'creates a working oAuth consumer for non-user-specific requests' do
120
- auth = create_authorize
121
- app_consumer = VCR.use_cassette('app_consumer') { auth.app_consumer }
122
-
123
- assert_kind_of OAuth::Consumer, app_consumer
124
- assert_equal API_KEY, app_consumer.key
125
- assert_equal API_SECRET, app_consumer.secret
126
- assert_equal auth.base_url, app_consumer.site
127
- end
128
- end
129
-
130
- describe '#user_consumer' do
131
- it 'creates a working oAuth consumer for user-specific requests' do
132
- auth = create_authorize
133
- user_consumer = VCR.use_cassette('app_consumer') { auth.user_consumer }
134
-
135
- assert_kind_of OAuth::Consumer, user_consumer
136
- assert_equal API_KEY, user_consumer.key
137
- assert_equal API_SECRET, user_consumer.secret
138
- assert_equal "#{auth.base_url}/platform", user_consumer.site
139
- end
140
- end
141
88
  end
@@ -0,0 +1,63 @@
1
+ require 'support/helper'
2
+
3
+ describe 'MyJohnDeereApi::Client' do
4
+ describe '#initialize(api_key, api_secret)' do
5
+ it 'sets the api key/secret' do
6
+ client = JD::Client.new(API_KEY, API_SECRET)
7
+
8
+ assert_equal API_KEY, client.api_key
9
+ assert_equal API_SECRET, client.api_secret
10
+ end
11
+
12
+ it 'accepts access token/secret' do
13
+ access_token = 'token'
14
+ access_secret = 'secret'
15
+
16
+ client = JD::Client.new(API_KEY, API_SECRET, access: [access_token, access_secret])
17
+
18
+ assert_equal access_token, client.access_token
19
+ assert_equal access_secret, client.access_secret
20
+ end
21
+
22
+ it 'accepts environment' do
23
+ environment = :sandbox
24
+
25
+ client = JD::Client.new(API_KEY, API_SECRET, environment: environment)
26
+ assert_equal environment, client.environment
27
+ end
28
+
29
+ it 'defaults the environment to production' do
30
+ environment = :production
31
+
32
+ client = JD::Client.new(API_KEY, API_SECRET)
33
+ assert_equal environment, client.environment
34
+ end
35
+ end
36
+
37
+ describe '#consumer' do
38
+ it 'receives the api key/secret and environment of the client' do
39
+ environment = :sandbox
40
+
41
+ client = JD::Client.new(API_KEY, API_SECRET, environment: environment)
42
+ consumer = client.send :consumer
43
+
44
+ assert_kind_of JD::Consumer, consumer
45
+ assert_equal API_KEY, consumer.api_key
46
+ assert_equal API_SECRET, consumer.api_secret
47
+ assert_equal environment, consumer.environment
48
+ end
49
+ end
50
+
51
+ describe '#accessor' do
52
+ it 'returns an object that can make user-specific requests' do
53
+ client = JD::Client.new(API_KEY, API_SECRET, environment: :sandbox, access: [ACCESS_TOKEN, ACCESS_SECRET])
54
+ consumer = client.send(:consumer)
55
+ accessor = VCR.use_cassette('catalog') { client.send :accessor }
56
+
57
+ assert_kind_of OAuth::AccessToken, accessor
58
+ assert_kind_of OAuth::Consumer, accessor.consumer
59
+ assert_equal ACCESS_TOKEN, accessor.token
60
+ assert_equal ACCESS_SECRET, accessor.secret
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,74 @@
1
+ require 'support/helper'
2
+
3
+ describe 'JD::Consumer' do
4
+ describe '#initialize' do
5
+ it 'requires an api key and secret' do
6
+ consumer = JD::Consumer.new(API_KEY, API_SECRET)
7
+
8
+ assert_equal API_KEY, consumer.api_key
9
+ assert_equal API_SECRET, consumer.api_secret
10
+ end
11
+
12
+ it 'accepts sandbox environment' do
13
+ environment = :sandbox
14
+ consumer = JD::Consumer.new(API_KEY, API_SECRET, environment: environment)
15
+
16
+ assert_equal environment, consumer.environment
17
+ assert_equal JD::Consumer::URLS[environment], consumer.base_url
18
+ end
19
+
20
+ it 'accepts production environment' do
21
+ environment = :production
22
+ consumer = JD::Consumer.new(API_KEY, API_SECRET, environment: environment)
23
+
24
+ assert_equal environment, consumer.environment
25
+ assert_equal JD::Consumer::URLS[environment], consumer.base_url
26
+ end
27
+
28
+ it 'defaults to production environment' do
29
+ default_environment = :production
30
+ consumer = JD::Consumer.new(API_KEY, API_SECRET)
31
+
32
+ assert_equal default_environment, consumer.environment
33
+ assert_equal JD::Consumer::URLS[default_environment], consumer.base_url
34
+ end
35
+
36
+ it 'accepts an arbitrary base_url' do
37
+ base_url = 'https://example.com'
38
+ consumer = JD::Consumer.new(API_KEY, API_SECRET, base_url: base_url)
39
+
40
+ assert_equal base_url, consumer.base_url
41
+ end
42
+
43
+ it 'uses specified base_url regardless of specified environment' do
44
+ base_url = 'https://example.com'
45
+ consumer = JD::Consumer.new(API_KEY, API_SECRET, base_url: base_url, environment: :sandbox)
46
+
47
+ assert_equal base_url, consumer.base_url
48
+ end
49
+ end
50
+
51
+ describe '#app_get' do
52
+ it 'creates a working oAuth consumer for non-user-specific GET requests' do
53
+ consumer = JD::Consumer.new(API_KEY, API_SECRET, environment: :sandbox)
54
+ app_get = VCR.use_cassette('app_consumer') { consumer.app_get }
55
+
56
+ assert_kind_of OAuth::Consumer, app_get
57
+ assert_equal API_KEY, app_get.key
58
+ assert_equal API_SECRET, app_get.secret
59
+ assert_equal JD::Consumer::URLS[:sandbox], app_get.site
60
+ end
61
+ end
62
+
63
+ describe '#user_get' do
64
+ it 'creates a working oAuth consumer for user-specific GET requests' do
65
+ consumer = JD::Consumer.new(API_KEY, API_SECRET, environment: :sandbox)
66
+ user_get = VCR.use_cassette('app_consumer') { consumer.user_get }
67
+
68
+ assert_kind_of OAuth::Consumer, user_get
69
+ assert_equal API_KEY, user_get.key
70
+ assert_equal API_SECRET, user_get.secret
71
+ assert_equal "#{JD::Consumer::URLS[:sandbox]}/platform", user_get.site
72
+ end
73
+ end
74
+ end
@@ -8,6 +8,15 @@ require 'my_john_deere_api'
8
8
  # shortcut for long module name
9
9
  JD = MyJohnDeereApi
10
10
 
11
+ API_KEY = ENV['API_KEY']
12
+ API_SECRET = ENV['API_SECRET']
13
+
14
+ ACCESS_TOKEN = ENV['ACCESS_TOKEN']
15
+ ACCESS_SECRET = ENV['ACCESS_SECRET']
16
+
17
+ TOKEN_PATTERN = /^[0-9a-z\-]+$/
18
+ SECRET_PATTERN = /^[0-9A-Za-z\-+=\/]+$/
19
+
11
20
  VCR.configure do |config|
12
21
  config.cassette_library_dir = 'test/support/vcr'
13
22
  config.hook_into :webmock
@@ -9,5 +9,13 @@ class MyJohnDeereApiTest < MiniTest::Test
9
9
  it 'loads Authorize' do
10
10
  assert JD::Authorize
11
11
  end
12
+
13
+ it 'loads Client' do
14
+ assert JD::Client
15
+ end
16
+
17
+ it 'loads Consumer' do
18
+ assert JD::Consumer
19
+ end
12
20
  end
13
21
  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.0.3
4
+ version: 0.0.4
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-06 00:00:00.000000000 Z
11
+ date: 2020-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: vcr
@@ -97,8 +97,12 @@ files:
97
97
  - Rakefile
98
98
  - lib/my_john_deere_api.rb
99
99
  - lib/my_john_deere_api/authorize.rb
100
+ - lib/my_john_deere_api/client.rb
101
+ - lib/my_john_deere_api/consumer.rb
100
102
  - lib/my_john_deere_api/version.rb
101
103
  - test/lib/test_authorize.rb
104
+ - test/lib/test_client.rb
105
+ - test/lib/test_consumer.rb
102
106
  - test/lib/test_version.rb
103
107
  - test/support/helper.rb
104
108
  - test/support/vcr/app_consumer.yml