aitch 1.1.0 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79fcbcbeb7a0487eb6071a17cdfe2a4ffceed98d1c1358a7e5a6613d916a0256
4
- data.tar.gz: a302171234f54b7b6607a5c8a8eda1c8b32c3b35658e65323ccd5a5cd6403ed3
3
+ metadata.gz: ac6be3c16c842bbd1555aed0de859b6e62bf59f511cce28a6c441efd980e5751
4
+ data.tar.gz: 2ebc4b41d63c9dd41756bb7fff03b52a6cbca2f56ed310183bc158a822bbdbd9
5
5
  SHA512:
6
- metadata.gz: f144ceb163b3a9cd1a91649b67bc5771fb5f73dcd021846147aa7b5583eeb4a13aa2d694cd7f468ca292b14e3226f09be8b0c9dd17292bfc74bc3792eabc2707
7
- data.tar.gz: 15974c7b5905d82798affa69f3494d6ca43b32e4f7ee4b175b350994d9627a0df04af3aa626cec9424ea31ae23da626ae212f446b79c571acb6cf39afc317d81
6
+ metadata.gz: 602da6e2d0aaf3812e7f19b84b48b47eaeac59086345bceb76c601eba64f369ae0833c32980f66b0c026338bb098ad72563d1a4d2fdf8384fe50792856d281a1
7
+ data.tar.gz: b35ef25d1e59cd76923e626fdd6d60a735977a35d6560a32fe3313a8421eeccbce9524163775651da6fc017fcd47f7ef20c7ec8a40460d4a627e2d75d334fae8
@@ -0,0 +1,3 @@
1
+ ---
2
+ github: [fnando]
3
+ custom: ["https://www.paypal.me/nandovieira/🍕"]
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: Tests
3
+
4
+ on:
5
+ pull_request:
6
+ branches:
7
+ - main
8
+ push:
9
+ branches:
10
+ - main
11
+ jobs:
12
+ build:
13
+ name: Tests with Ruby ${{ matrix.ruby }}
14
+ runs-on: "ubuntu-latest"
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ ruby: ["2.7.x", "2.6.x", "2.5.x", "3.0.x", "3.1.x"]
19
+
20
+ steps:
21
+ - uses: actions/checkout@v1
22
+
23
+ - uses: actions/cache@v2
24
+ with:
25
+ path: vendor/bundle
26
+ key: >
27
+ ${{ runner.os }}-${{ matrix.ruby }}-gems-${{
28
+ hashFiles('aitch.gemspec') }}
29
+ restore-keys: >
30
+ ${{ runner.os }}-${{ matrix.ruby }}-gems-${{
31
+ hashFiles('aitch.gemspec') }}
32
+
33
+ - name: Set up Ruby
34
+ uses: actions/setup-ruby@v1
35
+ with:
36
+ ruby-version: ${{ matrix.ruby }}
37
+
38
+ - name: Install gem dependencies
39
+ env:
40
+ RAILS_ENV: test
41
+ run: |
42
+ gem install bundler
43
+ bundle config path vendor/bundle
44
+ bundle update --jobs 4 --retry 3
45
+
46
+ - name: Run Tests
47
+ env:
48
+ RAILS_ENV: test
49
+ run: |
50
+ bundle exec rake
data/.rubocop.yml CHANGED
@@ -3,7 +3,8 @@ inherit_gem:
3
3
  rubocop-fnando: .rubocop.yml
4
4
 
5
5
  AllCops:
6
- TargetRubyVersion: 2.6
6
+ TargetRubyVersion: 2.5
7
+ NewCops: enable
7
8
 
8
9
  Layout/LineLength:
9
10
  Exclude:
@@ -13,14 +14,5 @@ Naming/AccessorMethodName:
13
14
  Exclude:
14
15
  - lib/aitch/request.rb
15
16
 
16
- Metrics/ClassLength:
17
- Enabled: false
18
-
19
- Metrics/AbcSize:
20
- Enabled: false
21
-
22
- Metrics/MethodLength:
23
- Enabled: false
24
-
25
- Metrics/ParameterLists:
17
+ Style/DocumentDynamicEvalDefinition:
26
18
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,40 +1,52 @@
1
1
  # Changelog
2
2
 
3
- * **1.0.1**
4
- * Fix a bug when JSON encoding body in a POST request.
5
- * **1.0.0**
6
- * Use frozen string magic comments
7
- * 307 redirections will honor the HTTP request method
8
- * Fix issue with redirection; it was including the target url for one level redirection.
9
- * Methods `Aitch::Response#html`, `Aitch::Response#json`, `Aitch::Response#xml` were removed; use `Aitch::Response#data` instead.
10
- * Add support to response parsers
11
- * **0.5.0** - May 24, 2015
12
- * Remove hard dependency on ActiveSupport
13
- * Add response validation
14
- * **0.4.1** - December 20, 2014
15
- * Consider default headers when returning content type (fixes issue with body's JSON encoding)
16
- * **0.4.0** - December 18, 2014
17
- * Add accessor method for setting request's content type
18
- * Automatically encodes body as JSON when content type matches `json`
19
- * JSON encoding now uses a parser
20
- * **0.3.0** - April 28, 2014
21
- * Make list of redirections available
22
- * Make the request URL available on responses
23
- * **0.2.1** - July 30, 2013
24
- * Add alias for `response.success?` (`response.ok?`)
25
- * **0.2.0** - July 28, 2013
26
- * Add DSL support
27
- * Create aliases for `response.data` (`response.xml` and `response.json`)
28
- * **0.1.5** - June 26, 2013
29
- * Fix issue with jRuby and `to_h` protocol
30
- * **0.1.4** - June 13, 2013
31
- * Accept headers as callable objects
32
- * Fix XML encoding, always converting values to UTF-8
33
- * **0.1.3** - May 12, 2013
34
- * Add response HTML parsing into Nokogiri object
35
- * **0.1.2** - May 10, 2013
36
- * Add response error code helpers, like `response.bad_request?` and `response.not_found?`
37
- * **0.1.1** - April 30, 2013
38
- * Add support for namespaces
39
- * **0.1.0** - April 29, 2013
40
- * Initial release
3
+ - **1.2.1**
4
+ - Avoid calling `to_h` when params are array-like.
5
+ - **1.2.0**
6
+ - Add support to base url.
7
+ - **1.1.0**
8
+ - Add keyword argument interface to methods like `Aitch.get` and alike.
9
+ - **1.0.2**
10
+ - Use `JSON.parse` rather than `JSON.load`.
11
+ - **1.0.1**
12
+ - Fix a bug when JSON encoding body in a POST request.
13
+ - **1.0.0**
14
+ - Use frozen string magic comments
15
+ - 307 redirections will honor the HTTP request method
16
+ - Fix issue with redirection; it was including the target url for one level
17
+ redirection.
18
+ - Methods `Aitch::Response#html`, `Aitch::Response#json`,
19
+ `Aitch::Response#xml` were removed; use `Aitch::Response#data` instead.
20
+ - Add support to response parsers
21
+ - **0.5.0** - May 24, 2015
22
+ - Remove hard dependency on ActiveSupport
23
+ - Add response validation
24
+ - **0.4.1** - December 20, 2014
25
+ - Consider default headers when returning content type (fixes issue with
26
+ body's JSON encoding)
27
+ - **0.4.0** - December 18, 2014
28
+ - Add accessor method for setting request's content type
29
+ - Automatically encodes body as JSON when content type matches `json`
30
+ - JSON encoding now uses a parser
31
+ - **0.3.0** - April 28, 2014
32
+ - Make list of redirections available
33
+ - Make the request URL available on responses
34
+ - **0.2.1** - July 30, 2013
35
+ - Add alias for `response.success?` (`response.ok?`)
36
+ - **0.2.0** - July 28, 2013
37
+ - Add DSL support
38
+ - Create aliases for `response.data` (`response.xml` and `response.json`)
39
+ - **0.1.5** - June 26, 2013
40
+ - Fix issue with jRuby and `to_h` protocol
41
+ - **0.1.4** - June 13, 2013
42
+ - Accept headers as callable objects
43
+ - Fix XML encoding, always converting values to UTF-8
44
+ - **0.1.3** - May 12, 2013
45
+ - Add response HTML parsing into Nokogiri object
46
+ - **0.1.2** - May 10, 2013
47
+ - Add response error code helpers, like `response.bad_request?` and
48
+ `response.not_found?`
49
+ - **0.1.1** - April 30, 2013
50
+ - Add support for namespaces
51
+ - **0.1.0** - April 29, 2013
52
+ - Initial release
data/README.md CHANGED
@@ -1,24 +1,24 @@
1
1
  # Aitch
2
2
 
3
- [![Build Status](https://travis-ci.org/fnando/aitch.png)](https://travis-ci.org/fnando/aitch)
3
+ [![Tests](https://github.com/fnando/aitch/workflows/Tests/badge.svg)](https://github.com/fnando/aitch)
4
4
  [![Code Climate](https://codeclimate.com/github/fnando/aitch/badges/gpa.svg)](https://codeclimate.com/github/fnando/aitch)
5
- [![Test Coverage](https://codeclimate.com/github/fnando/aitch/badges/coverage.svg)](https://codeclimate.com/github/fnando/aitch)
6
- [![RubyGems](https://badge.fury.io/rb/aitch.png)](https://rubygems.org/gems/aitch)
5
+ [![Gem Version](https://img.shields.io/gem/v/aitch.svg)](https://rubygems.org/gems/aitch)
6
+ [![Gem Downloads](https://img.shields.io/gem/dt/aitch.svg)](https://rubygems.org/gems/aitch)
7
7
 
8
8
  A simple HTTP client.
9
9
 
10
10
  Features:
11
11
 
12
- * Supports Gzip|Deflate response
13
- * Automatically parses JSON, HTML and XML responses
14
- * Automatically follows redirect
12
+ - Supports Gzip|Deflate response
13
+ - Automatically parses JSON, HTML and XML responses
14
+ - Automatically follows redirect
15
15
 
16
16
  ## Installation
17
17
 
18
18
  Add this line to your application's Gemfile:
19
19
 
20
20
  ```ruby
21
- gem 'aitch'
21
+ gem "aitch"
22
22
  ```
23
23
 
24
24
  And then execute:
@@ -54,6 +54,9 @@ Aitch.configure do |config|
54
54
 
55
55
  # Set the logger.
56
56
  config.logger = nil
57
+
58
+ # Set the base url.
59
+ config.base_url = nil
57
60
  end
58
61
  ```
59
62
 
@@ -115,7 +118,8 @@ response.data # Parsed response body
115
118
 
116
119
  #### Parsing JSON, XML and HTML with Nokogiri
117
120
 
118
- If your response is a JSON, XML or a HTML content type, we'll automatically convert the response into the appropriate object.
121
+ If your response is a JSON, XML or a HTML content type, we'll automatically
122
+ convert the response into the appropriate object.
119
123
 
120
124
  ```ruby
121
125
  response = Aitch.get("http://simplesideias.com.br")
@@ -159,7 +163,8 @@ The request:
159
163
  Aitch.get("http://example.org")
160
164
  ```
161
165
 
162
- If the redirect limit is exceeded, then the `Aitch::TooManyRedirectsError` exception is raised.
166
+ If the redirect limit is exceeded, then the `Aitch::TooManyRedirectsError`
167
+ exception is raised.
163
168
 
164
169
  ### Basic auth
165
170
 
@@ -207,7 +212,8 @@ Request.get("http://example.org")
207
212
 
208
213
  ### Validating responses
209
214
 
210
- When you know the kind of response you're expecting, you can validate it by specifying the `expect` option.
215
+ When you know the kind of response you're expecting, you can validate it by
216
+ specifying the `expect` option.
211
217
 
212
218
  ```ruby
213
219
  Aitch.get do
@@ -216,7 +222,8 @@ Aitch.get do
216
222
  end
217
223
  ```
218
224
 
219
- If this request receives anything other than `200`, it will raise a `Aitch::StatusCodeError` exception.
225
+ If this request receives anything other than `200`, it will raise a
226
+ `Aitch::StatusCodeError` exception.
220
227
 
221
228
  ```
222
229
  Expect(200 OK) <=> Actual(404 Not Found)
@@ -226,7 +233,10 @@ You can also provide a list of accepted statuses, like `expect: [200, 201]`.
226
233
 
227
234
  ### Response Parsers
228
235
 
229
- You can register new response parsers by using `Aitch::ResponseParser.register(name, parser)`, where parser must implement the methods `match?(content_type)` and `load(response_body)`. This is how you could load CSV values.
236
+ You can register new response parsers by using
237
+ `Aitch::ResponseParser.register(name, parser)`, where parser must implement the
238
+ methods `match?(content_type)` and `load(response_body)`. This is how you could
239
+ load CSV values.
230
240
 
231
241
  ```ruby
232
242
  require "csv"
@@ -248,7 +258,8 @@ end
248
258
  Aitch::ResponseParser.prepend(:csv, CSVParser)
249
259
  ```
250
260
 
251
- The default behavior is returning the response body. You can replace it as the following:
261
+ The default behavior is returning the response body. You can replace it as the
262
+ following:
252
263
 
253
264
  ```ruby
254
265
  module DefaultParser
@@ -272,13 +283,31 @@ Aitch::ResponseParser.append(:default, DefaultParser)
272
283
 
273
284
  Aitch comes with response parsers for HTML, XML and JSON.
274
285
 
275
- By default, the JSON parser will be `JSON`. To set it to something else, use `Aitch::ResponseParser::JSONParser.engine`.
286
+ By default, the JSON parser will be `JSON`. To set it to something else, use
287
+ `Aitch::ResponseParser::JSONParser.engine`.
276
288
 
277
289
  ```ruby
278
290
  require "oj"
279
291
  Aitch::ResponseParser::JSONParser.engine = Oj
280
292
  ```
281
293
 
294
+ ### Setting the base url
295
+
296
+ When you're creating a wrapper for an API, usually the hostname is the same for
297
+ the whole API. In this case, you can avoid having to pass it around all the time
298
+ by setting `Aitch::Configuration#base_url`. This option is meant to be used when
299
+ you instantiate a new namespace.
300
+
301
+ ```ruby
302
+ Client = Aitch::Namespace.new
303
+
304
+ Client.configure do |config|
305
+ config.base_url = "https://api.example.com"
306
+ end
307
+
308
+ Client.get("/users")
309
+ ```
310
+
282
311
  ## Contributing
283
312
 
284
313
  1. Fork it
data/aitch.gemspec CHANGED
@@ -6,15 +6,16 @@ Gem::Specification.new do |spec|
6
6
  spec.name = "aitch"
7
7
  spec.version = Aitch::VERSION
8
8
  spec.authors = ["Nando Vieira"]
9
- spec.email = ["fnando.vieira@gmail.com"]
9
+ spec.email = ["me@fnando.com"]
10
10
  spec.description = "A simple HTTP client"
11
11
  spec.summary = spec.description
12
12
  spec.homepage = "http://rubygems.org/gems/aitch"
13
13
  spec.license = "MIT"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
15
+ spec.metadata["rubygems_mfa_required"] = "true"
14
16
 
15
17
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
16
18
  spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename(f) }
17
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
19
  spec.require_paths = ["lib"]
19
20
 
20
21
  spec.add_dependency "nokogiri"
@@ -23,12 +23,16 @@ module Aitch
23
23
  # Set the logger.
24
24
  attr_accessor :logger
25
25
 
26
+ # Set the base url.
27
+ attr_accessor :base_url
28
+
26
29
  def initialize
27
30
  @timeout = 10
28
31
  @redirect_limit = 5
29
32
  @follow_redirect = true
30
33
  @user_agent = "Aitch/#{Aitch::VERSION} (http://rubygems.org/gems/aitch)"
31
34
  @default_headers = {}
35
+ @base_url = nil
32
36
  end
33
37
 
34
38
  def to_h
@@ -37,12 +37,6 @@ class FalseClass
37
37
  end
38
38
 
39
39
  class Array
40
- # Calls <tt>to_param</tt> on all its elements and joins the result with
41
- # slashes. This is used by <tt>url_for</tt> in Action Pack.
42
- def to_param
43
- collect(&:to_param).join "/"
44
- end
45
-
46
40
  # Converts an array into a string suitable for use as a URL query string,
47
41
  # using the given +key+ as the param name.
48
42
  #
@@ -10,7 +10,7 @@ module Aitch
10
10
  end
11
11
 
12
12
  def location
13
- return current_url unless current_url.match(%r{\A/})
13
+ return current_url unless current_url.match?(%r{\A/}) # rubocop:disable Performance/StartWith
14
14
 
15
15
  uri = find_uri_with_host
16
16
  url = ["#{uri.scheme}://#{uri.hostname}"]
@@ -25,7 +25,7 @@ module Aitch
25
25
  headers ||= {}
26
26
  options ||= {}
27
27
 
28
- if block_given?
28
+ if block
29
29
  dsl = DSL.new
30
30
  dsl.instance_eval(&block)
31
31
  args = dsl.to_h
@@ -38,10 +38,8 @@ module Aitch
38
38
  }
39
39
  end
40
40
 
41
- args.merge!(
42
- request_method: request_method,
43
- options: config.to_h.merge(Utils.symbolize_keys(args[:options]))
44
- )
41
+ args[:request_method] = request_method
42
+ args[:options] = config.to_h.merge(Utils.symbolize_keys(args[:options]))
45
43
 
46
44
  Request.new(args).perform
47
45
  end
data/lib/aitch/request.rb CHANGED
@@ -2,12 +2,7 @@
2
2
 
3
3
  module Aitch
4
4
  class Request
5
- attr_accessor :request_method
6
- attr_accessor :url
7
- attr_accessor :data
8
- attr_accessor :headers
9
- attr_accessor :options
10
- attr_accessor :redirects
5
+ attr_accessor :request_method, :url, :data, :headers, :options, :redirects
11
6
 
12
7
  alias params= data=
13
8
  alias body= data=
@@ -62,7 +57,15 @@ module Aitch
62
57
  end
63
58
 
64
59
  def uri
65
- @uri ||= URI.new(url, data, http_method_class::REQUEST_HAS_BODY)
60
+ @uri ||= begin
61
+ normalized_url = if url.start_with?("/") && options[:base_url]
62
+ File.join(options[:base_url], url)
63
+ else
64
+ url
65
+ end
66
+
67
+ URI.new(normalized_url, data, http_method_class::REQUEST_HAS_BODY)
68
+ end
66
69
  end
67
70
 
68
71
  def http_method_class
@@ -74,9 +77,9 @@ module Aitch
74
77
 
75
78
  private def set_body(request)
76
79
  body_data = data
77
- body_data = data.to_h if data.respond_to?(:to_h)
80
+ body_data = data.to_h if data.respond_to?(:to_h) && !data.is_a?(Array)
78
81
 
79
- if content_type.to_s =~ /\bjson\b/
82
+ if content_type.to_s.match?(/\bjson\b/)
80
83
  body_data = ResponseParser::JSONParser.engine.dump(body_data)
81
84
  end
82
85
 
@@ -53,15 +53,15 @@ module Aitch
53
53
  end
54
54
 
55
55
  def json?
56
- content_type =~ /json/
56
+ content_type.include?("json")
57
57
  end
58
58
 
59
59
  def xml?
60
- content_type =~ /xml/
60
+ content_type.include?("xml")
61
61
  end
62
62
 
63
63
  def html?
64
- content_type =~ /html/
64
+ content_type.include?("html")
65
65
  end
66
66
 
67
67
  def data
@@ -83,7 +83,7 @@ module Aitch
83
83
  end
84
84
 
85
85
  def respond_to_missing?(name, _include_private = false)
86
- headers.key?(name.to_s)
86
+ headers.key?(name.to_s) || super
87
87
  end
88
88
 
89
89
  def description
@@ -8,7 +8,7 @@ module Aitch
8
8
  end
9
9
 
10
10
  def self.match?(content_type)
11
- content_type =~ /html/
11
+ content_type.include?("html")
12
12
  end
13
13
 
14
14
  def self.load(source)
@@ -14,7 +14,7 @@ module Aitch
14
14
  end
15
15
 
16
16
  def self.match?(content_type)
17
- content_type =~ /json/
17
+ content_type.include?("json")
18
18
  end
19
19
 
20
20
  def self.load(source)
@@ -8,7 +8,7 @@ module Aitch
8
8
  end
9
9
 
10
10
  def self.match?(content_type)
11
- content_type =~ /xml/
11
+ content_type.include?("xml")
12
12
  end
13
13
 
14
14
  def self.load(source)
data/lib/aitch/uri.rb CHANGED
@@ -6,15 +6,15 @@ module Aitch
6
6
 
7
7
  def_delegators :@uri, :host, :port, :scheme
8
8
 
9
- def initialize(url, data = {}, request_has_body = false)
9
+ def initialize(url, data = {}, request_has_body = false) # rubocop:disable Style/OptionalBooleanParameter
10
10
  @url = url
11
11
  @data = data
12
12
  @request_has_body = request_has_body
13
13
 
14
14
  begin
15
15
  @uri = ::URI.parse(url)
16
- rescue ::URI::InvalidURIError => e
17
- raise InvalidURIError, e
16
+ rescue ::URI::InvalidURIError => error
17
+ raise InvalidURIError, error
18
18
  end
19
19
  end
20
20
 
@@ -27,7 +27,7 @@ module Aitch
27
27
  end
28
28
 
29
29
  def request_uri
30
- [path, query, fragment].compact.join("")
30
+ [path, query, fragment].compact.join
31
31
  end
32
32
 
33
33
  def fragment
data/lib/aitch/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Aitch
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.1"
5
5
  end
@@ -87,6 +87,18 @@ class RequestTest < Minitest::Test
87
87
  assert_equal "a=1", request.body
88
88
  end
89
89
 
90
+ test "sets json body from array" do
91
+ data = [1, 2, 3]
92
+ request = build_request(
93
+ request_method: "post",
94
+ data: data,
95
+ content_type: "application/json",
96
+ options: {json_parser: JSON}
97
+ ).request
98
+
99
+ assert_equal "[1,2,3]", request.body
100
+ end
101
+
90
102
  test "sets request body from to_s protocol" do
91
103
  data = stub(to_s: "some body")
92
104
  request = build_request(request_method: "post", data: data).request
@@ -140,7 +152,7 @@ class RequestTest < Minitest::Test
140
152
  assert_equal :post, last_request.method
141
153
  assert_equal "a=1&b=2", last_request.body
142
154
  assert_equal "0.1", last_request.headers["Rendering"]
143
- assert_equal "user:pass", Base64.decode64(last_request.headers["Authorization"].split(" ").last)
155
+ assert_equal "user:pass", Base64.decode64(last_request.headers["Authorization"].split.last)
144
156
  end
145
157
 
146
158
  test "performs request when using kwargs" do
@@ -157,6 +169,19 @@ class RequestTest < Minitest::Test
157
169
  assert_equal :post, last_request.method
158
170
  assert_equal "a=1&b=2", last_request.body
159
171
  assert_equal "0.1", last_request.headers["Rendering"]
160
- assert_equal "user:pass", Base64.decode64(last_request.headers["Authorization"].split(" ").last)
172
+ assert_equal "user:pass", Base64.decode64(last_request.headers["Authorization"].split.last)
173
+ end
174
+
175
+ test "uses base url" do
176
+ register_uri(:get, /.+/)
177
+
178
+ client = Aitch::Namespace.new
179
+ client.configure {|c| c.base_url = "https://example.com" }
180
+
181
+ client.get("/some/path")
182
+
183
+ assert_equal "/some/path", last_request.uri.request_uri
184
+ assert_equal "example.com", last_request.uri.host
185
+ assert_equal "https", last_request.uri.scheme
161
186
  end
162
187
  end
@@ -6,12 +6,8 @@ require "csv"
6
6
  class CustomResponseParserTest < Minitest::Test
7
7
  setup do
8
8
  parser = Class.new do
9
- def self.type
10
- :csv
11
- end
12
-
13
9
  def self.match?(content_type)
14
- content_type =~ /csv/
10
+ content_type.include?("csv")
15
11
  end
16
12
 
17
13
  def self.load(source)
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+ require "csv"
5
+
6
+ class DefaultResponseParserTest < Minitest::Test
7
+ test "returns application/custom" do
8
+ register_uri(:get, "http://example.org/file.custom", body: "1,2,3", content_type: "application/custom")
9
+ response = Aitch.get("http://example.org/file.custom")
10
+
11
+ assert_instance_of String, response.data
12
+ assert_equal %[1,2,3], response.data
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class ToQueryTest < Minitest::Test
6
+ test "converts array" do
7
+ assert_equal "hobbies%5B%5D=Rails&hobbies%5B%5D=coding",
8
+ %w[Rails coding].to_query("hobbies")
9
+ assert_equal "hobbies%5B%5D=",
10
+ [].to_query("hobbies")
11
+ end
12
+
13
+ test "converts hash" do
14
+ assert_equal "name=David&nationality=Danish",
15
+ {name: "David", nationality: "Danish"}.to_query
16
+
17
+ assert_equal "user%5Bname%5D=David&user%5Bnationality%5D=Danish",
18
+ {name: "David", nationality: "Danish"}.to_query("user")
19
+ end
20
+
21
+ test "converts booleans" do
22
+ assert_equal "done=false&ready=true",
23
+ {ready: true, done: false}.to_query
24
+
25
+ assert_equal "states%5B%5D=true&states%5B%5D=false",
26
+ [true, false].to_query("states")
27
+ end
28
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aitch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-18 00:00:00.000000000 Z
11
+ date: 2022-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -166,14 +166,15 @@ dependencies:
166
166
  version: '0'
167
167
  description: A simple HTTP client
168
168
  email:
169
- - fnando.vieira@gmail.com
169
+ - me@fnando.com
170
170
  executables: []
171
171
  extensions: []
172
172
  extra_rdoc_files: []
173
173
  files:
174
+ - ".github/FUNDING.yml"
175
+ - ".github/workflows/tests.yml"
174
176
  - ".gitignore"
175
177
  - ".rubocop.yml"
176
- - ".travis.yml"
177
178
  - CHANGELOG.md
178
179
  - Gemfile
179
180
  - LICENSE.txt
@@ -214,6 +215,7 @@ files:
214
215
  - test/aitch/request/status_code_validation_test.rb
215
216
  - test/aitch/request_test.rb
216
217
  - test/aitch/response/custom_response_parser_test.rb
218
+ - test/aitch/response/default_response_parser_test.rb
217
219
  - test/aitch/response/errors_test.rb
218
220
  - test/aitch/response/html_response_test.rb
219
221
  - test/aitch/response/json_response_test.rb
@@ -226,6 +228,7 @@ files:
226
228
  - test/aitch/response_parser/json_parser_test.rb
227
229
  - test/aitch/response_parser/xml_parser_test.rb
228
230
  - test/aitch/response_test.rb
231
+ - test/aitch/to_query_test.rb
229
232
  - test/aitch/uri_test.rb
230
233
  - test/aitch/utils/symbolize_keys_test.rb
231
234
  - test/aitch/utils/underscore_test.rb
@@ -235,8 +238,9 @@ files:
235
238
  homepage: http://rubygems.org/gems/aitch
236
239
  licenses:
237
240
  - MIT
238
- metadata: {}
239
- post_install_message:
241
+ metadata:
242
+ rubygems_mfa_required: 'true'
243
+ post_install_message:
240
244
  rdoc_options: []
241
245
  require_paths:
242
246
  - lib
@@ -244,45 +248,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
244
248
  requirements:
245
249
  - - ">="
246
250
  - !ruby/object:Gem::Version
247
- version: '0'
251
+ version: 2.5.0
248
252
  required_rubygems_version: !ruby/object:Gem::Requirement
249
253
  requirements:
250
254
  - - ">="
251
255
  - !ruby/object:Gem::Version
252
256
  version: '0'
253
257
  requirements: []
254
- rubygems_version: 3.1.2
255
- signing_key:
258
+ rubygems_version: 3.3.7
259
+ signing_key:
256
260
  specification_version: 4
257
261
  summary: A simple HTTP client
258
- test_files:
259
- - test/aitch/aitch_test.rb
260
- - test/aitch/configuration_test.rb
261
- - test/aitch/dsl_test.rb
262
- - test/aitch/execute_test.rb
263
- - test/aitch/namespace_test.rb
264
- - test/aitch/request/client_https_test.rb
265
- - test/aitch/request/follow_redirect_test.rb
266
- - test/aitch/request/json_request_test.rb
267
- - test/aitch/request/request_class_test.rb
268
- - test/aitch/request/status_code_validation_test.rb
269
- - test/aitch/request_test.rb
270
- - test/aitch/response/custom_response_parser_test.rb
271
- - test/aitch/response/errors_test.rb
272
- - test/aitch/response/html_response_test.rb
273
- - test/aitch/response/json_response_test.rb
274
- - test/aitch/response/raw_response_test.rb
275
- - test/aitch/response/status_3xx_test.rb
276
- - test/aitch/response/status_4xx_test.rb
277
- - test/aitch/response/status_5xx_test.rb
278
- - test/aitch/response/xml_response_test.rb
279
- - test/aitch/response_parser/html_parser_test.rb
280
- - test/aitch/response_parser/json_parser_test.rb
281
- - test/aitch/response_parser/xml_parser_test.rb
282
- - test/aitch/response_test.rb
283
- - test/aitch/uri_test.rb
284
- - test/aitch/utils/symbolize_keys_test.rb
285
- - test/aitch/utils/underscore_test.rb
286
- - test/fixtures/iso8859-1.xml
287
- - test/support/helpers.rb
288
- - test/test_helper.rb
262
+ test_files: []
data/.travis.yml DELETED
@@ -1,20 +0,0 @@
1
- ---
2
- language: ruby
3
- script: "bundle exec rake"
4
- before_install: gem install bundler
5
- cache: bundler
6
- sudo: false
7
-
8
- rvm:
9
- - "2.7"
10
-
11
- gemfile:
12
- - Gemfile
13
-
14
- notifications:
15
- email: false
16
-
17
- addons:
18
- code_climate:
19
- repo_token:
20
- secure: "j/AjAG1u7NtdldftKUXnTMKC7CPd2R/O55ejzZnJi5IlHKKKZgJla1Z0YHTsGr75JQS7Q00D0L3TOSY8fLhV6fXO3Gn+9ShKTFRV5+iUtzlV0AWKBw+uENKNJH4jn1FhCoV8Th0I6OKtq98PqZ/hLR2J+/Uv3oCBwyriyJqag2U="