sms_safe 1.0.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 +7 -0
- data/.gitignore +7 -0
- data/.travis.yml +18 -0
- data/Appraisals +19 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +173 -0
- data/Rakefile +15 -0
- data/gemfiles/mail_2_4_4.gemfile +8 -0
- data/gemfiles/mail_2_4_4.gemfile.lock +107 -0
- data/gemfiles/mail_2_5_3.gemfile +8 -0
- data/gemfiles/mail_2_5_3.gemfile.lock +107 -0
- data/gemfiles/mail_2_5_4.gemfile +8 -0
- data/gemfiles/mail_2_5_4.gemfile.lock +106 -0
- data/gemfiles/mail_2_6_1.gemfile +8 -0
- data/gemfiles/mail_2_6_1.gemfile.lock +101 -0
- data/gemfiles/mail_2_6_3.gemfile +8 -0
- data/gemfiles/mail_2_6_3.gemfile.lock +101 -0
- data/lib/sms_safe.rb +10 -0
- data/lib/sms_safe/config.rb +49 -0
- data/lib/sms_safe/hooks.rb +60 -0
- data/lib/sms_safe/interceptor.rb +151 -0
- data/lib/sms_safe/interceptors/action_texter.rb +32 -0
- data/lib/sms_safe/interceptors/nexmo.rb +31 -0
- data/lib/sms_safe/interceptors/twilio.rb +31 -0
- data/lib/sms_safe/message.rb +21 -0
- data/lib/sms_safe/version.rb +3 -0
- data/sms_safe.gemspec +49 -0
- data/test/hooks_test.rb +149 -0
- data/test/interceptor_test.rb +240 -0
- data/test/interceptors/action_texter_test.rb +76 -0
- data/test/interceptors/nexmo_test.rb +73 -0
- data/test/interceptors/twilio_test.rb +72 -0
- data/test/test_helper.rb +88 -0
- metadata +288 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 995545e18c459164e07f01bd321450729f95dfe7
|
4
|
+
data.tar.gz: 631d83f2446e3736b1aadb0c9a78eaaea73b3738
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2e3a1c3a4b4fbc0eb61da46600242b4eaf94b536c35fad468b9b750b937dbe77ab8117d474326fca45bbf01315d474f7de286953e58a0e86f61fd216f3bf98fc
|
7
|
+
data.tar.gz: ee2bd5071bc7684b0b794ff4b00785470aaf5e81db29b003fef34b6672ef4c3abab50d67ec284a98d909eb1c0e07b49f06ee729873f063e5b467e2c3b84ee456
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- "1.9.3"
|
4
|
+
- "2.0.0"
|
5
|
+
- "2.1.1"
|
6
|
+
- "2.1.2"
|
7
|
+
- "2.1.3"
|
8
|
+
- "2.1.5"
|
9
|
+
# Test in all the platforms that "mail" (our main dependency) tests on
|
10
|
+
|
11
|
+
gemfile:
|
12
|
+
- gemfiles/mail_2_6_3.gemfile
|
13
|
+
- gemfiles/mail_2_6_1.gemfile
|
14
|
+
- gemfiles/mail_2_5_4.gemfile
|
15
|
+
- gemfiles/mail_2_5_3.gemfile
|
16
|
+
- gemfiles/mail_2_4_4.gemfile
|
17
|
+
|
18
|
+
script: bundle exec rake test_with_coveralls
|
data/Appraisals
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
appraise "mail-2-6-3" do
|
2
|
+
gem "mail", "2.6.3"
|
3
|
+
end
|
4
|
+
|
5
|
+
appraise "mail-2-6-1" do
|
6
|
+
gem "mail", "2.6.1"
|
7
|
+
end
|
8
|
+
|
9
|
+
appraise "mail-2-5-4" do
|
10
|
+
gem "mail", "2.5.4"
|
11
|
+
end
|
12
|
+
|
13
|
+
appraise "mail-2-5-3" do
|
14
|
+
gem "mail", "2.5.3"
|
15
|
+
end
|
16
|
+
|
17
|
+
appraise "mail-2-4-4" do
|
18
|
+
gem "mail", "2.4.4"
|
19
|
+
end
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014, Daniel Magliola
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
# SmsSafe
|
2
|
+
|
3
|
+
[](https://travis-ci.org/dmagliola/sms_safe)
|
4
|
+
[](https://coveralls.io/r/dmagliola/sms_safe?branch=master)
|
5
|
+
[](https://codeclimate.com/github/dmagliola/sms_safe)
|
6
|
+
[](http://inch-ci.org/github/dmagliola/sms_safe)
|
7
|
+
[](http://badge.fury.io/rb/sms_safe)
|
8
|
+
[](https://gemnasium.com/dmagliola/sms_safe)
|
9
|
+
|
10
|
+
|
11
|
+
SMS safe provides a safety net while you're developing an application that sends SMS.
|
12
|
+
It keeps SMS messages from escaping into the wild.
|
13
|
+
|
14
|
+
Inspired by [MailSafe](https://rubygems.org/gems/mail_safe), it is essentially "MailSafe for SMS".
|
15
|
+
|
16
|
+
Once you've installed and configured this gem, you can rest assured that your app won't send
|
17
|
+
SMS messages to external phone numbers.
|
18
|
+
|
19
|
+
Messages going to your own, internal phone numbers will still go through normally, however, anything else will
|
20
|
+
either get sent to you instead (via SMS or Email), or discarded.
|
21
|
+
|
22
|
+
## Download
|
23
|
+
|
24
|
+
Gem: `gem install sms_safe`
|
25
|
+
|
26
|
+
## Installation
|
27
|
+
|
28
|
+
Load the gem in the appropriate environments in your GemFile. For example, I'm loading this in Gemfile as:
|
29
|
+
|
30
|
+
`gem "sms_safe", group: [:development, :staging]`
|
31
|
+
|
32
|
+
IMPORTANT: Be sure not to load this in your production environment, otherwise, your SMS won't be sent to the proper
|
33
|
+
recipients. In your test environment, you may or may not want this depending on how you are dealing with SMS right now.
|
34
|
+
|
35
|
+
We recommend using [ActionTexter](https://rubygems.org/gems/action_texter) to send your SMS, which already provides
|
36
|
+
for a very good way of switching SMS off in your test environment, while giving you testable objects that you can use
|
37
|
+
to check your logic.
|
38
|
+
|
39
|
+
|
40
|
+
## Configuration
|
41
|
+
|
42
|
+
You should configure SmsSafe in the same initializer that you use for your SMS, so you can make sure that it runs
|
43
|
+
after your Texter gem has been configured.
|
44
|
+
|
45
|
+
```
|
46
|
+
SmsSafe.configure do |config|
|
47
|
+
config.internal_phone_numbers = ['+12223334444', '+447111222222']
|
48
|
+
config.intercept_mechanism = :redirect
|
49
|
+
config.redirect_target = '+12223334444'
|
50
|
+
end
|
51
|
+
|
52
|
+
SmsSafe.hook!(:action_texter) # or :twilio or :nexmo
|
53
|
+
|
54
|
+
```
|
55
|
+
|
56
|
+
Call hook! **after** setting the configuration for your texter gem.
|
57
|
+
|
58
|
+
The configuration specifies:
|
59
|
+
|
60
|
+
- **internal_phone_numbers:** SMS sent to these numbers will be sent normally. These can be specified
|
61
|
+
as a String, Regex, Proc, or an array of the same. Any phone number that doesn't match these is
|
62
|
+
considered external, and its SMS will get intercepted. If left empty, **all** SMS will be intercepted.
|
63
|
+
- **intercept_mechanism:** Whether to `:redirect` (default), `:email` or `:discard` the SMS sent to an external number.
|
64
|
+
- **redirect_target:** If `:redirect`ing, SMS will be sent to this number instead of the original recipient.
|
65
|
+
Can be a String or a Proc
|
66
|
+
- **email_target:** If `:email`ing, SMS will be sent as an e-mail to this e-mail address. Can be a String or a Proc
|
67
|
+
- **discard_delay:** [ms] If `:discard`ing, a delay this long will be introduced, for slightly more realistic
|
68
|
+
performance characteristics.
|
69
|
+
|
70
|
+
|
71
|
+
## Interception mechanisms
|
72
|
+
|
73
|
+
When an SMS is being sent to a phone number that is not recognized as internal, it gets intercepted
|
74
|
+
and it will be processed according to the `intercept_mechanism` configured.
|
75
|
+
|
76
|
+
**IMPORTANT!**
|
77
|
+
|
78
|
+
If you choose to `:email` or `:discard` instead of `:redirect`ing, then when you send a message
|
79
|
+
the return value from your texter gem can be nil if the SMS does get intercepted.
|
80
|
+
You need to account for that, and consider it a successful send for your app logic.
|
81
|
+
|
82
|
+
|
83
|
+
### Redirection
|
84
|
+
|
85
|
+
SMS will be sent anyway, but to the number specified by `redirect_target`.
|
86
|
+
|
87
|
+
A string "(SmsSafe: #{original_phone_number})" will be added, so you know it was meant for a different number.
|
88
|
+
|
89
|
+
### Emailing
|
90
|
+
|
91
|
+
Instead of sending the SMS, an e-mail will be sent to the address specified by `email_target`, describing all the information about the SMS.
|
92
|
+
This is useful in dev / staging as a less annoying alternative to SMS'ing yourself, and also
|
93
|
+
for teams, since multiple people may end up having access to the e-mail, as opposed to an SMS.
|
94
|
+
|
95
|
+
### Discarding
|
96
|
+
|
97
|
+
In some cases, you just don't care, you simply don't want to be notified. This is particularly useful
|
98
|
+
if you are doing load testing / stress testing, where millions of SMS / emails might end up being sent to you.
|
99
|
+
|
100
|
+
For this scenario, we include the `discard_delay` setting, which will make the "sending" take longer
|
101
|
+
than a simple discard. You should set this to an average value that your SMS provider exhibits. This way,
|
102
|
+
even if you are queueing SMS sending using Resque / DelayedJob, you can still check that, when dealing with
|
103
|
+
a real load, your queue workers can keep up with the demand.
|
104
|
+
|
105
|
+
|
106
|
+
## Supported Libraries
|
107
|
+
|
108
|
+
SmsSafe can currently hook into the following texter gems:
|
109
|
+
|
110
|
+
- **[ActionTexter](https://rubygems.org/gems/action_texter)**
|
111
|
+
- [Nexmo](https://rubygems.org/gems/nexmo)
|
112
|
+
- [Twilio Ruby](https://rubygems.org/gems/twilio-ruby)
|
113
|
+
|
114
|
+
Of these 3, ActionTexter is the only one that provides useful functionality for automated testing,
|
115
|
+
and functionality for interceptors / observers. It also works natively with both Twilio and Nexmo,
|
116
|
+
so we recommend it extensively.
|
117
|
+
|
118
|
+
For Nexmo and Twilio Ruby, unfortunately, the way we hook is by monkey-patching them. This works,
|
119
|
+
but it's not ideal, so we recommend using ActionTexter if you can.
|
120
|
+
|
121
|
+
If you would like the SmsSafe functionality but you use another SMS provider / gem, you can add the new provider
|
122
|
+
and submit a Pull Request (see bottom of README), add the new provider to [ActionTexter](https://github.com/watu/action_texter),
|
123
|
+
or just ask, I'd like to extend this gem as much as possible.
|
124
|
+
|
125
|
+
|
126
|
+
## Version Compatibility and Continuous Integration
|
127
|
+
|
128
|
+
Tested with [Travis](https://travis-ci.org/dmagliola/sms_safe) using Ruby 1.9.3, 2.0, 2.1.1, 2.1.2, 2.1.3 and 2.1.5,
|
129
|
+
and against mail 2.6.3, 2.6.1, 2.5.4, 2.5.3 and 2.4.4.
|
130
|
+
|
131
|
+
To locally run tests do:
|
132
|
+
|
133
|
+
````
|
134
|
+
appraisal rake test
|
135
|
+
```
|
136
|
+
|
137
|
+
## Copyright
|
138
|
+
|
139
|
+
Copyright (c) 2014, 2015, Daniel Magliola
|
140
|
+
|
141
|
+
See LICENSE for details.
|
142
|
+
|
143
|
+
|
144
|
+
## Users
|
145
|
+
|
146
|
+
This gem is being used by:
|
147
|
+
|
148
|
+
- [MSTY](https://www.msty.com)
|
149
|
+
- You? please, let us know if you are using this gem.
|
150
|
+
|
151
|
+
|
152
|
+
## Changelog
|
153
|
+
|
154
|
+
### Version 1.0.0 (Jan 2nd, 2015)
|
155
|
+
- Newly released gem, supports ActionTexter, Nexmo and Twilio.
|
156
|
+
- Still waiting to make sure Mail configuration works transparently for both Mail and ActionMailer.
|
157
|
+
- Also waiting to figure out how to get Coveralls to recognize the true coverage (aka 100%)
|
158
|
+
|
159
|
+
|
160
|
+
## Contributing
|
161
|
+
|
162
|
+
1. Fork it
|
163
|
+
1. Create your feature branch (`git checkout -b my-new-feature`)
|
164
|
+
1. Code your thing
|
165
|
+
1. Write and run tests:
|
166
|
+
bundle install
|
167
|
+
appraisal
|
168
|
+
appraisal rake test
|
169
|
+
1. Write documentation and make sure it looks good: yard server --reload
|
170
|
+
1. Add items to the changelog, in README.
|
171
|
+
1. Commit your changes (`git commit -am "Add some feature"`)
|
172
|
+
1. Push to the branch (`git push origin my-new-feature`)
|
173
|
+
1. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler/setup"
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
|
5
|
+
require "rake/testtask"
|
6
|
+
Rake::TestTask.new do |t|
|
7
|
+
t.libs << "lib"
|
8
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
9
|
+
end
|
10
|
+
|
11
|
+
task :default => :test
|
12
|
+
|
13
|
+
require 'coveralls/rake/task'
|
14
|
+
Coveralls::RakeTask.new
|
15
|
+
task :test_with_coveralls => ["test", "coveralls:push"]
|
@@ -0,0 +1,107 @@
|
|
1
|
+
GIT
|
2
|
+
remote: git://github.com/mstycom/action_texter.git
|
3
|
+
revision: 75dea6a6dffe3e69082f1e2b50403f0e6c567119
|
4
|
+
specs:
|
5
|
+
action_texter (0.2.0)
|
6
|
+
|
7
|
+
PATH
|
8
|
+
remote: ../
|
9
|
+
specs:
|
10
|
+
sms_safe (0.1.0)
|
11
|
+
mail (>= 2.4)
|
12
|
+
|
13
|
+
GEM
|
14
|
+
remote: https://rubygems.org/
|
15
|
+
specs:
|
16
|
+
activesupport (4.2.0)
|
17
|
+
i18n (~> 0.7)
|
18
|
+
json (~> 1.7, >= 1.7.7)
|
19
|
+
minitest (~> 5.1)
|
20
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
21
|
+
tzinfo (~> 1.1)
|
22
|
+
ansi (1.4.3)
|
23
|
+
appraisal (1.0.2)
|
24
|
+
bundler
|
25
|
+
rake
|
26
|
+
thor (>= 0.14.0)
|
27
|
+
builder (3.2.2)
|
28
|
+
codeclimate-test-reporter (0.4.3)
|
29
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
30
|
+
coveralls (0.7.1)
|
31
|
+
multi_json (~> 1.3)
|
32
|
+
rest-client
|
33
|
+
simplecov (>= 0.7)
|
34
|
+
term-ansicolor
|
35
|
+
thor
|
36
|
+
docile (1.1.5)
|
37
|
+
i18n (0.7.0)
|
38
|
+
json (1.8.1)
|
39
|
+
jwt (1.0.0)
|
40
|
+
mail (2.4.4)
|
41
|
+
i18n (>= 0.4.0)
|
42
|
+
mime-types (~> 1.16)
|
43
|
+
treetop (~> 1.4.8)
|
44
|
+
metaclass (0.0.4)
|
45
|
+
mime-types (1.25.1)
|
46
|
+
minitest (5.5.0)
|
47
|
+
minitest-reporters (1.0.8)
|
48
|
+
ansi
|
49
|
+
builder
|
50
|
+
minitest (>= 5.0)
|
51
|
+
ruby-progressbar
|
52
|
+
mocha (1.1.0)
|
53
|
+
metaclass (~> 0.0.1)
|
54
|
+
multi_json (1.10.1)
|
55
|
+
netrc (0.10.2)
|
56
|
+
nexmo (2.0.0)
|
57
|
+
polyglot (0.3.5)
|
58
|
+
rake (10.4.2)
|
59
|
+
rest-client (1.7.2)
|
60
|
+
mime-types (>= 1.16, < 3.0)
|
61
|
+
netrc (~> 0.7)
|
62
|
+
ruby-progressbar (1.7.1)
|
63
|
+
shoulda (3.5.0)
|
64
|
+
shoulda-context (~> 1.0, >= 1.0.1)
|
65
|
+
shoulda-matchers (>= 1.4.1, < 3.0)
|
66
|
+
shoulda-context (1.2.1)
|
67
|
+
shoulda-matchers (2.7.0)
|
68
|
+
activesupport (>= 3.0.0)
|
69
|
+
simplecov (0.9.1)
|
70
|
+
docile (~> 1.1.0)
|
71
|
+
multi_json (~> 1.0)
|
72
|
+
simplecov-html (~> 0.8.0)
|
73
|
+
simplecov-html (0.8.0)
|
74
|
+
term-ansicolor (1.3.0)
|
75
|
+
tins (~> 1.0)
|
76
|
+
thor (0.19.1)
|
77
|
+
thread_safe (0.3.4)
|
78
|
+
tins (1.3.3)
|
79
|
+
treetop (1.4.15)
|
80
|
+
polyglot
|
81
|
+
polyglot (>= 0.3.1)
|
82
|
+
twilio-ruby (3.14.2)
|
83
|
+
builder (>= 2.1.2)
|
84
|
+
jwt (~> 1.0.0)
|
85
|
+
multi_json (>= 1.3.0)
|
86
|
+
tzinfo (1.2.2)
|
87
|
+
thread_safe (~> 0.1)
|
88
|
+
|
89
|
+
PLATFORMS
|
90
|
+
ruby
|
91
|
+
|
92
|
+
DEPENDENCIES
|
93
|
+
action_texter (= 0.2.0)!
|
94
|
+
appraisal
|
95
|
+
bundler
|
96
|
+
codeclimate-test-reporter
|
97
|
+
coveralls
|
98
|
+
mail (= 2.4.4)
|
99
|
+
minitest
|
100
|
+
minitest-reporters
|
101
|
+
mocha
|
102
|
+
nexmo
|
103
|
+
rake
|
104
|
+
shoulda
|
105
|
+
simplecov
|
106
|
+
sms_safe!
|
107
|
+
twilio-ruby
|
@@ -0,0 +1,107 @@
|
|
1
|
+
GIT
|
2
|
+
remote: git://github.com/mstycom/action_texter.git
|
3
|
+
revision: 75dea6a6dffe3e69082f1e2b50403f0e6c567119
|
4
|
+
specs:
|
5
|
+
action_texter (0.2.0)
|
6
|
+
|
7
|
+
PATH
|
8
|
+
remote: ../
|
9
|
+
specs:
|
10
|
+
sms_safe (0.1.0)
|
11
|
+
mail (>= 2.4)
|
12
|
+
|
13
|
+
GEM
|
14
|
+
remote: https://rubygems.org/
|
15
|
+
specs:
|
16
|
+
activesupport (4.2.0)
|
17
|
+
i18n (~> 0.7)
|
18
|
+
json (~> 1.7, >= 1.7.7)
|
19
|
+
minitest (~> 5.1)
|
20
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
21
|
+
tzinfo (~> 1.1)
|
22
|
+
ansi (1.4.3)
|
23
|
+
appraisal (1.0.2)
|
24
|
+
bundler
|
25
|
+
rake
|
26
|
+
thor (>= 0.14.0)
|
27
|
+
builder (3.2.2)
|
28
|
+
codeclimate-test-reporter (0.4.3)
|
29
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
30
|
+
coveralls (0.7.1)
|
31
|
+
multi_json (~> 1.3)
|
32
|
+
rest-client
|
33
|
+
simplecov (>= 0.7)
|
34
|
+
term-ansicolor
|
35
|
+
thor
|
36
|
+
docile (1.1.5)
|
37
|
+
i18n (0.7.0)
|
38
|
+
json (1.8.1)
|
39
|
+
jwt (1.0.0)
|
40
|
+
mail (2.5.3)
|
41
|
+
i18n (>= 0.4.0)
|
42
|
+
mime-types (~> 1.16)
|
43
|
+
treetop (~> 1.4.8)
|
44
|
+
metaclass (0.0.4)
|
45
|
+
mime-types (1.25.1)
|
46
|
+
minitest (5.5.0)
|
47
|
+
minitest-reporters (1.0.8)
|
48
|
+
ansi
|
49
|
+
builder
|
50
|
+
minitest (>= 5.0)
|
51
|
+
ruby-progressbar
|
52
|
+
mocha (1.1.0)
|
53
|
+
metaclass (~> 0.0.1)
|
54
|
+
multi_json (1.10.1)
|
55
|
+
netrc (0.10.2)
|
56
|
+
nexmo (2.0.0)
|
57
|
+
polyglot (0.3.5)
|
58
|
+
rake (10.4.2)
|
59
|
+
rest-client (1.7.2)
|
60
|
+
mime-types (>= 1.16, < 3.0)
|
61
|
+
netrc (~> 0.7)
|
62
|
+
ruby-progressbar (1.7.1)
|
63
|
+
shoulda (3.5.0)
|
64
|
+
shoulda-context (~> 1.0, >= 1.0.1)
|
65
|
+
shoulda-matchers (>= 1.4.1, < 3.0)
|
66
|
+
shoulda-context (1.2.1)
|
67
|
+
shoulda-matchers (2.7.0)
|
68
|
+
activesupport (>= 3.0.0)
|
69
|
+
simplecov (0.9.1)
|
70
|
+
docile (~> 1.1.0)
|
71
|
+
multi_json (~> 1.0)
|
72
|
+
simplecov-html (~> 0.8.0)
|
73
|
+
simplecov-html (0.8.0)
|
74
|
+
term-ansicolor (1.3.0)
|
75
|
+
tins (~> 1.0)
|
76
|
+
thor (0.19.1)
|
77
|
+
thread_safe (0.3.4)
|
78
|
+
tins (1.3.3)
|
79
|
+
treetop (1.4.15)
|
80
|
+
polyglot
|
81
|
+
polyglot (>= 0.3.1)
|
82
|
+
twilio-ruby (3.14.2)
|
83
|
+
builder (>= 2.1.2)
|
84
|
+
jwt (~> 1.0.0)
|
85
|
+
multi_json (>= 1.3.0)
|
86
|
+
tzinfo (1.2.2)
|
87
|
+
thread_safe (~> 0.1)
|
88
|
+
|
89
|
+
PLATFORMS
|
90
|
+
ruby
|
91
|
+
|
92
|
+
DEPENDENCIES
|
93
|
+
action_texter (= 0.2.0)!
|
94
|
+
appraisal
|
95
|
+
bundler
|
96
|
+
codeclimate-test-reporter
|
97
|
+
coveralls
|
98
|
+
mail (= 2.5.3)
|
99
|
+
minitest
|
100
|
+
minitest-reporters
|
101
|
+
mocha
|
102
|
+
nexmo
|
103
|
+
rake
|
104
|
+
shoulda
|
105
|
+
simplecov
|
106
|
+
sms_safe!
|
107
|
+
twilio-ruby
|