stuart-client-ruby 1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e6fe407f7e85f077cba35da969e8229ea66fe3cf
4
+ data.tar.gz: 0865cf44453d5fb5702d264fc507207af4521941
5
+ SHA512:
6
+ metadata.gz: ff636f7d5fbb3d80de6dab3eb9fd47df37829e5ddb48bc3ca4b9825f8a92db5742c111f72b1aa6e39b35015cdb17eb4dc8d7d91f4f44b136a5fc950758037d64
7
+ data.tar.gz: 7f03c699e1bd01593ccb79ea80bd9a9d655c3526615981ada0dfc9c9bf94e6b71552c989bb8162d04a9d8ff178b972b3360637422a1852b71ab24c97aad007b9
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rubocop.yml ADDED
@@ -0,0 +1,274 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.2
3
+ Exclude:
4
+ - "vendor/**/*"
5
+ - "db/schema.rb"
6
+ UseCache: false
7
+ Rails:
8
+ Enabled: true
9
+ Style/CollectionMethods:
10
+ Description: Preferred collection methods.
11
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#map-find-select-reduce-size
12
+ Enabled: true
13
+ PreferredMethods:
14
+ collect: map
15
+ collect!: map!
16
+ find: detect
17
+ find_all: select
18
+ reduce: inject
19
+ Style/DotPosition:
20
+ Description: Checks the position of the dot in multi-line method calls.
21
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains
22
+ Enabled: true
23
+ EnforcedStyle: trailing
24
+ SupportedStyles:
25
+ - leading
26
+ - trailing
27
+ Style/FileName:
28
+ Description: Use snake_case for source file names.
29
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#snake-case-files
30
+ Enabled: false
31
+ Exclude: []
32
+ Style/GuardClause:
33
+ Description: Check for conditionals that can be replaced with guard clauses
34
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals
35
+ Enabled: false
36
+ MinBodyLength: 1
37
+ Style/IfUnlessModifier:
38
+ Description: Favor modifier if/unless usage when you have a single-line body.
39
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier
40
+ Enabled: false
41
+ MaxLineLength: 99
42
+ Style/OptionHash:
43
+ Description: Don't use option hashes when you can use keyword arguments.
44
+ Enabled: false
45
+ Style/PercentLiteralDelimiters:
46
+ Description: Use `%`-literal delimiters consistently
47
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#percent-literal-braces
48
+ Enabled: false
49
+ PreferredDelimiters:
50
+ "%": "()"
51
+ "%i": "()"
52
+ "%q": "()"
53
+ "%Q": "()"
54
+ "%r": "{}"
55
+ "%s": "()"
56
+ "%w": "()"
57
+ "%W": "()"
58
+ "%x": "()"
59
+ Style/PredicateName:
60
+ Description: Check the names of predicate methods.
61
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark
62
+ Enabled: true
63
+ NamePrefix:
64
+ - is_
65
+ - has_
66
+ - have_
67
+ NamePrefixBlacklist:
68
+ - is_
69
+ Exclude:
70
+ - spec/**/*
71
+ Style/RaiseArgs:
72
+ Description: Checks the arguments passed to raise/fail.
73
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#exception-class-messages
74
+ Enabled: false
75
+ EnforcedStyle: exploded
76
+ SupportedStyles:
77
+ - compact
78
+ - exploded
79
+ Style/SignalException:
80
+ Description: Checks for proper usage of fail and raise.
81
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#fail-method
82
+ Enabled: false
83
+ EnforcedStyle: semantic
84
+ SupportedStyles:
85
+ - only_raise
86
+ - only_fail
87
+ - semantic
88
+ Style/SingleLineBlockParams:
89
+ Description: Enforces the names of some block params.
90
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#reduce-blocks
91
+ Enabled: false
92
+ Methods:
93
+ - reduce:
94
+ - a
95
+ - e
96
+ - inject:
97
+ - a
98
+ - e
99
+ Style/SingleLineMethods:
100
+ Description: Avoid single-line methods.
101
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-single-line-methods
102
+ Enabled: false
103
+ AllowIfMethodIsEmpty: true
104
+ Style/StringLiterals:
105
+ Description: Checks if uses of quotes match the configured preference.
106
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-string-literals
107
+ Enabled: true
108
+ EnforcedStyle: double_quotes
109
+ SupportedStyles:
110
+ - single_quotes
111
+ - double_quotes
112
+ Style/StringLiteralsInInterpolation:
113
+ Description: Checks if uses of quotes inside expressions in interpolated strings
114
+ match the configured preference.
115
+ Enabled: true
116
+ EnforcedStyle: single_quotes
117
+ SupportedStyles:
118
+ - single_quotes
119
+ - double_quotes
120
+ Style/TrailingCommaInArguments:
121
+ Description: 'Checks for trailing comma in argument lists.'
122
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
123
+ Enabled: false
124
+ EnforcedStyleForMultiline: no_comma
125
+ SupportedStyles:
126
+ - comma
127
+ - consistent_comma
128
+ - no_comma
129
+ Style/TrailingCommaInLiteral:
130
+ Description: 'Checks for trailing comma in array and hash literals.'
131
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
132
+ Enabled: false
133
+ EnforcedStyleForMultiline: no_comma
134
+ SupportedStyles:
135
+ - comma
136
+ - consistent_comma
137
+ - no_comma
138
+ Metrics/BlockLength:
139
+ Enabled: false
140
+ Metrics/AbcSize:
141
+ Description: A calculated magnitude based on number of assignments, branches, and
142
+ conditions.
143
+ Enabled: false
144
+ Max: 15
145
+ Metrics/ClassLength:
146
+ Description: Avoid classes longer than 100 lines of code.
147
+ Enabled: false
148
+ CountComments: false
149
+ Max: 100
150
+ Metrics/LineLength:
151
+ Max: 100
152
+ # To make it possible to copy or click on URIs in the code, we allow lines
153
+ # containing a URI to be longer than Max.
154
+ AllowHeredoc: true
155
+ AllowURI: true
156
+ URISchemes:
157
+ - http
158
+ - https
159
+ Metrics/ModuleLength:
160
+ CountComments: false
161
+ Max: 100
162
+ Description: Avoid modules longer than 100 lines of code.
163
+ Enabled: false
164
+ Metrics/CyclomaticComplexity:
165
+ Description: A complexity metric that is strongly correlated to the number of test
166
+ cases needed to validate a method.
167
+ Enabled: false
168
+ Max: 6
169
+ Metrics/MethodLength:
170
+ Description: Avoid methods longer than 10 lines of code.
171
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#short-methods
172
+ Enabled: false
173
+ CountComments: false
174
+ Max: 10
175
+ Metrics/ParameterLists:
176
+ Description: Avoid parameter lists longer than three or four parameters.
177
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#too-many-params
178
+ Enabled: false
179
+ Max: 5
180
+ CountKeywordArgs: true
181
+ Metrics/PerceivedComplexity:
182
+ Description: A complexity metric geared towards measuring complexity for a human
183
+ reader.
184
+ Enabled: false
185
+ Max: 7
186
+ Lint/AssignmentInCondition:
187
+ Description: Don't use assignment in conditions.
188
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition
189
+ Enabled: false
190
+ AllowSafeAssignment: true
191
+ Style/InlineComment:
192
+ Description: Avoid inline comments.
193
+ Enabled: false
194
+ Style/AccessorMethodName:
195
+ Description: Check the naming of accessor methods for get_/set_.
196
+ Enabled: false
197
+ Style/Alias:
198
+ Description: Use alias_method instead of alias.
199
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#alias-method
200
+ Enabled: false
201
+ Style/Documentation:
202
+ Description: Document classes and non-namespace modules.
203
+ Enabled: false
204
+ Style/DoubleNegation:
205
+ Description: Checks for uses of double negation (!!).
206
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-bang-bang
207
+ Enabled: false
208
+ Style/EachWithObject:
209
+ Description: Prefer `each_with_object` over `inject` or `reduce`.
210
+ Enabled: false
211
+ Style/EmptyLiteral:
212
+ Description: Prefer literals to Array.new/Hash.new/String.new.
213
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#literal-array-hash
214
+ Enabled: false
215
+ Style/ModuleFunction:
216
+ Description: Checks for usage of `extend self` in modules.
217
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#module-function
218
+ Enabled: false
219
+ Style/OneLineConditional:
220
+ Description: Favor the ternary operator(?:) over if/then/else/end constructs.
221
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#ternary-operator
222
+ Enabled: false
223
+ Style/PerlBackrefs:
224
+ Description: Avoid Perl-style regex back references.
225
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers
226
+ Enabled: false
227
+ Style/SymbolArray:
228
+ SupportedStyles:
229
+ - percent
230
+ - brackets
231
+ EnforcedStyle: percent
232
+ Style/Send:
233
+ Description: Prefer `Object#__send__` or `Object#public_send` to `send`, as `send`
234
+ may overlap with existing methods.
235
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#prefer-public-send
236
+ Enabled: false
237
+ Style/SpecialGlobalVars:
238
+ Description: Avoid Perl-style global variables.
239
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms
240
+ Enabled: false
241
+ Style/VariableInterpolation:
242
+ Description: Don't interpolate global, instance and class variables directly in
243
+ strings.
244
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#curlies-interpolate
245
+ Enabled: false
246
+ Style/WhenThen:
247
+ Description: Use when x then ... for one-line cases.
248
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#one-line-cases
249
+ Enabled: false
250
+ Lint/EachWithObjectArgument:
251
+ Description: Check for immutable argument given to each_with_object.
252
+ Enabled: true
253
+ Lint/HandleExceptions:
254
+ Description: Don't suppress exception.
255
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions
256
+ Enabled: false
257
+ Lint/LiteralInCondition:
258
+ Description: Checks of literals used in conditions.
259
+ Enabled: false
260
+ Lint/LiteralInInterpolation:
261
+ Description: Checks for literals used in interpolation.
262
+ Enabled: false
263
+ Style/Lambda:
264
+ Description: Use the new lambda literal syntax for single-line blocks.
265
+ StyleGuide: https://github.com/bbatsov/ruby-style-guide#lambda-multi-line
266
+ Enabled: false
267
+ Rails/HttpPositionalArguments:
268
+ Enabled: false
269
+ Rails/SkipsModelValidations:
270
+ Enabled: false
271
+ Lint/AmbiguousBlockAssociation:
272
+ Enabled: false
273
+ Style/ClassAndModuleChildren:
274
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "oauth2"
4
+ gem "typhoeus"
5
+
6
+ group :development do
7
+ gem "bundler"
8
+ gem "juwelier"
9
+ gem "rdoc"
10
+ gem "rspec"
11
+ gem "shoulda"
12
+ gem "simplecov"
13
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2018 Maximilien Tyc
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Stuart Ruby Client
2
+ For a complete documentation of all endpoints offered by the Stuart API, you can visit [Stuart API documentation](https://stuart.api-docs.io).
3
+
4
+ ## Install
5
+ Via Composer:
6
+
7
+ ``` bash
8
+ $ gem install stuart-client-ruby
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Initialize HTTP client
14
+
15
+ ```ruby
16
+ environment = Stuart::Infrastructure::Environment::SANDBOX
17
+ api_client_id = 'c6058849d0a056fc743203acb8e6a850dad103485c3edc51b16a9260cc7a7689' # can be found here: https://admin-sandbox.stuart.com/client/api
18
+ api_client_secret = 'aa6a415fce31967501662c1960fcbfbf4745acff99acb19dbc1aae6f76c9c618' # can be found here: https://admin-sandbox.stuart.com/client/api
19
+ auth = Stuart::Infrastructure::Authenticator.new(environment, api_client_id, api_client_secret)
20
+
21
+ http_client = Stuart::Infrastructure::HttpClient.new(auth)
22
+ ```
23
+
24
+ ### Custom requests
25
+
26
+ #### Example: create a job
27
+
28
+ ```ruby
29
+ job = {
30
+ job: {
31
+ transport_type: "bike",
32
+ pickups: [
33
+ {
34
+ address: "46 Boulevard Barbès, 75018 Paris",
35
+ comment: "Wait outside for an employee to come.",
36
+ contact: {
37
+ firstname: "Martin",
38
+ lastname: "Pont",
39
+ phone: "+33698348756'",
40
+ company: "KFC Paris Barbès"
41
+ }
42
+ }
43
+ ],
44
+ dropoffs: [
45
+ {
46
+ address: "156 rue de Charonne, 75011 Paris",
47
+ package_description: "Red packet.",
48
+ client_reference: "12345678ABCDE", # must be unique
49
+ comment: "code: 3492B. 3e étage droite. Sonner à Durand.",
50
+ contact: {
51
+ firstname: "Alex",
52
+ lastname: "Durand",
53
+ phone: "+33634981209",
54
+ company: "Durand associates."
55
+ }
56
+ }
57
+ ]
58
+ }
59
+ }
60
+
61
+ http_client.perform_post '/v2/jobs', JSON.generate(job)
62
+ ```
63
+
64
+ #### Example: get a list of jobs
65
+
66
+ ```ruby
67
+ http_client.perform_get('/v2/jobs')
68
+ ```
data/Rakefile ADDED
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ require "rubygems"
4
+ require "bundler"
5
+ require "./lib/stuart/version"
6
+ begin
7
+ Bundler.setup(:default, :development)
8
+ rescue Bundler::BundlerError => e
9
+ $stderr.puts e.message
10
+ $stderr.puts "Run `bundle install` to install missing gems"
11
+ exit e.status_code
12
+ end
13
+ require "rake"
14
+ require "juwelier"
15
+ Juwelier::Tasks.new do |gem|
16
+ gem.name = "stuart-client-ruby"
17
+ gem.homepage = "http://github.com/stuartapp/stuart-client-ruby"
18
+ gem.license = "MIT"
19
+ gem.summary = "Stuart API Ruby client"
20
+ gem.description = "Communicate with the Stuart API"
21
+ gem.email = "engineering@stuart.com"
22
+ gem.authors = ["Paul Caillau", "Maximilien Tyc"]
23
+ gem.version = Stuart::Version::STRING
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Juwelier::RubygemsDotOrgTasks.new
27
+ require "rake/testtask"
28
+ Rake::TestTask.new(:test) do |test|
29
+ test.libs << "lib" << "test"
30
+ test.pattern = "test/**/test_*.rb"
31
+ test.verbose = true
32
+ end
33
+
34
+ desc "Code coverage detail"
35
+ task :simplecov do
36
+ ENV["COVERAGE"] = "true"
37
+ Rake::Task["test"].execute
38
+ end
39
+
40
+ task default: :test
41
+
42
+ require "rdoc/task"
43
+ Rake::RDocTask.new do |rdoc|
44
+ rdoc.rdoc_dir = "rdoc"
45
+ rdoc.title = "stuart-client-ruby #{Stuart::Version::STRING}"
46
+ rdoc.rdoc_files.include("README*")
47
+ rdoc.rdoc_files.include("lib/**/*.rb")
48
+ end
Binary file
@@ -0,0 +1,11 @@
1
+ module Stuart
2
+ class Client
3
+ def initialize(http_client)
4
+ @http_client = http_client
5
+ end
6
+
7
+ def get_job(job_id)
8
+ http_client.perform_get("/v2/jobs/#{job_id}")
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ module Stuart
2
+ module Infrastructure
3
+ class ApiResponse
4
+ attr_reader :status_code, :body
5
+
6
+ def initialize(status_code, body)
7
+ @status_code = status_code
8
+ @body = body
9
+ end
10
+
11
+ def success?
12
+ @status_code == (200 || 201)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,30 @@
1
+ require "oauth2"
2
+
3
+ module Stuart
4
+ module Infrastructure
5
+ class Authenticator
6
+ attr_reader :environment
7
+
8
+ def initialize(environment, api_client_id, api_client_secret)
9
+ @environment = environment
10
+ @oauth_client = OAuth2::Client.new(api_client_id,
11
+ api_client_secret,
12
+ site: environment[:base_url])
13
+ end
14
+
15
+ def access_token
16
+ has_valid_token? ? @access_token.token : new_access_token.token
17
+ end
18
+
19
+ private
20
+
21
+ def new_access_token
22
+ @access_token = @oauth_client.client_credentials.get_token
23
+ end
24
+
25
+ def has_valid_token?
26
+ !@access_token.nil? && !@access_token.expired?
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ module Stuart
2
+ module Infrastructure
3
+ class Environment
4
+ SANDBOX = { base_url: "https://sandbox-api.stuart.com" }.freeze
5
+
6
+ PRODUCTION = { base_url: "https://api.stuart.com" }.freeze
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ require "typhoeus"
2
+ require "json"
3
+
4
+ module Stuart
5
+ module Infrastructure
6
+ class HttpClient
7
+ def initialize(authenticator)
8
+ @authenticator = authenticator
9
+ end
10
+
11
+ def perform_get(resource)
12
+ to_api_response Typhoeus.get(url(resource), headers: default_header)
13
+ end
14
+
15
+ def perform_post(resource, body)
16
+ to_api_response Typhoeus.post(url(resource), headers: default_header, body: body)
17
+ end
18
+
19
+ private
20
+
21
+ def url(resource)
22
+ "#{@authenticator.environment[:base_url]}#{resource}"
23
+ end
24
+
25
+ def default_header
26
+ { "Authorization" => "Bearer #{@authenticator.access_token}",
27
+ "User-Agent" => "stuart-client-ruby/#{Stuart::Version::STRING}",
28
+ "Content-Type" => "application/json" }
29
+ end
30
+
31
+ def to_api_response(response)
32
+ status_code = response.response_code
33
+ body = JSON.parse(response.response_body) if response.response_body
34
+ ApiResponse.new(status_code, body)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ module Stuart
2
+ module Version
3
+ MAJOR = 1
4
+ MINOR = 0
5
+ PATCH = 0
6
+
7
+ STRING = [MAJOR, MINOR, PATCH].compact.join(".")
8
+ end
9
+ end
data/lib/stuart.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "stuart/infrastructure/environment"
2
+ require "stuart/infrastructure/api_response"
3
+ require "stuart/infrastructure/authenticator"
4
+ require "stuart/infrastructure/http_client"
5
+ require "stuart/version"
@@ -0,0 +1,2 @@
1
+ require "stuart"
2
+ require "rspec"
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+ require "securerandom"
3
+
4
+ describe Stuart::Infrastructure::Authenticator do
5
+ let(:environment) { Stuart::Infrastructure::Environment::SANDBOX }
6
+ let(:authenticator) do
7
+ Stuart::Infrastructure::Authenticator.new(environment, "some-id",
8
+ "some-secret")
9
+ end
10
+
11
+ let(:client_credentials_double) { instance_double("OAuth2::Strategy::ClientCredentials") }
12
+
13
+ before do
14
+ allow(OAuth2::Strategy::ClientCredentials).to receive(:new).
15
+ and_return(client_credentials_double)
16
+ allow(client_credentials_double).to receive(:get_token).
17
+ and_return(OAuth2::AccessToken.new(nil, "new-access-token"))
18
+ end
19
+
20
+ describe "#access_token" do
21
+ subject(:access_token) { authenticator.access_token }
22
+
23
+ context "when no access token exists" do
24
+ it "returns a new access token" do
25
+ expect(access_token).to eq("new-access-token")
26
+ end
27
+ end
28
+
29
+ context "when a valid access token already exists" do
30
+ let(:oauth_access_token) { OAuth2::AccessToken.new(nil, "existing-access-token") }
31
+
32
+ before do
33
+ authenticator.instance_variable_set(:@access_token, oauth_access_token)
34
+ allow(authenticator).to receive(:has_valid_token?).and_return(true)
35
+ end
36
+
37
+ it "returns the current valid access token" do
38
+ expect(access_token).to eq("existing-access-token")
39
+ end
40
+ end
41
+
42
+ context "when a non valid access token already exists" do
43
+ before do
44
+ allow(authenticator).to receive(:has_valid_token?).and_return(false)
45
+ end
46
+
47
+ it "returns a new access token" do
48
+ expect(access_token).to eq("new-access-token")
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe Stuart::Infrastructure::HttpClient do
4
+ let(:environment) { Stuart::Infrastructure::Environment::SANDBOX }
5
+ let(:authenticator) do
6
+ Stuart::Infrastructure::Authenticator.new(environment, "some-id",
7
+ "some-secret")
8
+ end
9
+ let(:http_client) { Stuart::Infrastructure::HttpClient.new(authenticator) }
10
+
11
+ let(:access_token) { "some-access-token" }
12
+ let(:ruby_gem_version) { Stuart::Version::STRING }
13
+ let(:resource) { "/some-endpoint" }
14
+
15
+ let(:expected_headers) do
16
+ {
17
+ "Authorization" => "Bearer #{access_token}",
18
+ "User-Agent" => "stuart-client-ruby/#{ruby_gem_version}",
19
+ "Content-Type" => "application/json"
20
+ }
21
+ end
22
+
23
+ before do
24
+ allow(authenticator).to receive(:access_token).and_return(access_token)
25
+ end
26
+
27
+ describe "#perform_get" do
28
+ before do
29
+ allow(Typhoeus).to receive(:get).and_return(Typhoeus::Response.new)
30
+ end
31
+
32
+ subject(:get) { http_client.perform_get(resource) }
33
+
34
+ it "calls Typhoeus with correct parameters" do
35
+ expect(Typhoeus).to receive(:get).with("#{environment[:base_url]}#{resource}",
36
+ headers: expected_headers)
37
+ get
38
+ end
39
+ end
40
+
41
+ describe "#perform_post" do
42
+ before do
43
+ allow(Typhoeus).to receive(:post).and_return(Typhoeus::Response.new)
44
+ end
45
+
46
+ let(:body) { "some-body" }
47
+
48
+ subject(:post) { http_client.perform_post(resource, body) }
49
+
50
+ it "calls Typhoeus with correct parameters" do
51
+ expect(Typhoeus).to receive(:post).with("#{environment[:base_url]}#{resource}",
52
+ headers: expected_headers,
53
+ body: body)
54
+ post
55
+ end
56
+ end
57
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stuart-client-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Paul Caillau
8
+ - Maximilien Tyc
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-02-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: oauth2
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: typhoeus
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: juwelier
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rdoc
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: shoulda
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: simplecov
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: Communicate with the Stuart API
127
+ email: engineering@stuart.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files:
131
+ - LICENSE.txt
132
+ - README.md
133
+ files:
134
+ - ".document"
135
+ - ".rubocop.yml"
136
+ - Gemfile
137
+ - LICENSE.txt
138
+ - README.md
139
+ - Rakefile
140
+ - lib/stuart.rb
141
+ - lib/stuart/.DS_Store
142
+ - lib/stuart/client.rb
143
+ - lib/stuart/infrastructure/api_response.rb
144
+ - lib/stuart/infrastructure/authenticator.rb
145
+ - lib/stuart/infrastructure/environment.rb
146
+ - lib/stuart/infrastructure/http_client.rb
147
+ - lib/stuart/version.rb
148
+ - spec/spec_helper.rb
149
+ - spec/stuart/infrastructure/authenticator_spec.rb
150
+ - spec/stuart/infrastructure/http_client_spec.rb
151
+ homepage: http://github.com/stuartapp/stuart-client-ruby
152
+ licenses:
153
+ - MIT
154
+ metadata: {}
155
+ post_install_message:
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubyforge_project:
171
+ rubygems_version: 2.4.5.1
172
+ signing_key:
173
+ specification_version: 4
174
+ summary: Stuart API Ruby client
175
+ test_files: []