apress-validators 0.1.0

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.
@@ -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: