telegem 2.0.1 → 2.0.3

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 +38 -125
  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: 533bb8c8d591dc333e24b9efb5de8a07d95da7099b0a3cee6b35ede7f7b61bfb
4
+ data.tar.gz: 3acd65c37be2cff539dfc84307c512432a7470ad5cf80bcdbf0275b3285e2c6d
5
5
  SHA512:
6
- metadata.gz: 9f1aa5e8fc79c6198afe4a5c47fdd53b3c947b4fd48c8cb3ec6f96bc3320201d152645c00ab63a0568fb242e95106455bd95b904e57adf26c682a00b44a971c3
7
- data.tar.gz: 4355cd40167abbe6593a65fe2e736190a16aefde8b541b8cd679950a9cd10e5d764c9a72de328cce4f3439694875cf29e54d077169a5a47406a88cab3dae384d
6
+ metadata.gz: 98e26d47fda83ef2f083fb77e368146d4b125c0d43b15336c8f0caee7edf11b73bfd3e6e09f8493c00b3b8472ef991691409be2477902b9859ec7578168c0133
7
+ data.tar.gz: af192183c15e597958318b845c71eb01cac22e75dd250a53ddfa5fc2dcc8d8c1e4013f3589fee48f4278f92fdc741aa60a617140411ddffcdfcc5347807a699f
data/lib/api/client.rb CHANGED
@@ -1,4 +1,4 @@
1
- # lib/api/client.rb - V2.0.0 (FIXED)
1
+ # lib/api/client.rb - MINIMAL WORKING VERSION
2
2
  require 'httpx'
3
3
  require 'json'
4
4
 
@@ -7,83 +7,54 @@ 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
36
-
37
- ObjectSpace.define_finalizer(self, proc { close })
17
+ @http = HTTPX.with(
18
+ timeout: timeout,
19
+ headers: {
20
+ 'Content-Type' => 'application/json'
21
+ }
22
+ )
38
23
  end
39
24
 
40
25
  def call(method, params = {})
41
26
  url = "#{BASE_URL}/bot#{@token}/#{method}"
42
-
43
- @logger.debug("🚀 Async API: #{method}") if @logger
44
-
45
27
  @http.post(url, json: params.compact)
46
- .then(&method(:handle_response_async))
47
- .on_error(&method(:handle_error_async))
48
28
  end
49
29
 
50
- def call!(method, params = {}, timeout: nil)
51
- timeout ||= @http.options.timeout[:read_timeout]
52
-
30
+ def call!(method, params = {})
53
31
  request = call(method, params)
32
+ request.wait
54
33
 
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"
34
+ if request.error
35
+ handle_error(request.error)
36
+ return nil
67
37
  end
38
+
39
+ handle_response(request.response)
68
40
  end
69
41
 
70
42
  def upload(method, params)
71
43
  url = "#{BASE_URL}/bot#{@token}/#{method}"
72
-
73
- form = build_multipart_form(params)
74
-
75
- @logger.debug("📤 Async Upload: #{method}") if @logger
76
-
44
+ form = params.map do |key, value|
45
+ if file_object?(value)
46
+ [key.to_s, HTTPX::FormData::File.new(value)]
47
+ else
48
+ [key.to_s, value.to_s]
49
+ end
50
+ end
77
51
  @http.post(url, form: form)
78
- .then(&method(:handle_response_async))
79
- .on_error(&method(:handle_error_async))
80
52
  end
81
53
 
82
54
  def get_updates(offset: nil, timeout: 30, limit: 100, allowed_updates: nil)
83
55
  params = { timeout: timeout, limit: limit }
84
56
  params[:offset] = offset if offset
85
57
  params[:allowed_updates] = allowed_updates if allowed_updates
86
-
87
58
  call('getUpdates', params)
88
59
  end
89
60
 
@@ -93,80 +64,31 @@ module Telegem
93
64
 
94
65
  private
95
66
 
96
- def handle_response_async(response)
97
- response.raise_for_status unless response.status == 200
67
+ def handle_response(response)
68
+ return nil unless response
98
69
 
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
120
- else
121
- response.raise_for_status
70
+ if response.status != 200
71
+ raise APIError, "HTTP #{response.status}"
122
72
  end
123
- end
124
-
125
- def handle_error_async(error)
126
- case error
127
- when HTTPX::TimeoutError
128
- @logger.error("⏰ Timeout: #{error.message}") if @logger
129
- raise NetworkError, "Timeout: #{error.message}"
130
- 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
73
+
74
+ json = response.json
75
+ return nil unless json
76
+
77
+ if json['ok']
78
+ json['result']
139
79
  else
140
- @logger.error("💥 Unexpected: #{error.class}: #{error.message}") if @logger
141
- raise APIError, error.message
80
+ raise APIError.new(json['description'], json['error_code'])
142
81
  end
143
82
  end
144
83
 
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
84
+ def handle_error(error)
85
+ @logger.error("API Error: #{error.message}") if @logger
86
+ raise APIError, error.message
153
87
  end
154
88
 
155
89
  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
90
+ obj.is_a?(File) || obj.is_a?(StringIO) || obj.is_a?(Tempfile) ||
91
+ (obj.is_a?(String) && File.exist?(obj))
170
92
  end
171
93
  end
172
94
 
@@ -180,14 +102,5 @@ module Telegem
180
102
  end
181
103
 
182
104
  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
105
  end
193
106
  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.3".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.3
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.3!\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"