smsru-ruby 2.0.0 → 2.0.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: '055631208861d034be5c8318a3a8e52a04462d08e89816077cfbc3bb4cca0be7'
4
- data.tar.gz: 3961c10a7e11a77bc886b848b37cf6b31b8da93eb13a14b8370db25d43a10f20
3
+ metadata.gz: d72d6d4e772f82408d569348f99ef955327b2b79df8362af398e5d6a37e8a2e0
4
+ data.tar.gz: b63bede5061acbaa49f18c939efbe18612d8dd1293af1c0746b125c2633dc23c
5
5
  SHA512:
6
- metadata.gz: 54785ce27189179b91c1126107bda2ed46afc27160152fa1304a4a5d71e4700b04fa32fd55d6786226cba091e1b7188f644d4393bd7de31807a865a500152117
7
- data.tar.gz: 5aeb1ac3e4990df7dc1d54a23c1ed961336b7efea9a505eb20e85219f95307ee4e188cbdb09e4d7578af4e4fb4277763ac649d2137c271a29a635470b3a85b31
6
+ metadata.gz: 0f2a3066c095d35d1ee4b57d75511202edd08c3ecd224246a0ee010d698359ece9d6863f583317a44cd134abeecdb3b32f9e0c6e264208ea52cc448c3a50f769
7
+ data.tar.gz: dc4f9a01b3012479bb967bc0958d2183f015afaee88d6787514a43aeb67441b0297f04d12f1d5d5b83e290277fc137a063c4ff64288f81bdca1093b53a29b5c7
data/.yardopts CHANGED
@@ -3,4 +3,4 @@
3
3
  lib/**/*.rb
4
4
  -
5
5
  CHANGELOG.md
6
- LICENSE.txt
6
+ LICENSE
data/CHANGELOG.md CHANGED
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.0.1] - 2026-07-31
11
+
12
+ ### Added
13
+
14
+ - Releases are now built and published by GitHub Actions over OIDC, and every
15
+ published gem carries a Sigstore provenance attestation. Verify one with
16
+ `https://rubygems.org/api/v1/attestations/smsru-ruby-VERSION.json`.
17
+
18
+ ### Changed
19
+
20
+ - Renamed `LICENSE.txt` to `LICENSE`. The license text is untouched and the gem
21
+ is still MIT.
22
+ - Rewrote the README and widened the gemspec summary and description to describe
23
+ the full API surface.
24
+
10
25
  ## [2.0.0] - 2026-07-13
11
26
 
12
27
  ### Changed
@@ -14,7 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
14
29
  - **BREAKING:** Renamed the gem from `smsru_ruby` to `smsru-ruby` for
15
30
  consistency with the `-ruby` suffix convention. Update your `Gemfile`
16
31
  (`gem "smsru-ruby"`) and requires (`require "smsru-ruby"`). The Ruby API is
17
- unchanged the top-level class is still `SmsRu`.
32
+ unchanged. The top-level class is still `SmsRu`.
18
33
 
19
34
  ## [1.0.0] - 2026-06-26
20
35
 
@@ -34,8 +49,8 @@ same API, reworked to be idiomatic Ruby. How it differs from the original:
34
49
  and `Cost`; plus `#confirmed?` and `#available_today`. No raw decoded JSON or
35
50
  magic numbers.
36
51
  - **Typed error hierarchy** under `SmsRu::Error` (`AuthError`,
37
- `InsufficientFundsError`, `ResponseError`, `ConnectionError`) errors are
38
- raised, not returned as status codes you have to inspect.
52
+ `InsufficientFundsError`, `ResponseError`, `ConnectionError`). Errors are
53
+ raised rather than returned as status codes you have to inspect.
39
54
  - **First-class inbound webhooks**: `SmsRu::Webhook.parse` decodes the callback
40
55
  POST into typed events (`SmsRu::Events::SmsStatus`, `CallcheckStatus`, `Test`,
41
56
  `Unknown`), and `SmsRu::Webhook.valid?` verifies the signature.
@@ -47,6 +62,7 @@ same API, reworked to be idiomatic Ruby. How it differs from the original:
47
62
  SMS.ru's loosely-typed JSON is normalized to the declared types at the parse
48
63
  boundary, so result objects never surface raw wire values.
49
64
 
50
- [Unreleased]: https://github.com/svyatov/smsru-ruby/compare/v2.0.0...HEAD
65
+ [Unreleased]: https://github.com/svyatov/smsru-ruby/compare/v2.0.1...HEAD
66
+ [2.0.1]: https://github.com/svyatov/smsru-ruby/compare/v2.0.0...v2.0.1
51
67
  [2.0.0]: https://github.com/svyatov/smsru-ruby/compare/v1.0.0...v2.0.0
52
68
  [1.0.0]: https://github.com/svyatov/smsru-ruby/releases/tag/v1.0.0
data/README.md CHANGED
@@ -1,104 +1,71 @@
1
1
  # smsru-ruby
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/smsru-ruby.svg)](https://rubygems.org/gems/smsru-ruby)
4
- [![CI](https://github.com/svyatov/smsru-ruby/actions/workflows/main.yml/badge.svg)](https://github.com/svyatov/smsru-ruby/actions/workflows/main.yml)
5
- [![codecov](https://codecov.io/gh/svyatov/smsru-ruby/branch/main/graph/badge.svg)](https://codecov.io/gh/svyatov/smsru-ruby)
6
- [![Documentation](https://img.shields.io/badge/docs-rubydoc.info-blue.svg)](https://rubydoc.info/gems/smsru-ruby)
7
- [![Ruby](https://img.shields.io/badge/ruby-%3E%3D%203.2-CC342D.svg)](https://www.ruby-lang.org)
8
- [![Types: RBS](https://img.shields.io/badge/types-RBS-8A2BE2.svg)](https://github.com/svyatov/smsru-ruby/tree/main/sig)
9
-
10
- A modern, **dependency-free**, **fully typed** Ruby client for the [SMS.ru](https://sms.ru) HTTP API
11
- typed results, typed errors, shipped RBS signatures, and first-class webhooks.
12
-
13
- It is a clean, idiomatic Ruby port of the official [SMS.ru PHP library](https://sms.ru/php):
14
- send single or bulk SMS, schedule delivery, check cost and delivery status, verify
15
- users by phone call, inspect your balance/limits/senders, manage the stoplist, and
16
- register delivery callbacks all returning typed, immutable result objects and
17
- raising typed errors.
18
-
19
- ## Why smsru-ruby?
20
-
21
- - **Zero runtime dependencies** — only Ruby's standard library (`net/http`, `json`, `openssl`).
22
- - **Fully typed** — immutable `Data` result objects, not raw hashes, plus a typed error hierarchy: `rescue SmsRu::Error` catches everything.
23
- - **RBS signatures shipped** (`sig/`) and Steep-checked — type-check your integration out of the box.
24
- - **First-class webhooks** — parse signed delivery and call-authorization callbacks into typed events; the signature is verified in **constant time** (timing-attack safe).
25
- - **Secret-safe by default** — TLS verified; the optional logger never logs your `api_id`, phone numbers, or message text. Configurable timeout and transport retries.
26
- - **Outcome vs. delivery state** — two distinct ideas, each with its own predicates (`ok?` vs. `delivered?`/`pending?`/`failed?`), never conflated.
27
- - **100% test & documentation coverage, enforced in CI** across Ruby 3.2–4.0.
28
-
29
- ## What's covered
30
-
31
- The full SMS.ru API, mapped to an idiomatic Ruby surface:
32
-
33
- | Capability | Method |
34
- | --- | --- |
35
- | Send — single, bulk, or per-number text | `client.deliver` |
36
- | Price a message before sending | `client.cost` |
37
- | Delivery status, with state predicates | `client.status` |
38
- | Verify by flash call (outbound) | `client.call` |
39
- | Verify by callcheck (inbound) | `client.callcheck` |
40
- | Balance, limits, free limit, senders | `client.my` |
41
- | Validate credentials | `client.auth.ok?` |
42
- | Stoplist — add, remove, list | `client.stoplist` |
43
- | Webhook URLs — add, remove, list | `client.callbacks` |
44
- | Parse & verify incoming webhooks | `SmsRu::Webhook` |
45
-
46
- ## Table of contents
47
-
48
- - [Why smsru-ruby?](#why-smsru-ruby)
49
- - [What's covered](#whats-covered)
50
- - [Supported Ruby versions](#supported-ruby-versions)
51
- - [Installation](#installation)
52
- - [Quick start](#quick-start)
53
- - [Configuration](#configuration)
54
- - [Sending messages](#sending-messages)
55
- - [Cost and status](#cost-and-status)
56
- - [Verify by phone call](#verify-by-phone-call)
57
- - [Account information](#account-information)
58
- - [Stoplist](#stoplist)
59
- - [Callbacks (webhooks)](#callbacks-webhooks)
60
- - [Error handling](#error-handling)
61
- - [Development](#development)
62
- - [Recording test cassettes](#recording-test-cassettes)
63
- - [License](#license)
64
-
65
- ## Supported Ruby versions
66
-
67
- Ruby **3.2+** (the result objects use [`Data`](https://docs.ruby-lang.org/en/3.2/Data.html)).
68
- CI runs against `ruby-head`, `4.0`, `3.4`, `3.3`, and `3.2`.
3
+ smsru-ruby is a Ruby client for the [SMS.ru](https://sms.ru) HTTP API, for applications that send SMS,
4
+ check delivery, and verify users by phone call.
5
+
6
+ [![Gem version](https://img.shields.io/gem/v/smsru-ruby)](https://rubygems.org/gems/smsru-ruby)
7
+ [![CI](https://github.com/svyatov/smsru-ruby/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/svyatov/smsru-ruby/actions/workflows/main.yml)
8
+ [![Coverage](https://codecov.io/gh/svyatov/smsru-ruby/branch/main/graph/badge.svg)](https://app.codecov.io/gh/svyatov/smsru-ruby)
9
+
10
+ - **Covers the whole SMS.ru HTTP API.** Sending, cost, delivery status, flash call and callcheck
11
+ verification, balance and limits, stoplist, callback registration, and inbound webhook parsing.
12
+ - **11 typed result objects and 12 named status constants.** Every response arrives as a frozen `Data`
13
+ object rather than a decoded Hash.
14
+ - **No runtime dependencies.** The gem loads `net/http`, `json`, and `openssl` from the standard
15
+ library and nothing else.
16
+ - **A Ruby port of the official [SMS.ru PHP library](https://sms.ru/php).** Same API coverage, with
17
+ keyword arguments, namespaced sub-resources, and raised errors in place of flat `get_*` methods and
18
+ returned status codes.
19
+ - **100% line coverage and 100% documented public API.** Both gates run in CI on every push.
69
20
 
70
21
  ## Installation
71
22
 
23
+ Add the gem to your Gemfile.
24
+
72
25
  ```ruby
73
- # Gemfile
74
26
  gem "smsru-ruby"
75
27
  ```
76
28
 
77
- ```sh
78
- bundle install
79
- # or
80
- gem install smsru-ruby
81
- ```
82
-
83
- ```ruby
84
- require "smsru-ruby"
85
- ```
29
+ Then run `bundle install`. Without Bundler, run `gem install smsru-ruby`.
86
30
 
87
31
  ## Quick start
88
32
 
33
+ Create a client with your API id, then send a message.
34
+
89
35
  ```ruby
90
- client = SmsRu.new("YOUR_API_ID")
36
+ require "smsru-ruby"
91
37
 
38
+ client = SmsRu.new("YOUR_API_ID")
92
39
  result = client.deliver("79991234567", "Hello from Ruby!")
93
- result.messages.first.sms_id # => "000000-10000000"
94
- client.my.balance # => 4762.58
40
+
41
+ result.messages.first.sms_id # => "000000-10000000"
42
+ client.my.balance # => 4762.58
95
43
  ```
96
44
 
97
45
  Get your `api_id` in the SMS.ru dashboard under
98
- [Settings API](https://sms.ru/?panel=api).
46
+ [Settings, API](https://sms.ru/?panel=api).
47
+
48
+ ## API coverage
49
+
50
+ The full SMS.ru API, mapped to an idiomatic Ruby surface:
51
+
52
+ | Capability | Method |
53
+ | --- | --- |
54
+ | Send a single, bulk, or per-number text | `client.deliver` |
55
+ | Price a message before sending | `client.cost` |
56
+ | Delivery status, with state predicates | `client.status` |
57
+ | Verify by flash call (outbound) | `client.call` |
58
+ | Verify by callcheck (inbound) | `client.callcheck` |
59
+ | Balance, limits, free limit, senders | `client.my` |
60
+ | Validate credentials | `client.auth.ok?` |
61
+ | Stoplist: add, remove, list | `client.stoplist` |
62
+ | Webhook URLs: add, remove, list | `client.callbacks` |
63
+ | Parse and verify incoming webhooks | `SmsRu::Webhook` |
99
64
 
100
65
  ## Configuration
101
66
 
67
+ Every client option is a keyword argument on `SmsRu.new`:
68
+
102
69
  ```ruby
103
70
  SmsRu.new(
104
71
  "YOUR_API_ID",
@@ -111,11 +78,11 @@ SmsRu.new(
111
78
  ```
112
79
 
113
80
  Retries apply only to transport-level problems (timeouts, refused connections).
114
- API errors are never retried they are raised immediately.
81
+ API errors are never retried. They are raised immediately.
115
82
 
116
83
  `from` is a per-client default so you don't repeat your sender name on every call;
117
84
  a per-call `from:` always wins. The `logger` logs only the request path and
118
- transport failures never your `api_id`, phone numbers, or message text.
85
+ transport failures, never your `api_id`, phone numbers, or message text.
119
86
 
120
87
  ## Sending messages
121
88
 
@@ -128,7 +95,7 @@ client.deliver("79991234567", "Hi there")
128
95
  # 2. Same text to many numbers (Array)
129
96
  client.deliver(["79991234567", "79991234568"], "Hi everyone")
130
97
 
131
- # 3. A different text per number (Hash do not pass a separate text).
98
+ # 3. A different text per number (Hash, with no separate text argument).
132
99
  # Use braces so Ruby treats it as a positional Hash, not keyword arguments.
133
100
  client.deliver({
134
101
  "79991234567" => "Hi Alice",
@@ -143,7 +110,7 @@ client.deliver(
143
110
  "79991234567", "Hi",
144
111
  from: "MyCompany", # approved sender name
145
112
  time: Time.now.to_i + 3600, # scheduled send (UNIX time, up to 2 months ahead)
146
- ttl: 60, # message lifetime in minutes (11440)
113
+ ttl: 60, # message lifetime in minutes (1 to 1440)
147
114
  daytime: true, # defer night-time sends to the recipient's daytime
148
115
  translit: true, # transliterate Cyrillic to Latin
149
116
  test: true, # test mode for this call (overrides the client default)
@@ -174,6 +141,8 @@ result.failed # => [SmsRu::Sms, ...] rejected recipients
174
141
 
175
142
  ## Cost and status
176
143
 
144
+ Price a message before sending, and read the delivery state afterwards:
145
+
177
146
  ```ruby
178
147
  # Price a message before sending (text is optional; omit it for the price of 1 SMS)
179
148
  cost = client.cost("79991234567", "How much?")
@@ -185,15 +154,15 @@ cost.ok? # => true only if every recipient was priced
185
154
  cost.failed # => [SmsRu::CostItem, ...] recipients that errored
186
155
  cost.failed.first.error_code # => 207
187
156
 
188
- # Delivery status one id or an Array of ids
157
+ # Delivery status takes one id or an Array of ids
189
158
  status = client.status("000000-10000000")
190
159
  status.status_code # => 103 (the delivery state code)
191
160
  status.status_text # => "Сообщение доставлено"
192
161
 
193
162
  # State predicates instead of memorizing codes:
194
163
  status.delivered? # => true (code 103)
195
- status.pending? # => false (codes 100102, still in transit)
196
- status.failed? # => false (codes 104108, 150)
164
+ status.pending? # => false (codes 100 to 102, still in transit)
165
+ status.failed? # => false (codes 104 to 108, 150)
197
166
  status.found? # => true (false only when the id is unknown, code -1)
198
167
 
199
168
  statuses = client.status(["000000-10000000", "000000-10000001"]) # => [SmsRu::Status, ...]
@@ -204,15 +173,15 @@ Every code has a named constant under `SmsRu::Statuses` (e.g.
204
173
  predicates don't cover. The same predicates are available on
205
174
  `SmsRu::Events::SmsStatus` from webhook payloads.
206
175
 
207
- > **Outcome vs. delivery state two ideas, two names.** `ok?` (with
176
+ > **Outcome and delivery state are two ideas with two names.** `ok?` (with
208
177
  > `error_code`/`error_text` on a rejected `Sms`/`CostItem`) answers *did the
209
178
  > request succeed for this recipient*. `status_code` (with
210
- > `delivered?`/`pending?`/`failed?`) answers *where the message is in delivery* —
179
+ > `delivered?`/`pending?`/`failed?`) answers *where the message is in delivery*,
211
180
  > and only `Status` and webhook events carry it.
212
181
 
213
182
  ## Verify by phone call
214
183
 
215
- Two ways to verify a user by phone call no SMS required.
184
+ Two ways to verify a user by phone call, with no SMS required.
216
185
 
217
186
  **Outbound (flash call).** SMS.ru calls the user; the last 4 digits of the
218
187
  calling number are the code. You receive the expected `code` to compare against
@@ -220,7 +189,7 @@ what the user enters:
220
189
 
221
190
  ```ruby
222
191
  call = client.call("79991234567")
223
- call.code # => "1435" the last 4 digits the user will see
192
+ call.code # => "1435", the last 4 digits the user will see
224
193
  call.call_id # => "000000-10000000"
225
194
  ```
226
195
 
@@ -229,7 +198,7 @@ call (free for the caller) and marks the check confirmed:
229
198
 
230
199
  ```ruby
231
200
  check = client.callcheck.add("79991234567")
232
- check.call_phone_pretty # => "+7 (800) 500-8275" show this to the user
201
+ check.call_phone_pretty # => "+7 (800) 500-8275", show this to the user
233
202
 
234
203
  # Poll until the user has called (or receive it via a callback/webhook):
235
204
  client.callcheck.status(check.check_id).confirmed? # => true
@@ -286,9 +255,9 @@ In your webhook handler, verify the signature, parse the payload, and
286
255
  acknowledge it by replying with the string `"100"`:
287
256
 
288
257
  ```ruby
289
- # In Rails, params[:data] is ActionController::Parameters, not a Hash — convert
290
- # it with .to_unsafe_h first, or the numeric-key ordering the signature depends
291
- # on is skipped and the check below rejects the payload. The payload is
258
+ # In Rails, params[:data] is ActionController::Parameters rather than a Hash.
259
+ # Convert it with .to_unsafe_h first, or the numeric-key ordering the signature
260
+ # depends on is skipped and the check below rejects the payload. The payload is
292
261
  # signature-verified, so to_unsafe_h is safe here (.to_h would drop keys).
293
262
  # In bare Rack params["data"] is already a Hash; pass it as-is.
294
263
  data = params[:data].to_unsafe_h
@@ -342,11 +311,15 @@ rescue SmsRu::ConnectionError => e
342
311
  end
343
312
  ```
344
313
 
345
- Note that per-recipient failures in a bulk `deliver` are **not** raised they are
314
+ Note that per-recipient failures in a bulk `deliver` are **not** raised. They are
346
315
  reported on each `SmsRu::Sms` in `result.messages` (see above).
347
316
 
348
317
  ## Development
349
318
 
319
+ Ruby 3.2 or newer is required, because the result objects use
320
+ [`Data`](https://docs.ruby-lang.org/en/3.2/Data.html). CI runs against
321
+ `ruby-head`, `4.0`, `3.4`, `3.3`, and `3.2`.
322
+
350
323
  ```sh
351
324
  bin/setup # install dependencies
352
325
  bundle exec rake # run RuboCop, validate RBS signatures, and the test suite
@@ -361,12 +334,12 @@ diagnostics (no implicit `untyped`, no unannotated collections) at **100% type
361
334
  coverage**, gated in CI. Loosely-typed JSON from SMS.ru (which returns, say,
362
335
  `total_limit` as the string `"10"`) is normalized into the declared types at the
363
336
  parse boundary, and `rbs:test` checks that the values flowing through the suite
364
- actually match `sig/` at runtime so the types can't drift from the code.
337
+ actually match `sig/` at runtime, so the types cannot drift from the code.
365
338
 
366
339
  ## Recording test cassettes
367
340
 
368
341
  End-to-end tests replay real SMS.ru responses recorded with [VCR](https://github.com/vcr/vcr).
369
- The cassettes are not committed with secrets your `api_id` is filtered out. To
342
+ The cassettes are not committed with secrets: your `api_id` is filtered out. To
370
343
  record them once against your own account (message sends use `test=1`, so they are
371
344
  free):
372
345
 
@@ -378,6 +351,27 @@ This writes `test/cassettes/*.yml`. Commit them, then `COVERAGE=true bundle exec
378
351
  runs fully offline at 100% coverage. Before cassettes are recorded, the end-to-end
379
352
  tests are skipped (the unit and transport tests still run).
380
353
 
381
- ## License
382
-
383
- Released under the [MIT License](LICENSE.txt).
354
+ ## Help and project status
355
+
356
+ Ask a question or report a defect in the
357
+ [issue tracker](https://github.com/svyatov/smsru-ruby/issues). Both go to the same
358
+ place. For a security vulnerability, follow
359
+ [SECURITY.md](https://github.com/svyatov/smsru-ruby/blob/main/SECURITY.md) instead
360
+ of opening an issue.
361
+
362
+ Leonid Svyatov maintains this gem alone. He reads every issue, fixes defects in the
363
+ SMS.ru API coverage, and keeps the gem running on supported Ruby versions. Feature
364
+ work depends on the time he has.
365
+ [CONTRIBUTING.md](https://github.com/svyatov/smsru-ruby/blob/main/CONTRIBUTING.md#maintenance)
366
+ records who merges and releases.
367
+
368
+ ## Links
369
+
370
+ - [CHANGELOG.md](https://github.com/svyatov/smsru-ruby/blob/main/CHANGELOG.md) records every released
371
+ change.
372
+ - [CONTRIBUTING.md](https://github.com/svyatov/smsru-ruby/blob/main/CONTRIBUTING.md) covers setup,
373
+ tests, and the pull request process.
374
+ - [SECURITY.md](https://github.com/svyatov/smsru-ruby/blob/main/SECURITY.md) explains how to report a
375
+ vulnerability privately.
376
+ - [API documentation](https://rubydoc.info/gems/smsru-ruby) is generated from the source with YARD.
377
+ - [LICENSE](https://github.com/svyatov/smsru-ruby/blob/main/LICENSE) is the MIT License.
@@ -2,5 +2,5 @@
2
2
 
3
3
  class SmsRu
4
4
  # The gem version.
5
- VERSION = "2.0.0"
5
+ VERSION = "2.0.1"
6
6
  end
data/smsru-ruby.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["Leonid Svyatov"]
9
9
  spec.email = ["leonid@svyatov.com"]
10
10
 
11
- spec.summary = "Modern, dependency-free Ruby client for the SMS.ru API."
12
- spec.description = "A modern, dependency-free Ruby client for the SMS.ru HTTP API. Send single or bulk SMS, " \
11
+ spec.summary = "Ruby client for the SMS.ru HTTP API: send SMS, check delivery, verify users by phone call."
12
+ spec.description = "A Ruby client for the SMS.ru HTTP API. Send single or bulk SMS, " \
13
13
  "schedule delivery, check cost and delivery status, verify users by phone call, inspect " \
14
14
  "balance/limits/senders, manage the stoplist, and register delivery callbacks."
15
15
  spec.homepage = "https://github.com/svyatov/smsru-ruby"
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.require_paths = ["lib"]
21
21
  spec.files = Dir["lib/**/*.rb"] + Dir["sig/**/*"] +
22
- %w[.yardopts CHANGELOG.md LICENSE.txt README.md smsru-ruby.gemspec]
22
+ %w[.yardopts CHANGELOG.md LICENSE README.md smsru-ruby.gemspec]
23
23
 
24
24
  spec.metadata["rubygems_mfa_required"] = "true"
25
25
  spec.metadata["documentation_uri"] = "https://rubydoc.info/gems/smsru-ruby"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smsru-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leonid Svyatov
@@ -9,10 +9,9 @@ bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies: []
12
- description: A modern, dependency-free Ruby client for the SMS.ru HTTP API. Send single
13
- or bulk SMS, schedule delivery, check cost and delivery status, verify users by
14
- phone call, inspect balance/limits/senders, manage the stoplist, and register delivery
15
- callbacks.
12
+ description: A Ruby client for the SMS.ru HTTP API. Send single or bulk SMS, schedule
13
+ delivery, check cost and delivery status, verify users by phone call, inspect balance/limits/senders,
14
+ manage the stoplist, and register delivery callbacks.
16
15
  email:
17
16
  - leonid@svyatov.com
18
17
  executables: []
@@ -21,7 +20,7 @@ extra_rdoc_files: []
21
20
  files:
22
21
  - ".yardopts"
23
22
  - CHANGELOG.md
24
- - LICENSE.txt
23
+ - LICENSE
25
24
  - README.md
26
25
  - lib/sms_ru/auth.rb
27
26
  - lib/sms_ru/call_check.rb
@@ -75,7 +74,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
74
  - !ruby/object:Gem::Version
76
75
  version: '0'
77
76
  requirements: []
78
- rubygems_version: 4.0.16
77
+ rubygems_version: 3.6.9
79
78
  specification_version: 4
80
- summary: Modern, dependency-free Ruby client for the SMS.ru API.
79
+ summary: 'Ruby client for the SMS.ru HTTP API: send SMS, check delivery, verify users
80
+ by phone call.'
81
81
  test_files: []
File without changes