api_client_builder 1.0.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +34 -0
  4. data/.travis.yml +20 -0
  5. data/Gemfile +6 -0
  6. data/Jenkinsfile +13 -0
  7. data/LICENSE.txt +22 -0
  8. data/{readme.md → README.md} +65 -50
  9. data/api_client_builder.gemspec +15 -13
  10. data/build.sh +16 -0
  11. data/lib/api_client_builder.rb +14 -0
  12. data/lib/api_client_builder/api_client.rb +96 -0
  13. data/lib/api_client_builder/delete_request.rb +19 -0
  14. data/lib/api_client_builder/get_collection_request.rb +43 -0
  15. data/lib/api_client_builder/get_item_request.rb +27 -0
  16. data/lib/api_client_builder/post_request.rb +19 -0
  17. data/lib/api_client_builder/put_request.rb +19 -0
  18. data/lib/api_client_builder/request.rb +66 -0
  19. data/lib/api_client_builder/response.rb +32 -0
  20. data/lib/api_client_builder/url_generator.rb +37 -0
  21. data/lib/api_client_builder/version.rb +3 -0
  22. data/spec/lib/api_client_builder/api_client_spec.rb +13 -4
  23. data/spec/lib/api_client_builder/delete_request_spec.rb +29 -0
  24. data/spec/lib/api_client_builder/get_collection_request_spec.rb +7 -10
  25. data/spec/lib/api_client_builder/get_item_request_spec.rb +4 -6
  26. data/spec/lib/api_client_builder/post_request_spec.rb +3 -5
  27. data/spec/lib/api_client_builder/put_request_spec.rb +3 -5
  28. data/spec/lib/api_client_builder/request_spec.rb +7 -9
  29. data/spec/lib/api_client_builder/response_spec.rb +1 -2
  30. data/spec/lib/api_client_builder/test_client/client.rb +3 -3
  31. data/spec/lib/api_client_builder/test_client/http_client_handler.rb +1 -2
  32. data/spec/lib/api_client_builder/test_client/response_handler.rb +13 -14
  33. data/spec/lib/api_client_builder/url_generator_spec.rb +29 -7
  34. data/spec/spec_helper.rb +8 -2
  35. metadata +51 -31
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
- require 'api_client_builder/get_item_request'
3
- require 'lib/api_client_builder/test_client/client'
2
+ require_relative 'test_client/client'
4
3
 
5
4
  module APIClientBuilder
6
5
  describe GetItemRequest do
@@ -21,9 +20,8 @@ module APIClientBuilder
21
20
  bad_response = APIClientBuilder::Response.new('bad request', 500, [200])
22
21
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:get_first_page).and_return(bad_response)
23
22
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:retry_request).and_return(bad_response)
24
- expect{ client.get_some_object(some_id: '123').response }.to raise_error(
25
- APIClientBuilder::DefaultPageError,
26
- "Default error for bad response. If you want to handle this error use #on_error on the response in your api consumer. Error Code: 500"
23
+ expect { client.get_some_object(some_id: '123').response }.to raise_error(
24
+ APIClientBuilder::DefaultPageError, /Error Code: 500/
27
25
  )
28
26
  end
29
27
 
@@ -32,7 +30,7 @@ module APIClientBuilder
32
30
  client = TestClient::Client.new(domain: 'https://www.domain.com/api/endpoints/')
33
31
 
34
32
  bad_response = APIClientBuilder::Response.new('bad request', 500, [200])
35
- good_response = APIClientBuilder::Response.new([1,2,3], 200, [200])
33
+ good_response = APIClientBuilder::Response.new([1, 2, 3], 200, [200])
36
34
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:get_first_page).and_return(bad_response)
37
35
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:more_pages?).and_return(false)
38
36
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:retry_request).and_return(good_response)
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
- require 'api_client_builder/post_request'
3
- require 'lib/api_client_builder/test_client/client'
2
+ require_relative 'test_client/client'
4
3
 
5
4
  module APIClientBuilder
6
5
  describe PostRequest do
@@ -20,9 +19,8 @@ module APIClientBuilder
20
19
 
21
20
  bad_response = APIClientBuilder::Response.new('bad request', 400, [200])
22
21
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:post_request).and_return(bad_response)
23
- expect{ client.post_some_object({}).response }.to raise_error(
24
- APIClientBuilder::DefaultPageError,
25
- "Default error for bad response. If you want to handle this error use #on_error on the response in your api consumer. Error Code: 400"
22
+ expect { client.post_some_object({}).response }.to raise_error(
23
+ APIClientBuilder::DefaultPageError, /Error Code: 400/
26
24
  )
27
25
  end
28
26
  end
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
- require 'api_client_builder/put_request'
3
- require 'lib/api_client_builder/test_client/client'
2
+ require_relative 'test_client/client'
4
3
 
5
4
  module APIClientBuilder
6
5
  describe PutRequest do
@@ -20,9 +19,8 @@ module APIClientBuilder
20
19
 
21
20
  bad_response = APIClientBuilder::Response.new('bad request', 400, [200])
22
21
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:put_request).and_return(bad_response)
23
- expect{ client.put_some_object({}).response }.to raise_error(
24
- APIClientBuilder::DefaultPageError,
25
- "Default error for bad response. If you want to handle this error use #on_error on the response in your api consumer. Error Code: 400"
22
+ expect { client.put_some_object({}).response }.to raise_error(
23
+ APIClientBuilder::DefaultPageError, /Error Code: 400/
26
24
  )
27
25
  end
28
26
  end
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
- require 'lib/api_client_builder/test_client/client'
3
- require 'api_client_builder/request'
2
+ require_relative 'test_client/client'
4
3
 
5
4
  module APIClientBuilder
6
5
  describe Request do
@@ -12,9 +11,8 @@ module APIClientBuilder
12
11
  bad_response = APIClientBuilder::Response.new('bad request', 400, [200])
13
12
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:get_first_page).and_return(bad_response)
14
13
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:retry_request).and_return(bad_response)
15
- expect{ client.get_some_object(some_id: '123').response }.to raise_error(
16
- APIClientBuilder::DefaultPageError,
17
- "Default error for bad response. If you want to handle this error use #on_error on the response in your api consumer. Error Code: 400"
14
+ expect { client.get_some_object(some_id: '123').response }.to raise_error(
15
+ APIClientBuilder::DefaultPageError, /Error Code: 400/
18
16
  )
19
17
  end
20
18
  end
@@ -28,13 +26,13 @@ module APIClientBuilder
28
26
  allow_any_instance_of(TestClient::ResponseHandler).to receive(:retry_request).and_return(bad_response)
29
27
  object_response = client.get_some_object(some_id: '123')
30
28
 
31
- object_response.on_error do |page, response|
32
- raise StandardError, "Something Bad Happened"
29
+ object_response.on_error do |_page, _response|
30
+ raise StandardError, 'Something Bad Happened'
33
31
  end
34
32
 
35
- expect{object_response.response}.to raise_error(
33
+ expect { object_response.response }.to raise_error(
36
34
  StandardError,
37
- "Something Bad Happened"
35
+ 'Something Bad Happened'
38
36
  )
39
37
  end
40
38
  end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'api_client_builder/response'
3
2
 
4
3
  module APIClientBuilder
5
4
  describe Response do
@@ -18,7 +17,7 @@ module APIClientBuilder
18
17
 
19
18
  it 'returns false when the response is otherwise marked as failed' do
20
19
  page = Response.new([], 200, [200])
21
- page.mark_failed "Something happened"
20
+ page.mark_failed 'Something happened'
22
21
 
23
22
  expect(page.success?).to eq(false)
24
23
  end
@@ -1,6 +1,5 @@
1
- require 'api_client_builder/api_client'
2
- require 'lib/api_client_builder/test_client/response_handler'
3
- require 'lib/api_client_builder/test_client/http_client_handler'
1
+ require_relative 'response_handler'
2
+ require_relative 'http_client_handler'
4
3
 
5
4
  module TestClient
6
5
  class Client < APIClientBuilder::APIClient
@@ -18,5 +17,6 @@ module TestClient
18
17
 
19
18
  post :some_object, 'some/post/url'
20
19
  put :some_object, 'som/put/url'
20
+ delete :some_object, 'som/delete/url'
21
21
  end
22
22
  end
@@ -4,7 +4,6 @@ module TestClient
4
4
  @domain = domain
5
5
  end
6
6
 
7
- def get(route, params = nil, headers = {})
8
- end
7
+ def get(route, params = nil, headers = {}); end
9
8
  end
10
9
  end
@@ -1,36 +1,37 @@
1
- require 'api_client_builder/response'
2
-
3
1
  module TestClient
4
2
  class ResponseHandler
5
3
  SUCCESS_STATUS = 200
6
- SUCCESS_RANGE = [200]
4
+ SUCCESS_RANGE = [200].freeze
7
5
  MAX_RETRIES = 4
8
6
 
9
- def initialize(client, start_url, type, **opts)
7
+ def initialize(_client, _start_url, _type, **_opts)
10
8
  @retries = 0
11
9
  end
12
10
 
13
11
  def get_first_page
14
12
  @current_page = 0
15
- APIClientBuilder::Response.new([1,2,3], SUCCESS_STATUS, SUCCESS_RANGE)
13
+ APIClientBuilder::Response.new([1, 2, 3], SUCCESS_STATUS, SUCCESS_RANGE)
16
14
  end
17
15
 
18
16
  def get_next_page
19
17
  @current_page += 1
20
- APIClientBuilder::Response.new([4,5,6], SUCCESS_STATUS, SUCCESS_RANGE)
18
+ APIClientBuilder::Response.new([4, 5, 6], SUCCESS_STATUS, SUCCESS_RANGE)
19
+ end
20
+
21
+ def delete_request
22
+ APIClientBuilder::Response.new('good delete request', SUCCESS_STATUS, SUCCESS_RANGE)
21
23
  end
22
24
 
23
- def put_request(body)
25
+ def put_request(_body)
24
26
  APIClientBuilder::Response.new('good request', SUCCESS_STATUS, SUCCESS_RANGE)
25
27
  end
26
28
 
27
- def post_request(body)
29
+ def post_request(_body)
28
30
  APIClientBuilder::Response.new('good request', SUCCESS_STATUS, SUCCESS_RANGE)
29
31
  end
30
32
 
31
33
  def more_pages?
32
- return false if @current_page >= 2
33
- return true
34
+ @current_page < 2
34
35
  end
35
36
 
36
37
  def retryable?(status_code)
@@ -38,10 +39,8 @@ module TestClient
38
39
  status_code != 400 && @retries < MAX_RETRIES
39
40
  end
40
41
 
41
- def retry_request
42
- end
42
+ def retry_request; end
43
43
 
44
- def reset_retries
45
- end
44
+ def reset_retries; end
46
45
  end
47
46
  end
@@ -1,12 +1,11 @@
1
1
  require 'spec_helper'
2
- require 'api_client_builder/url_generator'
3
2
 
4
3
  module APIClientBuilder
5
4
  describe URLGenerator do
6
5
  describe '#build_route' do
7
6
  context 'route with colon params and matching keys' do
8
7
  it 'replaces to route keys with their respective values' do
9
- url_generator = URLGenerator.new("https://www.domain.com/api/endpoints/")
8
+ url_generator = URLGenerator.new('https://www.domain.com/api/endpoints/')
10
9
 
11
10
  route = url_generator.build_route(
12
11
  'object_one/:object_one_id/:object_one_id/route_to_object/:other_object_id/object',
@@ -16,16 +15,39 @@ module APIClientBuilder
16
15
 
17
16
  expect(route).to eq(URI.parse('https://www.domain.com/api/endpoints/object_one/4/4/route_to_object/10/object'))
18
17
  end
18
+
19
+ it 'replaces to route keys with their respective values in embedded params' do
20
+ url_generator = URLGenerator.new('https://www.domain.com/api/endpoints/')
21
+
22
+ route = url_generator.build_route(
23
+ 'object_one/:object_one_id/:object_one_id/object&as_user_id=:user_object_id',
24
+ object_one_id: '4',
25
+ user_object_id: '1'
26
+ )
27
+ expect(route).to eq(URI.parse('https://www.domain.com/api/endpoints/object_one/4/4/object&as_user_id=1'))
28
+ end
29
+
30
+ it 'encodes the URI correctly' do
31
+ url_generator = URLGenerator.new('https://www.domain.com/api/endpoints/')
32
+
33
+ route = url_generator.build_route(
34
+ 'route_to_object/:object_id/object',
35
+ object_id: "\u1F4a9"
36
+ )
37
+ expect(route).to eq(URI.parse('https://www.domain.com/api/endpoints/route_to_object/%E1%BD%8A9/object'))
38
+ end
19
39
  end
20
40
 
21
41
  context 'route with colon params and non matching keys' do
22
42
  it 'raises an argument error' do
23
- url_generator = URLGenerator.new("https://www.domain.com/api/endpoints/")
43
+ url_generator = URLGenerator.new('https://www.domain.com/api/endpoints/')
24
44
 
25
- expect{url_generator.build_route(
26
- 'object_one/:object_one_id/:object_one_id/route_to_object/:other_object_id/object',
27
- other_object_id: '10'
28
- )}.to raise_error(ArgumentError, "Param :object_one_id is required")
45
+ expect do
46
+ url_generator.build_route(
47
+ 'object_one/:object_one_id/:object_one_id/route_to_object/:other_object_id/object',
48
+ other_object_id: '10'
49
+ )
50
+ end.to raise_error(ArgumentError, 'Param :object_one_id is required')
29
51
  end
30
52
  end
31
53
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,10 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter 'lib/api_client_builder/version.rb'
4
+ add_filter 'spec'
5
+ track_files 'lib/**/*.rb'
6
+ end
7
+ SimpleCov.minimum_coverage(97)
8
+
1
9
  require 'bundler/setup'
2
10
  require 'api_client_builder'
3
-
4
- SPEC_DIR = File.dirname(__FILE__)
metadata CHANGED
@@ -1,55 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_client_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jayce Higgins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-01 00:00:00.000000000 Z
11
+ date: 2021-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '3.7'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '3.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.57.2
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.57.2
41
55
  - !ruby/object:Gem::Dependency
42
- name: wwtd
56
+ name: simplecov
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - '>='
59
+ - - "~>"
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - '>='
66
+ - - "~>"
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  description: API Client Builder provides an easy to use interface for creating HTTP
@@ -61,9 +75,28 @@ executables: []
61
75
  extensions: []
62
76
  extra_rdoc_files: []
63
77
  files:
78
+ - ".gitignore"
79
+ - ".rubocop.yml"
80
+ - ".travis.yml"
81
+ - Gemfile
82
+ - Jenkinsfile
83
+ - LICENSE.txt
84
+ - README.md
64
85
  - api_client_builder.gemspec
65
- - readme.md
86
+ - build.sh
87
+ - lib/api_client_builder.rb
88
+ - lib/api_client_builder/api_client.rb
89
+ - lib/api_client_builder/delete_request.rb
90
+ - lib/api_client_builder/get_collection_request.rb
91
+ - lib/api_client_builder/get_item_request.rb
92
+ - lib/api_client_builder/post_request.rb
93
+ - lib/api_client_builder/put_request.rb
94
+ - lib/api_client_builder/request.rb
95
+ - lib/api_client_builder/response.rb
96
+ - lib/api_client_builder/url_generator.rb
97
+ - lib/api_client_builder/version.rb
66
98
  - spec/lib/api_client_builder/api_client_spec.rb
99
+ - spec/lib/api_client_builder/delete_request_spec.rb
67
100
  - spec/lib/api_client_builder/get_collection_request_spec.rb
68
101
  - spec/lib/api_client_builder/get_item_request_spec.rb
69
102
  - spec/lib/api_client_builder/post_request_spec.rb
@@ -75,7 +108,7 @@ files:
75
108
  - spec/lib/api_client_builder/test_client/response_handler.rb
76
109
  - spec/lib/api_client_builder/url_generator_spec.rb
77
110
  - spec/spec_helper.rb
78
- homepage:
111
+ homepage: https://github.com/instructure/api-client-builder
79
112
  licenses:
80
113
  - MIT
81
114
  metadata: {}
@@ -85,31 +118,18 @@ require_paths:
85
118
  - lib
86
119
  required_ruby_version: !ruby/object:Gem::Requirement
87
120
  requirements:
88
- - - '>='
121
+ - - ">="
89
122
  - !ruby/object:Gem::Version
90
- version: '2.0'
123
+ version: '2.3'
91
124
  required_rubygems_version: !ruby/object:Gem::Requirement
92
125
  requirements:
93
- - - '>='
126
+ - - ">="
94
127
  - !ruby/object:Gem::Version
95
128
  version: '0'
96
129
  requirements: []
97
- rubyforge_project:
98
- rubygems_version: 2.0.14
130
+ rubygems_version: 3.0.3
99
131
  signing_key:
100
132
  specification_version: 4
101
133
  summary: API Client Builder provides an easy to use interface for creating HTTP api
102
134
  clients
103
- test_files:
104
- - spec/lib/api_client_builder/api_client_spec.rb
105
- - spec/lib/api_client_builder/get_collection_request_spec.rb
106
- - spec/lib/api_client_builder/get_item_request_spec.rb
107
- - spec/lib/api_client_builder/post_request_spec.rb
108
- - spec/lib/api_client_builder/put_request_spec.rb
109
- - spec/lib/api_client_builder/request_spec.rb
110
- - spec/lib/api_client_builder/response_spec.rb
111
- - spec/lib/api_client_builder/test_client/client.rb
112
- - spec/lib/api_client_builder/test_client/http_client_handler.rb
113
- - spec/lib/api_client_builder/test_client/response_handler.rb
114
- - spec/lib/api_client_builder/url_generator_spec.rb
115
- - spec/spec_helper.rb
135
+ test_files: []