sms_aero 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +7 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +12 -0
  6. data/.travis.yml +17 -0
  7. data/Gemfile +12 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +126 -0
  10. data/Rakefile +6 -0
  11. data/lib/sms_aero.rb +55 -0
  12. data/lib/sms_aero/models/answer.rb +8 -0
  13. data/lib/sms_aero/models/sms.rb +15 -0
  14. data/lib/sms_aero/models/tariff.rb +8 -0
  15. data/lib/sms_aero/operations/add_blacklist.rb +11 -0
  16. data/lib/sms_aero/operations/add_group.rb +11 -0
  17. data/lib/sms_aero/operations/add_phone.rb +17 -0
  18. data/lib/sms_aero/operations/check_balance.rb +11 -0
  19. data/lib/sms_aero/operations/check_groups.rb +12 -0
  20. data/lib/sms_aero/operations/check_senders.rb +15 -0
  21. data/lib/sms_aero/operations/check_sending.rb +11 -0
  22. data/lib/sms_aero/operations/check_sign.rb +15 -0
  23. data/lib/sms_aero/operations/check_status.rb +11 -0
  24. data/lib/sms_aero/operations/check_tariff.rb +12 -0
  25. data/lib/sms_aero/operations/delete_group.rb +11 -0
  26. data/lib/sms_aero/operations/delete_phone.rb +12 -0
  27. data/lib/sms_aero/operations/send_sms.rb +17 -0
  28. data/lib/sms_aero/operations/send_to_group.rb +15 -0
  29. data/lib/sms_aero/types/birthday.rb +20 -0
  30. data/lib/sms_aero/types/channel.rb +4 -0
  31. data/lib/sms_aero/types/digital.rb +8 -0
  32. data/lib/sms_aero/types/filled_string.rb +3 -0
  33. data/lib/sms_aero/types/future.rb +16 -0
  34. data/lib/sms_aero/types/phone.rb +12 -0
  35. data/lib/sms_aero/types/sign_status.rb +9 -0
  36. data/sms_aero.gemspec +23 -0
  37. data/spec/sms_aero/operations/add_blacklist_spec.rb +88 -0
  38. data/spec/sms_aero/operations/add_group_spec.rb +88 -0
  39. data/spec/sms_aero/operations/add_phone_spec.rb +221 -0
  40. data/spec/sms_aero/operations/check_balance_spec.rb +85 -0
  41. data/spec/sms_aero/operations/check_groups_spec.rb +72 -0
  42. data/spec/sms_aero/operations/check_senders_spec.rb +98 -0
  43. data/spec/sms_aero/operations/check_sending_spec.rb +88 -0
  44. data/spec/sms_aero/operations/check_sign_spec.rb +87 -0
  45. data/spec/sms_aero/operations/check_status_spec.rb +88 -0
  46. data/spec/sms_aero/operations/check_tariff_spec.rb +72 -0
  47. data/spec/sms_aero/operations/delete_group_spec.rb +88 -0
  48. data/spec/sms_aero/operations/delete_phone_spec.rb +118 -0
  49. data/spec/sms_aero/operations/send_sms_spec.rb +179 -0
  50. data/spec/sms_aero/operations/send_to_group_spec.rb +171 -0
  51. data/spec/sms_aero/types/birthday_spec.rb +33 -0
  52. data/spec/sms_aero/types/channel_spec.rb +19 -0
  53. data/spec/sms_aero/types/digital_spec.rb +15 -0
  54. data/spec/sms_aero/types/future_spec.rb +38 -0
  55. data/spec/sms_aero/types/phone_spec.rb +21 -0
  56. data/spec/sms_aero/types/sign_status_spec.rb +19 -0
  57. data/spec/spec_helper.rb +20 -0
  58. metadata +205 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fd3453fde3013efda34bdd4eef1de330c07933fc
4
+ data.tar.gz: 62bb50f526ccfd080df2b399fdefad5aedfbdc15
5
+ SHA512:
6
+ metadata.gz: 6ac5ea53d23db0b146cc6aea6cac0cf4ebad9f0f72715d8b9b085f3bf0d42c299a7d91530fdfd51483ceb35d97700f0df2d232d3b791a01c092ac0390502b044
7
+ data.tar.gz: a9a944438acf080749852be2fbcb5dedc3e23c79098269d89b8e21d546bfd3d09c20eb1e93b2d28f1c2e176c782f03927c053bd63a5c6691d902dfd442dab477
data/.codeclimate.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ engines:
3
+ rubocop:
4
+ enabled: true
5
+ checks:
6
+ Rubocop/Style/FrozenStringLiteralComment:
7
+ enabled: false
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --require spec_helper
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,12 @@
1
+ ---
2
+ AllCops:
3
+ DisplayCopNames: true
4
+ DisplayStyleGuide: true
5
+ StyleGuideCopsOnly: true
6
+ TargetRubyVersion: 2.3
7
+
8
+ Style/Lambda:
9
+ Enabled: false
10
+
11
+ Style/StringLiterals:
12
+ EnforcedStyle: double_quotes
data/.travis.yml ADDED
@@ -0,0 +1,17 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ script:
6
+ - bundle exec rspec
7
+ - bundle exec rubocop
8
+ rvm:
9
+ - '2.3.0'
10
+ - ruby-head
11
+ - jruby-9.1.0.0
12
+ - jruby-head
13
+ before_install: gem install bundler -v 1.12.5
14
+ matrix:
15
+ allow_failures:
16
+ - rvm: ruby-head
17
+ - rvm: jruby-head
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in sms_aero.gemspec
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem "pry", platform: :mri
8
+ gem "pry-byebug", platform: :mri
9
+ end
10
+
11
+ gem "evil-client", github: "evilmartians/evil-client", branch: "master"
12
+ gem "dry-initializer", github: "dry-rb/dry-initializer", branch: "master"
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Andrew Kozin (aka nepalez)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # SmsAero
2
+
3
+ [![Gem Version][gem-badger]][gem]
4
+ [![Build Status][travis-badger]][travis]
5
+ [![Dependency Status][gemnasium-badger]][gemnasium]
6
+ [![Code Climate][codeclimate-badger]][codeclimate]
7
+
8
+ HTTP(s) client to [SMS Aero service API][sms-aero].
9
+
10
+ [sms-aero]: https://smsaero.ru/api/description/
11
+ [codeclimate-badger]: https://img.shields.io/codeclimate/github/nepalez/sms_aero.svg?style=flat
12
+ [codeclimate]: https://codeclimate.com/github/nepalez/sms_aero
13
+ [gem-badger]: https://img.shields.io/gem/v/sms_aero.svg?style=flat
14
+ [gem]: https://rubygems.org/gems/sms_aero
15
+ [gemnasium-badger]: https://img.shields.io/gemnasium/nepalez/sms_aero.svg?style=flat
16
+ [gemnasium]: https://gemnasium.com/nepalez/sms_aero
17
+ [travis-badger]: https://img.shields.io/travis/nepalez/sms_aero/master.svg?style=flat
18
+ [travis]: https://travis-ci.org/nepalez/sms_aero
19
+
20
+ ## Synopsis
21
+
22
+ See [operation specs][specs] for more verbose examples.
23
+
24
+ [specs]: https://github.com/nepalez/sms_aero/tree/master/spec/sms_aero/operations
25
+
26
+ Initialize a client with user and password:
27
+
28
+ ```ruby
29
+ client = SmsAero.new user: "joe", password: "foobar"
30
+ ```
31
+
32
+ Then send requests:
33
+
34
+ ```ruby
35
+ answer = client.send_sms text: "Hello!",
36
+ to: "+7 (909) 382-84-45",
37
+ date: "2100/01/12", # Date, Time, DateTime are accepted as well
38
+ type: 3 # see API docs for details
39
+
40
+ answer.result # => "accepted"
41
+ answer.id # => "38293"
42
+ ```
43
+
44
+ ```ruby
45
+ answer = client.check_status id: "38293"
46
+ answer.result # => "pending"
47
+ ```
48
+
49
+ ```ruby
50
+ answer = client.send_to_group text: "Hello!",
51
+ group: "customers",
52
+ date: "2100/01/12",
53
+ type: 1
54
+
55
+ answer.result # => "accepted"
56
+ answer.id # => "894924"
57
+ ```
58
+
59
+ ```ruby
60
+ answer = client.check_sending id: "894924"
61
+ answer.result # => "pending"
62
+ ```
63
+
64
+ ```ruby
65
+ answer = client.add_blacklist phone: "+7 (999) 123-45-67"
66
+ answer.result # => "accepted"
67
+ ```
68
+
69
+ ```ruby
70
+ answer = client.add_group group: "baz"
71
+ answer.result # => "accepted"
72
+ ```
73
+
74
+ ```ruby
75
+ answer = client.add_phone phone: "+7 (999) 123-45-67",
76
+ group: "customers",
77
+ fname: "John",
78
+ lname: "Paul",
79
+ lname: "Doe",
80
+ bday: "1998/08/12",
81
+ param: "VIP"
82
+
83
+ answer.result # => "accepted"
84
+ ```
85
+
86
+ ```ruby
87
+ answer = client.check_balance
88
+ answer.result # => "accepted"
89
+ answer.balance # => 1973.2
90
+ ```
91
+
92
+ ```ruby
93
+ answer = client.check_groups
94
+ answer.result # => "accepted"
95
+ answer.channels # => ["customers", "employee"]
96
+ ```
97
+
98
+ ```ruby
99
+ answer = client.check_senders sign: "qux"
100
+ answer.result # => "accepted"
101
+ answer.result # => ["peter", "paul"]
102
+ ```
103
+
104
+ ```ruby
105
+ answer = client.check_sign sign: "qux"
106
+ answer.result # => "accepted"
107
+ answer.data # => ["approved"]
108
+ ```
109
+
110
+ ```ruby
111
+ answer = client.check_tariff
112
+ answer.result # => "accepted"
113
+ answer.tariff # => { direct: 10.3, digital: 3.89 }
114
+ ```
115
+
116
+ ```ruby
117
+ answer = client.delete_group group: "employee"
118
+ answer.result # => "accepted"
119
+ ```
120
+
121
+ ```ruby
122
+ answer = client.delete_phone phone: "+7 (999) 123-4567",
123
+ group: "customers"
124
+
125
+ answer.result # => "accepted"
126
+ ```
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/lib/sms_aero.rb ADDED
@@ -0,0 +1,55 @@
1
+ require "evil/client"
2
+ require "dry-types"
3
+
4
+ # HTTP(s) client to the "SMS Aero" online service
5
+ class SmsAero
6
+ extend Evil::Client::DSL
7
+
8
+ # Collection of dry-types with gem-specific additions
9
+ Types = Module.new { |types| types.include Dry::Types.module }
10
+
11
+ # Definitions for types, models, and API operations
12
+ %w(types models operations).each do |folder|
13
+ path = File.expand_path("lib/sms_aero/#{folder}/*.rb")
14
+ Dir[path].each { |file| require(file) }
15
+ end
16
+
17
+ settings do
18
+ option :user, Types::FilledString
19
+ option :password, Types::FilledString
20
+ option :use_ssl, Types::Form::Bool, default: proc { true }
21
+ option :use_post, Types::Form::Bool, default: proc { true }
22
+ end
23
+
24
+ base_url do |settings|
25
+ "http#{"s" if settings.use_ssl}://gate.smsaero.ru/"
26
+ end
27
+
28
+ operation do |settings|
29
+ documentation "https://smsaero.ru/api/description/"
30
+
31
+ http_method(settings.use_post ? :post : :get)
32
+
33
+ security do |user: nil, password: nil, **|
34
+ key_auth :user, user || settings.user, using: :query
35
+ key_auth :password, password || settings.password, using: :query
36
+ key_auth :answer, "json", using: :query
37
+ end
38
+
39
+ responses format: :json do
40
+ response :success, 200, model: Answer
41
+ response :failure, 200, model: Answer
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def method_missing(name, *args)
48
+ op = operations[name.to_sym]
49
+ op ? op.call(*args) : super
50
+ end
51
+
52
+ def respond_to_missing?(name, *)
53
+ operations.key? name.to_sym
54
+ end
55
+ end
@@ -0,0 +1,8 @@
1
+ class SmsAero
2
+ class Answer < Evil::Client::Model
3
+ attribute :reason, default: proc { nil }
4
+ attribute :result,
5
+ Types::FilledString.constructor(&:strip),
6
+ default: proc { "accepted" }
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ # Describes an SMS that can be send to either a phone or a group
2
+ class SmsAero
3
+ class Sms < Evil::Client::Model
4
+ attribute :text, Types::FilledString
5
+ attribute :date, Types::Future, optional: true
6
+ attribute :digital, Types::Digital, optional: true
7
+ attribute :type, Types::Channel, default: -> (*) do
8
+ case digital
9
+ when Dry::Initializer::UNDEFINED
10
+ 2
11
+ else Dry::Initializer::UNDEFINED
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ class SmsAero
2
+ class Tariff < Evil::Client::Model
3
+ attributes type: Types::Coercible::Float, optional: true do
4
+ attribute :"Direct channel", as: :direct
5
+ attribute :"Digital channel", as: :digital
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ class SmsAero
2
+ operation :add_blacklist do
3
+ documentation "https://smsaero.ru/api/description/#balcklist"
4
+
5
+ path { "addblacklist" }
6
+
7
+ query do
8
+ attribute :phone, Types::Phone
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class SmsAero
2
+ operation :add_group do
3
+ documentation "https://smsaero.ru/api/description/#groups"
4
+
5
+ path { "addgroup" }
6
+
7
+ query do
8
+ attribute :group, Types::FilledString
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
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
@@ -0,0 +1,11 @@
1
+ class SmsAero
2
+ operation :check_balance do
3
+ documentation "https://smsaero.ru/api/description/#get-balance"
4
+
5
+ path { "balance" }
6
+
7
+ response :success, 200, format: :json, model: Answer do
8
+ attribute :balance, Types::Coercible::Float
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
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
@@ -0,0 +1,15 @@
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
@@ -0,0 +1,11 @@
1
+ class SmsAero
2
+ operation :check_sending do
3
+ documentation "https://smsaero.ru/api/description/#check-status"
4
+
5
+ path { "checksending" }
6
+
7
+ query do
8
+ attribute :id, Types::Coercible::String.constrained(filled: true)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
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