fetch-api 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f3850dbddc3e46b5c6e59efdde4538c5c94e0464e94fb3ddd615e93d48a4e4f
4
- data.tar.gz: 5783d23d208526c9f009f6ad15317a136ad22ddbb58d403cad655e7c6909034a
3
+ metadata.gz: 4c44fa15b798e01607f5c81e771ad55d24c56abea4aaa1829de0046aa2a761a2
4
+ data.tar.gz: d8f8c324b7685c23d613ea1f00f5621bc23ef6e682aa66c0c181bb57c035d094
5
5
  SHA512:
6
- metadata.gz: 77c50b51b5e084f405e26a6222bc388e1b2843f3f856db2f4f242fe64491ec31b8dd2f00532ff7099ab915b44bcf21f5edca3ca66bb5d9a0218f0f00c26100a3
7
- data.tar.gz: bd4668f688f2a9cf06bab9eec7f471a61b8e5bd3c2d0408521f46b6b2b61e2054cf7057f71ebaf53028d20b8363f9e01586fa75bfec8d5ef7c1ad3b9e49a3d9c
6
+ metadata.gz: 89fc2a039bac8f9dea78f86a6af9d195dff47f1e47fdfbf86026364a916be5dba60961daccd4d24a56f321f95823e24148c9e32df58b50736b7aba03e9ae24cf
7
+ data.tar.gz: d60ae6beb1b1736cb4a5e71b5049742771a8905565475121f02e5d23b0691905575cb6f1ab55afcc8f7a97f2ed38fee6d169aa6f1f4220a9513ab01c3b97adc3
data/README.md CHANGED
@@ -129,6 +129,18 @@ Fetch.configure do |config|
129
129
  end
130
130
  ```
131
131
 
132
+ ### Parsing JSON
133
+
134
+ By default, `Fetch::Response#json` calls `JSON.parse` without options. Additional options can be specified in `Fetch.config.json_parse_options`.
135
+
136
+ ``` ruby
137
+ Fetch.configure do |config|
138
+ config.json_parse_options = {
139
+ symbolize_names: true
140
+ }
141
+ end
142
+ ```
143
+
132
144
  ## Development
133
145
 
134
146
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/fetch/config.rb CHANGED
@@ -1,3 +1,7 @@
1
1
  module Fetch
2
- Config = Struct.new(:connection_max_idle_time, :on_connection_create)
2
+ Config = Struct.new(
3
+ :connection_max_idle_time,
4
+ :on_connection_create,
5
+ :json_parse_options
6
+ )
3
7
  end
@@ -1,13 +1,7 @@
1
- require 'forwardable'
1
+ require_relative 'multi_map'
2
2
 
3
3
  module Fetch
4
- class FormData
5
- include Enumerable
6
-
7
- extend Forwardable
8
-
9
- def_delegators :entries, :each
10
-
4
+ class FormData < MultiMap
11
5
  def self.build(enumerable)
12
6
  data = FormData.new
13
7
 
@@ -18,43 +12,14 @@ module Fetch
18
12
  data
19
13
  end
20
14
 
21
- def initialize
22
- @entries = []
23
- end
24
-
25
- attr_reader :entries
26
-
27
- def append(key, value)
28
- @entries.push [key.to_s, File === value ? value : value.to_s]
29
- end
30
-
31
- def delete(key)
32
- @entries.reject! {|k,| k == key.to_s }
33
- end
34
-
35
- def get(key)
36
- @entries.assoc(key.to_s)&.last
37
- end
38
-
39
- def get_all(key)
40
- @entries.select {|k,| k == key.to_s }.map(&:last)
41
- end
42
-
43
- def has(key)
44
- @entries.any? {|k,| k == key.to_s }
45
- end
46
-
47
- def keys
48
- @entries.map(&:first)
49
- end
15
+ private
50
16
 
51
- def set(key, value)
52
- delete key
53
- append key, value
17
+ def to_key(key)
18
+ key.to_s
54
19
  end
55
20
 
56
- def values
57
- @entries.map(&:last)
21
+ def to_value(value)
22
+ File === value ? value : value.to_s
58
23
  end
59
24
  end
60
25
  end
data/lib/fetch/headers.rb CHANGED
@@ -1,13 +1,7 @@
1
- require 'forwardable'
2
-
3
1
  module Fetch
4
2
  class Headers
5
3
  include Enumerable
6
4
 
7
- extend Forwardable
8
-
9
- def_delegators :entries, :each
10
-
11
5
  def initialize(init = [])
12
6
  @data = {}
13
7
 
@@ -47,5 +41,9 @@ module Fetch
47
41
  def values
48
42
  @data.values.map { _1.join(', ') }
49
43
  end
44
+
45
+ def each(&block)
46
+ block ? entries.each(&block) : entries.each
47
+ end
50
48
  end
51
49
  end
@@ -0,0 +1,58 @@
1
+ module Fetch
2
+ class MultiMap
3
+ include Enumerable
4
+
5
+ def initialize
6
+ @entries = []
7
+ end
8
+
9
+ attr_reader :entries
10
+
11
+ def append(key, value)
12
+ @entries.push [to_key(key), to_value(value)]
13
+ end
14
+
15
+ def delete(key)
16
+ @entries.reject! {|k,| k == to_key(key) }
17
+ end
18
+
19
+ def get(key)
20
+ @entries.assoc(to_key(key))&.last
21
+ end
22
+
23
+ def get_all(key)
24
+ @entries.select {|k,| k == to_key(key) }.map(&:last)
25
+ end
26
+
27
+ def has(key)
28
+ @entries.any? {|k,| k == to_key(key) }
29
+ end
30
+
31
+ def keys
32
+ @entries.map(&:first)
33
+ end
34
+
35
+ def set(key, value)
36
+ delete key
37
+ append key, value
38
+ end
39
+
40
+ def values
41
+ @entries.map(&:last)
42
+ end
43
+
44
+ def each(&)
45
+ @entries.each(&)
46
+ end
47
+
48
+ private
49
+
50
+ def to_key(key)
51
+ raise NotImplementedError
52
+ end
53
+
54
+ def to_value(value)
55
+ raise NotImplementedError
56
+ end
57
+ end
58
+ end
@@ -21,10 +21,10 @@ module Fetch
21
21
  Rack::Utils::HTTP_STATUS_CODES[status]
22
22
  end
23
23
 
24
- def json(...)
24
+ def json(**json_parse_options)
25
25
  return nil unless body
26
26
 
27
- JSON.parse(body, ...)
27
+ JSON.parse(body, **Fetch.config.json_parse_options, **json_parse_options)
28
28
  end
29
29
  end
30
30
  end
@@ -1,16 +1,11 @@
1
- require 'forwardable'
1
+ require_relative 'multi_map'
2
+
2
3
  require 'uri'
3
4
 
4
5
  module Fetch
5
- class URLSearchParams
6
- include Enumerable
7
-
8
- extend Forwardable
9
-
10
- def_delegators :entries, :each
11
-
6
+ class URLSearchParams < MultiMap
12
7
  def initialize(options = [])
13
- @entries = []
8
+ super()
14
9
 
15
10
  case options
16
11
  when String
@@ -24,47 +19,22 @@ module Fetch
24
19
  end
25
20
  end
26
21
 
27
- attr_reader :entries
28
-
29
- def append(key, value)
30
- @entries.push [key.to_s, value.to_s]
31
- end
32
-
33
- def delete(key)
34
- @entries.reject! {|k,| k == key.to_s }
35
- end
36
-
37
- def get(key)
38
- @entries.assoc(key.to_s)&.last
39
- end
40
-
41
- def get_all(key)
42
- @entries.select {|k,| k == key.to_s }.map(&:last)
43
- end
44
-
45
- def has(key)
46
- @entries.any? {|k,| k == key.to_s }
47
- end
48
-
49
- def keys
50
- @entries.map(&:first)
22
+ def sort
23
+ entries.sort_by!(&:first)
51
24
  end
52
25
 
53
- def set(key, value)
54
- delete key
55
- append key, value
26
+ def to_s
27
+ URI.encode_www_form(entries)
56
28
  end
57
29
 
58
- def sort
59
- @entries.sort_by!(&:first)
60
- end
30
+ private
61
31
 
62
- def to_s
63
- URI.encode_www_form(@entries)
32
+ def to_key(key)
33
+ key.to_s
64
34
  end
65
35
 
66
- def values
67
- @entries.map(&:last)
36
+ def to_value(value)
37
+ value.to_s
68
38
  end
69
39
  end
70
40
  end
data/lib/fetch/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fetch
2
- VERSION = '0.5.0'
2
+ VERSION = '0.6.0'
3
3
  end
data/lib/fetch.rb CHANGED
@@ -12,5 +12,6 @@ module Fetch
12
12
  configure do |config|
13
13
  config.connection_max_idle_time = 30
14
14
  config.on_connection_create = -> (*) {}
15
+ config.json_parse_options = {}
15
16
  end
16
17
  end
data/sig/fetch/config.rbs CHANGED
@@ -2,5 +2,6 @@ module Fetch
2
2
  class Config
3
3
  attr_accessor connection_max_idle_time: Integer
4
4
  attr_accessor on_connection_create: ^(Net::HTTP, URI::HTTP) -> void
5
+ attr_accessor json_parse_options: json_options
5
6
  end
6
7
  end
@@ -1,24 +1,5 @@
1
1
  module Fetch
2
- class FormData
3
- include Enumerable[[String, String | File]]
4
-
5
- extend Forwardable
6
-
7
- attr_reader entries: Array[[String, String | File]]
8
-
2
+ class FormData < MultiMap[_ToS, String, _ToS | File, String | File]
9
3
  def self.build: (_Each[[_ToS, _ToS | File]]) -> FormData
10
-
11
- def initialize: () -> void
12
- def append: (_ToS, _ToS | File) -> void
13
- def delete: (_ToS) -> void
14
- def get: (_ToS) -> (String | File)?
15
- def get_all: (_ToS) -> Array[String | File]
16
- def has: (_ToS) -> bool
17
- def keys: -> Array[String]
18
- def set: (_ToS, _ToS | File) -> void
19
- def values: () -> Array[String | File]
20
-
21
- def each: () { ([String, String | File]) -> void } -> Array[[String, String | File]]
22
- | () -> Enumerator[[String, String | File], Array[[String, String | File]]]
23
4
  end
24
5
  end
@@ -2,8 +2,6 @@ module Fetch
2
2
  class Headers
3
3
  include Enumerable[[String, String]]
4
4
 
5
- extend Forwardable
6
-
7
5
  def initialize: (_Each[[_ToS, _ToS]]) -> void
8
6
  def append: (_ToS, _ToS) -> void
9
7
  def delete: (_ToS) -> void
@@ -0,0 +1,23 @@
1
+ module Fetch
2
+ class MultiMap[KIN, KOUT, VIN, VOUT]
3
+ include Enumerable[[KOUT, VOUT]]
4
+
5
+ def initialize: () -> void
6
+ def append: (KIN, VIN) -> void
7
+ def delete: (KIN) -> void
8
+ def get: (KIN) -> VOUT?
9
+ def get_all: (KIN) -> Array[VOUT]
10
+ def has: (KIN) -> bool
11
+ def keys: -> Array[KOUT]
12
+ def set: (KIN, VIN) -> void
13
+ def values: () -> Array[VOUT]
14
+
15
+ def each: () { ([KOUT, VOUT]) -> void } -> Array[[KOUT, VOUT]]
16
+ | () -> Enumerator[[KOUT, VOUT], Array[[KOUT, VOUT]]]
17
+
18
+ private
19
+
20
+ def to_key: (KIN) -> KOUT
21
+ def to_value: (VIN) -> VOUT
22
+ end
23
+ end
@@ -9,6 +9,6 @@ module Fetch
9
9
  def initialize: (url: String, status: Integer, headers: Headers, body: String?, redirected: bool) -> void
10
10
  def ok: () -> bool
11
11
  def status_text: () -> String
12
- def json: (json_options) -> untyped
12
+ def json: (**json_options) -> untyped
13
13
  end
14
14
  end
@@ -1,24 +1,7 @@
1
1
  module Fetch
2
- class URLSearchParams
3
- include Enumerable[[String, String]]
4
-
5
- extend Forwardable
6
-
7
- attr_reader entries: Array[[String, String]]
8
-
9
- def self.build: (_Each[[_ToS, _ToS]]) -> FormData
10
-
2
+ class URLSearchParams < MultiMap[_ToS, String, _ToS, String]
11
3
  def initialize: (String | _Each[[_ToS, _ToS]]) -> void
12
- def append: (_ToS, _ToS) -> void
13
- def delete: (_ToS) -> void
14
- def get: (_ToS) -> String?
15
- def get_all: (_ToS) -> Array[String]
16
- def has: (_ToS) -> bool
17
- def keys: -> Array[String]
18
- def set: (_ToS, _ToS) -> void
19
- def values: () -> Array[String]
20
-
21
- def each: () { ([String, String]) -> void } -> Array[[String, String]]
22
- | () -> Enumerator[[String, String], Array[[String, String]]]
4
+ def sort: () -> void
5
+ def to_s: () -> String
23
6
  end
24
7
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fetch-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keita Urashima
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-11 00:00:00.000000000 Z
11
+ date: 2024-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: forwardable
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: json
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -126,6 +112,7 @@ files:
126
112
  - lib/fetch/errors.rb
127
113
  - lib/fetch/form_data.rb
128
114
  - lib/fetch/headers.rb
115
+ - lib/fetch/multi_map.rb
129
116
  - lib/fetch/response.rb
130
117
  - lib/fetch/url_search_params.rb
131
118
  - lib/fetch/version.rb
@@ -137,6 +124,7 @@ files:
137
124
  - sig/fetch/errors.rbs
138
125
  - sig/fetch/form_data.rbs
139
126
  - sig/fetch/headers.rbs
127
+ - sig/fetch/multi_map.rbs
140
128
  - sig/fetch/response.rbs
141
129
  - sig/fetch/url_search_params.rbs
142
130
  - sig/fetch/version.rbs
@@ -161,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
149
  - !ruby/object:Gem::Version
162
150
  version: '0'
163
151
  requirements: []
164
- rubygems_version: 3.5.11
152
+ rubygems_version: 3.5.16
165
153
  signing_key:
166
154
  specification_version: 4
167
155
  summary: Something like the Fetch API for Ruby