marble_api_client 1.0.0.pre.alpha

Sign up to get free protection for your applications and to get access to all the features.
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