sms_aero 0.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.
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