net-hippie 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8022bf107e849103e21fc49ea92cfc570394c301cae3568fc57173471432578f
4
- data.tar.gz: f0b3442b8b5ccf7fd51fb09e31f85877d66ea0368eaa713ac689c7ed58e5340c
3
+ metadata.gz: e3fdff6728d13d3fece5e05908cc04e9c0999909ab392f73c9dc67a3203bbfb6
4
+ data.tar.gz: e3e94c49e148b6931b543b011cf10da959d36d6b8f0f6b2dd1f4620e5ff21521
5
5
  SHA512:
6
- metadata.gz: 7239565953fd5222222cb4f0b4181443dd96fdf01389deb27e352389b90707c16f44d01548b4277935a31ced02224c5f821441db6f0ae116d75402beaadba163
7
- data.tar.gz: 818f4b089eb080640819a153259267ff54152f1429b525ae6ac82c3ae192e67f4ca38e2a7b114c731047126a91b1f17a433ff60f19c1b199edb42caa24384ff7
6
+ metadata.gz: 1f1ec4190b76c30c45efa6c00198326eb08f4e80280557dc42a6afb3c70166e80e624986ac14823f1d3f6a24ba16afb923f5ead14420fd34fdc5f88620f82a90
7
+ data.tar.gz: 0331df5f99e4b75ba58185c9dbba971e97f1233f3c0625dc0d7a6948e41cd2b3cc63bebeb4c7bba08767c677a72a1e2e3aee6df2d45afa54c2b0701096a97dc4
@@ -9,7 +9,7 @@ jobs:
9
9
  runs-on: ubuntu-latest
10
10
  strategy:
11
11
  matrix:
12
- ruby-version: ['2.5', '2.6', '2.7', '3.0', '3.1', '3.2', '3.3', '3.4']
12
+ ruby-version: ['3.2', '3.3', '3.4']
13
13
  steps:
14
14
  - uses: actions/checkout@v2
15
15
  - name: Set up Ruby
data/.rubocop.yml CHANGED
@@ -6,7 +6,7 @@ AllCops:
6
6
  - 'tmp/**/*'
7
7
  - 'vendor/**/*'
8
8
  NewCops: enable
9
- TargetRubyVersion: 2.5
9
+ TargetRubyVersion: 3.2
10
10
 
11
11
  Gemspec/DevelopmentDependencies:
12
12
  EnforcedStyle: gemspec
@@ -14,5 +14,11 @@ Gemspec/DevelopmentDependencies:
14
14
  Layout/ParameterAlignment:
15
15
  EnforcedStyle: with_fixed_indentation
16
16
 
17
+ Naming/BlockForwarding:
18
+ Enabled: false
19
+
17
20
  Naming/RescuedExceptionsVariableName:
18
21
  PreferredName: error
22
+
23
+ Style/ArgumentsForwarding:
24
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- Version 1.2.0
1
+ Version 1.3.0
2
2
 
3
3
  # Changelog
4
4
  All notable changes to this project will be documented in this file.
@@ -7,6 +7,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
7
7
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
9
  ## [Unreleased]
10
+
11
+ ## [1.4.0] - 2025-10-08
12
+ ### Added
13
+ - Streaming response support via block parameter
14
+ - Backward compatible with existing block API (arity-based detection)
15
+
16
+ ## [1.3.0] - 2025-04-30
17
+ ### Changed
18
+ - Ruby 2.3+ required
19
+
20
+ ### Fixed
21
+ - Add explicit dependency on `base64` gem
22
+ - Add explicit dependency on `json` gem
23
+ - Add explicit dependency on `net-http` gem
24
+ - Add explicit dependency on `openssl` gem
25
+
10
26
  ## [1.2.0] - 2024-12-05
11
27
  ### Changed
12
28
  - Disable logger by default
@@ -84,7 +100,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
84
100
  - with\_retry.
85
101
  - authorization header helpers
86
102
 
87
- [Unreleased]: https://github.com/xlgmokha/net-hippie/compare/v1.2.0...HEAD
103
+ [Unreleased]: https://github.com/xlgmokha/net-hippie/compare/v1.4.0...HEAD
104
+ [1.4.0]: https://github.com/xlgmokha/net-hippie/compare/v1.3.0...v1.4.0
105
+ [1.3.0]: https://github.com/xlgmokha/net-hippie/compare/v1.2.0...v1.3.0
88
106
  [1.2.0]: https://github.com/xlgmokha/net-hippie/compare/v1.1.1...v1.2.0
89
107
  [1.1.1]: https://github.com/xlgmokha/net-hippie/compare/v1.1.0...v1.1.1
90
108
  [1.1.0]: https://github.com/xlgmokha/net-hippie/compare/v1.0.1...v1.1.0
data/README.md CHANGED
@@ -90,6 +90,40 @@ headers = { 'Authorization' => Net::Hippie.bearer_auth('token') }
90
90
  Net::Hippie.get('https://www.example.org', headers: headers)
91
91
  ```
92
92
 
93
+ ### Streaming Responses
94
+
95
+ Net::Hippie supports streaming responses by passing a block that accepts the response object:
96
+
97
+ ```ruby
98
+ Net::Hippie.post('https://api.example.com/stream', body: { prompt: 'Hello' }) do |response|
99
+ response.read_body do |chunk|
100
+ print chunk
101
+ end
102
+ end
103
+ ```
104
+
105
+ This is useful for Server-Sent Events (SSE) or other streaming APIs:
106
+
107
+ ```ruby
108
+ client = Net::Hippie::Client.new
109
+ client.post('https://api.openai.com/v1/chat/completions',
110
+ headers: {
111
+ 'Authorization' => Net::Hippie.bearer_auth(ENV['OPENAI_API_KEY']),
112
+ 'Content-Type' => 'application/json'
113
+ },
114
+ body: { model: 'gpt-4', messages: [{ role: 'user', content: 'Hi' }], stream: true }
115
+ ) do |response|
116
+ buffer = ""
117
+ response.read_body do |chunk|
118
+ buffer += chunk
119
+ while (line = buffer.slice!(/.*\n/))
120
+ next if line.strip.empty?
121
+ puts line if line.start_with?('data: ')
122
+ end
123
+ end
124
+ end
125
+ ```
126
+
93
127
  ## Development
94
128
 
95
129
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/test` to run the tests.
@@ -26,14 +26,10 @@ module Net
26
26
 
27
27
  def execute(uri, request, limit: follow_redirects, &block)
28
28
  connection = connection_for(uri)
29
+ return execute_with_block(connection, request, &block) if block_given?
30
+
29
31
  response = connection.run(request)
30
- if limit.positive? && response.is_a?(Net::HTTPRedirection)
31
- url = connection.build_url_for(response['location'])
32
- request = request_for(Net::HTTP::Get, url)
33
- execute(url, request, limit: limit - 1, &block)
34
- else
35
- block_given? ? yield(request, response) : response
36
- end
32
+ follow_redirect?(response, limit) ? follow_redirect(connection, response, limit) : response
37
33
  end
38
34
 
39
35
  def get(uri, headers: {}, body: {}, &block)
@@ -78,6 +74,20 @@ module Net
78
74
 
79
75
  attr_reader :default_headers
80
76
 
77
+ def execute_with_block(connection, request, &block)
78
+ block.arity == 2 ? yield(request, connection.run(request)) : connection.run(request, &block)
79
+ end
80
+
81
+ def follow_redirect?(response, limit)
82
+ limit.positive? && response.is_a?(Net::HTTPRedirection)
83
+ end
84
+
85
+ def follow_redirect(connection, response, limit)
86
+ url = connection.build_url_for(response['location'])
87
+ request = request_for(Net::HTTP::Get, url)
88
+ execute(url, request, limit: limit - 1)
89
+ end
90
+
81
91
  def attempt(attempt, max)
82
92
  yield
83
93
  rescue *CONNECTION_ERRORS => error
@@ -15,8 +15,12 @@ module Net
15
15
  @http = http
16
16
  end
17
17
 
18
- def run(request)
19
- @http.request(request)
18
+ def run(request, &block)
19
+ if block_given?
20
+ @http.request(request, &block)
21
+ else
22
+ @http.request(request)
23
+ end
20
24
  end
21
25
 
22
26
  def build_url_for(path)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Net
4
4
  module Hippie
5
- VERSION = '1.2.0'
5
+ VERSION = '1.4.0'
6
6
  end
7
7
  end
data/net-hippie.gemspec CHANGED
@@ -25,9 +25,13 @@ Gem::Specification.new do |spec|
25
25
  spec.bindir = 'exe'
26
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
27
  spec.require_paths = ['lib']
28
- spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
28
+ spec.required_ruby_version = Gem::Requirement.new('>= 3.2.0')
29
29
 
30
+ spec.add_dependency 'base64', '~> 0.1'
31
+ spec.add_dependency 'json', '~> 2.0'
30
32
  spec.add_dependency 'logger', '~> 1.0'
33
+ spec.add_dependency 'net-http', '~> 0.6'
34
+ spec.add_dependency 'openssl', '~> 3.0'
31
35
  spec.add_development_dependency 'minitest', '~> 5.0'
32
36
  spec.add_development_dependency 'rake', '~> 13.0'
33
37
  spec.add_development_dependency 'rubocop', '~> 1.9'
metadata CHANGED
@@ -1,15 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-hippie
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mo
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-12-05 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: base64
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: json
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
13
40
  - !ruby/object:Gem::Dependency
14
41
  name: logger
15
42
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +51,34 @@ dependencies:
24
51
  - - "~>"
25
52
  - !ruby/object:Gem::Version
26
53
  version: '1.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: net-http
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.6'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.6'
68
+ - !ruby/object:Gem::Dependency
69
+ name: openssl
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.0'
27
82
  - !ruby/object:Gem::Dependency
28
83
  name: minitest
29
84
  requirement: !ruby/object:Gem::Requirement
@@ -129,7 +184,6 @@ licenses:
129
184
  metadata:
130
185
  source_code_uri: https://github.com/xlgmokha/net-hippie
131
186
  rubygems_mfa_required: 'true'
132
- post_install_message:
133
187
  rdoc_options: []
134
188
  require_paths:
135
189
  - lib
@@ -137,15 +191,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
191
  requirements:
138
192
  - - ">="
139
193
  - !ruby/object:Gem::Version
140
- version: 2.5.0
194
+ version: 3.2.0
141
195
  required_rubygems_version: !ruby/object:Gem::Requirement
142
196
  requirements:
143
197
  - - ">="
144
198
  - !ruby/object:Gem::Version
145
199
  version: '0'
146
200
  requirements: []
147
- rubygems_version: 3.5.23
148
- signing_key:
201
+ rubygems_version: 3.7.2
149
202
  specification_version: 4
150
203
  summary: net/http for hippies. ☮️
151
204
  test_files: []