marble_api_client 1.0.0.pre.alpha

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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +8 -0
  3. data/.gitignore +6 -0
  4. data/.rubocop.yml +25 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +25 -0
  7. data/CHANGELOG.md +3 -0
  8. data/CODE_OF_CONDUCT.md +74 -0
  9. data/Gemfile +5 -0
  10. data/Guardfile +16 -0
  11. data/LICENSE +7 -0
  12. data/README.md +137 -0
  13. data/Rakefile +17 -0
  14. data/bin/console +18 -0
  15. data/lib/marble_api_client/proxy.rb +68 -0
  16. data/lib/marble_api_client/requests/create.rb +27 -0
  17. data/lib/marble_api_client/requests/index.rb +31 -0
  18. data/lib/marble_api_client/requests.rb +4 -0
  19. data/lib/marble_api_client/responses/bad_request.rb +25 -0
  20. data/lib/marble_api_client/responses/client_error.rb +21 -0
  21. data/lib/marble_api_client/responses/forbidden.rb +29 -0
  22. data/lib/marble_api_client/responses/http_methods.rb +29 -0
  23. data/lib/marble_api_client/responses/list.rb +60 -0
  24. data/lib/marble_api_client/responses/not_found.rb +25 -0
  25. data/lib/marble_api_client/responses/not_implemented.rb +24 -0
  26. data/lib/marble_api_client/responses/record.rb +25 -0
  27. data/lib/marble_api_client/responses/server_error.rb +27 -0
  28. data/lib/marble_api_client/responses/success.rb +21 -0
  29. data/lib/marble_api_client/responses/unauthorized.rb +19 -0
  30. data/lib/marble_api_client/responses/unprocessable_entity.rb +40 -0
  31. data/lib/marble_api_client/responses.rb +92 -0
  32. data/lib/marble_api_client/version.rb +12 -0
  33. data/lib/marble_api_client.rb +18 -0
  34. data/marble_api_client.gemspec +32 -0
  35. data/spec/marble_api_client/proxy_spec.rb +89 -0
  36. data/spec/marble_api_client/requests/create_spec.rb +30 -0
  37. data/spec/marble_api_client/requests/index_spec.rb +34 -0
  38. data/spec/marble_api_client/responses/bad_request_spec.rb +24 -0
  39. data/spec/marble_api_client/responses/client_error_spec.rb +21 -0
  40. data/spec/marble_api_client/responses/forbidden_spec.rb +31 -0
  41. data/spec/marble_api_client/responses/list_spec.rb +77 -0
  42. data/spec/marble_api_client/responses/not_found_spec.rb +24 -0
  43. data/spec/marble_api_client/responses/not_implmented_spec.rb +24 -0
  44. data/spec/marble_api_client/responses/record_spec.rb +24 -0
  45. data/spec/marble_api_client/responses/responses_spec.rb +90 -0
  46. data/spec/marble_api_client/responses/server_error_spec.rb +24 -0
  47. data/spec/marble_api_client/responses/success_spec.rb +13 -0
  48. data/spec/marble_api_client/responses/unauthorized_spec.rb +13 -0
  49. data/spec/marble_api_client/responses/unprocessable_entity_spec.rb +49 -0
  50. data/spec/marble_api_client_spec.rb +16 -0
  51. data/spec/spec_helper.rb +23 -0
  52. metadata +223 -0
@@ -0,0 +1,31 @@
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 Requests
12
+ # Index Request Object
13
+ class Index
14
+ def initialize(context: {}, record: {}, page: 1, page_size: 25)
15
+ @context = context
16
+ @record = record
17
+ @page = page
18
+ @page_size = page_size
19
+ end
20
+
21
+ def request_body
22
+ {
23
+ context: @context,
24
+ record: @record,
25
+ page: @page,
26
+ page_size: @page_size
27
+ }.to_json
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'requests/create'
4
+ require_relative 'requests/index'
@@ -0,0 +1,25 @@
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
+ # 400 Response Class
13
+ 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
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
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
+ # 400 Range Response Base Class
13
+ class ClientError
14
+ include HttpMethods
15
+
16
+ def initialize(response)
17
+ @response = response
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
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
+ # 403 Response Class
13
+ 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
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
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
+ # Module assumes existance of @response Net::HTTPResponse object
13
+ module HttpMethods
14
+ def code
15
+ @response.code
16
+ end
17
+
18
+ def body
19
+ @response.body
20
+ end
21
+
22
+ private
23
+
24
+ def parsed_body
25
+ @parsed_body ||= JSON.parse(body)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,60 @@
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
+ # 200 Response Index Class
13
+ 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
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,25 @@
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
+ # 404 Response Class
13
+ 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
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
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
+ module MarbleApiClient
10
+ module Responses
11
+ # 501 Response Class
12
+ 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
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
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
+ # 200 Response Create Class
13
+ 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
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
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
+ # 500 Response Base Class
13
+ class ServerError
14
+ include HttpMethods
15
+
16
+ ERRORS = 'errors'
17
+
18
+ def initialize(response)
19
+ @response = response
20
+ end
21
+
22
+ def errors
23
+ parsed_body.dig(ERRORS)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,21 @@
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
+ # 200 Response Base Class
13
+ class Success
14
+ include HttpMethods
15
+
16
+ def initialize(response)
17
+ @response = response
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
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
+ # 401 Response Class
13
+ class Unauthorized < ClientError
14
+ def initialize(response)
15
+ super
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,40 @@
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
+ # 422 Response Object
13
+ 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
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'responses/http_methods'
4
+
5
+ require_relative 'responses/success'
6
+ require_relative 'responses/client_error'
7
+ require_relative 'responses/server_error'
8
+
9
+ require_relative 'responses/bad_request'
10
+ require_relative 'responses/forbidden'
11
+ require_relative 'responses/list'
12
+ require_relative 'responses/not_found'
13
+ require_relative 'responses/not_implemented'
14
+ require_relative 'responses/record'
15
+ require_relative 'responses/unauthorized'
16
+ require_relative 'responses/unprocessable_entity'
17
+
18
+ module MarbleApiClient
19
+ # Module for all response objects
20
+ module Responses
21
+ INDEX_ACTION = 'index'
22
+ CREATE_ACTION = 'create'
23
+
24
+ SUCCESS_RESPONSE_CODE = '200'
25
+ BAD_REQUEST_RESPONSE_CODE = '400'
26
+ UNAUTHORIZED_RESPONSE_CODE = '401'
27
+ FORBIDDEN_RESPONSE_CODE = '403'
28
+ NOT_FOUND_RESPONSE_CODE = '404'
29
+ UNPROCESSABLE_ENTITY_RESPONSE_CODE = '422'
30
+ SERVER_ERROR_RESPONSE_CODE = '500'
31
+ NOT_IMPLEMENTED_RESPONSE_CODE = '501'
32
+
33
+ RESPONSES = [
34
+ {
35
+ code: SUCCESS_RESPONSE_CODE,
36
+ action: INDEX_ACTION,
37
+ class_constant: List
38
+ },
39
+ {
40
+ code: SUCCESS_RESPONSE_CODE,
41
+ action: CREATE_ACTION,
42
+ class_constant: Record
43
+ },
44
+ {
45
+ code: BAD_REQUEST_RESPONSE_CODE,
46
+ class_constant: BadRequest
47
+ },
48
+ {
49
+ code: UNAUTHORIZED_RESPONSE_CODE,
50
+ class_constant: Unauthorized
51
+ },
52
+ {
53
+ code: FORBIDDEN_RESPONSE_CODE,
54
+ class_constant: Forbidden
55
+ },
56
+ {
57
+ code: NOT_FOUND_RESPONSE_CODE,
58
+ class_constant: NotFound
59
+ },
60
+ {
61
+ code: UNPROCESSABLE_ENTITY_RESPONSE_CODE,
62
+ class_constant: UnprocessableEntity
63
+ },
64
+ {
65
+ code: SERVER_ERROR_RESPONSE_CODE,
66
+ class_constant: ServerError
67
+ },
68
+ {
69
+ code: NOT_IMPLEMENTED_RESPONSE_CODE,
70
+ class_constant: NotImplemented
71
+ }
72
+ ].freeze
73
+
74
+ class << self
75
+ def get_response_object(response, action)
76
+ raise ArgumentError, 'HTTPResponse required' unless response.is_a?(Net::HTTPResponse)
77
+
78
+ response_object = find_object(response, action)
79
+
80
+ raise ArgumentError, "Unexpecred HTTResponse: #{response.code}" unless response_object
81
+
82
+ response_object[:class_constant].new(response)
83
+ end
84
+
85
+ def find_object(response, action)
86
+ RESPONSES.find do |r|
87
+ r[:code] == response.code && (r[:action] ? r[:action] == action : true)
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end