marble_api_client 1.0.0.pre.alpha → 1.0.0.pre.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +4 -5
  4. data/README.md +5 -7
  5. data/lib/marble_api_client/{proxy.rb → client.rb} +11 -13
  6. data/lib/marble_api_client/requests/create.rb +6 -1
  7. data/lib/marble_api_client/requests/index.rb +6 -1
  8. data/lib/marble_api_client/responses/bad_request.rb +3 -10
  9. data/lib/marble_api_client/responses/body_attributes.rb +44 -0
  10. data/lib/marble_api_client/responses/client_error.rb +2 -1
  11. data/lib/marble_api_client/responses/forbidden.rb +3 -14
  12. data/lib/marble_api_client/responses/http_methods.rb +1 -7
  13. data/lib/marble_api_client/responses/list.rb +5 -45
  14. data/lib/marble_api_client/responses/not_found.rb +3 -10
  15. data/lib/marble_api_client/responses/not_implemented.rb +3 -10
  16. data/lib/marble_api_client/responses/record.rb +3 -10
  17. data/lib/marble_api_client/responses/server_error.rb +3 -6
  18. data/lib/marble_api_client/responses/success.rb +2 -1
  19. data/lib/marble_api_client/responses/unauthorized.rb +3 -4
  20. data/lib/marble_api_client/responses/unprocessable_entity.rb +3 -25
  21. data/lib/marble_api_client/responses.rb +36 -8
  22. data/lib/marble_api_client/version.rb +1 -1
  23. data/lib/marble_api_client.rb +7 -1
  24. data/marble_api_client.gemspec +8 -6
  25. data/spec/marble_api_client/{proxy_spec.rb → client_spec.rb} +47 -16
  26. data/spec/marble_api_client/responses/bad_request_spec.rb +5 -5
  27. data/spec/marble_api_client/responses/forbidden_spec.rb +5 -5
  28. data/spec/marble_api_client/responses/list_spec.rb +8 -8
  29. data/spec/marble_api_client/responses/not_found_spec.rb +5 -5
  30. data/spec/marble_api_client/responses/not_implmented_spec.rb +1 -1
  31. data/spec/marble_api_client/responses/record_spec.rb +1 -1
  32. data/spec/marble_api_client/responses/responses_spec.rb +37 -23
  33. data/spec/marble_api_client/responses/server_error_spec.rb +1 -1
  34. data/spec/marble_api_client/responses/unauthorized_spec.rb +18 -0
  35. data/spec/marble_api_client/responses/unprocessable_entity_spec.rb +4 -4
  36. data/spec/marble_api_client_spec.rb +5 -0
  37. metadata +37 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 07bb0106eb2b330cbedd19e5c4e3eb2ada24ee0730d1a1215f40f6747f8a28b9
4
- data.tar.gz: e69d6c1eac333ad79019901d46eb4533c482124ea5fbb6c5f33e644db38d0c98
3
+ metadata.gz: af8b15a6c6b9c8f924514faec3239174d940a8f743f38f727d80256d5ecd5a29
4
+ data.tar.gz: 239322b12d457693d46e24c0a75f9b8940b726303732b8c033fba0cc41c98bae
5
5
  SHA512:
6
- metadata.gz: 31aec67b60ec58add566da56550505c09c97116be608eb565bdeb6e72dd66b2c4fbfa5bd503ef4eb941cab583bc8d91a5f40c232b86bd7e7ec639d9e86fcfd3a
7
- data.tar.gz: fff2dd756c5c60eadd571583493aa8a7c222879c0c066dd65d7208119b474a4626d2246af353d81236949f3aee90e58a8b1d0591a4a8d43db263fa9340e8bf49
6
+ metadata.gz: 65923ab69c544e910658e1aa6286f226f3e84ef21fa58be694991bc63cf3cca21d563bd88c27605449448e3e2e5edcd0b85913798583e6d116daac90ff9437db
7
+ data.tar.gz: d5e6ea846c798e7d6911906b1425b5c46ca2bb4c3328e33c93dcc72cbf97034bdd1592cf0078dc5662229ea863164f3468d7d7cdb04e4e88ac13e89a24bdb87d
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.3
1
+ 2.6.5
data/.travis.yml CHANGED
@@ -4,10 +4,9 @@ env:
4
4
  language: ruby
5
5
  rvm:
6
6
  # Build on the latest stable of all supported Rubies (https://www.ruby-lang.org/en/downloads/):
7
- - 2.3.8
8
- - 2.4.6
9
- - 2.5.5
10
- - 2.6.3
7
+ - 2.4.9
8
+ - 2.5.7
9
+ - 2.6.5
11
10
  cache: bundler
12
11
  before_script:
13
12
  - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
@@ -15,7 +14,7 @@ before_script:
15
14
  - ./cc-test-reporter before-build
16
15
  script:
17
16
  - bundle exec rubocop
18
- - bundle exec rspec spec --format documentation
17
+ - bundle exec rspec spec
19
18
  after_script:
20
19
  - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
21
20
  addons:
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![Maintainability](https://api.codeclimate.com/v1/badges/fba9ec43303ca1595e5a/maintainability)](https://codeclimate.com/github/bluemarblepayroll/marble_api_client/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/fba9ec43303ca1595e5a/test_coverage)](https://codeclimate.com/github/bluemarblepayroll/marble_api_client/test_coverage)[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
 
6
6
 
7
- This library is to simplify requests made to Marble Service Model (Still in procgress). This library offers simple objects to comply with the Marble Service Model request and response objects.
7
+ This library exists to simplify requests made to Marble Service Model (Still in progress). It offers simple objects to comply with the Marble Service Model request and response objects.
8
8
  The library currently supports:
9
9
 
10
10
  * Create
@@ -28,14 +28,12 @@ bundle add marble_api_client
28
28
 
29
29
  ### Creating the client
30
30
 
31
- A client can be created with a url and any headers that should be included
32
- in all requests.
31
+ A client can be created with a URL and any headers that should be included
32
+ in all requests. By default, Content-Type of Application/JSON is added.
33
33
  ````ruby
34
- client = MarbleApiClient::Proxy.new(
35
- 'https://www.example.com:3000',
36
- headers: { 'Content-Type': 'application/json' }
34
+ client = MarbleApiClient.client(
35
+ 'https://www.example.com:3000'
37
36
  )
38
-
39
37
  ````
40
38
 
41
39
  ### Making Request Objects
@@ -8,26 +8,26 @@
8
8
  #
9
9
 
10
10
  module MarbleApiClient
11
- # Main class for sending http requests to url.
11
+ # Main class for sending HTTP requests to a URL.
12
12
  # Requests are sent using request and response objects crafted for each action.
13
13
  # Headers can be provided to the Proxy as default headers for all requests
14
- class Proxy
14
+ class Client
15
15
  def initialize(base_url, headers: {})
16
16
  raise ArgumentError, 'Base URL is not valid' unless base_url_valid?(base_url)
17
17
 
18
18
  @base_url = base_url
19
- @headers = headers
19
+ @headers = { 'Content-Type': 'application/json' }.merge(headers)
20
20
  freeze
21
21
  end
22
22
 
23
23
  def create(path, create_request: Requests::Create.new, headers: {})
24
- response = send_request(path, create_request, headers, 'create')
25
- Responses.get_response_object(response, Responses::CREATE_ACTION)
24
+ response = send_request(path, Requests::Create.make(create_request), headers, 'create')
25
+ Responses.parse_response(response, Responses::CREATE_ACTION)
26
26
  end
27
27
 
28
28
  def index(path, index_request: Requests::Index.new, headers: {})
29
- response = send_request(path, index_request, headers, 'index')
30
- Responses.get_response_object(response, Responses::INDEX_ACTION)
29
+ response = send_request(path, Requests::Index.make(index_request), headers, 'index')
30
+ Responses.parse_response(response, Responses::INDEX_ACTION)
31
31
  end
32
32
 
33
33
  private
@@ -38,7 +38,7 @@ module MarbleApiClient
38
38
 
39
39
  Net::HTTP.start(uri.host, uri.port, use_ssl: ssl?(uri)) do |http|
40
40
  request = Net::HTTP::Post.new(uri.request_uri)
41
- merged_headers.each { |key, value| request.add_field(key, value) }
41
+ merged_headers.each { |key, value| request.add_field(key.to_s, value.to_s) }
42
42
  request.body = request_object.request_body
43
43
  http.request(request)
44
44
  end
@@ -57,12 +57,10 @@ module MarbleApiClient
57
57
  end
58
58
 
59
59
  def base_url_valid?(url)
60
- uri = begin
61
- URI.parse(url)
62
- rescue URI::InvalidURIError
63
- false
64
- end
60
+ uri = URI.parse(url)
65
61
  uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
62
+ rescue URI::InvalidURIError
63
+ false
66
64
  end
67
65
  end
68
66
  end
@@ -9,11 +9,16 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Requests
12
- # Create Request Object
12
+ # Request object for sending create requests.
13
+ # Uses context and record to send data that
14
+ # the service model can use in controllers
13
15
  class Create
16
+ acts_as_hashable
17
+
14
18
  def initialize(context: {}, record: {})
15
19
  @context = context
16
20
  @record = record
21
+ freeze
17
22
  end
18
23
 
19
24
  def request_body
@@ -9,13 +9,18 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Requests
12
- # Index Request Object
12
+ # Request object for sending index requests.
13
+ # Uses context, record, page, and page_size to send
14
+ # data that the service model can use in controllers
13
15
  class Index
16
+ acts_as_hashable
17
+
14
18
  def initialize(context: {}, record: {}, page: 1, page_size: 25)
15
19
  @context = context
16
20
  @record = record
17
21
  @page = page
18
22
  @page_size = page_size
23
+ freeze
19
24
  end
20
25
 
21
26
  def request_body
@@ -9,17 +9,10 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 400 Response Class
12
+ # Represents an HTTP 400 responses.
13
+ # Adds additional properties to the ClientError which encompasses the entire 400 level.
13
14
  class BadRequest < ClientError
14
- ERRORS = 'errors'
15
-
16
- def initialize(response)
17
- super
18
- end
19
-
20
- def errors
21
- parsed_body.dig(ERRORS)
22
- end
15
+ body_attributes :message
23
16
  end
24
17
  end
25
18
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module MarbleApiClient
11
+ module Responses
12
+ # Allows for declarative body attribute naming in response classes
13
+ module BodyAttributes
14
+ class << self
15
+ def included(klass)
16
+ klass.extend(ClassMethods)
17
+ end
18
+ end
19
+
20
+ # Extending ClassMethods to allow for module level class methods
21
+ module ClassMethods
22
+ def body_attributes(*keys)
23
+ keys.each do |k|
24
+ define_method(k) do
25
+ parsed_body.dig(json_key(k))
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def json_key(key)
34
+ key.to_s.split('_').instance_eval do |k|
35
+ [k.first] + k.drop(1).map(&:capitalize)
36
+ end.join
37
+ end
38
+
39
+ def parsed_body
40
+ @parsed_body ||= JSON.parse(body)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -9,9 +9,10 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 400 Range Response Base Class
12
+ # Represents an HTTP 400 response. This will encompass all errors in the 400-499 range.
13
13
  class ClientError
14
14
  include HttpMethods
15
+ include BodyAttributes
15
16
 
16
17
  def initialize(response)
17
18
  @response = response
@@ -9,21 +9,10 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 403 Response Class
12
+ # Represents an HTTP 403 responses.
13
+ # Adds additional properties to the ClientError which encompasses the entire 400 level.
13
14
  class Forbidden < ClientError
14
- STATUS_CODE = 'statusCode'
15
- REDIRECT_URL = 'redirectUrl'
16
- def initialize(response)
17
- super
18
- end
19
-
20
- def status_code
21
- parsed_body.dig(STATUS_CODE)
22
- end
23
-
24
- def redirect_url
25
- parsed_body.dig(REDIRECT_URL)
26
- end
15
+ body_attributes :message, :redirect_url
27
16
  end
28
17
  end
29
18
  end
@@ -9,7 +9,7 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # Module assumes existance of @response Net::HTTPResponse object
12
+ # This module requires a "response" method which returns an instance of Net::HTTPResponse.
13
13
  module HttpMethods
14
14
  def code
15
15
  @response.code
@@ -18,12 +18,6 @@ module MarbleApiClient
18
18
  def body
19
19
  @response.body
20
20
  end
21
-
22
- private
23
-
24
- def parsed_body
25
- @parsed_body ||= JSON.parse(body)
26
- end
27
21
  end
28
22
  end
29
23
  end
@@ -9,52 +9,12 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 200 Response Index Class
12
+ # Represents an HTTP 200 responses.
13
+ # Adds additional properties to the Success class specific to Index requests.
13
14
  class List < Success
14
- PAGE = 'page'
15
- PAGE_SIZE = 'pageSize'
16
- META = 'meta'
17
- RECORDS = 'records'
18
- SORT_DIRECTION = 'sortDirection'
19
- SORT_COLUMN_INDEX = 'sortColumnIndex'
20
- TOTAL = 'total'
21
- TOTAL_PAGES = 'totalPages'
22
-
23
- def initialize(response)
24
- super
25
- end
26
-
27
- def page
28
- parsed_body.dig(PAGE)
29
- end
30
-
31
- def page_size
32
- parsed_body.dig(PAGE_SIZE)
33
- end
34
-
35
- def meta
36
- parsed_body.dig(META)
37
- end
38
-
39
- def records
40
- parsed_body.dig(RECORDS)
41
- end
42
-
43
- def sort_direction
44
- parsed_body.dig(SORT_DIRECTION)
45
- end
46
-
47
- def sort_column_index
48
- parsed_body.dig(SORT_COLUMN_INDEX)
49
- end
50
-
51
- def total
52
- parsed_body.dig(TOTAL)
53
- end
54
-
55
- def total_pages
56
- parsed_body.dig(TOTAL_PAGES)
57
- end
15
+ body_attributes :page, :page_size, :meta, :records,
16
+ :sort_direction, :sort_column_index,
17
+ :total, :total_pages
58
18
  end
59
19
  end
60
20
  end
@@ -9,17 +9,10 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 404 Response Class
12
+ # Represents an HTTP 404 responses.
13
+ # Adds additional properties to the ClientError which encompasses the entire 400 level.
13
14
  class NotFound < ClientError
14
- ERRORS = 'errors'
15
-
16
- def initialize(response)
17
- super
18
- end
19
-
20
- def errors
21
- parsed_body.dig(ERRORS)
22
- end
15
+ body_attributes :message
23
16
  end
24
17
  end
25
18
  end
@@ -8,17 +8,10 @@
8
8
  #
9
9
  module MarbleApiClient
10
10
  module Responses
11
- # 501 Response Class
11
+ # Represents an HTTP 501 responses.
12
+ # Adds additional properties to the ServerError which encompasses the entire 500 level.
12
13
  class NotImplemented < ServerError
13
- ERRORS = 'errors'
14
-
15
- def initialize(response)
16
- super
17
- end
18
-
19
- def errors
20
- parsed_body.dig(ERRORS)
21
- end
14
+ body_attributes :message
22
15
  end
23
16
  end
24
17
  end
@@ -9,17 +9,10 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 200 Response Create Class
12
+ # Represents an HTTP 200 responses.
13
+ # Adds additional properties to the Success class specific to Create requests.
13
14
  class Record < Success
14
- RECORD = 'record'
15
-
16
- def initialize(response)
17
- super
18
- end
19
-
20
- def record
21
- parsed_body.dig(RECORD)
22
- end
15
+ body_attributes :record
23
16
  end
24
17
  end
25
18
  end
@@ -9,19 +9,16 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 500 Response Base Class
12
+ # Represents an HTTP 500 response. This will encompass all errors in the 500-599 range.
13
13
  class ServerError
14
14
  include HttpMethods
15
+ include BodyAttributes
15
16
 
16
- ERRORS = 'errors'
17
+ body_attributes :errors
17
18
 
18
19
  def initialize(response)
19
20
  @response = response
20
21
  end
21
-
22
- def errors
23
- parsed_body.dig(ERRORS)
24
- end
25
22
  end
26
23
  end
27
24
  end
@@ -9,9 +9,10 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 200 Response Base Class
12
+ # Represents an HTTP 200 response. This will encompass all errors in the 200-299 range.
13
13
  class Success
14
14
  include HttpMethods
15
+ include BodyAttributes
15
16
 
16
17
  def initialize(response)
17
18
  @response = response
@@ -9,11 +9,10 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 401 Response Class
12
+ # Represents an HTTP 401 responses.
13
+ # Adds additional properties to the ClientError which encompasses the entire 400 level.
13
14
  class Unauthorized < ClientError
14
- def initialize(response)
15
- super
16
- end
15
+ body_attributes :message, :redirect_url
17
16
  end
18
17
  end
19
18
  end
@@ -9,32 +9,10 @@
9
9
 
10
10
  module MarbleApiClient
11
11
  module Responses
12
- # 422 Response Object
12
+ # Represents an HTTP 422 responses.
13
+ # Adds additional properties to the ClientError which encompasses the entire 400 level.
13
14
  class UnprocessableEntity < ClientError
14
- ERRORS = 'errors'
15
- ERROR_PROPERTIES = 'errorProperties'
16
- WARNINGS = 'warnings'
17
- WARNING_PROPERTIES = 'warningProperties'
18
-
19
- def initialize(response)
20
- super
21
- end
22
-
23
- def errors
24
- parsed_body.dig(ERRORS)
25
- end
26
-
27
- def error_properties
28
- parsed_body.dig(ERROR_PROPERTIES)
29
- end
30
-
31
- def warnings
32
- parsed_body.dig(WARNINGS)
33
- end
34
-
35
- def warning_properties
36
- parsed_body.dig(WARNING_PROPERTIES)
37
- end
15
+ body_attributes :errors, :error_properties, :warnings, :warning_properties
38
16
  end
39
17
  end
40
18
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'responses/http_methods'
4
+ require_relative 'responses/body_attributes'
4
5
 
5
6
  require_relative 'responses/success'
6
7
  require_relative 'responses/client_error'
@@ -16,7 +17,7 @@ require_relative 'responses/unauthorized'
16
17
  require_relative 'responses/unprocessable_entity'
17
18
 
18
19
  module MarbleApiClient
19
- # Module for all response objects
20
+ # Module for getting response objects
20
21
  module Responses
21
22
  INDEX_ACTION = 'index'
22
23
  CREATE_ACTION = 'create'
@@ -31,6 +32,10 @@ module MarbleApiClient
31
32
  NOT_IMPLEMENTED_RESPONSE_CODE = '501'
32
33
 
33
34
  RESPONSES = [
35
+ {
36
+ code: SUCCESS_RESPONSE_CODE,
37
+ class_constant: Success
38
+ },
34
39
  {
35
40
  code: SUCCESS_RESPONSE_CODE,
36
41
  action: INDEX_ACTION,
@@ -72,20 +77,43 @@ module MarbleApiClient
72
77
  ].freeze
73
78
 
74
79
  class << self
75
- def get_response_object(response, action)
80
+ def parse_response(response, action)
76
81
  raise ArgumentError, 'HTTPResponse required' unless response.is_a?(Net::HTTPResponse)
77
82
 
78
- response_object = find_object(response, action)
83
+ find_object(response, action)[:class_constant].new(response)
84
+ end
79
85
 
80
- raise ArgumentError, "Unexpecred HTTResponse: #{response.code}" unless response_object
86
+ private
81
87
 
82
- response_object[:class_constant].new(response)
88
+ def find_object(response, action)
89
+ code_search = create_searches(response.code)
90
+ find_by_code_and_action(response.code, action, code_search)
83
91
  end
84
92
 
85
- def find_object(response, action)
86
- RESPONSES.find do |r|
87
- r[:code] == response.code && (r[:action] ? r[:action] == action : true)
93
+ # Creates cascading searches using lambdas and the find ifnone argument.
94
+ # Shortcircuits at first found object and returns it.
95
+ def create_searches(code)
96
+ none_found = lambda do
97
+ raise ArgumentError, "Unexpecred HTTResponse: #{code}"
98
+ end
99
+
100
+ rounded_code_search = lambda do
101
+ RESPONSES.find(none_found) { |r| r[:action].nil? && r[:code] == rounded_code(code) }
88
102
  end
103
+
104
+ lambda do
105
+ RESPONSES.find(rounded_code_search) { |r| r[:action].nil? && r[:code] == code }
106
+ end
107
+ end
108
+
109
+ def find_by_code_and_action(code, action, ifnone)
110
+ RESPONSES.find(ifnone) do |r|
111
+ r[:code] == code && r[:action] == action
112
+ end
113
+ end
114
+
115
+ def rounded_code(code)
116
+ code.to_i.floor(-2).to_s
89
117
  end
90
118
  end
91
119
  end
@@ -8,5 +8,5 @@
8
8
  #
9
9
 
10
10
  module MarbleApiClient
11
- VERSION = '1.0.0-alpha'
11
+ VERSION = '1.0.0-alpha.1'
12
12
  end
@@ -8,11 +8,17 @@
8
8
  #
9
9
 
10
10
  require 'net/http'
11
+ require 'acts_as_hashable'
11
12
 
12
- require_relative 'marble_api_client/proxy'
13
+ require_relative 'marble_api_client/client'
13
14
  require_relative 'marble_api_client/requests'
14
15
  require_relative 'marble_api_client/responses'
15
16
 
16
17
  # This class interacts with Blue Marble Payroll Webglobe API
17
18
  module MarbleApiClient
19
+ class << self
20
+ def client(base_url, headers: {})
21
+ Client.new(base_url, headers)
22
+ end
23
+ end
18
24
  end
@@ -19,14 +19,16 @@ Gem::Specification.new do |s|
19
19
  s.homepage = 'https://github.com/bluemarblepayroll/marble_api_client'
20
20
  s.license = 'MIT'
21
21
 
22
- s.required_ruby_version = '>= 2.3.8'
22
+ s.required_ruby_version = '>= 2.3.8', '<2.7.0'
23
+
24
+ s.add_dependency 'acts_as_hashable', '~> 1'
23
25
 
24
26
  s.add_development_dependency('guard-rspec', '~>4.7')
25
27
  s.add_development_dependency('pry', '~>0')
26
28
  s.add_development_dependency('rake', '~> 12')
27
- s.add_development_dependency('rspec')
28
- s.add_development_dependency('rubocop', '~>0.74.0')
29
- s.add_development_dependency('simplecov', '~>0.17.0')
30
- s.add_development_dependency('simplecov-console', '~>0.5.0')
31
- s.add_development_dependency('webmock')
29
+ s.add_development_dependency('rspec', '~>3.8')
30
+ s.add_development_dependency('rubocop', '~>0.74')
31
+ s.add_development_dependency('simplecov', '~>0.17')
32
+ s.add_development_dependency('simplecov-console', '~>0.5')
33
+ s.add_development_dependency('webmock', '~>3.7')
32
34
  end
@@ -9,21 +9,20 @@
9
9
 
10
10
  require 'spec_helper'
11
11
 
12
- RSpec.describe MarbleApiClient::Proxy do
13
- let(:proxy) do
14
- MarbleApiClient::Proxy.new(
15
- 'http://www.example.com:3000',
16
- headers: { 'Content-Type': 'application/json' }
12
+ RSpec.describe MarbleApiClient::Client do
13
+ let(:client) do
14
+ MarbleApiClient::Client.new(
15
+ 'http://www.example.com:3000'
17
16
  )
18
17
  end
19
18
 
20
19
  it 'requires a base_url' do
21
- expect { MarbleApiClient::Proxy.new(nil) }
20
+ expect { MarbleApiClient::Client.new(nil) }
22
21
  .to raise_error(ArgumentError, 'Base URL is not valid')
23
22
  end
24
23
 
25
24
  it 'uses SSL for HTTPS requests' do
26
- p = MarbleApiClient::Proxy.new(
25
+ p = MarbleApiClient::Client.new(
27
26
  'https://www.example.com:3000',
28
27
  headers: { 'Content-Type': 'application/json' }
29
28
  )
@@ -36,19 +35,35 @@ RSpec.describe MarbleApiClient::Proxy do
36
35
  context 'create' do
37
36
  it 'sends requests to path' do
38
37
  stub_request(:post, 'http://www.example.com:3000/custom/path/create')
39
- proxy.create('custom/path')
38
+ client.create('custom/path')
40
39
  expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
41
40
  end
42
41
 
43
42
  it 'sends requests to path ending in "/"' do
44
43
  stub_request(:post, 'http://www.example.com:3000/custom/path/create')
45
- proxy.create('custom/path/')
44
+ client.create('custom/path/')
46
45
  expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
47
46
  end
48
47
 
49
48
  it 'sends correct headers' do
50
49
  stub_request(:post, 'http://www.example.com:3000/custom/path/create')
51
- proxy.create('custom/path', headers: { option: 'val' })
50
+ client.create('custom/path', headers: { option: 'val' })
51
+ expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
52
+ .with(headers: { 'Content-Type': 'application/json',
53
+ option: 'val' })
54
+ end
55
+
56
+ it 'sends symbol headers' do
57
+ stub_request(:post, 'http://www.example.com:3000/custom/path/create')
58
+ client.create('custom/path', headers: { option: 'val' })
59
+ expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
60
+ .with(headers: { 'Content-Type': 'application/json',
61
+ option: 'val' })
62
+ end
63
+
64
+ it 'sends string headers' do
65
+ stub_request(:post, 'http://www.example.com:3000/custom/path/create')
66
+ client.create('custom/path', headers: { 'option' => 'val' })
52
67
  expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
53
68
  .with(headers: { 'Content-Type': 'application/json',
54
69
  option: 'val' })
@@ -56,8 +71,16 @@ RSpec.describe MarbleApiClient::Proxy do
56
71
 
57
72
  it 'sends the correct body' do
58
73
  stub_request(:post, 'http://www.example.com:3000/custom/path/create')
59
- proxy.create('custom/path',
60
- create_request: MarbleApiClient::Requests::Create.new(record: { name: 'blue' }))
74
+ client.create('custom/path',
75
+ create_request: MarbleApiClient::Requests::Create.new(record: { name: 'blue' }))
76
+ expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
77
+ .with(body: { context: {}, record: { name: 'blue' } })
78
+ end
79
+
80
+ it 'allows hash instead of Request::Create object' do
81
+ stub_request(:post, 'http://www.example.com:3000/custom/path/create')
82
+ client.create('custom/path',
83
+ create_request: { record: { name: 'blue' } })
61
84
  expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
62
85
  .with(body: { context: {}, record: { name: 'blue' } })
63
86
  end
@@ -66,13 +89,13 @@ RSpec.describe MarbleApiClient::Proxy do
66
89
  context 'index' do
67
90
  it 'sends to requested path' do
68
91
  stub_request(:post, 'http://www.example.com:3000/custom/path/index')
69
- proxy.index('custom/path')
92
+ client.index('custom/path')
70
93
  expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/index')
71
94
  end
72
95
 
73
96
  it 'sends the correct headers' do
74
97
  stub_request(:post, 'http://www.example.com:3000/custom/path/index')
75
- proxy.index('custom/path', headers: { option: 'val' })
98
+ client.index('custom/path', headers: { option: 'val' })
76
99
  expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/index')
77
100
  .with(headers: { 'Content-Type': 'application/json',
78
101
  option: 'val' })
@@ -80,8 +103,16 @@ RSpec.describe MarbleApiClient::Proxy do
80
103
 
81
104
  it 'sends the correct body' do
82
105
  stub_request(:post, 'http://www.example.com:3000/custom/path/index')
83
- proxy.index('custom/path',
84
- index_request: MarbleApiClient::Requests::Index.new(record: { name: 'blue' }))
106
+ client.index('custom/path',
107
+ index_request: MarbleApiClient::Requests::Index.new(record: { name: 'blue' }))
108
+ expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/index')
109
+ .with(body: { context: {}, record: { name: 'blue' }, page: 1, page_size: 25 })
110
+ end
111
+
112
+ it 'allows hash instead of Request::Index object' do
113
+ stub_request(:post, 'http://www.example.com:3000/custom/path/index')
114
+ client.index('custom/path',
115
+ index_request: { record: { name: 'blue' } })
85
116
  expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/index')
86
117
  .with(body: { context: {}, record: { name: 'blue' }, page: 1, page_size: 25 })
87
118
  end
@@ -11,14 +11,14 @@ require 'spec_helper'
11
11
 
12
12
  RSpec.describe MarbleApiClient::Responses::BadRequest do
13
13
  context 'provides' do
14
- let(:error_hash) { { name: 'invalid' }.to_json }
14
+ let(:message) { 'invalid' }
15
15
  let(:response) do
16
- instance_double(Net::HTTPResponse, code: 400, body: { errors: error_hash }.to_json)
16
+ instance_double(Net::HTTPResponse, code: 400, body: { message: message }.to_json)
17
17
  end
18
18
 
19
- it 'errors' do
20
- expect(described_class.new(response).errors)
21
- .to eq(error_hash)
19
+ specify 'message' do
20
+ expect(described_class.new(response).message)
21
+ .to eq(message)
22
22
  end
23
23
  end
24
24
  end
@@ -14,16 +14,16 @@ RSpec.describe MarbleApiClient::Responses::Forbidden do
14
14
  let(:response) do
15
15
  instance_double(Net::HTTPResponse,
16
16
  code: 400,
17
- body: { statusCode: '403',
17
+ body: { message: 'not allowed',
18
18
  redirectUrl: 'www.example.com/hello' }.to_json)
19
19
  end
20
20
 
21
- it 'Status Code' do
22
- expect(described_class.new(response).status_code)
23
- .to eq('403')
21
+ specify 'message' do
22
+ expect(described_class.new(response).message)
23
+ .to eq('not allowed')
24
24
  end
25
25
 
26
- it 'Redirect URL' do
26
+ specify 'Redirect URL' do
27
27
  expect(described_class.new(response).redirect_url)
28
28
  .to eq('www.example.com/hello')
29
29
  end
@@ -34,42 +34,42 @@ RSpec.describe MarbleApiClient::Responses::List do
34
34
  }.to_json)
35
35
  end
36
36
 
37
- it 'page' do
37
+ specify 'page' do
38
38
  expect(described_class.new(response).page)
39
39
  .to eq(page)
40
40
  end
41
41
 
42
- it 'page_size' do
42
+ specify 'page_size' do
43
43
  expect(described_class.new(response).page_size)
44
44
  .to eq(page_size)
45
45
  end
46
46
 
47
- it 'meta' do
47
+ specify 'meta' do
48
48
  expect(described_class.new(response).meta)
49
49
  .to eq(meta)
50
50
  end
51
51
 
52
- it 'records' do
52
+ specify 'records' do
53
53
  expect(described_class.new(response).records)
54
54
  .to eq(records)
55
55
  end
56
56
 
57
- it 'sort driection' do
57
+ specify 'sort driection' do
58
58
  expect(described_class.new(response).sort_direction)
59
59
  .to eq(sort_direction)
60
60
  end
61
61
 
62
- it 'sort column index' do
62
+ specify 'sort column index' do
63
63
  expect(described_class.new(response).sort_column_index)
64
64
  .to eq(sort_column_index)
65
65
  end
66
66
 
67
- it 'total' do
67
+ specify 'total' do
68
68
  expect(described_class.new(response).total)
69
69
  .to eq(total)
70
70
  end
71
71
 
72
- it 'total pages' do
72
+ specify 'total pages' do
73
73
  expect(described_class.new(response).total_pages)
74
74
  .to eq(total_pages)
75
75
  end
@@ -11,14 +11,14 @@ require 'spec_helper'
11
11
 
12
12
  RSpec.describe MarbleApiClient::Responses::NotFound do
13
13
  context 'provides' do
14
- let(:error_hash) { { name: 'invalid' }.to_json }
14
+ let(:message) { 'invalid' }
15
15
  let(:response) do
16
- instance_double(Net::HTTPResponse, code: 400, body: { errors: error_hash }.to_json)
16
+ instance_double(Net::HTTPResponse, code: 400, body: { message: message }.to_json)
17
17
  end
18
18
 
19
- it 'errors' do
20
- expect(described_class.new(response).errors)
21
- .to eq(error_hash)
19
+ specify 'errors' do
20
+ expect(described_class.new(response).message)
21
+ .to eq(message)
22
22
  end
23
23
  end
24
24
  end
@@ -16,7 +16,7 @@ RSpec.describe MarbleApiClient::Responses::NotImplemented do
16
16
  instance_double(Net::HTTPResponse, code: 400, body: { errors: error_hash }.to_json)
17
17
  end
18
18
 
19
- it 'errors' do
19
+ specify 'errors' do
20
20
  expect(described_class.new(response).errors)
21
21
  .to eq(error_hash)
22
22
  end
@@ -16,7 +16,7 @@ RSpec.describe MarbleApiClient::Responses::Record do
16
16
  instance_double(Net::HTTPResponse, code: 400, body: { record: record }.to_json)
17
17
  end
18
18
 
19
- it 'errors' do
19
+ specify 'errors' do
20
20
  expect(described_class.new(response).record)
21
21
  .to eq(record)
22
22
  end
@@ -12,79 +12,93 @@ require 'spec_helper'
12
12
  RSpec.describe MarbleApiClient::Responses do
13
13
  it 'requires a HTTPResponse' do
14
14
  response = nil
15
- expect { described_class.get_response_object(response, 'index') }
15
+ expect { described_class.parse_response(response, 'index') }
16
16
  .to raise_error(ArgumentError)
17
17
  end
18
18
 
19
- context 'returns the right objects' do
20
- it '200' do
19
+ describe 'objects returned for various HTTP status codes' do
20
+ specify '200' do
21
21
  response = Net::HTTPResponse.new(1.0, '200', 'OK')
22
- response.uri = 'www.exampleuri.com/index'
23
- expect(described_class.get_response_object(response, 'index'))
22
+ response.uri = 'www.exampleuri.com/notarealaction'
23
+ expect(described_class.parse_response(response, 'notarealaction'))
24
24
  .to be_a_kind_of(MarbleApiClient::Responses::Success)
25
25
  end
26
26
 
27
- it '200 Index' do
27
+ specify '200 Index' do
28
28
  response = Net::HTTPResponse.new(1.0, '200', 'OK')
29
29
  response.uri = 'www.exampleuri.com/index'
30
- expect(described_class.get_response_object(response, 'index'))
30
+ expect(described_class.parse_response(response, 'index'))
31
31
  .to be_a_kind_of(MarbleApiClient::Responses::List)
32
32
  end
33
33
 
34
- it '200 Create' do
34
+ specify '200 Create' do
35
35
  response = Net::HTTPResponse.new(1.0, '200', 'OK')
36
36
  response.uri = 'www.exampleuri.com/create'
37
- expect(described_class.get_response_object(response, 'create'))
37
+ expect(described_class.parse_response(response, 'create'))
38
38
  .to be_a_kind_of(MarbleApiClient::Responses::Record)
39
39
  end
40
40
 
41
- it '400' do
41
+ specify '400' do
42
42
  response = Net::HTTPResponse.new(1.0, '400', 'Client Error')
43
43
  response.uri = 'www.exampleuri.com/index'
44
- expect(described_class.get_response_object(response, 'index'))
44
+ expect(described_class.parse_response(response, 'index'))
45
45
  .to be_a_kind_of(MarbleApiClient::Responses::BadRequest)
46
46
  end
47
47
 
48
- it '401' do
48
+ specify '401' do
49
49
  response = Net::HTTPResponse.new(1.0, '401', 'Client Error')
50
50
  response.uri = 'www.exampleuri.com/index'
51
- expect(described_class.get_response_object(response, 'index'))
51
+ expect(described_class.parse_response(response, 'index'))
52
52
  .to be_a_kind_of(MarbleApiClient::Responses::Unauthorized)
53
53
  end
54
54
 
55
- it '403' do
55
+ specify '403' do
56
56
  response = Net::HTTPResponse.new(1.0, '403', 'Client Error')
57
57
  response.uri = 'www.exampleuri.com/index'
58
- expect(described_class.get_response_object(response, 'index'))
58
+ expect(described_class.parse_response(response, 'index'))
59
59
  .to be_a_kind_of(MarbleApiClient::Responses::Forbidden)
60
60
  end
61
61
 
62
- it '404' do
62
+ specify '404' do
63
63
  response = Net::HTTPResponse.new(1.0, '404', 'Client Error')
64
64
  response.uri = 'www.exampleuri.com/index'
65
- expect(described_class.get_response_object(response, 'index'))
65
+ expect(described_class.parse_response(response, 'index'))
66
66
  .to be_a_kind_of(MarbleApiClient::Responses::NotFound)
67
67
  end
68
68
 
69
- it '422' do
69
+ specify '422' do
70
70
  response = Net::HTTPResponse.new(1.0, '422', 'Client Error')
71
71
  response.uri = 'www.exampleuri.com/index'
72
- expect(described_class.get_response_object(response, 'index'))
72
+ expect(described_class.parse_response(response, 'index'))
73
73
  .to be_a_kind_of(MarbleApiClient::Responses::UnprocessableEntity)
74
74
  end
75
75
 
76
- it '500' do
76
+ specify '500' do
77
77
  response = Net::HTTPResponse.new(1.0, '500', 'Server Error')
78
78
  response.uri = 'www.exampleuri.com/index'
79
- expect(described_class.get_response_object(response, 'index'))
79
+ expect(described_class.parse_response(response, 'index'))
80
80
  .to be_a_kind_of(MarbleApiClient::Responses::ServerError)
81
81
  end
82
82
 
83
- it '501' do
83
+ specify '501' do
84
84
  response = Net::HTTPResponse.new(1.0, '501', 'Server Error')
85
85
  response.uri = 'www.exampleuri.com/index'
86
- expect(described_class.get_response_object(response, 'index'))
86
+ expect(described_class.parse_response(response, 'index'))
87
87
  .to be_a_kind_of(MarbleApiClient::Responses::NotImplemented)
88
88
  end
89
+
90
+ specify '503' do
91
+ response = Net::HTTPResponse.new(1.0, '503', 'Server Error')
92
+ response.uri = 'www.exampleuri.com/index'
93
+ expect(described_class.parse_response(response, 'index'))
94
+ .to be_a_kind_of(MarbleApiClient::Responses::ServerError)
95
+ end
96
+
97
+ specify '1000' do
98
+ response = Net::HTTPResponse.new(1.0, '1000', 'Not Real Error')
99
+ response.uri = 'www.exampleuri.com/index'
100
+ expect { described_class.parse_response(response, 'index') }
101
+ .to raise_error(ArgumentError)
102
+ end
89
103
  end
90
104
  end
@@ -16,7 +16,7 @@ RSpec.describe MarbleApiClient::Responses::ServerError do
16
16
  instance_double(Net::HTTPResponse, code: 400, body: { errors: error_hash }.to_json)
17
17
  end
18
18
 
19
- it 'errors' do
19
+ specify 'errors' do
20
20
  expect(described_class.new(response).errors)
21
21
  .to eq(error_hash)
22
22
  end
@@ -10,4 +10,22 @@
10
10
  require 'spec_helper'
11
11
 
12
12
  RSpec.describe MarbleApiClient::Responses::Unauthorized do
13
+ context 'provides' do
14
+ let(:response) do
15
+ instance_double(Net::HTTPResponse,
16
+ code: 400,
17
+ body: { message: 'not authorized',
18
+ redirectUrl: 'www.example.com/hello' }.to_json)
19
+ end
20
+
21
+ specify 'message' do
22
+ expect(described_class.new(response).message)
23
+ .to eq('not authorized')
24
+ end
25
+
26
+ specify 'Redirect URL' do
27
+ expect(described_class.new(response).redirect_url)
28
+ .to eq('www.example.com/hello')
29
+ end
30
+ end
13
31
  end
@@ -26,22 +26,22 @@ RSpec.describe MarbleApiClient::Responses::UnprocessableEntity do
26
26
  }.to_json)
27
27
  end
28
28
 
29
- it 'errors' do
29
+ specify 'errors' do
30
30
  expect(described_class.new(response).errors)
31
31
  .to eq(errors)
32
32
  end
33
33
 
34
- it 'error properties' do
34
+ specify 'error properties' do
35
35
  expect(described_class.new(response).error_properties)
36
36
  .to eq(error_properties)
37
37
  end
38
38
 
39
- it 'warnings' do
39
+ specify 'warnings' do
40
40
  expect(described_class.new(response).warnings)
41
41
  .to eq(warnings)
42
42
  end
43
43
 
44
- it 'warning properties' do
44
+ specify 'warning properties' do
45
45
  expect(described_class.new(response).warning_properties)
46
46
  .to eq(warning_properties)
47
47
  end
@@ -13,4 +13,9 @@ RSpec.describe MarbleApiClient do
13
13
  it 'has a version number' do
14
14
  expect(MarbleApiClient::VERSION).not_to be nil
15
15
  end
16
+
17
+ specify 'client returns a MarbleApiClient::Client' do
18
+ expect(MarbleApiClient.client('http://www.example.com'))
19
+ .to be_a(MarbleApiClient::Client)
20
+ end
16
21
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marble_api_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.alpha
4
+ version: 1.0.0.pre.alpha.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Dewar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-12 00:00:00.000000000 Z
11
+ date: 2020-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: acts_as_hashable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: guard-rspec
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,72 +70,72 @@ dependencies:
56
70
  name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ">="
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0'
75
+ version: '3.8'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ">="
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0'
82
+ version: '3.8'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rubocop
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: 0.74.0
89
+ version: '0.74'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: 0.74.0
96
+ version: '0.74'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: simplecov
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 0.17.0
103
+ version: '0.17'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 0.17.0
110
+ version: '0.17'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: simplecov-console
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: 0.5.0
117
+ version: '0.5'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: 0.5.0
124
+ version: '0.5'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: webmock
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ">="
129
+ - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: '0'
131
+ version: '3.7'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ">="
136
+ - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: '0'
138
+ version: '3.7'
125
139
  description: " Write a description.\n"
126
140
  email:
127
141
  - ddewar@bluemarblepayroll.com
@@ -144,12 +158,13 @@ files:
144
158
  - Rakefile
145
159
  - bin/console
146
160
  - lib/marble_api_client.rb
147
- - lib/marble_api_client/proxy.rb
161
+ - lib/marble_api_client/client.rb
148
162
  - lib/marble_api_client/requests.rb
149
163
  - lib/marble_api_client/requests/create.rb
150
164
  - lib/marble_api_client/requests/index.rb
151
165
  - lib/marble_api_client/responses.rb
152
166
  - lib/marble_api_client/responses/bad_request.rb
167
+ - lib/marble_api_client/responses/body_attributes.rb
153
168
  - lib/marble_api_client/responses/client_error.rb
154
169
  - lib/marble_api_client/responses/forbidden.rb
155
170
  - lib/marble_api_client/responses/http_methods.rb
@@ -163,7 +178,7 @@ files:
163
178
  - lib/marble_api_client/responses/unprocessable_entity.rb
164
179
  - lib/marble_api_client/version.rb
165
180
  - marble_api_client.gemspec
166
- - spec/marble_api_client/proxy_spec.rb
181
+ - spec/marble_api_client/client_spec.rb
167
182
  - spec/marble_api_client/requests/create_spec.rb
168
183
  - spec/marble_api_client/requests/index_spec.rb
169
184
  - spec/marble_api_client/responses/bad_request_spec.rb
@@ -193,6 +208,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
193
208
  - - ">="
194
209
  - !ruby/object:Gem::Version
195
210
  version: 2.3.8
211
+ - - "<"
212
+ - !ruby/object:Gem::Version
213
+ version: 2.7.0
196
214
  required_rubygems_version: !ruby/object:Gem::Requirement
197
215
  requirements:
198
216
  - - ">"
@@ -204,7 +222,7 @@ signing_key:
204
222
  specification_version: 4
205
223
  summary: Write a summary.
206
224
  test_files:
207
- - spec/marble_api_client/proxy_spec.rb
225
+ - spec/marble_api_client/client_spec.rb
208
226
  - spec/marble_api_client/requests/create_spec.rb
209
227
  - spec/marble_api_client/requests/index_spec.rb
210
228
  - spec/marble_api_client/responses/bad_request_spec.rb