heartland-retail 5.0.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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +16 -0
  5. data/.yardopts +1 -0
  6. data/Gemfile +15 -0
  7. data/Gemfile.lock +84 -0
  8. data/LICENSE +21 -0
  9. data/README.md +272 -0
  10. data/Rakefile +18 -0
  11. data/heartland-retail.gemspec +17 -0
  12. data/lib/heartland-retail.rb +1 -0
  13. data/lib/heartland/client.rb +299 -0
  14. data/lib/heartland/client/body.rb +13 -0
  15. data/lib/heartland/client/collection.rb +121 -0
  16. data/lib/heartland/client/errors.rb +17 -0
  17. data/lib/heartland/client/resource.rb +215 -0
  18. data/lib/heartland/client/response.rb +84 -0
  19. data/lib/heartland/client/uri.rb +117 -0
  20. data/spec/heartland/client/body_spec.rb +31 -0
  21. data/spec/heartland/client/resource_spec.rb +318 -0
  22. data/spec/heartland/client/response_spec.rb +105 -0
  23. data/spec/heartland/client/uri_spec.rb +157 -0
  24. data/spec/heartland/client_spec.rb +361 -0
  25. data/spec/shared_client_context.rb +5 -0
  26. data/spec/spec_helper.rb +17 -0
  27. data/vendor/cache/addressable-2.2.8.gem +0 -0
  28. data/vendor/cache/codeclimate-test-reporter-1.0.8.gem +0 -0
  29. data/vendor/cache/coderay-1.1.0.gem +0 -0
  30. data/vendor/cache/coveralls-0.7.11.gem +0 -0
  31. data/vendor/cache/crack-0.4.2.gem +0 -0
  32. data/vendor/cache/diff-lcs-1.2.5.gem +0 -0
  33. data/vendor/cache/docile-1.1.5.gem +0 -0
  34. data/vendor/cache/faraday-0.17.3.gem +0 -0
  35. data/vendor/cache/hashie-4.1.0.gem +0 -0
  36. data/vendor/cache/json-2.3.0.gem +0 -0
  37. data/vendor/cache/method_source-0.8.2.gem +0 -0
  38. data/vendor/cache/mime-types-2.4.3.gem +0 -0
  39. data/vendor/cache/multi_json-1.11.0.gem +0 -0
  40. data/vendor/cache/multipart-post-2.1.1.gem +0 -0
  41. data/vendor/cache/netrc-0.10.3.gem +0 -0
  42. data/vendor/cache/pry-0.10.1.gem +0 -0
  43. data/vendor/cache/rake-10.4.2.gem +0 -0
  44. data/vendor/cache/rest-client-1.7.3.gem +0 -0
  45. data/vendor/cache/rspec-3.2.0.gem +0 -0
  46. data/vendor/cache/rspec-core-3.2.2.gem +0 -0
  47. data/vendor/cache/rspec-expectations-3.2.0.gem +0 -0
  48. data/vendor/cache/rspec-mocks-3.2.1.gem +0 -0
  49. data/vendor/cache/rspec-support-3.2.2.gem +0 -0
  50. data/vendor/cache/safe_yaml-1.0.4.gem +0 -0
  51. data/vendor/cache/simplecov-0.9.2.gem +0 -0
  52. data/vendor/cache/simplecov-html-0.9.0.gem +0 -0
  53. data/vendor/cache/slop-3.6.0.gem +0 -0
  54. data/vendor/cache/term-ansicolor-1.3.0.gem +0 -0
  55. data/vendor/cache/thor-0.19.1.gem +0 -0
  56. data/vendor/cache/tins-1.3.5.gem +0 -0
  57. data/vendor/cache/webmock-1.17.4.gem +0 -0
  58. metadata +140 -0
@@ -0,0 +1,361 @@
1
+ require 'spec_helper'
2
+
3
+ describe HeartlandRetail::Client do
4
+ include_context "client"
5
+
6
+ describe "connection" do
7
+ it "should be a Faraday::Connection" do
8
+ expect(client.connection).to be_a Faraday::Connection
9
+ end
10
+ end
11
+
12
+ describe "auth" do
13
+ it "should attempt to authenticate with the given username and password" do
14
+ request_stub = stub_request(:post, "#{base_url}/auth/identity/callback").with(
15
+ :body => "auth_key=coco&password=boggle",
16
+ :headers => {'Content-Type' => 'application/x-www-form-urlencoded'}
17
+ )
18
+
19
+ client.auth(:username => 'coco', :password => 'boggle')
20
+ expect(request_stub).to have_been_requested
21
+ end
22
+
23
+ it "should raise an exception if called without username or password" do
24
+ expect { client.auth }.to raise_error("Must specify :username and :password")
25
+ expect { client.auth(:username => 'x') }.to raise_error("Must specify :username and :password")
26
+ expect { client.auth(:password => 'y') }.to raise_error("Must specify :username and :password")
27
+ end
28
+
29
+ it "should return true if auth succeeds" do
30
+ stub_request(:post, "#{base_url}/auth/identity/callback").to_return(:status => 200)
31
+ expect(client.auth(:username => 'someone', :password => 'right')).to be_truthy
32
+ end
33
+
34
+ it "should raise an AuthFailed if auth fails" do
35
+ stub_request(:post, "#{base_url}/auth/identity/callback").to_return(:status => 401)
36
+ expect { client.auth(:username => 'someone', :password => 'wrong') }.to \
37
+ raise_error(HeartlandRetail::Client::AuthFailed, "Heartland Retail auth failed")
38
+ end
39
+
40
+ it "should store the session cookie" do
41
+ stub_request(:post, "#{base_url}/auth/identity/callback").to_return(headers: {'set-cookie' => '123'})
42
+ client.auth(:username => 'someone', :password => 'right')
43
+ expect(client.instance_variable_get(:@session_cookie)).to eq('123')
44
+ end
45
+ end
46
+
47
+ describe "initialize" do
48
+ it "should call configure_connection!" do
49
+ expect_any_instance_of(HeartlandRetail::Client).to receive(:configure_connection!)
50
+ HeartlandRetail::Client.new(base_url, :x => 'y')
51
+ end
52
+ end
53
+
54
+ describe "configure_connection" do
55
+ it "should set the connection's url_prefix" do
56
+ client.__send__(:configure_connection!)
57
+ expect(connection.url_prefix.to_s).to eq(base_url)
58
+ end
59
+
60
+ it "should allow setting insecure on the connection" do
61
+ client.__send__(:opts)[:insecure] = true
62
+ client.__send__(:configure_connection!)
63
+ expect(connection.ssl[:verify]).to be false
64
+ end
65
+
66
+ it "set the default timeout" do
67
+ client.__send__(:configure_connection!)
68
+ expect(connection.options.timeout).to eq(HeartlandRetail::Client::DEFAULT_TIMEOUT)
69
+ end
70
+
71
+ it "set the default connect timeout" do
72
+ client.__send__(:configure_connection!)
73
+ expect(connection.options.open_timeout).to eq(HeartlandRetail::Client::DEFAULT_CONNECT_TIMEOUT)
74
+ end
75
+
76
+ context 'headers' do
77
+ let(:headers) { double('headers') }
78
+ before do
79
+ connection = double('Connection').as_null_object
80
+ allow(Faraday).to receive(:new).and_return(connection)
81
+ allow(connection).to receive(:headers).and_return(headers)
82
+ end
83
+
84
+ it 'sets Content-Type header' do
85
+ expect(headers).to receive(:[]=).once.with('Content-Type', 'application/json')
86
+ expect(headers).to receive(:[]=).once.with('Authorization', 'Bearer token')
87
+ HeartlandRetail::Client.new(base_url, token: 'token')
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "[]" do
93
+ it "should return a resource object with the given path string and client" do
94
+ expect(client["path"]).to be_a HeartlandRetail::Client::Resource
95
+ expect(client[:path].uri.to_s).to eq("#{base_url}/path")
96
+ end
97
+
98
+ it "should return a resource object when given a path as a symbol" do
99
+ expect(client[:path]).to be_a HeartlandRetail::Client::Resource
100
+ expect(client[:path].uri.to_s).to eq("#{base_url}/path")
101
+ end
102
+
103
+ it "should return a resource object when given a path as a URI" do
104
+ uri = 'path'.to_uri
105
+ expect(client[uri]).to be_a HeartlandRetail::Client::Resource
106
+ expect(client[uri].uri.to_s).to eq("#{base_url}/path")
107
+ end
108
+
109
+ it "should not duplicate the base URI path" do
110
+ expect(client['api/subpath'].uri.to_s).to eq("#{base_url}/subpath")
111
+ end
112
+
113
+ it "should not duplicate the base URI" do
114
+ expect(client["#{base_url}/subpath"].uri.to_s).to eq("#{base_url}/subpath")
115
+ end
116
+ end
117
+
118
+ describe "debug=" do
119
+ it "should set opts[:debug]" do
120
+ logger = double
121
+ allow(Logger).to receive(:new).with('/path/to/log').and_return(logger)
122
+
123
+ client.debug = '/path/to/log'
124
+ expect(client.__send__(:opts)[:debug]).to eq('/path/to/log')
125
+ end
126
+
127
+ it "should reconfigure connection" do
128
+ logger = double
129
+ allow(Logger).to receive(:new).with('/path/to/log').and_return(logger)
130
+
131
+ expect(client).to receive(:configure_connection!)
132
+ client.debug = '/path/to/log'
133
+ end
134
+ end
135
+
136
+ [:get, :head, :delete].each do |method|
137
+ bang_method = "#{method}!"
138
+ describe method do
139
+ it "should call connection's #{method}" do
140
+ expect(connection).to receive(method).with('relative/path')
141
+
142
+ client.__send__(method, '/relative/path')
143
+ end
144
+
145
+ it "should return a HeartlandRetail::Client::Response" do
146
+ stub_request(method, "#{base_url}/relative/path")
147
+ response = client.__send__(method, '/relative/path')
148
+ expect(response).to be_a HeartlandRetail::Client::Response
149
+ end
150
+
151
+ it "should remove redundant base path prefix from URL if present" do
152
+ stub_request(method, "#{base_url}/relative/path")
153
+ response = client.__send__(method, '/api/relative/path')
154
+ expect(response).to be_a HeartlandRetail::Client::Response
155
+ end
156
+ end
157
+
158
+ describe bang_method do
159
+ it "should call #{method}" do
160
+ response = double(HeartlandRetail::Client::Response)
161
+ expect(response).to receive(:success?).and_return(true)
162
+ expect(client).to receive(method).with('/path', false).and_return(response)
163
+ expect(client.__send__(bang_method, '/path')).to be === response
164
+ end
165
+
166
+ it "should raise an exception on failure" do
167
+ response = double(HeartlandRetail::Client::Response)
168
+ expect(response).to receive(:success?).and_return(false)
169
+ expect(response).to receive(:status).and_return(404)
170
+ expect(client).to receive(method).with('/path', false).and_return(response)
171
+ expect { client.send(bang_method, '/path') }.to raise_error(HeartlandRetail::Client::RequestFailed)
172
+ end
173
+ end
174
+ end
175
+
176
+ [:put, :post].each do |method|
177
+ bang_method = "#{method}!"
178
+ describe method do
179
+ it "should call connection's #{method}" do
180
+ request = double.as_null_object
181
+
182
+ expect(request).to receive(:body=).with('body')
183
+ expect(connection).to receive(method).with('relative/path').and_yield(request)
184
+
185
+ client.__send__(method, '/relative/path', 'body')
186
+ end
187
+
188
+ it "should return a HeartlandRetail::Client::Response" do
189
+ stub_request(method, "#{base_url}/relative/path")
190
+ response = client.__send__(method, '/relative/path', 'body')
191
+ expect(response).to be_a HeartlandRetail::Client::Response
192
+ end
193
+
194
+ it "should serialize the request body as JSON if it is a hash" do
195
+ request = double.as_null_object
196
+ body_hash = {:key1 => 'val1', :key2 => 'val2'}
197
+
198
+ expect(connection).to receive(method).and_yield(request)
199
+ expect(request).to receive(:body=).with(body_hash.to_json)
200
+
201
+ client.__send__(method, '/path', body_hash)
202
+ end
203
+
204
+ it "should set the Content-Type header to application/json if not specified" do
205
+ request_stub = stub_request(method, "#{base_url}/my/resource").
206
+ with(:headers => {'Content-Type' => 'application/json'})
207
+ client.__send__(method, '/my/resource', :key1 => 'val1')
208
+ expect(request_stub).to have_been_requested
209
+ end
210
+
211
+ it "should set the Content-Type header to specified value if specified" do
212
+ request_stub = stub_request(method, "#{base_url}/my/resource").
213
+ with(:headers => {'Content-Type' => 'application/pdf'})
214
+ client.__send__(method, '/my/resource', {:key1 => 'val1'}, 'Content-Type' => 'application/pdf')
215
+ expect(request_stub).to have_been_requested
216
+ end
217
+ end
218
+
219
+ describe bang_method do
220
+ it "should call #{method}" do
221
+ response = double(HeartlandRetail::Client::Response)
222
+ expect(response).to receive(:success?).and_return(true)
223
+ expect(client).to receive(method).with('/path', 'body', false).and_return(response)
224
+ expect(client.__send__(bang_method, '/path', 'body')).to be === response
225
+ end
226
+
227
+ it "should raise an exception on failure" do
228
+ response = double(HeartlandRetail::Client::Response)
229
+ expect(response).to receive(:success?).and_return(false)
230
+ expect(response).to receive(:status).and_return(404)
231
+ expect(client).to receive(method).with('/path', 'body', false).and_return(response)
232
+ expect { client.send(bang_method, '/path', 'body') }.to raise_error { |error|
233
+ expect(error).to be_a(HeartlandRetail::Client::RequestFailed)
234
+ expect(error.response).to be === response
235
+ }
236
+ end
237
+ end
238
+ end
239
+
240
+ describe "each_page" do
241
+ it "should request each page of the collection and yield each response to the block" do
242
+ responses = (1..3).map do |p|
243
+ response = double(HeartlandRetail::Client::Response)
244
+ allow(response).to receive(:[]).with('pages').and_return(3)
245
+
246
+ expect(client).to receive(:get!).with("/things?page=#{p}&per_page=20".to_uri).and_return(response)
247
+
248
+ response
249
+ end
250
+
251
+ expect do |block|
252
+ client.each_page('/things', &block)
253
+ end.to yield_successive_args(*responses)
254
+ end
255
+ end
256
+
257
+ describe "each" do
258
+ it "should request each page of the collection and yield each individual result to the block" do
259
+ all_results = (1..3).inject([]) do |results, p|
260
+ response = double(HeartlandRetail::Client::Response)
261
+ allow(response).to receive(:[]).with('pages').and_return(3)
262
+
263
+ page_results = 20.times.map {|i| "Page #{p} result #{i+1}"}
264
+ results += page_results
265
+
266
+ allow(response).to receive(:[]).with('results').and_return(page_results)
267
+
268
+ expect(client).to receive(:get!).with("/things?page=#{p}&per_page=20".to_uri).and_return(response)
269
+
270
+ results
271
+ end
272
+
273
+ expect do |block|
274
+ client.each('/things', &block)
275
+ end.to yield_successive_args(*all_results)
276
+ end
277
+ end
278
+
279
+ describe "count" do
280
+ it "should request the first page/record of the collection and return the total" do
281
+ response = double(HeartlandRetail::Client::Response)
282
+ allow(response).to receive(:[]).with('total').and_return(17)
283
+ expect(client).to receive(:get!).with("/things?page=1&per_page=1".to_uri)
284
+ .and_return(response)
285
+ expect(client.count('/things')).to eq(17)
286
+ end
287
+ end
288
+ end
289
+
290
+ describe Springboard::Client do
291
+ include_context "client"
292
+ let(:client) { Springboard::Client.new(base_url) }
293
+
294
+ describe "initialize" do
295
+ it "should call configure_connection! and return a HeartlandRetail::Client" do
296
+ expect_any_instance_of(HeartlandRetail::Client).to receive(:configure_connection!)
297
+ client = Springboard::Client.new(base_url, :x => 'y')
298
+ expect(client).to be_a HeartlandRetail::Client
299
+ end
300
+
301
+ it "should include a deprecation warning" do
302
+ deprecation_message = "[DEPRECATION] `Springboard::Client.new` is deprecated. Please use `HeartlandRetail::Client.new` instead.\n"
303
+ expect { Springboard::Client.new(base_url) }.to output(deprecation_message).to_stderr
304
+ end
305
+ end
306
+
307
+ describe "errors" do
308
+ describe "legacy error handling" do
309
+ describe "AuthFailed" do
310
+ it "should raise a Springboard class error if auth fails" do
311
+ stub_request(:post, "#{base_url}/auth/identity/callback").to_return(:status => 401)
312
+ expect { client.auth(:username => 'someone', :password => 'wrong') }.to \
313
+ raise_error(Springboard::Client::AuthFailed, "Heartland Retail auth failed")
314
+ end
315
+
316
+ it "should rescue a Springboard class error" do
317
+ stub_request(:post, "#{base_url}/auth/identity/callback").to_return(:status => 401)
318
+ rescued = nil
319
+ begin
320
+ client.auth(:username => 'someone', :password => 'wrong')
321
+ rescue Springboard::Client::AuthFailed => err
322
+ rescued = true
323
+ end
324
+ expect(rescued).to eq(true)
325
+ end
326
+ end
327
+
328
+ describe "RequestFailed" do
329
+ it "should raise an Springboard class error if request fails" do
330
+ response = double(Springboard::Client::Response)
331
+ expect(response).to receive(:success?).and_return(false)
332
+ expect(response).to receive(:status).and_return(404)
333
+ expect(client).to receive(:get).with('/path', false).and_return(response)
334
+ expect { client.get!('/path') }.to raise_error(Springboard::Client::RequestFailed)
335
+ end
336
+
337
+ it "should rescue a Springboard class error" do
338
+ response = double(Springboard::Client::Response)
339
+ expect(response).to receive(:success?).and_return(false)
340
+ expect(response).to receive(:status).and_return(404)
341
+ expect(client).to receive(:get).with('/path', false).and_return(response)
342
+ rescued = nil
343
+ begin
344
+ client.get!('/path')
345
+ rescue Springboard::Client::RequestFailed => err
346
+ rescued = true
347
+ end
348
+ expect(rescued).to eq(true)
349
+ end
350
+ end
351
+ end
352
+ end
353
+
354
+ [:get, :head, :delete, :put, :post, :debug=, :[], :auth, :connection].each do |method|
355
+ describe method do
356
+ it "should respond to the HeartlandRetail::Client method #{method}" do
357
+ expect(client).to respond_to(method)
358
+ end
359
+ end
360
+ end
361
+ end
@@ -0,0 +1,5 @@
1
+ shared_context "client" do
2
+ let(:base_url) { "http://bozo.com/api" }
3
+ let(:client) { HeartlandRetail::Client.new(base_url) }
4
+ let(:connection) { client.connection }
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ require 'heartland-retail'
5
+ require 'webmock/rspec'
6
+ require 'shared_client_context'
7
+
8
+ RSpec.configure do |c|
9
+ c.filter_run :focus => true
10
+ c.run_all_when_everything_filtered = true
11
+ end
12
+
13
+ class String
14
+ def to_uri
15
+ HeartlandRetail::Client::URI.parse(self)
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: heartland-retail
3
+ version: !ruby/object:Gem::Version
4
+ version: 5.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jay Stotz
8
+ - Derek Stotz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2020-06-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: faraday
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "<"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "<"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: json
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 1.7.4
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 1.7.4
42
+ - !ruby/object:Gem::Dependency
43
+ name: hashie
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ description:
57
+ email:
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - ".travis.yml"
65
+ - ".yardopts"
66
+ - Gemfile
67
+ - Gemfile.lock
68
+ - LICENSE
69
+ - README.md
70
+ - Rakefile
71
+ - heartland-retail.gemspec
72
+ - lib/heartland-retail.rb
73
+ - lib/heartland/client.rb
74
+ - lib/heartland/client/body.rb
75
+ - lib/heartland/client/collection.rb
76
+ - lib/heartland/client/errors.rb
77
+ - lib/heartland/client/resource.rb
78
+ - lib/heartland/client/response.rb
79
+ - lib/heartland/client/uri.rb
80
+ - spec/heartland/client/body_spec.rb
81
+ - spec/heartland/client/resource_spec.rb
82
+ - spec/heartland/client/response_spec.rb
83
+ - spec/heartland/client/uri_spec.rb
84
+ - spec/heartland/client_spec.rb
85
+ - spec/shared_client_context.rb
86
+ - spec/spec_helper.rb
87
+ - vendor/cache/addressable-2.2.8.gem
88
+ - vendor/cache/codeclimate-test-reporter-1.0.8.gem
89
+ - vendor/cache/coderay-1.1.0.gem
90
+ - vendor/cache/coveralls-0.7.11.gem
91
+ - vendor/cache/crack-0.4.2.gem
92
+ - vendor/cache/diff-lcs-1.2.5.gem
93
+ - vendor/cache/docile-1.1.5.gem
94
+ - vendor/cache/faraday-0.17.3.gem
95
+ - vendor/cache/hashie-4.1.0.gem
96
+ - vendor/cache/json-2.3.0.gem
97
+ - vendor/cache/method_source-0.8.2.gem
98
+ - vendor/cache/mime-types-2.4.3.gem
99
+ - vendor/cache/multi_json-1.11.0.gem
100
+ - vendor/cache/multipart-post-2.1.1.gem
101
+ - vendor/cache/netrc-0.10.3.gem
102
+ - vendor/cache/pry-0.10.1.gem
103
+ - vendor/cache/rake-10.4.2.gem
104
+ - vendor/cache/rest-client-1.7.3.gem
105
+ - vendor/cache/rspec-3.2.0.gem
106
+ - vendor/cache/rspec-core-3.2.2.gem
107
+ - vendor/cache/rspec-expectations-3.2.0.gem
108
+ - vendor/cache/rspec-mocks-3.2.1.gem
109
+ - vendor/cache/rspec-support-3.2.2.gem
110
+ - vendor/cache/safe_yaml-1.0.4.gem
111
+ - vendor/cache/simplecov-0.9.2.gem
112
+ - vendor/cache/simplecov-html-0.9.0.gem
113
+ - vendor/cache/slop-3.6.0.gem
114
+ - vendor/cache/term-ansicolor-1.3.0.gem
115
+ - vendor/cache/thor-0.19.1.gem
116
+ - vendor/cache/tins-1.3.5.gem
117
+ - vendor/cache/webmock-1.17.4.gem
118
+ homepage:
119
+ licenses: []
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 1.3.6
135
+ requirements: []
136
+ rubygems_version: 3.0.3
137
+ signing_key:
138
+ specification_version: 4
139
+ summary: Heartland Retail API client library
140
+ test_files: []