fetch-api 0.4.3 → 0.5.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: eb43f07388e02a5f1ec3ccf700a634962896b68e8de60c402aacfe078499dc06
4
- data.tar.gz: 228e63fa8ba87bdb73f4ed82dd92af70724bb5e3c0a10c2be1849bba3752b846
3
+ metadata.gz: 7c17efb152e74853bef394109a4f6012247e44e17277f22b49569249bb4ec01f
4
+ data.tar.gz: d1451560f1fc8a26a0a381d7c7fe1c69a5e0cdff9a3641706aeacea801ef724c
5
5
  SHA512:
6
- metadata.gz: 99785c3983dbf1e311e3e845ad92a41791af9089b1ecf349973e5a3a14159b1ec855b07c16f46980248b1f8375d3761fd6696cebde999763053a178117257510
7
- data.tar.gz: 6c969cd4edfc77256e960cab56d7fe9db4a345f754e811e278b18d27900c393625ead267a566abb4334e743270b181ac9921fdfdc51f45f715da8f8701ed28cb
6
+ metadata.gz: 480a9fba5b2d4ccb972122507dd907d2fae0ffe941d470e7bfb2f20cb39e0e81440c879d87d43192a7b67ff2673bc4e41c1c1237cbd2c8a5baeedc0ed2abcdee
7
+ data.tar.gz: b497f558eab4796ecc87a89cdfe696eb8ec68dc2b417215f1e2d0f34fa350b31965460ed2a810e50668bfa92a2c8f71329764a556141b990b4e826f44948ab80
data/README.md CHANGED
@@ -110,8 +110,22 @@ These values can be configured as follows (in seconds):
110
110
 
111
111
  ``` ruby
112
112
  Fetch.configure do |config|
113
- config.max_idle_time = 30 # default
114
- config.keep_alive_timeout = 15 # default
113
+ config.connection_max_idle_time = 30 # default
114
+ end
115
+ ```
116
+
117
+ ### Customizing connection
118
+
119
+ If the lambda is set to `Fetch.config.on_connection_create`, it is called before the connection is initiated. The arguments are a Net::HTTP instance and a URI object. Note that `Net::HTTP#use_ssl` is automatically set according to the URL schema.
120
+
121
+ ``` ruby
122
+ Fetch.configure do |config|
123
+ config.on_connection_create = -> (conn, uri) {
124
+ if uri.host == 'example.com'
125
+ conn.open_timeout = 5
126
+ conn.read_timeout = 5
127
+ end
128
+ }
115
129
  end
116
130
  ```
117
131
 
data/lib/fetch/api.rb CHANGED
@@ -4,8 +4,8 @@ module Fetch
4
4
  module API
5
5
  module_function
6
6
 
7
- def fetch(...)
8
- Client.instance.fetch(...)
7
+ def fetch(resource, method: :get, headers: [], body: nil, redirect: :follow)
8
+ Client.instance.fetch(resource, method:, headers:, body:, redirect:)
9
9
  end
10
10
  end
11
11
  end
data/lib/fetch/client.rb CHANGED
@@ -15,7 +15,7 @@ module Fetch
15
15
  class Client
16
16
  include Singleton
17
17
 
18
- def fetch(resource, method: :get, headers: [], body: nil, redirect: :follow, _redirected: false)
18
+ def fetch(resource, method:, headers:, body:, redirect:, redirected: false)
19
19
  uri = URI.parse(resource)
20
20
  req = Net::HTTP.const_get(method.capitalize).new(uri)
21
21
 
@@ -51,16 +51,16 @@ module Fetch
51
51
  # @type var location: String
52
52
  location = res['Location']
53
53
 
54
- fetch(location, method:, headers:, body:, redirect:, _redirected: true)
54
+ fetch(location, method:, headers:, body:, redirect:, redirected: true)
55
55
  when 'error'
56
56
  raise RedirectError, "redirected to #{res['Location']}"
57
57
  when 'manual'
58
- to_response(resource, res, _redirected)
58
+ to_response(resource, res, redirected)
59
59
  else
60
60
  raise ArgumentError, "invalid redirect option: #{redirect.inspect}"
61
61
  end
62
62
  else
63
- to_response(resource, res, _redirected)
63
+ to_response(resource, res, redirected)
64
64
  end
65
65
  end
66
66
 
data/lib/fetch/config.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fetch
2
- Config = Struct.new(:max_idle_time, :keep_alive_timeout)
2
+ Config = Struct.new(:connection_max_idle_time, :on_connection_create)
3
3
  end
@@ -41,8 +41,10 @@ module Fetch
41
41
  host = uri.host
42
42
 
43
43
  Net::HTTP.new(host, uri.port).tap {|http|
44
- http.use_ssl = uri.scheme == 'https'
45
- http.keep_alive_timeout = Fetch.config.keep_alive_timeout
44
+ http.use_ssl = uri.scheme == 'https'
45
+
46
+ Fetch.config.on_connection_create.call http, uri
47
+
46
48
  http.start
47
49
  }
48
50
  end
@@ -59,7 +61,7 @@ module Fetch
59
61
  def sweep
60
62
  @mutex.synchronize do
61
63
  @connections.each do |origin, (conn, last_used)|
62
- if last_used + Fetch.config.max_idle_time < Time.now
64
+ if last_used + Fetch.config.connection_max_idle_time < Time.now
63
65
  begin
64
66
  conn.finish
65
67
  rescue IOError
@@ -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
@@ -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.4.3'
2
+ VERSION = '0.5.1'
3
3
  end
data/lib/fetch.rb CHANGED
@@ -10,7 +10,7 @@ module Fetch
10
10
  end
11
11
 
12
12
  configure do |config|
13
- config.max_idle_time = 30
14
- config.keep_alive_timeout = 15
13
+ config.connection_max_idle_time = 30
14
+ config.on_connection_create = -> (*) {}
15
15
  end
16
16
  end
data/sig/fetch/client.rbs CHANGED
@@ -4,11 +4,11 @@ module Fetch
4
4
 
5
5
  def fetch: (
6
6
  string,
7
- ?method: String | Symbol,
8
- ?headers: _Each[[_ToS, _ToS]],
9
- ?body: (String | FormData | URLSearchParams)?,
10
- ?redirect: 'follow' | 'error' | 'manual' | :follow | :error | :manual,
11
- ?_redirected: bool
7
+ method: String | Symbol,
8
+ headers: _Each[[_ToS, _ToS]],
9
+ body: (String | FormData | URLSearchParams)?,
10
+ redirect: 'follow' | 'error' | 'manual' | :follow | :error | :manual,
11
+ ?redirected: bool
12
12
  ) -> Response
13
13
 
14
14
  private
data/sig/fetch/config.rbs CHANGED
@@ -1,6 +1,6 @@
1
1
  module Fetch
2
2
  class Config
3
- attr_accessor max_idle_time: Integer
4
- attr_accessor keep_alive_timeout: Integer
3
+ attr_accessor connection_max_idle_time: Integer
4
+ attr_accessor on_connection_create: ^(Net::HTTP, URI::HTTP) -> void
5
5
  end
6
6
  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
@@ -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.4.3
4
+ version: 0.5.1
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-10 00:00:00.000000000 Z
11
+ date: 2024-08-03 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