telegem 2.0.1 → 2.0.2

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/api/client.rb +55 -113
  3. data/lib/telegem.rb +1 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac41d0622154fd92c57bbd5b86a6d5209914233e1be586180f399912d093f0ea
4
- data.tar.gz: 6225d0dd673a63b03d595a58c4260f462c12ac63715338bc8c95413ed69b9e86
3
+ metadata.gz: 5b3073c1e51978c6c7a09bc9ef4e28a0d262b15b23be16d6a81c9c69d11ef9dd
4
+ data.tar.gz: a4850c9a75a3009bf55c9aa587ab61e2a9fbf75f1d210762e103c64d5c044a7e
5
5
  SHA512:
6
- metadata.gz: 9f1aa5e8fc79c6198afe4a5c47fdd53b3c947b4fd48c8cb3ec6f96bc3320201d152645c00ab63a0568fb242e95106455bd95b904e57adf26c682a00b44a971c3
7
- data.tar.gz: 4355cd40167abbe6593a65fe2e736190a16aefde8b541b8cd679950a9cd10e5d764c9a72de328cce4f3439694875cf29e54d077169a5a47406a88cab3dae384d
6
+ metadata.gz: e259c050dd7d42564dc53e82266e7becc2089d7bf72ab14b1c85c7189215f36a543bc1c0ee6b677277cafc9661ac35057e4c2110260ad198397d49623a8c4cf7
7
+ data.tar.gz: c30b8f65dacb91c98d78a01ff359896f85d79295ca466667c8c60c5ea995fa82d8d28127c44b5490f64573524f3a9820dfe8b96ccc7a54a571d9a7e77377ce9d
data/lib/api/client.rb CHANGED
@@ -1,4 +1,4 @@
1
- # lib/api/client.rb - V2.0.0 (FIXED)
1
+ # lib/api/client.rb - WORKING VERSION
2
2
  require 'httpx'
3
3
  require 'json'
4
4
 
@@ -7,32 +7,24 @@ module Telegem
7
7
  class Client
8
8
  BASE_URL = 'https://api.telegram.org'
9
9
 
10
- attr_reader :token, :logger, :http, :connection_pool
10
+ attr_reader :token, :logger, :http
11
11
 
12
12
  def initialize(token, **options)
13
13
  @token = token
14
14
  @logger = options[:logger] || Logger.new($stdout)
15
15
  timeout = options[:timeout] || 30
16
- pool_size = options[:pool_size] || 10
17
16
 
18
- @http = HTTPX.plugin(:persistent)
19
- .with(
20
- timeout: {
21
- connect_timeout: 10,
22
- write_timeout: 10,
23
- read_timeout: timeout,
24
- keep_alive_timeout: 15
25
- },
26
- headers: {
27
- 'Content-Type' => 'application/json',
28
- 'User-Agent' => "Telegem/#{Telegem::VERSION} (Ruby #{RUBY_VERSION}; #{RUBY_PLATFORM})"
29
- },
30
- max_requests: pool_size
31
- )
32
-
33
- if HTTPX.plugins.key?(:retries)
34
- @http = @http.plugin(:retries, max_retries: 3, retry_on: [500, 502, 503, 504])
35
- end
17
+ @http = HTTPX.with(
18
+ timeout: {
19
+ connect_timeout: 10,
20
+ write_timeout: 10,
21
+ read_timeout: timeout
22
+ },
23
+ headers: {
24
+ 'Content-Type' => 'application/json',
25
+ 'User-Agent' => "Telegem/#{Telegem::VERSION}"
26
+ }
27
+ )
36
28
 
37
29
  ObjectSpace.define_finalizer(self, proc { close })
38
30
  end
@@ -40,43 +32,35 @@ module Telegem
40
32
  def call(method, params = {})
41
33
  url = "#{BASE_URL}/bot#{@token}/#{method}"
42
34
 
43
- @logger.debug("🚀 Async API: #{method}") if @logger
35
+ @logger.debug("API: #{method}") if @logger
44
36
 
45
37
  @http.post(url, json: params.compact)
46
- .then(&method(:handle_response_async))
47
- .on_error(&method(:handle_error_async))
48
38
  end
49
39
 
50
- def call!(method, params = {}, timeout: nil)
51
- timeout ||= @http.options.timeout[:read_timeout]
52
-
40
+ def call!(method, params = {})
53
41
  request = call(method, params)
42
+ request.wait
54
43
 
55
- begin
56
- wait_result = request.wait(timeout)
57
-
58
- if request.error
59
- raise APIError, request.error.message
60
- elsif !wait_result
61
- raise NetworkError, "Request timeout after #{timeout}s"
62
- end
63
-
64
- request.instance_variable_get(:@result) || request.response
65
- rescue Timeout::Error
66
- raise NetworkError, "Request timeout after #{timeout}s"
44
+ if request.error
45
+ handle_error(request.error)
46
+ return nil
67
47
  end
48
+
49
+ handle_response(request.response)
68
50
  end
69
51
 
70
52
  def upload(method, params)
71
53
  url = "#{BASE_URL}/bot#{@token}/#{method}"
72
54
 
73
- form = build_multipart_form(params)
74
-
75
- @logger.debug("📤 Async Upload: #{method}") if @logger
55
+ form = params.map do |key, value|
56
+ if file_object?(value)
57
+ [key.to_s, HTTPX::FormData::File.new(value)]
58
+ else
59
+ [key.to_s, value.to_s]
60
+ end
61
+ end
76
62
 
77
63
  @http.post(url, form: form)
78
- .then(&method(:handle_response_async))
79
- .on_error(&method(:handle_error_async))
80
64
  end
81
65
 
82
66
  def get_updates(offset: nil, timeout: 30, limit: 100, allowed_updates: nil)
@@ -93,80 +77,47 @@ module Telegem
93
77
 
94
78
  private
95
79
 
96
- def handle_response_async(response)
97
- response.raise_for_status unless response.status == 200
80
+ def handle_response(response)
81
+ return nil unless response
98
82
 
99
- case response.status
100
- when 429
101
- retry_after = response.headers['retry-after']&.to_i || 1
102
- raise RateLimitError.new("Rate limited", retry_after)
103
- when 200
104
- begin
105
- json = response.json
106
- rescue JSON::ParserError => e
107
- raise APIError, "Invalid JSON: #{e.message}"
108
- end
109
-
110
- unless json
111
- raise APIError, "Empty response"
112
- end
113
-
114
- if json['ok']
115
- response.request.instance_variable_set(:@result, json['result'])
116
- json['result']
117
- else
118
- raise APIError.new(json['description'], json['error_code'])
119
- end
83
+ if response.status != 200
84
+ raise APIError, "HTTP #{response.status}"
85
+ end
86
+
87
+ begin
88
+ json = response.json
89
+ rescue JSON::ParserError
90
+ raise APIError, "Invalid JSON response"
91
+ end
92
+
93
+ unless json
94
+ raise APIError, "Empty response"
95
+ end
96
+
97
+ if json['ok']
98
+ json['result']
120
99
  else
121
- response.raise_for_status
100
+ raise APIError.new(json['description'], json['error_code'])
122
101
  end
123
102
  end
124
103
 
125
- def handle_error_async(error)
104
+ def handle_error(error)
126
105
  case error
127
106
  when HTTPX::TimeoutError
128
- @logger.error("Timeout: #{error.message}") if @logger
129
- raise NetworkError, "Timeout: #{error.message}"
107
+ @logger.error("Timeout: #{error.message}") if @logger
108
+ raise NetworkError, "Request timeout"
130
109
  when HTTPX::ConnectionError
131
- @logger.error("🔌 Connection: #{error.message}") if @logger
132
- raise NetworkError, "Connection failed: #{error.message}"
133
- when HTTPX::HTTPError
134
- @logger.error("🌐 HTTP #{error.response.status}: #{error.message}") if @logger
135
- raise APIError, "HTTP #{error.response.status}: #{error.message}"
136
- when RateLimitError
137
- @logger.error("🚦 Rate limit: retry after #{error.retry_after}s") if @logger
138
- raise error
110
+ @logger.error("Connection error: #{error.message}") if @logger
111
+ raise NetworkError, "Connection failed"
139
112
  else
140
- @logger.error("💥 Unexpected: #{error.class}: #{error.message}") if @logger
113
+ @logger.error("Error: #{error.class}: #{error.message}") if @logger
141
114
  raise APIError, error.message
142
115
  end
143
116
  end
144
117
 
145
- def build_multipart_form(params)
146
- params.map do |key, value|
147
- if file_object?(value)
148
- [key.to_s, HTTPX::FormData::File.new(value)]
149
- else
150
- [key.to_s, value.to_s]
151
- end
152
- end
153
- end
154
-
155
118
  def file_object?(obj)
156
- case obj
157
- when File, StringIO, Tempfile
158
- true
159
- when Pathname
160
- obj.exist? && obj.readable?
161
- when String
162
- if obj.start_with?('http://', 'https://', 'ftp://')
163
- false
164
- else
165
- File.exist?(obj) && File.readable?(obj)
166
- end
167
- else
168
- false
169
- end
119
+ obj.is_a?(File) || obj.is_a?(StringIO) || obj.is_a?(Tempfile) ||
120
+ (obj.is_a?(String) && File.exist?(obj))
170
121
  end
171
122
  end
172
123
 
@@ -180,14 +131,5 @@ module Telegem
180
131
  end
181
132
 
182
133
  class NetworkError < APIError; end
183
-
184
- class RateLimitError < APIError
185
- attr_reader :retry_after
186
-
187
- def initialize(message, retry_after = 1)
188
- super(message)
189
- @retry_after = retry_after
190
- end
191
- end
192
134
  end
193
135
  end
data/lib/telegem.rb CHANGED
@@ -3,7 +3,7 @@ require 'logger'
3
3
  require 'json'
4
4
 
5
5
  module Telegem
6
- VERSION = "2.0.1".freeze
6
+ VERSION = "2.0.2".freeze
7
7
  end
8
8
 
9
9
  # Load core components
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: telegem
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - sick_phantom
@@ -198,7 +198,7 @@ metadata:
198
198
  bug_tracker_uri: https://gitlab.com/ruby-telegem/telegem/-/issues
199
199
  documentation_uri: https://gitlab.com/ruby-telegem/telegem/-/blob/main/README.md
200
200
  rubygems_mfa_required: 'false'
201
- post_install_message: "Thanks for installing Telegem 2.0.1!\n\nQuick start:\n bot
201
+ post_install_message: "Thanks for installing Telegem 2.0.2!\n\nQuick start:\n bot
202
202
  = Telegem.new(\"YOUR_TOKEN\")\n bot.on(:message) { |ctx| ctx.reply(\"Hello!\")
203
203
  }\n bot.start_polling\n\nDocumentation: https://gitlab.com/ruby-telegem/telegem\nHappy
204
204
  bot building! \U0001F916\n"