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 +4 -4
- data/.yardopts +1 -1
- data/CHANGELOG.md +20 -4
- data/README.md +95 -101
- data/lib/sms_ru/version.rb +1 -1
- data/smsru-ruby.gemspec +3 -3
- metadata +8 -8
- /data/{LICENSE.txt → LICENSE} +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d72d6d4e772f82408d569348f99ef955327b2b79df8362af398e5d6a37e8a2e0
|
|
4
|
+
data.tar.gz: b63bede5061acbaa49f18c939efbe18612d8dd1293af1c0746b125c2633dc23c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0f2a3066c095d35d1ee4b57d75511202edd08c3ecd224246a0ee010d698359ece9d6863f583317a44cd134abeecdb3b32f9e0c6e264208ea52cc448c3a50f769
|
|
7
|
+
data.tar.gz: dc4f9a01b3012479bb967bc0958d2183f015afaee88d6787514a43aeb67441b0297f04d12f1d5d5b83e290277fc137a063c4ff64288f81bdca1093b53a29b5c7
|
data/.yardopts
CHANGED
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
|
|
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`)
|
|
38
|
-
raised
|
|
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.
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
[
|
|
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
|
+
[](https://rubygems.org/gems/smsru-ruby)
|
|
7
|
+
[](https://github.com/svyatov/smsru-ruby/actions/workflows/main.yml)
|
|
8
|
+
[](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
|
-
|
|
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
|
-
|
|
36
|
+
require "smsru-ruby"
|
|
91
37
|
|
|
38
|
+
client = SmsRu.new("YOUR_API_ID")
|
|
92
39
|
result = client.deliver("79991234567", "Hello from Ruby!")
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 (1
|
|
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
|
|
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 100
|
|
196
|
-
status.failed? # => false (codes 104
|
|
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
|
|
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
|
|
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"
|
|
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"
|
|
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
|
|
290
|
-
# it with .to_unsafe_h first, or the numeric-key ordering the signature
|
|
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
|
|
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
|
|
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
|
|
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
|
-
##
|
|
382
|
-
|
|
383
|
-
|
|
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.
|
data/lib/sms_ru/version.rb
CHANGED
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 = "
|
|
12
|
-
spec.description = "A
|
|
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
|
|
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.
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
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:
|
|
77
|
+
rubygems_version: 3.6.9
|
|
79
78
|
specification_version: 4
|
|
80
|
-
summary:
|
|
79
|
+
summary: 'Ruby client for the SMS.ru HTTP API: send SMS, check delivery, verify users
|
|
80
|
+
by phone call.'
|
|
81
81
|
test_files: []
|
/data/{LICENSE.txt → LICENSE}
RENAMED
|
File without changes
|