yukonisuru 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 (96) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +14 -0
  4. data/.rspec +4 -0
  5. data/.travis.yml +13 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +1101 -0
  9. data/Rakefile +1 -0
  10. data/config/locales/en.yml +113 -0
  11. data/lib/yukonisuru.rb +93 -0
  12. data/lib/yukonisuru/matchers/ensure_valid_alpha_format_of.rb +26 -0
  13. data/lib/yukonisuru/matchers/ensure_valid_alpha_numeric_format_of.rb +26 -0
  14. data/lib/yukonisuru/matchers/ensure_valid_base64_format_of.rb +26 -0
  15. data/lib/yukonisuru/matchers/ensure_valid_boolean_format_of.rb +26 -0
  16. data/lib/yukonisuru/matchers/ensure_valid_credit_card_format_of.rb +26 -0
  17. data/lib/yukonisuru/matchers/ensure_valid_currency_format_of.rb +26 -0
  18. data/lib/yukonisuru/matchers/ensure_valid_cusip_format_of.rb +26 -0
  19. data/lib/yukonisuru/matchers/ensure_valid_email_format_of.rb +26 -0
  20. data/lib/yukonisuru/matchers/ensure_valid_equality_matcher_of.rb +40 -0
  21. data/lib/yukonisuru/matchers/ensure_valid_gtin_format_of.rb +26 -0
  22. data/lib/yukonisuru/matchers/ensure_valid_hex_format_of.rb +26 -0
  23. data/lib/yukonisuru/matchers/ensure_valid_imei_format_of.rb +26 -0
  24. data/lib/yukonisuru/matchers/ensure_valid_ip_format_of.rb +26 -0
  25. data/lib/yukonisuru/matchers/ensure_valid_isbn_format_of.rb +26 -0
  26. data/lib/yukonisuru/matchers/ensure_valid_isin_format_of.rb +26 -0
  27. data/lib/yukonisuru/matchers/ensure_valid_latitude_format_of.rb +26 -0
  28. data/lib/yukonisuru/matchers/ensure_valid_longitude_format_of.rb +26 -0
  29. data/lib/yukonisuru/matchers/ensure_valid_mac_address_format_of.rb +26 -0
  30. data/lib/yukonisuru/matchers/ensure_valid_name_format_of.rb +26 -0
  31. data/lib/yukonisuru/matchers/ensure_valid_password_format_of.rb +26 -0
  32. data/lib/yukonisuru/matchers/ensure_valid_phone_format_of.rb +26 -0
  33. data/lib/yukonisuru/matchers/ensure_valid_sedol_format_of.rb +26 -0
  34. data/lib/yukonisuru/matchers/ensure_valid_slug_format_of.rb +26 -0
  35. data/lib/yukonisuru/matchers/ensure_valid_ssn_format_of.rb +26 -0
  36. data/lib/yukonisuru/matchers/ensure_valid_url_format_of.rb +26 -0
  37. data/lib/yukonisuru/matchers/ensure_valid_username_format_of.rb +26 -0
  38. data/lib/yukonisuru/matchers/ensure_valid_uuid_format_of.rb +26 -0
  39. data/lib/yukonisuru/validators/alpha_numeric_validator.rb +31 -0
  40. data/lib/yukonisuru/validators/alpha_validator.rb +31 -0
  41. data/lib/yukonisuru/validators/base64_validator.rb +9 -0
  42. data/lib/yukonisuru/validators/boolean_validator.rb +9 -0
  43. data/lib/yukonisuru/validators/credit_card_validator.rb +133 -0
  44. data/lib/yukonisuru/validators/currency_validator.rb +23 -0
  45. data/lib/yukonisuru/validators/cusip_validator.rb +33 -0
  46. data/lib/yukonisuru/validators/email_validator.rb +25 -0
  47. data/lib/yukonisuru/validators/equality_validator.rb +27 -0
  48. data/lib/yukonisuru/validators/gtin_validator.rb +59 -0
  49. data/lib/yukonisuru/validators/hex_validator.rb +9 -0
  50. data/lib/yukonisuru/validators/imei_validator.rb +37 -0
  51. data/lib/yukonisuru/validators/ip_validator.rb +9 -0
  52. data/lib/yukonisuru/validators/isbn_validator.rb +24 -0
  53. data/lib/yukonisuru/validators/isin_validator.rb +38 -0
  54. data/lib/yukonisuru/validators/latitude_validator.rb +9 -0
  55. data/lib/yukonisuru/validators/longitude_validator.rb +9 -0
  56. data/lib/yukonisuru/validators/mac_address_validator.rb +24 -0
  57. data/lib/yukonisuru/validators/name_validator.rb +9 -0
  58. data/lib/yukonisuru/validators/password_validator.rb +23 -0
  59. data/lib/yukonisuru/validators/phone_validator.rb +9 -0
  60. data/lib/yukonisuru/validators/sedol_validator.rb +32 -0
  61. data/lib/yukonisuru/validators/slug_validator.rb +9 -0
  62. data/lib/yukonisuru/validators/ssn_validator.rb +9 -0
  63. data/lib/yukonisuru/validators/url_validator.rb +36 -0
  64. data/lib/yukonisuru/validators/username_validator.rb +9 -0
  65. data/lib/yukonisuru/validators/uuid_validator.rb +28 -0
  66. data/lib/yukonisuru/version.rb +3 -0
  67. data/spec/lib/alpha_numeric_validator_spec.rb +91 -0
  68. data/spec/lib/alpha_validator_spec.rb +182 -0
  69. data/spec/lib/base64_validator_spec.rb +33 -0
  70. data/spec/lib/boolean_validator_spec.rb +35 -0
  71. data/spec/lib/credit_card_validator_spec.rb +686 -0
  72. data/spec/lib/currency_validator_spec.rb +63 -0
  73. data/spec/lib/cusip_validator_spec.rb +27 -0
  74. data/spec/lib/email_validator_spec.rb +109 -0
  75. data/spec/lib/equality_validator_spec.rb +334 -0
  76. data/spec/lib/gtin_validator_spec.rb +101 -0
  77. data/spec/lib/hex_validator_spec.rb +73 -0
  78. data/spec/lib/imei_validator_spec.rb +41 -0
  79. data/spec/lib/ip_validator_spec.rb +33 -0
  80. data/spec/lib/isbn_validator_spec.rb +41 -0
  81. data/spec/lib/isin_validator_spec.rb +35 -0
  82. data/spec/lib/latitude_validator_spec.rb +31 -0
  83. data/spec/lib/longitude_validator_spec.rb +31 -0
  84. data/spec/lib/mac_address_validator_spec.rb +54 -0
  85. data/spec/lib/name_validator_spec.rb +39 -0
  86. data/spec/lib/password_validator_spec.rb +87 -0
  87. data/spec/lib/phone_validator_spec.rb +42 -0
  88. data/spec/lib/sedol_validator_spec.rb +31 -0
  89. data/spec/lib/slug_validator_spec.rb +41 -0
  90. data/spec/lib/ssn_validator_spec.rb +36 -0
  91. data/spec/lib/url_validator_spec.rb +109 -0
  92. data/spec/lib/username_validator_spec.rb +37 -0
  93. data/spec/lib/uuid_validator_spec.rb +157 -0
  94. data/spec/spec_helper.rb +12 -0
  95. data/yukonisuru.gemspec +29 -0
  96. metadata +264 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3c3f2c762bbaa9cabb75c03afe24d51b419a75ab
4
+ data.tar.gz: bde30ebfcc52b09306dcd6d445e0ebb1364a2116
5
+ SHA512:
6
+ metadata.gz: 1d93a981e44cae5dd6077f49d22f7ef1dd24cfb32a8056966f7e3430a14442cf3ab5989edca74ee06faa416adb01eabe8a68845c91d9e18723375099c42baaa2
7
+ data.tar.gz: 8f84d81a471db4ae0c2804280f6ae885c9b95c10cc241a5f9566da0bee74090e85dd61884b5dca70a5e988b1b713cb2111d498d9e4326a607c99503141e8575f
@@ -0,0 +1 @@
1
+ service_name: travis-ci
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,4 @@
1
+ --order random
2
+ --colour
3
+ --backtrace
4
+ --format progress
@@ -0,0 +1,13 @@
1
+ before_install:
2
+ - sudo apt-get install libxml2-dev
3
+ cache: bundler
4
+ language: ruby
5
+ notifications:
6
+ email:
7
+ recipients:
8
+ - j.gomez@drexed.com
9
+ on_failure: change
10
+ on_success: never
11
+ rvm:
12
+ - ruby-head
13
+ script: 'bundle exec rake'
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in yukonisuru.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Juan Gomez
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.
@@ -0,0 +1,1101 @@
1
+ # Yukonisuru
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/yukonisuru.svg)](http://badge.fury.io/rb/yukonisuru)
4
+ [![Build Status](https://travis-ci.org/drexed/yukonisuru.svg?branch=master)](https://travis-ci.org/drexed/yukonisuru)
5
+ [![Coverage Status](https://coveralls.io/repos/drexed/yukonisuru/badge.png)](https://coveralls.io/r/drexed/yukonisuru)
6
+ [![Code Climate](https://codeclimate.com/github/drexed/yukonisuru.png)](https://codeclimate.com/github/drexed/yukonisuru)
7
+
8
+ Yukonisuru (japanese: validate) is a collection of custom validators that are often required in Rails applications plus shoulda-style RSpec matchers to test the validation rules.
9
+
10
+ Currently supported validators: alpha, alpha-numeric, Base64, boolean, credit card, currency, CUSIP, email, equality, GTIN, hex, IMEI, IP, ISBN, ISIN, latitude, longitude, MAC address, name, password, phone, SEDOL, slug, SSN, url, username, and UUID.
11
+
12
+ Highly recommended validators:
13
+ * **DateTime:** Validates Timeliness - https://github.com/adzap/validates_timeliness
14
+ * **Existence:** Validates Existence - https://github.com/perfectline/validates_existence
15
+ * **Group:** Group Validations - https://github.com/adzap/grouped_validations
16
+ * **Overlap:** Validates Overlap - https://github.com/robinbortlik/validates_overlap
17
+
18
+ ## Installation
19
+
20
+ Add this line to your application's Gemfile:
21
+
22
+ gem 'yukonisuru'
23
+
24
+ And then execute:
25
+
26
+ $ bundle
27
+
28
+ Or install it yourself as:
29
+
30
+ $ gem install yukonisuru
31
+
32
+ ## Usage
33
+
34
+ ### AlphaValidator
35
+
36
+ **Ex:** Example or Example Title
37
+
38
+ **Rules:**
39
+ * Characters: A-Z a-z
40
+ * Must include: A-Z a-z
41
+
42
+ With an ActiveRecord model:
43
+
44
+ ```ruby
45
+ class Book < ActiveRecord::Base
46
+ attr_accessor :title, :name
47
+ validates :title, alpha: true
48
+ end
49
+ ```
50
+
51
+ Or any ruby class:
52
+
53
+ ```ruby
54
+ class Book
55
+ include ActiveModel::Validations
56
+ attr_accessor :title, :name
57
+ validates :title, alpha: true
58
+ end
59
+ ```
60
+
61
+ Options: :strict, case: [:lower, :upper]
62
+
63
+ ```ruby
64
+ validates :title, alpha: { strict: true }
65
+ validates :title, alpha: { case: :lower }
66
+ validates :title, alpha: { case: :upper, strict: true }
67
+ ```
68
+
69
+ RSpec matcher is also available for your convenience:
70
+
71
+ ```ruby
72
+ describe Book do
73
+ it { should ensure_valid_alpha_format_of(:title) }
74
+ it { should_not ensure_valid_alpha_format_of(:name) }
75
+ end
76
+ ```
77
+
78
+ ### AlphaNumericValidator
79
+
80
+ **Ex:** Example1 or Example Title 1
81
+
82
+ **Rules:**
83
+ * Characters: A-Z a-z 0-9
84
+ * Must include: A-Z a-z 0-9
85
+
86
+ With an ActiveRecord model:
87
+
88
+ ```ruby
89
+ class Book < ActiveRecord::Base
90
+ attr_accessor :title, :name
91
+ validates :title, alpha_numeric: true
92
+ end
93
+ ```
94
+
95
+ Or any ruby class:
96
+
97
+ ```ruby
98
+ class Book
99
+ include ActiveModel::Validations
100
+ attr_accessor :title, :name
101
+ validates :title, alpha_numeric: true
102
+ end
103
+ ```
104
+
105
+ Options: :strict
106
+ Strict: requires not including spaces
107
+
108
+ ```ruby
109
+ validates :title, alpha_numeric: { strict: true }
110
+ ```
111
+
112
+ RSpec matcher is also available for your convenience:
113
+
114
+ ```ruby
115
+ describe Book do
116
+ it { should ensure_valid_alpha_numeric_format_of(:title) }
117
+ it { should_not ensure_valid_alpha_numeric_format_of(:name) }
118
+ end
119
+ ```
120
+
121
+ ### Base64Validator
122
+
123
+ **Ex:** YW55IGNhcm5hbCBwbGVhcw==
124
+
125
+ **Rules:**
126
+ * Characters: 0-1 A-Z =
127
+
128
+ With an ActiveRecord model:
129
+
130
+ ```ruby
131
+ class Code < ActiveRecord::Base
132
+ attr_accessor :code, :name
133
+ validates :code, base64: true
134
+ end
135
+ ```
136
+
137
+ Or any ruby class:
138
+
139
+ ```ruby
140
+ class Code
141
+ include ActiveModel::Validations
142
+ attr_accessor :code, :name
143
+ validates :code, base64: true
144
+ end
145
+ ```
146
+
147
+ RSpec matcher is also available for your convenience:
148
+
149
+ ```ruby
150
+ describe Code do
151
+ it { should ensure_valid_base64_format_of(:code) }
152
+ it { should_not ensure_valid_base64_format_of(:name) }
153
+ end
154
+ ```
155
+
156
+ ### BooleanValidator
157
+
158
+ **Ex:** true or false or 1 or 0
159
+
160
+ **Rules:**
161
+ * Characters: 0-1
162
+ * Equality: true or false
163
+
164
+ With an ActiveRecord model:
165
+
166
+ ```ruby
167
+ class User < ActiveRecord::Base
168
+ attr_accessor :active, :name
169
+ validates :active, boolean: true
170
+ end
171
+ ```
172
+
173
+ Or any ruby class:
174
+
175
+ ```ruby
176
+ class User
177
+ include ActiveModel::Validations
178
+ attr_accessor :active, :name
179
+ validates :active, boolean: true
180
+ end
181
+ ```
182
+
183
+ RSpec matcher is also available for your convenience:
184
+
185
+ ```ruby
186
+ describe User do
187
+ it { should ensure_valid_boolean_format_of(:active) }
188
+ it { should_not ensure_valid_boolean_format_of(:name) }
189
+ end
190
+ ```
191
+
192
+ ### CreditCardValidator
193
+
194
+ **Ex:** 370000000000002
195
+
196
+ **Rules:**
197
+ * Characters: 0-9 .-
198
+ * Must include: 0-9
199
+ * Range for card digits: 12-19
200
+
201
+ With an ActiveRecord model:
202
+
203
+ ```ruby
204
+ class Invoice < ActiveRecord::Base
205
+ attr_accessor :cc_number, :name
206
+ validates :cc_number, credit_card: true
207
+ end
208
+ ```
209
+
210
+ Or any ruby class:
211
+
212
+ ```ruby
213
+ class Invoice
214
+ include ActiveModel::Validations
215
+ attr_accessor :cc_number, :name
216
+ validates :cc_number, credit_card: true
217
+ end
218
+ ```
219
+
220
+ Options: :strict, card: [:american_express (:amex), :diners_club, :discover, :jbc, :laser, :maestro, :mastercard, :solo, :unionpay, :visa]
221
+ Strict: requires not including spaces
222
+
223
+ ```ruby
224
+ validates :cc_number, credit_card: { card: :visa }
225
+ validates :cc_number, credit_card: { strict: true }
226
+ validates :cc_number, credit_card: { card: :discover, strict: true }
227
+ ```
228
+
229
+ RSpec matcher is also available for your convenience:
230
+
231
+ ```ruby
232
+ describe Invoice do
233
+ it { should ensure_valid_credit_card_format_of(:cc_number) }
234
+ it { should_not ensure_valid_credit_card_format_of(:name) }
235
+ end
236
+ ```
237
+
238
+ ### CurrencyValidator
239
+
240
+ **Ex:** 123.00 or .1
241
+
242
+ **Rules:**
243
+ * Characters: 0-9 .
244
+ * Must include: .
245
+ * Range for cents: 1-2
246
+
247
+ With an ActiveRecord model:
248
+
249
+ ```ruby
250
+ class Product < ActiveRecord::Base
251
+ attr_accessor :price, :name
252
+ validates :price, currency: true
253
+ end
254
+ ```
255
+
256
+ Or any ruby class:
257
+
258
+ ```ruby
259
+ class Product
260
+ include ActiveModel::Validations
261
+ attr_accessor :price, :name
262
+ validates :price, currency: true
263
+ end
264
+ ```
265
+
266
+ Options: :strict
267
+ Strict: requires leading number and exactly two decimals, 1.45
268
+
269
+ ```ruby
270
+ validates :price, currency: { strict: true }
271
+ ```
272
+
273
+ RSpec matcher is also available for your convenience:
274
+
275
+ ```ruby
276
+ describe Product do
277
+ it { should ensure_valid_currency_format_of(:price) }
278
+ it { should_not ensure_valid_currency_format_of(:name) }
279
+ end
280
+ ```
281
+
282
+ ### CusipValidator
283
+
284
+ **Ex:** 125509BG3
285
+
286
+ **Rules:**
287
+ * Characters: 0-1 A-Z
288
+ * Length: 1-9
289
+
290
+ With an ActiveRecord model:
291
+
292
+ ```ruby
293
+ class Bank < ActiveRecord::Base
294
+ attr_accessor :code, :name
295
+ validates :code, cusip: true
296
+ end
297
+ ```
298
+
299
+ Or any ruby class:
300
+
301
+ ```ruby
302
+ class Bank
303
+ include ActiveModel::Validations
304
+ attr_accessor :code, :name
305
+ validates :code, cusip: true
306
+ end
307
+ ```
308
+
309
+ RSpec matcher is also available for your convenience:
310
+
311
+ ```ruby
312
+ describe Bank do
313
+ it { should ensure_valid_cusip_format_of(:code) }
314
+ it { should_not ensure_cusip_base64_format_of(:name) }
315
+ end
316
+ ```
317
+
318
+ ### EmailValidator
319
+
320
+ **Ex:** user@example.com or user+123@example-site.com
321
+
322
+ **Rules:**
323
+ * Characters in username: a-z 0-9 -_+.
324
+ * Must include: @
325
+ * Characters in domain: a-z 0-9 -
326
+ * Must include extension: .co, .org, .museum
327
+
328
+ With an ActiveRecord model:
329
+
330
+ ```ruby
331
+ class User < ActiveRecord::Base
332
+ attr_accessor :email, :name
333
+ validates :email, email: true
334
+ end
335
+ ```
336
+
337
+ Or any ruby class:
338
+
339
+ ```ruby
340
+ class User
341
+ include ActiveModel::Validations
342
+ attr_accessor :email, :name
343
+ validates :email, email: true
344
+ end
345
+ ```
346
+
347
+ Options: :domains
348
+
349
+ ```ruby
350
+ validates :email, email: { domains: 'com' }
351
+ validates :email, email: { domains: :com }
352
+ validates :email, email: { domains: [:com, 'edu'] }
353
+ ```
354
+
355
+ RSpec matcher is also available for your convenience:
356
+
357
+ ```ruby
358
+ describe User do
359
+ it { should ensure_valid_email_format_of(:email) }
360
+ it { should_not ensure_valid_email_format_of(:name) }
361
+ end
362
+ ```
363
+
364
+ ### EqualityValidator
365
+
366
+ **Operators:**
367
+ * Less than: x < y
368
+ * Less than or equal to: x <= y
369
+ * Greater than: x > y
370
+ * Greater than or equal to: x >= y
371
+ * Equal to: x == y
372
+ * Not equal to: x != y
373
+
374
+
375
+ **Rules:**
376
+ * Equal and not equal to: cannot be nil
377
+
378
+ With an ActiveRecord model:
379
+
380
+ ```ruby
381
+ class Auction < ActiveRecord::Base
382
+ attr_accessor :bid, :price, :product
383
+ validates :bid, equality: { operator: :greater_than_or_equal_to, to: :price }
384
+ end
385
+ ```
386
+
387
+ Or any ruby class:
388
+
389
+ ```ruby
390
+ class Auction
391
+ include ActiveModel::Validations
392
+ attr_accessor :bid, :price, :product
393
+ validates :bid, equality: { operator: :greater_than_or_equal_to, to: :price }
394
+ end
395
+ ```
396
+
397
+ RSpec matcher is also available for your convenience:
398
+
399
+ ```ruby
400
+ describe Auction do
401
+ it { should ensure_equality_of(:bid).to(:price) }
402
+ it { should_not ensure_equality_of(:bid).to(:product) }
403
+ end
404
+ ```
405
+
406
+ ### GtinValidator
407
+
408
+ **Ex:** 73513537 or 4 006381 33393 1
409
+
410
+ **Rules:**
411
+ * Length: 8, 12, 13, or 14
412
+ * Characters: 0-9
413
+
414
+ With an ActiveRecord model:
415
+
416
+ ```ruby
417
+ class Trade < ActiveRecord::Base
418
+ attr_accessor :code, :name
419
+ validates :code, gtin: true
420
+ end
421
+ ```
422
+
423
+ Or any ruby class:
424
+
425
+ ```ruby
426
+ class Trade
427
+ include ActiveModel::Validations
428
+ attr_accessor :code, :name
429
+ validates :code, gtin: true
430
+ end
431
+ ```
432
+
433
+ Options: :strict, format: [:ean_8, :gtin_8, :ucc_8, :gtin_12, :upc, :upc_a, :ean, :ean_13, :gtin_13, :ucc_13, :gtin_14, :ucc_14]
434
+ Strict: requires not including spaces
435
+
436
+ ```ruby
437
+ validates :code, gtin: { format: :ean_8 }
438
+ validates :code, gtin: { strict: true }
439
+ validates :code, gtin: { format: :ucc_13, strict: true }
440
+ ```
441
+
442
+ RSpec matcher is also available for your convenience:
443
+
444
+ ```ruby
445
+ describe Trade do
446
+ it { should ensure_valid_gtin_format_of(:code) }
447
+ it { should_not ensure_valid_gtin_format_of(:name) }
448
+ end
449
+ ```
450
+
451
+ ### HexValidator
452
+
453
+ **Ex:** #a9a9a9 or #999 or aaaaaa or AAA
454
+
455
+ **Rules:**
456
+ * Prefix (non-mandatory): #
457
+ * Length: 3 or 6
458
+ * Characters: A-F a-f 0-9
459
+
460
+ With an ActiveRecord model:
461
+
462
+ ```ruby
463
+ class Profile < ActiveRecord::Base
464
+ attr_accessor :color, :trim
465
+ validates :color, hex: true
466
+ end
467
+ ```
468
+
469
+ Or any ruby class:
470
+
471
+ ```ruby
472
+ class Profile
473
+ include ActiveModel::Validations
474
+ attr_accessor :color, :trim
475
+ validates :color, hex: true
476
+ end
477
+ ```
478
+
479
+ RSpec matcher is also available for your convenience:
480
+
481
+ ```ruby
482
+ describe Color do
483
+ it { should ensure_valid_hex_format_of(:color) }
484
+ it { should_not ensure_valid_hex_format_of(:trim) }
485
+ end
486
+ ```
487
+
488
+ ### ImeiValidator
489
+
490
+ **Ex:** 356843052637512 or 35-6843052-637512 or 35.6843052.637512
491
+
492
+ **Rules:**
493
+ * Length: min 14
494
+ * Characters: 0-9 -.
495
+
496
+ With an ActiveRecord model:
497
+
498
+ ```ruby
499
+ class User < ActiveRecord::Base
500
+ attr_accessor :imei, :name
501
+ validates :imei, imei: true
502
+ end
503
+ ```
504
+
505
+ Or any ruby class:
506
+
507
+ ```ruby
508
+ class User
509
+ include ActiveModel::Validations
510
+ attr_accessor :imei, :name
511
+ validates :imei, imei: true
512
+ end
513
+ ```
514
+
515
+ RSpec matcher is also available for your convenience:
516
+
517
+ ```ruby
518
+ describe User do
519
+ it { should ensure_valid_imei_format_of(:imei) }
520
+ it { should_not ensure_valid_imei_format_of(:name) }
521
+ end
522
+ ```
523
+
524
+ ### IpValidator
525
+
526
+ **Ex:** 0.0.0.0 or 127.0.0.1 or 167.39.240.31
527
+
528
+ **Rules:**
529
+ * Length: min 7
530
+ * Characters: 0-9 .
531
+
532
+ With an ActiveRecord model:
533
+
534
+ ```ruby
535
+ class User < ActiveRecord::Base
536
+ attr_accessor :ip, :name
537
+ validates :ip, ip: true
538
+ end
539
+ ```
540
+
541
+ Or any ruby class:
542
+
543
+ ```ruby
544
+ class User
545
+ include ActiveModel::Validations
546
+ attr_accessor :ip, :name
547
+ validates :ip, ip: true
548
+ end
549
+ ```
550
+
551
+ RSpec matcher is also available for your convenience:
552
+
553
+ ```ruby
554
+ describe User do
555
+ it { should ensure_valid_ip_format_of(:ip) }
556
+ it { should_not ensure_valid_ip_format_of(:name) }
557
+ end
558
+ ```
559
+
560
+ ### IsbnValidator
561
+
562
+ **Ex:** 9519854894 or 0-9722051-1-x or 978 159059 9938
563
+
564
+ **Rules:**
565
+ * Length: 10 or 13
566
+ * Characters: 0-9 -|
567
+
568
+ With an ActiveRecord model:
569
+
570
+ ```ruby
571
+ class User < ActiveRecord::Base
572
+ attr_accessor :isbn, :name
573
+ validates :isbn, isbn: true
574
+ end
575
+ ```
576
+
577
+ Or any ruby class:
578
+
579
+ ```ruby
580
+ class User
581
+ include ActiveModel::Validations
582
+ attr_accessor :isbn, :name
583
+ validates :isbn, isbn: true
584
+ end
585
+ ```
586
+
587
+ RSpec matcher is also available for your convenience:
588
+
589
+ ```ruby
590
+ describe User do
591
+ it { should ensure_valid_isbn_format_of(:isbn) }
592
+ it { should_not ensure_valid_isbn_format_of(:name) }
593
+ end
594
+ ```
595
+
596
+ ### IsinValidator
597
+
598
+ **Ex:** US0378331005 or AU0000XVGZA3
599
+
600
+ **Rules:**
601
+ * Length: 12
602
+ * Characters: 0-9 A-Z
603
+ * Start: valid country code
604
+
605
+ With an ActiveRecord model:
606
+
607
+ ```ruby
608
+ class Trade < ActiveRecord::Base
609
+ attr_accessor :isin, :name
610
+ validates :isin, isin: true
611
+ end
612
+ ```
613
+
614
+ Or any ruby class:
615
+
616
+ ```ruby
617
+ class User
618
+ include ActiveModel::Validations
619
+ attr_accessor :isin, :name
620
+ validates :isin, isin: true
621
+ end
622
+ ```
623
+
624
+ RSpec matcher is also available for your convenience:
625
+
626
+ ```ruby
627
+ describe User do
628
+ it { should ensure_valid_isin_format_of(:isin) }
629
+ it { should_not ensure_valid_isin_format_of(:name) }
630
+ end
631
+ ```
632
+
633
+ ### LatitudeValidator
634
+
635
+ **Ex:** 78.213 or -34.985
636
+
637
+ **Rules:**
638
+ * Range: 90 to -90
639
+ * Characters: 0-9
640
+
641
+ With an ActiveRecord model:
642
+
643
+ ```ruby
644
+ class Location < ActiveRecord::Base
645
+ attr_accessor :lat, :name
646
+ validates :lat, latitude: true
647
+ end
648
+ ```
649
+
650
+ Or any ruby class:
651
+
652
+ ```ruby
653
+ class Location
654
+ include ActiveModel::Validations
655
+ attr_accessor :lat, :name
656
+ validates :lat, latitude: true
657
+ end
658
+ ```
659
+
660
+ RSpec matcher is also available for your convenience:
661
+
662
+ ```ruby
663
+ describe Location do
664
+ it { should ensure_valid_latitude_format_of(:lat) }
665
+ it { should_not ensure_valid_latitude_format_of(:name) }
666
+ end
667
+ ```
668
+
669
+ ### LongitudeValidator
670
+
671
+ **Ex:** 165.371 or -56.152
672
+
673
+ **Rules:**
674
+ * Range: 180 to -180
675
+ * Characters: 0-9
676
+
677
+ With an ActiveRecord model:
678
+
679
+ ```ruby
680
+ class Location < ActiveRecord::Base
681
+ attr_accessor :lon, :name
682
+ validates :lon, longitude: true
683
+ end
684
+ ```
685
+
686
+ Or any ruby class:
687
+
688
+ ```ruby
689
+ class Location
690
+ include ActiveModel::Validations
691
+ attr_accessor :lon, :name
692
+ validates :lon, longitude: true
693
+ end
694
+ ```
695
+
696
+ RSpec matcher is also available for your convenience:
697
+
698
+ ```ruby
699
+ describe Location do
700
+ it { should ensure_valid_longitude_format_of(:lon) }
701
+ it { should_not ensure_valid_longitude_format_of(:name) }
702
+ end
703
+ ```
704
+
705
+ ### MacAddressValidator
706
+
707
+ **Ex:**
708
+ '08:00:2b:01:02:03'
709
+ '08-00-2b-01-02-03'
710
+ '08002b:010203'
711
+ '08002b-010203'
712
+ '0800.2b01.0203'
713
+ '08002b010203'
714
+
715
+ **Rules:**
716
+ * Characters: a-z 0-9 -.:
717
+
718
+ With an ActiveRecord model:
719
+
720
+ ```ruby
721
+ class Device < ActiveRecord::Base
722
+ attr_accessor :mac, :name
723
+ validates :mac, mac_address: true
724
+ end
725
+ ```
726
+
727
+ Or any ruby class:
728
+
729
+ ```ruby
730
+ class Device
731
+ include ActiveModel::Validations
732
+ attr_accessor :mac, :name
733
+ validates :mac, mac_address: true
734
+ end
735
+ ```
736
+
737
+ RSpec matcher is also available for your convenience:
738
+
739
+ ```ruby
740
+ describe Device do
741
+ it { should ensure_valid_mac_address_format_of }
742
+ it { should_not ensure_valid_mac_address_format_of(:name) }
743
+ end
744
+ ```
745
+
746
+ ### NameValidator
747
+
748
+ **Ex:** James Brown or Billy Bob Thorton Jr
749
+
750
+ **Rules:**
751
+ * Range: 2 - 5 names
752
+ * Characters: a-z -
753
+ * Must include: First Last
754
+
755
+ With an ActiveRecord model:
756
+
757
+ ```ruby
758
+ class User < ActiveRecord::Base
759
+ attr_accessor :name, :email
760
+ validates :name, name: true
761
+ end
762
+ ```
763
+
764
+ Or any ruby class:
765
+
766
+ ```ruby
767
+ class User
768
+ include ActiveModel::Validations
769
+ attr_accessor :name, :email
770
+ validates :name, name: true
771
+ end
772
+ ```
773
+
774
+ RSpec matcher is also available for your convenience:
775
+
776
+ ```ruby
777
+ describe User do
778
+ it { should ensure_valid_name_format_of(:name) }
779
+ it { should_not ensure_valid_name_format_of(:email) }
780
+ end
781
+ ```
782
+
783
+ ### PasswordValidator
784
+
785
+ **Ex:** password or password123 or pa!!word
786
+
787
+ **Rules:**
788
+ * Range: 6-18
789
+ * Characters: a-z 0-9 -_!@#$%^&*
790
+
791
+ With an ActiveRecord model:
792
+
793
+ ```ruby
794
+ class User < ActiveRecord::Base
795
+ attr_accessor :password, :name
796
+ validates :password, password: true
797
+ end
798
+ ```
799
+
800
+ Or any ruby class:
801
+
802
+ ```ruby
803
+ class User
804
+ include ActiveModel::Validations
805
+ attr_accessor :password, :name
806
+ validates :password, password: true
807
+ end
808
+ ```
809
+ Options: :strict
810
+ Strict: requires length between 6 and 18, one number, lowercase, upcase letter
811
+
812
+ ```ruby
813
+ validates :password, password: { strict: true }
814
+ ```
815
+
816
+ RSpec matcher is also available for your convenience:
817
+
818
+ ```ruby
819
+ describe User do
820
+ it { should ensure_valid_password_format_of(:password) }
821
+ it { should_not ensure_valid_password_format_of(:name) }
822
+ end
823
+ ```
824
+
825
+ ### PhoneValidator
826
+
827
+ **Ex:** 555 333 4444 or (555) 123-4567 or +1 (555) 123 4567 ext-890
828
+
829
+ **Rules:**
830
+ * Characters: a-z 0-9 -()+
831
+
832
+ With an ActiveRecord model:
833
+
834
+ ```ruby
835
+ class User < ActiveRecord::Base
836
+ attr_accessor :phone, :name
837
+ validates :phone, phone: true
838
+ end
839
+ ```
840
+
841
+ Or any ruby class:
842
+
843
+ ```ruby
844
+ class User
845
+ include ActiveModel::Validations
846
+ attr_accessor :phone, :name
847
+ validates :phone, phone: true
848
+ end
849
+ ```
850
+
851
+ RSpec matcher is also available for your convenience:
852
+
853
+ ```ruby
854
+ describe User do
855
+ it { should ensure_valid_phone_format_of(:phone) }
856
+ it { should_not ensure_valid_phone_format_of(:name) }
857
+ end
858
+ ```
859
+
860
+ ### SedolValidator
861
+
862
+ **Ex:** B0WNLY7
863
+
864
+ **Rules:**
865
+ * Characters: A-Z 0-9
866
+
867
+ With an ActiveRecord model:
868
+
869
+ ```ruby
870
+ class Trade < ActiveRecord::Base
871
+ attr_accessor :sedol, :name
872
+ validates :sedol, sedol: true
873
+ end
874
+ ```
875
+
876
+ Or any ruby class:
877
+
878
+ ```ruby
879
+ class Trade
880
+ include ActiveModel::Validations
881
+ attr_accessor :sedol, :name
882
+ validates :sedol, sedol: true
883
+ end
884
+ ```
885
+
886
+ RSpec matcher is also available for your convenience:
887
+
888
+ ```ruby
889
+ describe Trade do
890
+ it { should ensure_valid_sedol_format_of(:sedol) }
891
+ it { should_not ensure_valid_sedol_format_of(:name) }
892
+ end
893
+ ```
894
+
895
+ ### SlugValidator
896
+
897
+ **Ex:** slug1234 or slug-1234
898
+
899
+ **Rules:**
900
+ * Characters: a-z 0-9 -
901
+
902
+ With an ActiveRecord model:
903
+
904
+ ```ruby
905
+ class User < ActiveRecord::Base
906
+ attr_accessor :slug, :name
907
+ validates :slug, slug: true
908
+ end
909
+ ```
910
+
911
+ Or any ruby class:
912
+
913
+ ```ruby
914
+ class User
915
+ include ActiveModel::Validations
916
+ attr_accessor :slug, :name
917
+ validates :slug, slug: true
918
+ end
919
+ ```
920
+
921
+ RSpec matcher is also available for your convenience:
922
+
923
+ ```ruby
924
+ describe User do
925
+ it { should ensure_valid_slug_format_of(:slug) }
926
+ it { should_not ensure_valid_slug_format_of(:name) }
927
+ end
928
+ ```
929
+
930
+ ### SsnValidator
931
+
932
+ **Ex:** 333-22-4444 or 333224444
933
+
934
+ **Rules:**
935
+ * Characters: 0-9 -
936
+
937
+ With an ActiveRecord model:
938
+
939
+ ```ruby
940
+ class User < ActiveRecord::Base
941
+ attr_accessor :ssn, :name
942
+ validates :ssn, ssn: true
943
+ end
944
+ ```
945
+
946
+ Or any ruby class:
947
+
948
+ ```ruby
949
+ class User
950
+ include ActiveModel::Validations
951
+ attr_accessor :ssn, :name
952
+ validates :ssn, ssn: true
953
+ end
954
+ ```
955
+
956
+ RSpec matcher is also available for your convenience:
957
+
958
+ ```ruby
959
+ describe User do
960
+ it { should ensure_valid_ssn_format_of(:ssn) }
961
+ it { should_not ensure_valid_ssn_format_of(:name) }
962
+ end
963
+ ```
964
+
965
+ ### UrlValidator
966
+
967
+ **Ex:** example.com or http://www.example.com
968
+
969
+ **Rules:**
970
+ * Characters in root: a-z 0-9 -.//:
971
+ * Characters in domain: a-z 0-9 -
972
+ * Must include extension: .co, .org, .museum
973
+
974
+ With an ActiveRecord model:
975
+
976
+ ```ruby
977
+ class User < ActiveRecord::Base
978
+ attr_accessor :url, :name
979
+ validates :url, url: true
980
+ end
981
+ ```
982
+
983
+ Or any ruby class:
984
+
985
+ ```ruby
986
+ class User
987
+ include ActiveModel::Validations
988
+ attr_accessor :url, :name
989
+ validates :url, url: true
990
+ end
991
+ ```
992
+
993
+ Options: :domains, :root, :scheme
994
+
995
+ ```ruby
996
+ validates :url, url: { scheme: :http }
997
+ validates :url, url: { scheme: [:http, 'https'] }
998
+ validates :url, url: { scheme: :http, root: true, domains: :com }
999
+ validates :url, url: { root: true }
1000
+ validates :url, url: { root: true, domains: :com }
1001
+ validates :url, url: { domains: 'com' }
1002
+ validates :url, url: { domains: :com }
1003
+ validates :url, url: { domains: [:com, 'edu'] }
1004
+ ```
1005
+
1006
+ RSpec matcher is also available for your convenience:
1007
+
1008
+ ```ruby
1009
+ describe User do
1010
+ it { should ensure_valid_url_format_of(:url) }
1011
+ it { should_not ensure_valid_url_format_of(:name) }
1012
+ end
1013
+ ```
1014
+
1015
+ ### UsernameValidator
1016
+
1017
+ **Ex:** username123 or username
1018
+
1019
+ **Rules:**
1020
+ * Range: 2-16
1021
+ * Characters: a-z 0-9 -_
1022
+
1023
+ With an ActiveRecord model:
1024
+
1025
+ ```ruby
1026
+ class User < ActiveRecord::Base
1027
+ attr_accessor :username, :name
1028
+ validates :username, username: true
1029
+ end
1030
+ ```
1031
+
1032
+ Or any ruby class:
1033
+
1034
+ ```ruby
1035
+ class User
1036
+ include ActiveModel::Validations
1037
+ attr_accessor :username, :name
1038
+ validates :username, username: true
1039
+ end
1040
+ ```
1041
+
1042
+ RSpec matcher is also available for your convenience:
1043
+
1044
+ ```ruby
1045
+ describe User do
1046
+ it { should ensure_valid_username_format_of(:username) }
1047
+ it { should_not ensure_valid_username_format_of(:name) }
1048
+ end
1049
+ ```
1050
+
1051
+ ### UuidValidator
1052
+
1053
+ **Ex:** 886313e1-3b8a-5372-9b90-0c9aee199e5d
1054
+
1055
+ **Rules:**
1056
+ * Characters: A-Z a-z 0-9 -
1057
+
1058
+ With an ActiveRecord model:
1059
+
1060
+ ```ruby
1061
+ class User < ActiveRecord::Base
1062
+ attr_accessor :uuid, :name
1063
+ validates :uuid, uuid: true
1064
+ end
1065
+ ```
1066
+
1067
+ Or any ruby class:
1068
+
1069
+ ```ruby
1070
+ class User
1071
+ include ActiveModel::Validations
1072
+ attr_accessor :uuid, :name
1073
+ validates :uuid, username: true
1074
+ end
1075
+ ```
1076
+
1077
+ Options: :version
1078
+
1079
+ ```ruby
1080
+ validates :uuid, uuid: { version: 3 }
1081
+ ```
1082
+
1083
+ RSpec matcher is also available for your convenience:
1084
+
1085
+ ```ruby
1086
+ describe User do
1087
+ it { should ensure_valid_uuid_format_of(:uuid) }
1088
+ it { should_not ensure_valid_uuid_format_of(:name) }
1089
+ end
1090
+ ```
1091
+
1092
+ ## Contributing
1093
+
1094
+ Your contribution is welcome.
1095
+
1096
+ 1. Fork it
1097
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
1098
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
1099
+ 4. Push to the branch (`git push origin my-new-feature`)
1100
+ 5. Create new Pull Request
1101
+