phony_rails 0.14.11 → 0.14.12

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: bb21cdef27d6696f003b5d1b60a5c6df7365845366eb36769ee17b11d809e277
4
- data.tar.gz: 35e3206fe90042f14332eac06e3e27060ed8cd6fda339863009d55c0f7962291
2
+ SHA1:
3
+ metadata.gz: f5bc5fd8efabff8b0607fe060f2d27b11ddbd948
4
+ data.tar.gz: 68add4fb0fc07c768ecafdd390e1ce471940eb07
5
5
  SHA512:
6
- metadata.gz: 23cee7e1e1d089117a4519c45fd52c456786d92a783f85acc45be269917008b9b50985767fcc630fba544e1a806622e3a37297fad2ed3499a2ab08d5495a36cc
7
- data.tar.gz: 6badf776d61071abf152dfe03ff90a585bbc1c13ae83c2cabf6d2c93ea76ee7773455ffe0a03c8615a9865b23cff001b3b56018d8a50c6f95d59ce7ab0423fc0
6
+ metadata.gz: d61d5e02e7e61a8b15088a09d1ae8cc5db8ce5eb38c388ff2845e27a508a2fde4e12e6780042cec5832992610d54908456423a639671c0a6eb128cb45f24a1ce
7
+ data.tar.gz: 3e61051454973a4ca74a0e863a500f53dfd49bebf26d7e19d311332d8fc701a20dfe55a2ef035cb1184811fcd14809225629023b15e525dce61167a18637456c
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  coverage/*
7
7
  /.bundle
8
8
  /vendor
9
+ Gemfile.lock
data/.travis.yml CHANGED
@@ -2,7 +2,8 @@ language: ruby
2
2
  rvm:
3
3
  - 2.3.7
4
4
  - 2.4.4
5
- - 2.5.1
5
+ - 2.5.5
6
+ - 2.6.2
6
7
  script:
7
8
  - bundle exec rspec spec
8
9
  - bundle exec rubocop
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.14.11](https://github.com/joost/phony_rails/tree/v0.14.11) (2018-10-11)
4
+ [Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.10...v0.14.11)
5
+
6
+ **Closed issues:**
7
+
8
+ - Problem with normalizing Estonian number [\#187](https://github.com/joost/phony_rails/issues/187)
9
+
10
+ **Merged pull requests:**
11
+
12
+ - Add Korean translation\(including spec\) [\#186](https://github.com/joost/phony_rails/pull/186) ([freelyageha](https://github.com/freelyageha))
13
+
3
14
  ## [v0.14.10](https://github.com/joost/phony_rails/tree/v0.14.10) (2018-10-11)
4
15
  [Full Changelog](https://github.com/joost/phony_rails/compare/v0.14.9...v0.14.10)
5
16
 
data/Gemfile CHANGED
@@ -11,6 +11,3 @@ gem 'guard-rspec' # , '~> 4.2.0'
11
11
  gem 'rake'
12
12
  gem 'rspec' # , '~> 2.14.0'
13
13
  gem 'rubocop'
14
-
15
- # For testing
16
- gem 'sqlite3'
data/README.md CHANGED
@@ -156,6 +156,22 @@ validates_plausible_phone :phone_number_normalized, presence: true, if: :phone_n
156
156
 
157
157
  Validation supports phone numbers with extension, such as `+18181231234 x1234` or `'+1 (818)151-5483 #4312'` out-of-the-box.
158
158
 
159
+ Return original value after validation:
160
+
161
+ The flag normalize_when_valid (disabled by default), allows to return the original phone_number when is the object is not valid. When phone validation fails, normalization is not triggered at all. It could prevent a situation where user fills in the phone number and after validation, he gets back different, already normalized phone number value, even if phone number was wrong.
162
+
163
+ Example usage:
164
+
165
+ ```ruby
166
+ validates_plausible_phone :phone_number
167
+ phony_normalize :phone_number, country_code: :country_code, normalize_when_valid: true
168
+ ```
169
+
170
+ Filling in the number will result with following:
171
+
172
+ When the number is incorrect (e.g. phone_number: `+44 888 888 888` for country_code 'PL'), the original validation behavior is preserved, but if the number is still invalid, the original value is returned.
173
+ When number is valid, it will save the normalized number (e.g. `+48 888 888 888` will be saved as `+48888888888`).
174
+
159
175
  #### Allowing records country codes to not match phone number country codes
160
176
 
161
177
  You may have a record specifying one country (via a `country_code` attribute) but using a phone number from another country. For example, your record may be from Japan but have a phone number from the Philippines. By default, `phony_rails` will consider your record's `country_code` as part of the validation. If that country doesn't match the country code in the phone number, validation will fail.
@@ -463,6 +463,8 @@ UA:
463
463
  country_code: '380'
464
464
  UG:
465
465
  country_code: '256'
466
+ UK:
467
+ country_code: '44'
466
468
  UM:
467
469
  country_code: ''
468
470
  US:
data/lib/phony_rails.rb CHANGED
@@ -46,18 +46,18 @@ module PhonyRails
46
46
  # http://www.redguava.com.au/2011/06/rails-convert-phone-numbers-to-international-format-for-sms/
47
47
  def self.normalize_number(number, options = {}, current_instance = nil)
48
48
  return if number.nil?
49
+
49
50
  original_number = number
50
51
  number = number.dup # Just to be sure, we don't want to change the original.
51
52
  number, ext = extract_extension(number)
52
53
  number.gsub!(/[^\(\)\d\+]/, '') # Strips weird stuff from the number
53
54
  return if number.blank?
55
+
54
56
  if _country_number = options[:country_number] || country_number_for(options[:country_code])
55
57
  options[:add_plus] = true if options[:add_plus].nil?
56
58
  # (Force) add country_number if missing
57
59
  # NOTE: do we need to force adding country code? Otherwise we can share logic with next block
58
- if !Phony.plausible?(number) || _country_number != country_code_from_number(number)
59
- number = "#{_country_number}#{number}"
60
- end
60
+ number = "#{_country_number}#{number}" if !Phony.plausible?(number) || _country_number != country_code_from_number(number)
61
61
  elsif _default_country_number = extract_default_country_number(options, current_instance)
62
62
  options[:add_plus] = true if options[:add_plus].nil?
63
63
  number = normalize_number_default_country(number, _default_country_number)
@@ -101,12 +101,14 @@ module PhonyRails
101
101
  # Should probably be named 'country_number_from_number'.
102
102
  def self.country_code_from_number(number)
103
103
  return nil unless Phony.plausible?(number)
104
+
104
105
  Phony.split(Phony.normalize(number)).first
105
106
  end
106
107
 
107
108
  # Returns the country (eg. 'NL') for a number (eg. +31612341234).
108
109
  def self.country_from_number(number)
109
110
  return nil unless Phony.plausible?(number)
111
+
110
112
  country_codes_hash.select { |_country, hash| hash['country_code'] == country_code_from_number(number) }.keys[0]
111
113
  end
112
114
 
@@ -115,6 +117,7 @@ module PhonyRails
115
117
  # It uses the 'cc' option for Phony. This was a required param before?
116
118
  def self.plausible_number?(number, options = {})
117
119
  return false if number.blank?
120
+
118
121
  number = extract_extension(number).first
119
122
  number = normalize_number(number, options)
120
123
  country_number = options[:country_number] || country_number_for(options[:country_code]) ||
@@ -126,10 +129,11 @@ module PhonyRails
126
129
  false
127
130
  end
128
131
 
129
- COMMON_EXTENSIONS = /[ ]*(ext|ex|x|xt|#|:)+[^0-9]*\(?([-0-9]{1,})\)?#?$/i
132
+ COMMON_EXTENSIONS = /[ ]*(ext|ex|x|xt|#|:)+[^0-9]*\(?([-0-9]{1,})\)?#?$/i.freeze
130
133
 
131
134
  def self.extract_extension(number_and_ext)
132
135
  return [nil, nil] if number_and_ext.nil?
136
+
133
137
  subbed = number_and_ext.sub(COMMON_EXTENSIONS, '')
134
138
  [subbed, Regexp.last_match(2)]
135
139
  end
@@ -156,8 +160,10 @@ module PhonyRails
156
160
  attributes.each do |attribute|
157
161
  attribute_name = options[:as] || attribute
158
162
  raise("No attribute #{attribute_name} found on #{self.class.name} (PhonyRails)") unless self.class.attribute_method?(attribute_name)
163
+
164
+ cache_original_attribute(current_instance, attribute) if options[:normalize_when_valid]
159
165
  new_value = PhonyRails.normalize_number(send(attribute), options, current_instance)
160
- send("#{attribute_name}=", new_value) if new_value || attribute_name != attribute
166
+ current_instance.public_send("#{attribute_name}=", new_value) if new_value || attribute_name != attribute
161
167
  end
162
168
  end
163
169
 
@@ -169,7 +175,25 @@ module PhonyRails
169
175
  end
170
176
  end
171
177
 
178
+ def cache_original_attribute(current_instance, attribute)
179
+ current_instance.define_singleton_method("#{attribute}_original=") { |value| @original = value }
180
+ current_instance.define_singleton_method("#{attribute}_original") { @original }
181
+ current_instance.public_send("#{attribute}_original=", current_instance.public_send(attribute.to_s))
182
+ end
183
+
172
184
  module ClassMethods
185
+ PHONY_RAILS_COLLECTION_VALID_KEYS = %i[
186
+ add_plus
187
+ as
188
+ country_code
189
+ country_number
190
+ default_country_code
191
+ default_country_number
192
+ enforce_record_country
193
+ if
194
+ normalize_when_valid
195
+ unless
196
+ ].freeze
173
197
  # Use this method on the class level like:
174
198
  # phony_normalize :phone_number, :fax_number, :default_country_code => 'NL'
175
199
  #
@@ -177,7 +201,7 @@ module PhonyRails
177
201
  # you've geocoded before calling this method!
178
202
  def phony_normalize(*attributes)
179
203
  options = attributes.last.is_a?(Hash) ? attributes.pop : {}
180
- options.assert_valid_keys :country_number, :default_country_number, :country_code, :default_country_code, :add_plus, :as, :enforce_record_country, :if, :unless
204
+ options.assert_valid_keys(*PHONY_RAILS_COLLECTION_VALID_KEYS)
181
205
  if options[:as].present?
182
206
  raise ArgumentError, ':as option can not be used on phony_normalize with multiple attribute names! (PhonyRails)' if attributes.size > 1
183
207
  end
@@ -200,10 +224,12 @@ module PhonyRails
200
224
  main_options.assert_valid_keys :country_code, :default_country_code
201
225
  attributes.each do |attribute|
202
226
  raise(StandardError, "Instance method normalized_#{attribute} already exists on #{name} (PhonyRails)") if method_defined?(:"normalized_#{attribute}")
227
+
203
228
  define_method :"normalized_#{attribute}" do |*args|
204
229
  options = main_options.merge(args.first || {})
205
230
  assign_values_for_phony_symbol_options(options)
206
231
  raise(ArgumentError, "No attribute/method #{attribute} found on #{self.class.name} (PhonyRails)") unless respond_to?(attribute)
232
+
207
233
  options[:country_code] ||= country_code if respond_to?(:country_code)
208
234
  PhonyRails.normalize_number(send(attribute), options)
209
235
  end
@@ -7,6 +7,7 @@ class String
7
7
  # "(0)30 1234 123".phony_normalized(country_code: 'NL') # => '301234123'
8
8
  def phony_normalized(options = {})
9
9
  raise ArgumentError, "Expected options to be a Hash, got #{options.inspect}" unless options.is_a?(Hash)
10
+
10
11
  options = options.dup
11
12
  PhonyRails.normalize_number(self, options)
12
13
  end
@@ -24,21 +25,25 @@ class String
24
25
  # "somestring".phone_formatted(raise: true)
25
26
  def phony_formatted(options = {})
26
27
  raise ArgumentError, "Expected options to be a Hash, got #{options.inspect}" unless options.is_a?(Hash)
28
+
27
29
  options = options.dup
28
30
  normalize_country_code = options.delete(:normalize)
29
31
  s, ext = PhonyRails.extract_extension(self)
30
32
  s = (normalize_country_code ? PhonyRails.normalize_number(s, default_country_code: normalize_country_code.to_s, add_plus: false) : s.gsub(/\D/, ''))
31
33
  return if s.blank?
32
34
  return if options[:strict] && !Phony.plausible?(s)
35
+
33
36
  PhonyRails.format_extension(Phony.format(s, options.reverse_merge(format: :national)), ext)
34
37
  rescue StandardError
35
38
  raise if options[:raise]
39
+
36
40
  s
37
41
  end
38
42
 
39
43
  # The bang method
40
44
  def phony_formatted!(options = {})
41
45
  raise ArgumentError, 'The :strict options is only supported in the phony_formatted (non bang) method.' if options[:strict]
46
+
42
47
  replace(phony_formatted(options))
43
48
  end
44
49
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhonyRails
4
- VERSION = '0.14.11'
4
+ VERSION = '0.14.12'
5
5
  end
@@ -4,6 +4,7 @@
4
4
  # Usage:
5
5
  # validate :phone_number, :phony_plausible => true
6
6
  require 'active_model'
7
+
7
8
  class PhonyPlausibleValidator < ActiveModel::EachValidator
8
9
  # Validates a String using Phony.plausible? method.
9
10
  def validate_each(record, attribute, value)
@@ -13,6 +14,8 @@ class PhonyPlausibleValidator < ActiveModel::EachValidator
13
14
  value = PhonyRails.normalize_number(value.dup, default_country_code: normalized_country_code) if normalized_country_code
14
15
  value = PhonyRails.extract_extension(value).first
15
16
  @record.errors.add(attribute, error_message) unless Phony.plausible?(value, cc: country_number)
17
+ @record.public_send("#{attribute}=", @record.public_send("#{attribute}_original")) if @record.respond_to?("#{attribute}_original") &&
18
+ !Phony.plausible?(value, cc: country_number)
16
19
  end
17
20
 
18
21
  private
data/phony_rails.gemspec CHANGED
@@ -17,11 +17,13 @@ Gem::Specification.new do |gem|
17
17
  gem.require_paths = ['lib']
18
18
  gem.version = PhonyRails::VERSION
19
19
 
20
- gem.post_install_message = 'PhonyRails v0.10.0 changes the way numbers are stored!'
21
- gem.post_install_message = "It now adds a '+' to the normalized number when it starts with a country number!"
20
+ gem.post_install_message = "PhonyRails v0.10.0 changes the way numbers are stored!\nIt now adds a ' + ' to the normalized number when it starts with a country number!"
22
21
 
23
22
  gem.add_runtime_dependency 'activesupport', '>= 3.0'
24
23
  gem.add_runtime_dependency 'phony', '> 2.15'
25
24
  gem.add_development_dependency 'activerecord', '>= 3.0'
26
25
  gem.add_development_dependency 'mongoid', '>= 3.0'
26
+
27
+ # For testing
28
+ gem.add_development_dependency 'sqlite3', '~> 1.3.6'
27
29
  end
@@ -246,6 +246,14 @@ describe PhonyRails do
246
246
  phone2 = PhonyRails.normalize_number(phone2, default_country_code: 'EE')
247
247
  expect(phone2).to eq('+37275016183')
248
248
  end
249
+
250
+ it 'should pass Github issue #180' do
251
+ phone = '5555555555'
252
+ phone = PhonyRails.normalize_number(phone, default_country_code: 'AU')
253
+ expect(phone).to eq('+615555555555')
254
+ phone = PhonyRails.normalize_number(phone, default_country_code: 'AU')
255
+ expect(phone).to eq('+615555555555')
256
+ end
249
257
  end
250
258
 
251
259
  it 'should not change original String' do
@@ -60,6 +60,10 @@ ActiveRecord::Schema.define do
60
60
  table.column :phone_number, :string
61
61
  table.column :phone_number_country_code, :string
62
62
  end
63
+
64
+ create_table :normalizabled_phone_homes do |table|
65
+ table.column :phone_number, :string
66
+ end
63
67
  end
64
68
 
65
69
  #--------------------
@@ -166,6 +170,13 @@ class MessageOptionSameAsModelMethod < HelpfulHome
166
170
  'user@example.com'
167
171
  end
168
172
  end
173
+ #--------------------
174
+ class NormalizabledPhoneHome < ActiveRecord::Base
175
+ attr_accessor :phone_number, :country_code
176
+ validates_plausible_phone :phone_number
177
+ phony_normalize :phone_number, country_code: 'PL', normalize_when_valid: true
178
+ end
179
+
169
180
  #-----------------------------------------------------------------------------------------------------------------------
170
181
  # Tests
171
182
  #-----------------------------------------------------------------------------------------------------------------------
@@ -641,5 +652,21 @@ describe ActiveModel::Validations::HelperMethods do
641
652
  @home.save
642
653
  end
643
654
  end
655
+
656
+ context 'when a number has already code_number' do
657
+ it 'does not normalize code after validation' do
658
+ @home = NormalizabledPhoneHome.new
659
+ @home.phone_number = '+44 799 449 595'
660
+ @home.country_code = 'PL'
661
+
662
+ expect(@home).to_not be_valid
663
+ expect(@home.phone_number).to eql('+44 799 449 595')
664
+
665
+ @home.phone_number = '+48 799 449 595'
666
+
667
+ expect(@home).to be_valid
668
+ expect(@home.phone_number).to eql('+48799449595')
669
+ end
670
+ end
644
671
  end
645
672
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phony_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.11
4
+ version: 0.14.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joost Hietbrink
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-11 00:00:00.000000000 Z
11
+ date: 2019-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.3.6
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.3.6
69
83
  description: This Gem adds useful methods to your Rails app to validate, display and
70
84
  save phone numbers.
71
85
  email:
@@ -81,7 +95,6 @@ files:
81
95
  - ".travis.yml"
82
96
  - CHANGELOG.md
83
97
  - Gemfile
84
- - Gemfile.lock
85
98
  - Guardfile
86
99
  - LICENSE
87
100
  - README.md
@@ -112,8 +125,9 @@ homepage: https://github.com/joost/phony_rails
112
125
  licenses:
113
126
  - MIT
114
127
  metadata: {}
115
- post_install_message: It now adds a '+' to the normalized number when it starts with
116
- a country number!
128
+ post_install_message: |-
129
+ PhonyRails v0.10.0 changes the way numbers are stored!
130
+ It now adds a ' + ' to the normalized number when it starts with a country number!
117
131
  rdoc_options: []
118
132
  require_paths:
119
133
  - lib
@@ -129,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
143
  version: '0'
130
144
  requirements: []
131
145
  rubyforge_project:
132
- rubygems_version: 2.7.7
146
+ rubygems_version: 2.5.1
133
147
  signing_key:
134
148
  specification_version: 4
135
149
  summary: This Gem adds useful methods to your Rails app to validate, display and save
data/Gemfile.lock DELETED
@@ -1,143 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- phony_rails (0.14.11)
5
- activesupport (>= 3.0)
6
- phony (> 2.15)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- activemodel (5.1.4)
12
- activesupport (= 5.1.4)
13
- activerecord (5.1.4)
14
- activemodel (= 5.1.4)
15
- activesupport (= 5.1.4)
16
- arel (~> 8.0)
17
- activesupport (5.1.4)
18
- concurrent-ruby (~> 1.0, >= 1.0.2)
19
- i18n (~> 0.7)
20
- minitest (~> 5.1)
21
- tzinfo (~> 1.1)
22
- arel (8.0.0)
23
- ast (2.3.0)
24
- bson (4.2.2)
25
- coderay (1.1.2)
26
- concurrent-ruby (1.0.5)
27
- coveralls (0.8.21)
28
- json (>= 1.8, < 3)
29
- simplecov (~> 0.14.1)
30
- term-ansicolor (~> 1.3)
31
- thor (~> 0.19.4)
32
- tins (~> 1.6)
33
- diff-lcs (1.3)
34
- docile (1.1.5)
35
- ffi (1.9.25)
36
- formatador (0.2.5)
37
- guard (2.14.1)
38
- formatador (>= 0.2.4)
39
- listen (>= 2.7, < 4.0)
40
- lumberjack (~> 1.0)
41
- nenv (~> 0.1)
42
- notiffany (~> 0.0)
43
- pry (>= 0.9.12)
44
- shellany (~> 0.0)
45
- thor (>= 0.18.1)
46
- guard-bundler (2.1.0)
47
- bundler (~> 1.0)
48
- guard (~> 2.2)
49
- guard-compat (~> 1.1)
50
- guard-compat (1.2.1)
51
- guard-rspec (4.7.3)
52
- guard (~> 2.1)
53
- guard-compat (~> 1.1)
54
- rspec (>= 2.99.0, < 4.0)
55
- i18n (0.9.1)
56
- concurrent-ruby (~> 1.0)
57
- json (2.1.0)
58
- listen (3.1.5)
59
- rb-fsevent (~> 0.9, >= 0.9.4)
60
- rb-inotify (~> 0.9, >= 0.9.7)
61
- ruby_dep (~> 1.2)
62
- lumberjack (1.0.12)
63
- method_source (0.9.0)
64
- minitest (5.10.3)
65
- mongo (2.4.3)
66
- bson (>= 4.2.1, < 5.0.0)
67
- mongoid (6.2.1)
68
- activemodel (~> 5.1)
69
- mongo (>= 2.4.1, < 3.0.0)
70
- nenv (0.3.0)
71
- notiffany (0.1.1)
72
- nenv (~> 0.1)
73
- shellany (~> 0.0)
74
- parallel (1.12.0)
75
- parser (2.4.0.2)
76
- ast (~> 2.3)
77
- phony (2.16.5)
78
- powerpack (0.1.1)
79
- pry (0.11.3)
80
- coderay (~> 1.1.0)
81
- method_source (~> 0.9.0)
82
- rainbow (2.2.2)
83
- rake
84
- rake (12.3.0)
85
- rb-fsevent (0.10.2)
86
- rb-inotify (0.9.10)
87
- ffi (>= 0.5.0, < 2)
88
- rspec (3.7.0)
89
- rspec-core (~> 3.7.0)
90
- rspec-expectations (~> 3.7.0)
91
- rspec-mocks (~> 3.7.0)
92
- rspec-core (3.7.0)
93
- rspec-support (~> 3.7.0)
94
- rspec-expectations (3.7.0)
95
- diff-lcs (>= 1.2.0, < 2.0)
96
- rspec-support (~> 3.7.0)
97
- rspec-mocks (3.7.0)
98
- diff-lcs (>= 1.2.0, < 2.0)
99
- rspec-support (~> 3.7.0)
100
- rspec-support (3.7.0)
101
- rubocop (0.51.0)
102
- parallel (~> 1.10)
103
- parser (>= 2.3.3.1, < 3.0)
104
- powerpack (~> 0.1)
105
- rainbow (>= 2.2.2, < 3.0)
106
- ruby-progressbar (~> 1.7)
107
- unicode-display_width (~> 1.0, >= 1.0.1)
108
- ruby-progressbar (1.9.0)
109
- ruby_dep (1.5.0)
110
- shellany (0.0.1)
111
- simplecov (0.14.1)
112
- docile (~> 1.1.0)
113
- json (>= 1.8, < 3)
114
- simplecov-html (~> 0.10.0)
115
- simplecov-html (0.10.2)
116
- sqlite3 (1.3.13)
117
- term-ansicolor (1.6.0)
118
- tins (~> 1.0)
119
- thor (0.19.4)
120
- thread_safe (0.3.6)
121
- tins (1.15.1)
122
- tzinfo (1.2.4)
123
- thread_safe (~> 0.1)
124
- unicode-display_width (1.3.0)
125
-
126
- PLATFORMS
127
- ruby
128
-
129
- DEPENDENCIES
130
- activerecord (>= 3.0)
131
- coveralls
132
- guard
133
- guard-bundler
134
- guard-rspec
135
- mongoid (>= 3.0)
136
- phony_rails!
137
- rake
138
- rspec
139
- rubocop
140
- sqlite3
141
-
142
- BUNDLED WITH
143
- 1.16.4