validates_lengths_from_database 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ee05414f5d7aef3fb39a4e692b6616259d20db11
4
- data.tar.gz: '096b57b2a49d98450f1127f27dfd135c34556d86'
2
+ SHA256:
3
+ metadata.gz: c8969981a23f54edfe7d597ad648c841c7beb9e7e296bb1bd050ca30b50ae18e
4
+ data.tar.gz: 55e92318175af1685a1665d9cb30c456a62b93701ee6e9e358a85f5b4159908c
5
5
  SHA512:
6
- metadata.gz: dd35abc81106fe376476a747e78a89aeedaf2828a9aeff2e1f30181a486efc7da88474e5914b82a5df3706bb6f2dd8c0995ea5c05d8a9986ebc234ea40f3cb2c
7
- data.tar.gz: d637ae88ae7aa3e2a738e095981270d0228817ab660f8e98214bc0f0bfc23b09e463bb8ab62be5221a6191a9c9504e089d3ceb62d96b23f5d95f9530437a6714
6
+ metadata.gz: b4584e27e3758ceabeecf85f56263b0579be4ea190ecfe730cfe3aca2fac0e17208ad52fdbaf3afdd4dcd6aa0afa239bc496146f2c55784c003af83205f081eb
7
+ data.tar.gz: 6bb72ca778ab3aaae981f03bbf9e8bf9e73dacca4b96dd6dd30252d2bcd8a7a2fe53f080f0dc0d37732fde0eca80827355fe83aba4af67d941c39c0386a173cf
data/Appraisals CHANGED
@@ -1,23 +1,11 @@
1
- appraise "3.0" do
2
- gem "rails", "~> 3.0.12"
3
- end
4
-
5
- appraise "3.1" do
6
- gem "rails", "~> 3.1.4"
7
- end
8
-
9
- appraise "3.2" do
10
- gem "rails", "~> 3.2.2"
11
- end
12
-
13
- appraise "4.0" do
14
- gem "rails", "~> 4.0.12"
1
+ appraise "4.2" do
2
+ gem "rails", "~> 4.2"
15
3
  end
16
4
 
17
- appraise "4.1" do
18
- gem "rails", "~> 4.1.8"
5
+ appraise "5.1" do
6
+ gem "rails", "~> 5.1"
19
7
  end
20
8
 
21
- appraise "4.2" do
22
- gem "rails", "~> 4.2.0"
9
+ appraise "5.2" do
10
+ gem "rails", "~> 5.2"
23
11
  end
@@ -1,3 +1,8 @@
1
+ == v0.8.0 (2019-10-30)
2
+
3
+ * Enforce validation length on TEXT columns via bytes instead of characters (#25)
4
+ * Drop support for ruby 1.9 (#26)
5
+
1
6
  == v0.7.0 (2017-10-09)
2
7
 
3
8
  * Drop hard reliance on rails (can use with just activerecord) - thanks @grosser
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- validates_lengths_from_database (0.6.0)
5
- activerecord (>= 3)
4
+ validates_lengths_from_database (0.7.0)
5
+ activerecord (>= 4)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
@@ -53,18 +53,19 @@ GEM
53
53
 
54
54
  PLATFORMS
55
55
  ruby
56
+ x86_64-darwin-18
56
57
 
57
58
  DEPENDENCIES
58
- activesupport (>= 3)
59
+ activesupport (>= 4)
59
60
  appraisal (~> 1.0.2)
60
61
  i18n
61
62
  iconv (~> 1.0.4)
62
63
  pg (~> 0.17.1)
63
- rake
64
+ rake (< 11)
64
65
  rdoc (~> 3.12)
65
66
  rspec (~> 2.0)
66
67
  sqlite3 (~> 1.3.4)
67
68
  validates_lengths_from_database!
68
69
 
69
70
  BUNDLED WITH
70
- 1.15.4
71
+ 1.17.3
@@ -9,10 +9,8 @@ This gem introspects your table schema for maximum lengths on string and text fi
9
9
 
10
10
  == Requirements
11
11
 
12
- As of v0.5.0, validates_lengths_from_database lazily loads column information and requires Rails 3+. If you are using Rails 2, please use the v0.4.0 release.
13
-
14
- Due to issues maintaining backwards compatibility, as of v0.4.0 validates_lengths_from_database requires ruby 1.9.3 or higher.
15
- If you are still using 1.8.7 or 1.9.2, please use the v0.3.0 release.
12
+ Due to issues maintaining backwards compatibility, as of v0.8.0 validates_lengths_from_database requires ruby 2 or higher.
13
+ If you are still using 1.9, please use the v0.7.0 release.
16
14
 
17
15
  == Installation
18
16
 
@@ -4,6 +4,14 @@ module ValidatesLengthsFromDatabase
4
4
  base.send(:include, InstanceMethods)
5
5
  end
6
6
 
7
+ class BytesizeValidator < ActiveModel::Validations::LengthValidator
8
+ def validate_each(record, attribute, value)
9
+ value_for_validation = value.is_a?(String) ? value.bytes : value
10
+
11
+ super(record, attribute, value_for_validation)
12
+ end
13
+ end
14
+
7
15
  module ClassMethods
8
16
  def validates_lengths_from_database(options = {})
9
17
  options.symbolize_keys!
@@ -49,22 +57,67 @@ module ValidatesLengthsFromDatabase
49
57
 
50
58
  columns_to_validate.each do |column|
51
59
  column_schema = self.class.columns.find {|c| c.name == column }
60
+
52
61
  next if column_schema.nil?
53
62
  next if column_schema.respond_to?(:array) && column_schema.array
54
63
  next unless [:string, :text, :decimal].include?(column_schema.type)
64
+
55
65
  case column_schema.type
56
- when :string, :text
57
- column_limit = options[:limit][column_schema.type] || column_schema.limit
58
- if column_limit
59
- ActiveModel::Validations::LengthValidator.new(:maximum => column_limit, :allow_blank => true, :attributes => [column]).validate(self)
66
+ when :string
67
+ if column_limit = options[:limit][column_schema.type] || column_schema.limit
68
+ validate_length_by_characters(column, column_limit)
69
+ end
70
+ when :text
71
+ if column_limit = options[:limit][column_schema.type] || column_schema.limit
72
+ validate_length_by_bytesize(column, column_limit)
60
73
  end
61
74
  when :decimal
62
75
  if column_schema.precision && column_schema.scale
63
- max_val = (10 ** column_schema.precision)/(10 ** column_schema.scale)
64
- ActiveModel::Validations::NumericalityValidator.new(:less_than => max_val, :allow_blank => true, :attributes => [column]).validate(self)
76
+ validate_numericality_with_precision(column, column_schema)
65
77
  end
66
78
  end
67
79
  end
68
80
  end
81
+
82
+ private
83
+
84
+ def validate_length_by_characters(column, column_limit)
85
+ ActiveModel::Validations::LengthValidator.new(
86
+ :allow_blank => true,
87
+ :attributes => [column],
88
+ :maximum => column_limit
89
+ ).validate(self)
90
+ end
91
+
92
+ def validate_length_by_bytesize(column, column_limit)
93
+ validator =
94
+ if ActiveModel::Validations::LengthValidator::RESERVED_OPTIONS.include?(:tokenizer)
95
+ ActiveModel::Validations::LengthValidator.new(
96
+ :allow_blank => true,
97
+ :attributes => [column],
98
+ :maximum => column_limit,
99
+ :tokenizer => ->(string) { string.bytes }
100
+ )
101
+ else
102
+ BytesizeValidator.new(
103
+ :allow_blank => true,
104
+ :attributes => [column],
105
+ :maximum => column_limit,
106
+ :too_long => "is too long (maximum is %{count} bytes)"
107
+ )
108
+ end
109
+
110
+ validator.validate(self)
111
+ end
112
+
113
+ def validate_numericality_with_precision(column, column_schema)
114
+ max_val = (10 ** column_schema.precision)/(10 ** column_schema.scale)
115
+
116
+ ActiveModel::Validations::NumericalityValidator.new(
117
+ :allow_blank => true,
118
+ :attributes => [column],
119
+ :less_than => max_val
120
+ ).validate(self)
121
+ end
69
122
  end
70
123
  end
@@ -1,3 +1,3 @@
1
1
  module ValidatesLengthsFromDatabase
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -222,7 +222,7 @@ describe ValidatesLengthsFromDatabase do
222
222
  end
223
223
  end
224
224
 
225
- context "an article with overloaded attributes" do
225
+ context "an article with string_1 that is too many characters" do
226
226
  before { @article = ArticleValidateSpecificLimit.new(LONG_ATTRIBUTES); @article.valid? }
227
227
 
228
228
  it "should not be valid" do
@@ -236,6 +236,73 @@ describe ValidatesLengthsFromDatabase do
236
236
  @article.errors["decimal_1"].should_not be_present
237
237
  end
238
238
  end
239
+
240
+ context "an article with string_1 that is too many bytes, but few enough characters" do
241
+ before do
242
+ @article = ArticleValidateSpecificLimit.new(
243
+ LONG_ATTRIBUTES.merge(:string_1 => "😎😎😎😎", :string_2 => "👍👍👍👍")
244
+ )
245
+
246
+ @article.valid?
247
+ end
248
+
249
+ it "should be valid" do
250
+ @article.should be_valid
251
+ end
252
+ end
253
+
254
+ context "an article with text_1 that is too many characters" do
255
+ before do
256
+ @article = ArticleValidateSpecificLimit.new(LONG_ATTRIBUTES.merge(:text_1 => "a"*101))
257
+ @article.valid?
258
+ end
259
+
260
+ it "should not be valid" do
261
+ @article.should_not be_valid
262
+ end
263
+
264
+ it "should have errors on all string/text attributes" do
265
+ @article.errors["string_1"].join.should =~ /too long/
266
+ @article.errors["string_2"].join.should =~ /too long/
267
+ @article.errors["text_1"].join.should =~ /too long/
268
+ @article.errors["decimal_1"].should_not be_present
269
+ end
270
+ end
271
+
272
+ context "an article with text_1 that is too many bytes, but few enough characters" do
273
+ before do
274
+ @article = ArticleValidateSpecificLimit.new(LONG_ATTRIBUTES.merge(:text_1 => "👍"*99))
275
+ @article.valid?
276
+ end
277
+
278
+ it "should not be valid" do
279
+ @article.should_not be_valid
280
+ end
281
+
282
+ it "should have errors on all string/text attributes" do
283
+ @article.errors["string_1"].join.should =~ /too long/
284
+ @article.errors["string_2"].join.should =~ /too long/
285
+ @article.errors["text_1"].join.should =~ /too long/
286
+ @article.errors["decimal_1"].should_not be_present
287
+ end
288
+ end
289
+ end
290
+
291
+ context "Model with validates_lengths_from_database :only => [:text_1], :limit => {:text => 10}" do
292
+ before do
293
+ class ArticleValidateOnlyText < ActiveRecord::Base
294
+ self.table_name = "articles_high_limit"
295
+ validates_lengths_from_database :only => [:text_1], :limit => {:text => 10}
296
+ end
297
+ end
298
+
299
+ context "an article with a length equal to max, but a bytesize greater than" do
300
+ before { @article = ArticleValidateOnlyText.new(:text_1 => "😎"*10); @article.valid? }
301
+
302
+ it "should not be valid" do
303
+ @article.should_not be_valid
304
+ end
305
+ end
239
306
  end
240
307
 
241
308
  context "Model with validates_lengths_from_database :only => [:string_1, :text_1]" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_lengths_from_database
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Hughes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-09 00:00:00.000000000 Z
11
+ date: 2019-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3'
19
+ version: '4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '3'
26
+ version: '4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '3'
33
+ version: '4'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '3'
40
+ version: '4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -112,16 +112,16 @@ dependencies:
112
112
  name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "<"
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '11'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "<"
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: '11'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: i18n
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -186,7 +186,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
186
186
  requirements:
187
187
  - - ">="
188
188
  - !ruby/object:Gem::Version
189
- version: 1.9.3
189
+ version: '2.4'
190
190
  required_rubygems_version: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - ">="
@@ -194,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
194
  version: 1.3.4
195
195
  requirements: []
196
196
  rubyforge_project: validates_lengths_from_database
197
- rubygems_version: 2.6.11
197
+ rubygems_version: 2.7.6
198
198
  signing_key:
199
199
  specification_version: 4
200
200
  summary: Automatic maximum-length validations.