apress-validators 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmVlNzJkNTQ5MzIyNjhhYjc0OWZlNzE1MGE1MjFhY2JkZjI0NGMwMg==
5
+ data.tar.gz: !binary |-
6
+ M2FjNTFlYjRmZWE2OTliMTdhOGU3ZjBiZDcwODg4ZmVlMDc5ZTkzMw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MTI2ZTEzMWM4NWNhZTBmNWI4NWIyNzFmNzEzYTM3YWJlYmYwYWZlODZiOGE5
10
+ ZTVkNjFlYTcyNTIwMWQxMGE1M2Y3MzFmMWM5MzhmMmNmYjU1YTJjMTM0Y2Iz
11
+ MWMyODQ0MThkODVmNjYxZGQ1NGMxM2E0Yjk2M2YwM2FkMzQ5ODc=
12
+ data.tar.gz: !binary |-
13
+ ZDA4ZjFiZWY0ZWQ4YzNkNzBjZjg4OGQ2ODQ2M2Q3NTc1MDI0YmFhMjY3NzJm
14
+ NzY1YTQ4ODY5NmZhMDVjZmM5N2ZjOWQ4NjdlMDFjN2JhMmJkMmRkZTk4MGQz
15
+ M2U3MzQ1MzM1MGNhZTdjMmExOTRjY2ZjODZkZWZkMDYzZDMxODk=
@@ -0,0 +1,19 @@
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
15
+ /.rvmrc
16
+ /.idea/
17
+ .ruby-version
18
+ .ruby-gemset
19
+ /gemfiles/
data/.rspec ADDED
@@ -0,0 +1,5 @@
1
+ --color
2
+ --tty
3
+ --format progress
4
+ --order random
5
+ --backtrace
@@ -0,0 +1,19 @@
1
+ appraise 'rails3.1' do
2
+ gem 'rails', '~> 3.1'
3
+ end
4
+
5
+ appraise 'rails3.2' do
6
+ gem 'rails', '~> 3.2'
7
+ end
8
+
9
+ appraise 'rails4.0' do
10
+ gem 'rails', '~> 4.0'
11
+ end
12
+
13
+ appraise 'rails4.1' do
14
+ gem 'rails', '~> 4.1'
15
+ end
16
+
17
+ appraise 'rails4.2' do
18
+ gem 'rails', '~> 4.2'
19
+ end
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in apress-validators.gemspec
4
+ gemspec
@@ -0,0 +1,32 @@
1
+ RAILS_ENV = test
2
+ BUNDLE = RAILS_ENV=${RAILS_ENV} bundle
3
+ BUNDLE_OPTIONS = --jobs=2
4
+ RSPEC = rspec
5
+ APPRAISAL = appraisal
6
+
7
+ all: test
8
+
9
+ test: configs bundler appraisal
10
+ ${BUNDLE} exec ${APPRAISAL} ${RSPEC} spec 2>&1
11
+
12
+ define DATABASE_YML
13
+ test:
14
+ adapter: postgresql
15
+ database: docker
16
+ username: docker
17
+ host: localhost
18
+ min_messages: warning
19
+ endef
20
+ export DATABASE_YML
21
+
22
+ configs:
23
+ echo "$${DATABASE_YML}" > spec/internal/config/database.yml
24
+
25
+ bundler:
26
+ if ! gem list bundler -i > /dev/null; then \
27
+ gem install bundler; \
28
+ fi
29
+ ${BUNDLE} install ${BUNDLE_OPTIONS}
30
+
31
+ appraisal:
32
+ ${BUNDLE} exec ${APPRAISAL} install
@@ -0,0 +1,36 @@
1
+ # Apress::Validators
2
+ <a href="http://dolly.railsc.ru/projects/136/builds/latest/?ref=master">
3
+ <img src="http://dolly.railsc.ru/badges/abak-press/apress-validators/master" height="18">
4
+ </a>
5
+
6
+ Validators for ActiveRecord and ActiveModel.
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'apress-validators'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle install
19
+
20
+ ## Available Validators
21
+
22
+ `CountValidator` - behaves similarly to `LengthValidator`, but designed only for associated records. Does not count records
23
+ that are marked for destruction. Takes the same options as `LengthValidator`.
24
+ ```ruby
25
+ validates :image, :count => {:maximum => 24}
26
+ validates :image, :count => {:minimum => 2, message: 'Must have at lest 2 images'}
27
+ validates :image, :count => {:is => 3, :allow_nil => true}
28
+ ```
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it ( https://github.com/[my-github-username]/apress-validators/fork )
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create a new Pull Request
@@ -0,0 +1,5 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
@@ -0,0 +1,17 @@
1
+ class CountValidator < ActiveModel::Validations::LengthValidator
2
+ MESSAGES = {
3
+ :wrong_length => :count_invalid,
4
+ :too_short => :count_greater_than_or_equal_to,
5
+ :too_long => :count_less_than_or_equal_to
6
+ }.freeze
7
+
8
+ def initialize(options)
9
+ options = options.reverse_merge(MESSAGES)
10
+ super
11
+ end
12
+
13
+ def validate_each(record, attribute, value)
14
+ existing_records = record.send(attribute).reject(&:marked_for_destruction?)
15
+ super(record, attribute, existing_records)
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'apress/validators/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'apress-validators'
8
+ spec.version = Apress::Validators::VERSION
9
+ spec.authors = ['Pavel Galkin']
10
+ spec.email = ['paulriddle@openmailbox.org']
11
+ spec.summary = 'Validators for ActiveRecord and ActiveModel.'
12
+ spec.description = %q{The gem is supposed to contain validators
13
+ that can be used across multiple projects.}
14
+ spec.homepage = 'https://github.com/abak-press/apress-validators'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'rails', '>= 3.1', '< 4.3'
22
+ spec.add_runtime_dependency 'pg'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.7'
25
+ spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'rspec', '>= 3.1'
27
+ spec.add_development_dependency 'rspec-rails', '>= 2.14.0'
28
+ spec.add_development_dependency 'combustion', '>= 0.5.3'
29
+ spec.add_development_dependency 'appraisal', '>= 1.0.2'
30
+ spec.add_development_dependency 'simplecov'
31
+ spec.add_development_dependency 'pry-debugger'
32
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize! :active_record
7
+ run Combustion::Application
@@ -0,0 +1,12 @@
1
+ ru:
2
+ errors:
3
+ messages:
4
+ count_less_than_or_equal_to:
5
+ one: Количество должно быть меньше одного
6
+ other: Количество должно быть %{count} или меньше
7
+ count_greater_than_or_equal_to:
8
+ one: Количество должно быть больше одного
9
+ other: Количество должно быть больше %{count}
10
+ count_invalid:
11
+ one: Неверное количество (должно быть 1)
12
+ other: Неверное количество (должно быть %{count})
@@ -0,0 +1,8 @@
1
+ require 'rails'
2
+ require 'apress/validators/version'
3
+ require 'apress/validators/engine'
4
+
5
+ module Apress
6
+ module Validators
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Apress
2
+ module Validators
3
+ class Engine < ::Rails::Engine
4
+ config.autoload_paths += Dir["#{config.root}/lib"]
5
+ config.i18n.load_path += Dir[config.root.join('locales', '*.{rb,yml}').to_s]
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module Apress
2
+ module Validators
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe CountValidator do
4
+ before do
5
+ stub_const('OwnerClass', Class.new(Owner))
6
+ end
7
+
8
+ describe 'success' do
9
+ let(:owner) { OwnerClass.new }
10
+
11
+ before do
12
+ OwnerClass.validates :pets, :count => {:minimum => 2}
13
+ owner.pets = [Pet.new, Pet.new]
14
+ end
15
+
16
+ it { expect(owner).to be_valid }
17
+ end
18
+
19
+ describe 'failure' do
20
+ let(:owner) { OwnerClass.new }
21
+
22
+ before do
23
+ OwnerClass.validates :pets, :count => {:minimum => 2}
24
+ end
25
+
26
+ it do
27
+ expect(owner).to be_invalid
28
+ expect(owner.errors).to include(:pets)
29
+ end
30
+ end
31
+
32
+ context 'when associated records are marked for destruction' do
33
+ let(:owner) { OwnerClass.new(pets: [Pet.new, Pet.new]) }
34
+
35
+ before do
36
+ OwnerClass.validates :pets, :count => {:maximum => 1}
37
+ owner.pets.last.mark_for_destruction
38
+ end
39
+
40
+ it 'does not count associated records marked for destruction' do
41
+ expect(owner).to be_valid
42
+ end
43
+ end
44
+
45
+ context 'with no optional error messages' do
46
+ let(:owner) { OwnerClass.new }
47
+
48
+ before do
49
+ OwnerClass.validates :pets, :count => {:minimum => 1}
50
+ owner.save
51
+ end
52
+
53
+ it "uses it's own default error messages" do
54
+ expect(owner.errors[:pets]).to eq([I18n.t('errors.messages.count_greater_than_or_equal_to.one')])
55
+ end
56
+ end
57
+
58
+ context 'with optional error message' do
59
+ let(:owner) { OwnerClass.new }
60
+
61
+ before do
62
+ OwnerClass.validates :pets, :count => {:minimum => 1, :too_short => 'optional message'}
63
+ owner.save
64
+ end
65
+
66
+ it 'uses optional error message' do
67
+ expect(owner.errors[:pets]).to eq(['optional message'])
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,4 @@
1
+ class Owner < ActiveRecord::Base
2
+ has_many :pets
3
+ accepts_nested_attributes_for :pets, :allow_destroy => true
4
+ end
@@ -0,0 +1,3 @@
1
+ class Pet < ActiveRecord::Base
2
+ belongs_to :owner
3
+ end
@@ -0,0 +1 @@
1
+ database.yml
@@ -0,0 +1,6 @@
1
+ ActiveRecord::Schema.define do
2
+ create_table :owners, :force => true
3
+ create_table :pets, :force => true do |t|
4
+ t.belongs_to :owner
5
+ end
6
+ end
@@ -0,0 +1 @@
1
+ *.log
@@ -0,0 +1,21 @@
1
+ require 'bundler/setup'
2
+ require 'apress/validators'
3
+
4
+ require 'simplecov'
5
+ SimpleCov.start 'rails' do
6
+ minimum_coverage 100
7
+ add_filter 'lib'
8
+ end
9
+
10
+ require 'combustion'
11
+ Combustion.initialize! :active_record do
12
+ config.i18n.enforce_available_locales = false
13
+ config.i18n.default_locale = :ru
14
+ end
15
+
16
+ require 'rspec/rails'
17
+ RSpec.configure do |config|
18
+ config.use_transactional_fixtures = true
19
+ config.filter_run_including :focus => true
20
+ config.run_all_when_everything_filtered = true
21
+ end
metadata ADDED
@@ -0,0 +1,219 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: apress-validators
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pavel Galkin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ - - <
21
+ - !ruby/object:Gem::Version
22
+ version: '4.3'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ - - <
31
+ - !ruby/object:Gem::Version
32
+ version: '4.3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: pg
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '1.7'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ version: '1.7'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '3.1'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '3.1'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec-rails
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: 2.14.0
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: 2.14.0
103
+ - !ruby/object:Gem::Dependency
104
+ name: combustion
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 0.5.3
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: 0.5.3
117
+ - !ruby/object:Gem::Dependency
118
+ name: appraisal
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: 1.0.2
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: 1.0.2
131
+ - !ruby/object:Gem::Dependency
132
+ name: simplecov
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ! '>='
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: pry-debugger
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ description: ! "The gem is supposed to contain validators\n that
160
+ can be used across multiple projects."
161
+ email:
162
+ - paulriddle@openmailbox.org
163
+ executables: []
164
+ extensions: []
165
+ extra_rdoc_files: []
166
+ files:
167
+ - .gitignore
168
+ - .rspec
169
+ - Appraisals
170
+ - Gemfile
171
+ - Makefile
172
+ - README.md
173
+ - Rakefile
174
+ - app/validators/count_validator.rb
175
+ - apress-validators.gemspec
176
+ - config.ru
177
+ - config/locales/ru.yml
178
+ - lib/apress/validators.rb
179
+ - lib/apress/validators/engine.rb
180
+ - lib/apress/validators/version.rb
181
+ - spec/app/validators/count_validator_spec.rb
182
+ - spec/internal/app/models/owner.rb
183
+ - spec/internal/app/models/pet.rb
184
+ - spec/internal/config/.gitignore
185
+ - spec/internal/db/schema.rb
186
+ - spec/internal/log/.gitignore
187
+ - spec/spec_helper.rb
188
+ homepage: https://github.com/abak-press/apress-validators
189
+ licenses: []
190
+ metadata: {}
191
+ post_install_message:
192
+ rdoc_options: []
193
+ require_paths:
194
+ - lib
195
+ required_ruby_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ! '>='
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ requirements: []
206
+ rubyforge_project:
207
+ rubygems_version: 2.4.8
208
+ signing_key:
209
+ specification_version: 4
210
+ summary: Validators for ActiveRecord and ActiveModel.
211
+ test_files:
212
+ - spec/app/validators/count_validator_spec.rb
213
+ - spec/internal/app/models/owner.rb
214
+ - spec/internal/app/models/pet.rb
215
+ - spec/internal/config/.gitignore
216
+ - spec/internal/db/schema.rb
217
+ - spec/internal/log/.gitignore
218
+ - spec/spec_helper.rb
219
+ has_rdoc: