snils 0.1.2 → 0.2.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
2
  SHA1:
3
- metadata.gz: 0d078496a9e5e3d59cf848f8e688e77684a5df62
4
- data.tar.gz: 400e756356573821582f4d66b4d78238bec532cf
3
+ metadata.gz: 91cdf5ebb2a1c759d2a516c727f57b76608a0c6d
4
+ data.tar.gz: b09a5d8567ea381ba33266f35675e62f3d9d1f20
5
5
  SHA512:
6
- metadata.gz: 32824e28abc137a157b0bd7399726a58e96df0c213eecd2b893c28fb095059161036915ff1718d12a1590a1cc62d7adf8f62878a41bf05c190516fd1d5d104de
7
- data.tar.gz: 140f05aa7c5dbf5aedac2643ef6ef591b77cfb88a218902c9c817ae102ba1b4115b5979e35c23a38c9836e35eb893d2e98f97ca8e7acd0776a91aa71e975d409
6
+ metadata.gz: 68e09826f0a41d26ee283eb7f84c39bf4df40a87662a7830879e465922a4cada26845bdc1780e586832756b3a362e5bc1a478bfdeb61a2b7934105b0ac3e871d
7
+ data.tar.gz: d190281341892789efde45ecabe5398886bfa57b0825016e9785a6db0856a600a83ff24ee5242cd61cb3d112f5644951960dfc12477ea1b11521640d0003bd14
data/README.md CHANGED
@@ -51,26 +51,63 @@ Snils.new("216471647").errors
51
51
 
52
52
  Validating Rails model attributes:
53
53
 
54
+ 1. Modify your gemfile to require `snils/rails`
55
+
56
+ ```ruby
57
+ gem 'snils', require: 'snils/rails'
58
+ ```
59
+
60
+ 2. Add `:snils` validation to SNILS attributes
61
+
62
+ ```ruby
63
+ validates :snils, presence: true, uniqueness: true, snils: true
64
+ ```
65
+
66
+ Generating SNILSes in factories for tests:
67
+
54
68
  ```ruby
55
- require 'snils'
56
-
57
- class User < ActiveRecord::Base
58
- validates :snils, presence: true, uniqueness: true
59
- validate :snils_validation
60
-
61
- protected
62
-
63
- def snils_validation
64
- validated_snils = Snils.new(snils)
65
- unless validated_snils.valid?
66
- validated_snils.errors.each do |error|
67
- errors.add(:snils, *error)
68
- end
69
- end
69
+ FactoryGirl.define do
70
+ sequence :snils do |_|
71
+ Snils.new.to_s
72
+ end
73
+
74
+ factory :user do
75
+ snils
70
76
  end
71
77
  end
72
78
  ```
73
79
 
80
+ ### Recommended workflow for Ruby on Rails projects
81
+
82
+ 1. Use [draper] gem to format SNILS for views
83
+
84
+ ```ruby
85
+ # app/decorators/user_decorator.rb
86
+ class UserDecorator < Draper::Decorator
87
+ delegate_all
88
+
89
+ def snils
90
+ @formatted_snils ||= Snils.new(object.snils).formatted
91
+ end
92
+ end
93
+ ```
94
+
95
+ 2. Sanitize SNILSes on attribute write
96
+
97
+ ```ruby
98
+ # app/models/user.rb
99
+ class User < ActiveRecord::Base
100
+ validates :snils, presence: true, uniqueness: true, snils: true
101
+
102
+ def snils=(value)
103
+ Snils.new(value).raw
104
+ end
105
+ end
106
+ ```
107
+
108
+ With this setup you will always store raw (only digits) value in database and always will show pretty formatted SNILS to users.
109
+
110
+
74
111
  ## Contributing
75
112
 
76
113
  1. Fork it ( https://github.com/Envek/snils/fork )
@@ -79,4 +116,5 @@ end
79
116
  4. Push to the branch (`git push origin my-new-feature`)
80
117
  5. Create a new Pull Request
81
118
 
119
+ [draper]: https://github.com/drapergem/draper
82
120
  [SNILS]: http://en.wikipedia.org/wiki/SNILS_(Russia) "Insurance individual account number"
@@ -46,26 +46,63 @@ Snils.new("216471647").errors
46
46
 
47
47
  Валидация в Ruby on Rails для атрибутов моделей:
48
48
 
49
+ 1. Измените Gemfile, чтобы он подключал `snils/rails`
50
+
51
+ ```ruby
52
+ gem 'snils', require: 'snils/rails'
53
+ ```
54
+
55
+ 2. Добавьте валидацию `:snils` к требуемым атрибутам
56
+
57
+ ```ruby
58
+ validates :snils, presence: true, uniqueness: true, snils: true
59
+ ```
60
+
61
+ Генерация СНИЛСов в фабриках для тестов:
62
+
49
63
  ```ruby
50
- require 'snils'
51
-
52
- class User < ActiveRecord::Base
53
- validates :snils, presence: true, uniqueness: true
54
- validate :snils_validation
55
-
56
- protected
57
-
58
- def snils_validation
59
- validated_snils = Snils.new(snils)
60
- unless validated_snils.valid?
61
- validated_snils.errors.each do |error|
62
- errors.add(:snils, *error)
63
- end
64
- end
64
+ FactoryGirl.define do
65
+ sequence :snils do |_|
66
+ Snils.new.to_s
67
+ end
68
+
69
+ factory :user do
70
+ snils
65
71
  end
66
72
  end
67
73
  ```
68
74
 
75
+ ### Рекомендуемый рабочий процесс для проектов на Ruby on Rails
76
+
77
+ 1. Используйте [draper], чтобы форматировать СНИЛС для отображения
78
+
79
+ ```ruby
80
+ # app/decorators/user_decorator.rb
81
+ class UserDecorator < Draper::Decorator
82
+ delegate_all
83
+
84
+ def snils
85
+ @formatted_snils ||= Snils.new(object.snils).formatted if object.snils
86
+ end
87
+ end
88
+ ```
89
+
90
+ 2. Очищайте СНИЛС при записи в атрибут модели
91
+
92
+ ```ruby
93
+ # app/models/user.rb
94
+ class User < ActiveRecord::Base
95
+ validates :snils, presence: true, uniqueness: true, snils: true
96
+
97
+ def snils=(value)
98
+ Snils.new(value).raw
99
+ end
100
+ end
101
+ ```
102
+
103
+ С такой настройкой вы всегда будете хранить в БД значение, состоящее только из цифр, а пользователю всегда будете отображать красиво форматированный СНИЛС.
104
+
105
+
69
106
  ## Помощь в разработке
70
107
 
71
108
  1. Сделайте форк проекта в своём github-аккаунте. ( https://github.com/Envek/snils/fork )
@@ -74,4 +111,5 @@ end
74
111
  4. Запушьте изменения (`git push origin my-new-feature`)
75
112
  5. Создайте новый Pull Request
76
113
 
114
+ [draper]: https://github.com/drapergem/draper
77
115
  [СНИЛС]: http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D1%85%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B2%D0%B8%D0%B4%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B8%D1%86%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE_%D1%81%D1%87%D1%91%D1%82%D0%B0
@@ -19,7 +19,7 @@ class Snils
19
19
  # Calculates checksum (last 2 digits) of a number
20
20
  def checksum
21
21
  digits = @snils.split('').take(9).map(&:to_i)
22
- checksum = digits.each.with_index.inject(0) do |sum, (digit, index)|
22
+ checksum = digits.each.with_index.reduce(0) do |sum, (digit, index)|
23
23
  sum + digit * (9 - index)
24
24
  end
25
25
  while checksum > 101 do
@@ -59,7 +59,7 @@ class Snils
59
59
 
60
60
  # Generates new random valid SNILS
61
61
  def self.generate
62
- digits = Array.new(9).map{ rand(10) }.join
62
+ digits = Array.new(9).map { rand(10) }.join
63
63
  sum = self.new(digits).checksum
64
64
  "#{digits}#{sum}"
65
65
  end
@@ -67,10 +67,9 @@ class Snils
67
67
  protected
68
68
 
69
69
  def validate
70
- @errors << [:wrong_length, {:count => 11}] unless @snils.length == 11
70
+ @errors << [:wrong_length, { :count => 11 }] unless @snils.length == 11
71
71
  @errors << :invalid unless @snils[-2..-1] == self.checksum
72
72
  @validated = true
73
73
  end
74
74
 
75
75
  end
76
-
@@ -0,0 +1,2 @@
1
+ require 'snils'
2
+ require 'snils/rails'
@@ -0,0 +1,26 @@
1
+ require 'snils'
2
+
3
+ # SNILS validation for Active Model (Active Record and Ruby on Rails)
4
+ #
5
+ # Usage:
6
+ #
7
+ # 1. Modify your gemfile to require 'snils/rails'
8
+ #
9
+ # gem 'snils', require: 'snils/rails'
10
+ #
11
+ # 2. Add +:snils+ validation to SNILS attributes
12
+ #
13
+ # validates :snils, presence: true, uniqueness: true, snils: true
14
+ #
15
+ class SnilsValidator < ActiveModel::EachValidator
16
+ def validate_each(record, attribute, value)
17
+ snils = Snils.new(value)
18
+ if snils.errors.any? && options[:message]
19
+ record.errors.add(attribute, options[:message])
20
+ else
21
+ snils.errors.each do |error|
22
+ record.errors.add(attribute, *error)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  class Snils
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -68,12 +68,12 @@ describe Snils do
68
68
 
69
69
  it 'should not validate invalid snils (with wrong length)' do
70
70
  snils = described_class.new('963-117-158 080')
71
- expect(snils.errors).to include [:wrong_length, {:count => 11}]
71
+ expect(snils.errors).to include [:wrong_length, { :count => 11 }]
72
72
  end
73
73
 
74
74
  it 'should not validate invalid snils (with wrong length)' do
75
75
  snils = described_class.new('963-117-158')
76
- expect(snils.errors).to include [:wrong_length, {:count => 11}]
76
+ expect(snils.errors).to include [:wrong_length, { :count => 11 }]
77
77
  end
78
78
 
79
79
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Novikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-30 00:00:00.000000000 Z
11
+ date: 2014-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -85,6 +85,8 @@ files:
85
85
  - README.ru.md
86
86
  - Rakefile
87
87
  - lib/snils.rb
88
+ - lib/snils/all.rb
89
+ - lib/snils/rails.rb
88
90
  - lib/snils/version.rb
89
91
  - snils.gemspec
90
92
  - spec/snils_spec.rb