sms_aero 0.0.11 → 0.1.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 +4 -4
- data/.rubocop.yml +3 -6
- data/CHANGELOG.md +15 -10
- data/README.md +25 -30
- data/lib/sms_aero.rb +119 -34
- data/lib/sms_aero/birthday.rb +12 -0
- data/lib/sms_aero/callable.rb +6 -0
- data/lib/sms_aero/channel.rb +15 -0
- data/lib/sms_aero/digital.rb +7 -0
- data/lib/sms_aero/filled_string.rb +11 -0
- data/lib/sms_aero/future.rb +16 -0
- data/lib/sms_aero/group.rb +11 -0
- data/lib/sms_aero/optional.rb +15 -0
- data/lib/sms_aero/phone.rb +11 -0
- data/lib/sms_aero/response.rb +30 -0
- data/lib/sms_aero/response/with_balance.rb +5 -0
- data/lib/sms_aero/response/with_groups.rb +5 -0
- data/lib/sms_aero/response/with_id.rb +9 -0
- data/lib/sms_aero/response/with_senders.rb +5 -0
- data/lib/sms_aero/response/with_statuses.rb +5 -0
- data/lib/sms_aero/response/with_tariff.rb +5 -0
- data/lib/sms_aero/tariff.rb +8 -0
- data/sms_aero.gemspec +2 -4
- data/spec/{sms_aero/types → models}/birthday_spec.rb +2 -2
- data/spec/{sms_aero/types → models}/channel_spec.rb +2 -2
- data/spec/{sms_aero/types → models}/digital_spec.rb +1 -1
- data/spec/{sms_aero/types → models}/future_spec.rb +5 -5
- data/spec/{sms_aero/types → models}/phone_spec.rb +1 -1
- data/spec/{sms_aero/operations → operations}/add_blacklist_spec.rb +19 -3
- data/spec/{sms_aero/operations → operations}/add_group_spec.rb +4 -4
- data/spec/{sms_aero/operations → operations}/add_phone_spec.rb +39 -76
- data/spec/{sms_aero/operations → operations}/check_balance_spec.rb +2 -4
- data/spec/{sms_aero/operations → operations}/check_groups_spec.rb +0 -0
- data/spec/{sms_aero/operations → operations}/check_senders_spec.rb +5 -5
- data/spec/{sms_aero/operations → operations}/check_sending_spec.rb +3 -3
- data/spec/{sms_aero/operations → operations}/check_sign_spec.rb +2 -2
- data/spec/{sms_aero/operations → operations}/check_status_spec.rb +3 -3
- data/spec/{sms_aero/operations → operations}/check_tariff_spec.rb +1 -1
- data/spec/{sms_aero/operations → operations}/delete_group_spec.rb +3 -3
- data/spec/{sms_aero/operations → operations}/delete_phone_spec.rb +4 -4
- data/spec/{sms_aero/operations → operations}/send_sms_spec.rb +49 -11
- data/spec/spec_helper.rb +4 -1
- data/spec/support/en.yml +8 -0
- metadata +61 -101
- data/lib/sms_aero/models/answer.rb +0 -8
- data/lib/sms_aero/models/sms.rb +0 -16
- data/lib/sms_aero/models/tariff.rb +0 -8
- data/lib/sms_aero/operations/add_blacklist.rb +0 -11
- data/lib/sms_aero/operations/add_group.rb +0 -11
- data/lib/sms_aero/operations/add_phone.rb +0 -17
- data/lib/sms_aero/operations/check_balance.rb +0 -11
- data/lib/sms_aero/operations/check_groups.rb +0 -12
- data/lib/sms_aero/operations/check_senders.rb +0 -15
- data/lib/sms_aero/operations/check_sending.rb +0 -11
- data/lib/sms_aero/operations/check_sign.rb +0 -15
- data/lib/sms_aero/operations/check_status.rb +0 -11
- data/lib/sms_aero/operations/check_tariff.rb +0 -12
- data/lib/sms_aero/operations/delete_group.rb +0 -11
- data/lib/sms_aero/operations/delete_phone.rb +0 -12
- data/lib/sms_aero/operations/hlr.rb +0 -36
- data/lib/sms_aero/operations/send_sms.rb +0 -22
- data/lib/sms_aero/operations/send_to_group.rb +0 -15
- data/lib/sms_aero/types/birthday.rb +0 -20
- data/lib/sms_aero/types/channel.rb +0 -4
- data/lib/sms_aero/types/digital.rb +0 -8
- data/lib/sms_aero/types/filled_string.rb +0 -3
- data/lib/sms_aero/types/future.rb +0 -16
- data/lib/sms_aero/types/password.rb +0 -6
- data/lib/sms_aero/types/phone.rb +0 -12
- data/lib/sms_aero/types/sign_status.rb +0 -9
- data/spec/sms_aero/operations/hlr_spec.rb +0 -96
- data/spec/sms_aero/operations/send_to_group_spec.rb +0 -185
- data/spec/sms_aero/types/sign_status_spec.rb +0 -19
data/lib/sms_aero/models/sms.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# Describes an SMS that can be send to either a phone or a group
|
2
|
-
class SmsAero
|
3
|
-
class Sms < Evil::Struct
|
4
|
-
attribute :from, Types::FilledString
|
5
|
-
attribute :text, Types::FilledString
|
6
|
-
attribute :date, Types::Future, optional: true
|
7
|
-
attribute :digital, Types::Digital, optional: true
|
8
|
-
attribute :type, Types::Channel, default: -> (*) do
|
9
|
-
if digital == 1
|
10
|
-
Dry::Initializer::UNDEFINED
|
11
|
-
else
|
12
|
-
2
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class SmsAero
|
2
|
-
operation :add_phone do
|
3
|
-
documentation "https://smsaero.ru/api/description/#contacts"
|
4
|
-
|
5
|
-
path { "addphone" }
|
6
|
-
|
7
|
-
query do
|
8
|
-
attribute :phone, Types::Phone
|
9
|
-
attribute :group, Types::FilledString, optional: true
|
10
|
-
attribute :lname, Types::FilledString, optional: true
|
11
|
-
attribute :fname, Types::FilledString, optional: true
|
12
|
-
attribute :sname, Types::FilledString, optional: true
|
13
|
-
attribute :param, Types::FilledString, optional: true
|
14
|
-
attribute :bday, Types::Birthday, optional: true
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class SmsAero
|
2
|
-
operation :check_groups do
|
3
|
-
documentation "https://smsaero.ru/api/description/#groups"
|
4
|
-
|
5
|
-
path { "checkgroup" }
|
6
|
-
|
7
|
-
response :success, 200, format: :json do
|
8
|
-
attribute :result, Types::FilledString
|
9
|
-
attribute :reason, Types::Hash, as: :channels
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class SmsAero
|
2
|
-
operation :check_senders do
|
3
|
-
documentation "https://smsaero.ru/api/description/#signs"
|
4
|
-
|
5
|
-
path { "senders" }
|
6
|
-
|
7
|
-
query do
|
8
|
-
attribute :sign, Types::FilledString
|
9
|
-
end
|
10
|
-
|
11
|
-
response :success, 200, format: :json, model: Answer do
|
12
|
-
attribute :data, Types::Array.member(Types::FilledString)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class SmsAero
|
2
|
-
operation :check_sign do
|
3
|
-
documentation "https://smsaero.ru/api/description/#signs"
|
4
|
-
|
5
|
-
path { "sign" }
|
6
|
-
|
7
|
-
query do
|
8
|
-
attribute :sign, Types::FilledString
|
9
|
-
end
|
10
|
-
|
11
|
-
response :success, 200, format: :json do
|
12
|
-
attribute :data, Types::Array.member(Types::SignStatus), as: :statuses
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class SmsAero
|
2
|
-
operation :check_tariff do
|
3
|
-
documentation "https://smsaero.ru/api/description/#get-balance"
|
4
|
-
|
5
|
-
path { "checktarif" }
|
6
|
-
|
7
|
-
response :success, 200, format: :json do
|
8
|
-
attribute :result, Types::FilledString
|
9
|
-
attribute :reason, Tariff, as: :tariff
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
class SmsAero
|
2
|
-
HLR_STATUSES = {
|
3
|
-
1 => :available,
|
4
|
-
2 => :unavailable,
|
5
|
-
3 => :nonexistent
|
6
|
-
}.freeze
|
7
|
-
|
8
|
-
operation :hlr do
|
9
|
-
documentation "https://smsaero.ru/api/description/#hlr"
|
10
|
-
|
11
|
-
path { "hlr" }
|
12
|
-
|
13
|
-
query { attribute :phone, Types::Phone }
|
14
|
-
|
15
|
-
response :success, 200, format: :json, model: Answer do
|
16
|
-
attribute :id, proc(&:to_s)
|
17
|
-
attribute :success, default: proc { id != "" }
|
18
|
-
end
|
19
|
-
|
20
|
-
response :failure, 200, format: :json, model: Answer do
|
21
|
-
attribute :success, default: proc { false }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
operation :hlr_status do
|
26
|
-
documentation "https://smsaero.ru/api/description/#hlr"
|
27
|
-
|
28
|
-
path { "hlrStatus" }
|
29
|
-
|
30
|
-
query { attribute :id, Types::Coercible::String.constrained(filled: true) }
|
31
|
-
|
32
|
-
response :success, 200, format: :json, model: Answer do
|
33
|
-
attribute :status, -> (s) { HLR_STATUSES[s.to_i] }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
class SmsAero
|
2
|
-
operation :send_sms do |settings|
|
3
|
-
documentation "https://smsaero.ru/api/description/#send-sms"
|
4
|
-
|
5
|
-
path do |test: false, **|
|
6
|
-
settings.test || test ? "testsend" : "send"
|
7
|
-
end
|
8
|
-
|
9
|
-
query model: Sms do
|
10
|
-
attribute :to, Types::Phone
|
11
|
-
end
|
12
|
-
|
13
|
-
response :success, 200, format: :json, model: Answer do
|
14
|
-
attribute :id, proc(&:to_s)
|
15
|
-
attribute :success, default: proc { id != "" }
|
16
|
-
end
|
17
|
-
|
18
|
-
response :failure, 200, format: :json, model: Answer do
|
19
|
-
attribute :success, default: proc { false }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class SmsAero
|
2
|
-
operation :send_to_group do
|
3
|
-
documentation "https://smsaero.ru/api/description/#send-sms"
|
4
|
-
|
5
|
-
path { "sendtogroup" }
|
6
|
-
|
7
|
-
query model: Sms do
|
8
|
-
attribute :group, Types::FilledString, default: proc { "all" }
|
9
|
-
end
|
10
|
-
|
11
|
-
response :success, 200, format: :json, model: Answer do
|
12
|
-
attribute :id, Types::Coercible::String, optional: true
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module SmsAero::Types
|
2
|
-
# Describes a user's birthday in year-month-date format
|
3
|
-
# Accepts dates, times, datetimes, and strings parceable to dates
|
4
|
-
#
|
5
|
-
# @example
|
6
|
-
# SmsAero::Types::Birthday["1901-12-9"] # => "1901-12-09"
|
7
|
-
# SmsAero::Types::Birthday[Time.new(1901, 12, 9, 10, 12)] # => "1901-12-09"
|
8
|
-
#
|
9
|
-
Birthday = Strict::String
|
10
|
-
.constrained(format: /\A\d{4}-\d{2}-\d{2}\z/)
|
11
|
-
.constructor do |value|
|
12
|
-
begin
|
13
|
-
date = value.to_date if value.respond_to? :to_date
|
14
|
-
date ||= ::Date.parse(value.to_s)
|
15
|
-
date.strftime "%Y-%m-%d"
|
16
|
-
rescue StandardError
|
17
|
-
raise TypeError, "#{value.inspect} cannot be coerced to date"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module SmsAero::Types
|
2
|
-
# Describes coercible Unix time in future
|
3
|
-
Future = Strict::Int.constructor do |value|
|
4
|
-
begin
|
5
|
-
error = TypeError.new "#{value.inspect} is not a valid time in future"
|
6
|
-
|
7
|
-
time = value.to_time if value.respond_to? :to_time
|
8
|
-
time ||= ::Time.parse(value.to_s) unless value.is_a? Numeric
|
9
|
-
number = time.to_i
|
10
|
-
|
11
|
-
number > ::Time.now.to_i ? number : raise(error)
|
12
|
-
rescue StandardError
|
13
|
-
raise error
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/lib/sms_aero/types/phone.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
module SmsAero::Types
|
2
|
-
# Describes a valid phone containing digits without lead zeros
|
3
|
-
#
|
4
|
-
# @example
|
5
|
-
# SmsAero::Types::Phone["07 (123) 134-12-08"] # => "71231341208"
|
6
|
-
# SmsAero::Types::Phone["008"] # raises #<Dry::Types::ConstraintError ...>
|
7
|
-
#
|
8
|
-
Phone = Strict::String.constrained(format: /\A\d{11,13}\z/)
|
9
|
-
.constructor do |value|
|
10
|
-
value.to_s.scan(/\d/).join[/[^0].*/].to_s
|
11
|
-
end
|
12
|
-
end
|
@@ -1,96 +0,0 @@
|
|
1
|
-
describe SmsAero do
|
2
|
-
let(:settings) { { user: "LOGIN", password: "PASSWORD" } }
|
3
|
-
let(:client) { described_class.new(settings) }
|
4
|
-
|
5
|
-
before { stub_request(:any, //).to_return(body: answer.to_json) }
|
6
|
-
|
7
|
-
describe "#hlr" do
|
8
|
-
let(:params) { { phone: "+7(002)034-5678" } }
|
9
|
-
let(:answer) { { result: "accepted", id: 123 } }
|
10
|
-
let(:url) do
|
11
|
-
"https://gate.smsaero.ru/hlr?answer=json&user=LOGIN&" \
|
12
|
-
"password=319f4d26e3c536b5dd871bb2c52e3178&phone=70020345678"
|
13
|
-
end
|
14
|
-
|
15
|
-
subject { client.hlr params }
|
16
|
-
|
17
|
-
it "sends a request" do
|
18
|
-
subject
|
19
|
-
expect(a_request(:post, url)).to have_been_made
|
20
|
-
end
|
21
|
-
|
22
|
-
it "returns success" do
|
23
|
-
expect(subject).to be_kind_of SmsAero::Answer
|
24
|
-
expect(subject.result).to eq "accepted"
|
25
|
-
expect(subject.id).to eq "123"
|
26
|
-
end
|
27
|
-
|
28
|
-
context "with invalid phone" do
|
29
|
-
let(:params) { { phone: "123" } }
|
30
|
-
|
31
|
-
it "raises an exception" do
|
32
|
-
expect { subject }.to raise_error(TypeError, /123/)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context "without a phone" do
|
37
|
-
let(:params) { {} }
|
38
|
-
|
39
|
-
it "raises an exception" do
|
40
|
-
expect { subject }.to raise_error(ArgumentError)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
context "when rejected" do
|
45
|
-
let(:answer) { { result: "rejected" } }
|
46
|
-
|
47
|
-
it "has success false" do
|
48
|
-
expect(subject.success).to be_falsey
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "#hlr_status" do
|
54
|
-
let(:params) { { id: 1 } }
|
55
|
-
let(:status) { 1 }
|
56
|
-
let(:answer) { { result: "accepted", status: status } }
|
57
|
-
let(:url) do
|
58
|
-
"https://gate.smsaero.ru/hlrStatus?answer=json&user=LOGIN&" \
|
59
|
-
"password=319f4d26e3c536b5dd871bb2c52e3178&id=1"
|
60
|
-
end
|
61
|
-
|
62
|
-
subject { client.hlr_status params }
|
63
|
-
|
64
|
-
it "sends a request" do
|
65
|
-
subject
|
66
|
-
expect(a_request(:post, url)).to have_been_made
|
67
|
-
end
|
68
|
-
|
69
|
-
it "returns success" do
|
70
|
-
expect(subject).to be_kind_of SmsAero::Answer
|
71
|
-
expect(subject.result).to eq "accepted"
|
72
|
-
end
|
73
|
-
|
74
|
-
it "converts status to sym" do
|
75
|
-
expect(subject.status).to eq :available
|
76
|
-
end
|
77
|
-
|
78
|
-
context "other statuses" do
|
79
|
-
context "unavailable" do
|
80
|
-
let(:status) { 2 }
|
81
|
-
|
82
|
-
it "converts status to sym" do
|
83
|
-
expect(subject.status).to eq :unavailable
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
context "nonexistent" do
|
88
|
-
let(:status) { 3 }
|
89
|
-
|
90
|
-
it "converts status to sym" do
|
91
|
-
expect(subject.status).to eq :nonexistent
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|