validation_matcher 3.2.0 → 4.0.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: 2256f5aae95d9a85c63454d483aa53d63b920579
4
- data.tar.gz: 9b7f1c07918b26a57646055107d523b95330016c
3
+ metadata.gz: 44aea0bbd6d53fd36664be6e5f80d2f42d4b7dca
4
+ data.tar.gz: d2a20e572b8ed5e999cb54324bd8fe8770727b8b
5
5
  SHA512:
6
- metadata.gz: 39cdb61a3f6be45f76d7676eed2addaa6b6d4d24cbc7c8a455a684709deb43d82a2bfbd22397ecb28c7f8ba6b91cb6fc24d692cf50ad5c41b8005a649a06a259
7
- data.tar.gz: dd45b03f8fee1a7acdd8809485f7ed75b9c2ed7c43d28394a38bc19ca5d8c1bdcdf852c692e80d0f7eb5b45aacd7d0ef95380d209034b663b3f99ebc7e368f9a
6
+ metadata.gz: f00bd4e341890244dfbd9f7e154fb3b8df854aabf0a02a981e438e3b5ef61311fd3d4801eed0c91deab0c539455571bc2ec7608c1cf8e0b8bd91c8a6065cdac5
7
+ data.tar.gz: cdd896f57cf72f9c32755f5e90e939c3979d5063c89d88e1776baec4cd936dfb551f1ec9b47ec6afbe90aa97a908df7dd115ce2b940ea33f7acaa85a386bf9c8
@@ -0,0 +1,36 @@
1
+ stages:
2
+ - style
3
+ - specs
4
+
5
+ .ruby: &ruby
6
+ before_script: ["bundle install"]
7
+ cache:
8
+ key: "$CI_COMMIT_REF_NAME"
9
+ paths: ["vendor/bundle"]
10
+ image: devfu/ci:2.4-alpine
11
+ variables:
12
+ BUNDLE_CLEAN: "true"
13
+ BUNDLE_JOBS: "$(nproc)"
14
+ BUNDLE_PATH: "vendor/bundle"
15
+ BUNDLE_RETRY: "3"
16
+ BUNDLE_WITHOUT: "production,staging"
17
+
18
+ #
19
+ # style
20
+ #
21
+
22
+ rubocop:
23
+ <<: *ruby
24
+ except: [tags]
25
+ script: ["rubocop"]
26
+ stage: style
27
+
28
+ #
29
+ # specs
30
+ #
31
+
32
+ rspec:
33
+ <<: *ruby
34
+ except: [tags]
35
+ script: ["rake spec"]
36
+ stage: specs
@@ -0,0 +1,17 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.4
3
+ DisplayCopNames: true
4
+ DisplayStyleGuide: true
5
+ ExtraDetails: true
6
+ Exclude:
7
+ - Gemfile.lock
8
+ - vendor/**/*
9
+
10
+ inherit_from:
11
+ - .rubocop_todo.yml
12
+
13
+ inherit_gem:
14
+ yoshiki: .devfu-rubocop.yml
15
+
16
+ Style/Documentation:
17
+ Enabled: false
@@ -0,0 +1,16 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2017-08-28 06:11:21 +0000 using RuboCop version 0.49.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 2
10
+ Metrics/AbcSize:
11
+ Max: 19
12
+
13
+ # Offense count: 1
14
+ # Configuration parameters: CountComments.
15
+ Metrics/MethodLength:
16
+ Max: 13
@@ -0,0 +1,17 @@
1
+ FROM devfu/ci:2.4-alpine
2
+
3
+ ENV app /src
4
+ ENV BUNDLE_NO_PRUNE true
5
+ ENV BUNDLE_PATH /bundle
6
+ RUN bundle config jobs $(nproc)
7
+
8
+ # Copy the bundle config
9
+ # COPY .bundle/config /usr/local/bundle/config
10
+
11
+ RUN mkdir $app
12
+ WORKDIR $app
13
+ ADD . $app
14
+
15
+ VOLUME /bundle
16
+
17
+ CMD bundle console
data/Gemfile CHANGED
@@ -1,10 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in validation_matcher.gemspec
4
- gemspec :development_group => :test
5
-
6
- group :development do
7
- # install the appropriate pry debug tool
8
- gem 'pry-byebug', require: false, platform: 'ruby_20'
9
- gem 'pry-debugger', require: false, platform: 'ruby_19'
10
- end
6
+ gemspec development_group: :test
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new :spec
5
- task :default => :spec
7
+ task default: :spec
@@ -0,0 +1,38 @@
1
+ version: '3'
2
+
3
+ services:
4
+ ruby:
5
+ build: .
6
+ volumes: &ruby_volumes
7
+ - .:/src:cached
8
+ - gems:/bundle:cached
9
+
10
+ #
11
+ # fake binstubs with additional services
12
+ #
13
+
14
+ # docker-compose run bundle [cmd]
15
+ bundle:
16
+ build: .
17
+ command: check
18
+ entrypoint: ["bundle"]
19
+ volumes: *ruby_volumes
20
+
21
+ # docker-compose run rake [task]
22
+ rake:
23
+ build: .
24
+ command: spec
25
+ entrypoint: ["bundle", "exec", "rake"]
26
+ volumes: *ruby_volumes
27
+
28
+ # docker-compose run rspec [pattern]
29
+ rspec:
30
+ build: .
31
+ command: spec
32
+ entrypoint: ["bundle", "exec", "rspec"]
33
+ volumes: *ruby_volumes
34
+
35
+ volumes:
36
+ gems:
37
+ external:
38
+ name: docker-gems
@@ -1,56 +1,70 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'validation_matcher/version'
2
4
  require 'rspec/expectations'
3
5
 
4
6
  module ValidationMatcher
5
7
 
6
- class UnexpectedOptions < RuntimeError
7
-
8
- attr_reader :validator
8
+ RSpec::Matchers.define :validate do |_expected|
9
+ chain(:of) { |attr| @attribute = attr }
9
10
 
10
- def initialze validator
11
- @validator = validator
11
+ chain(:with) do |*opts|
12
+ @options = opts.extract_options!
13
+ @options = opts if @options.empty?
12
14
  end
13
15
 
14
- def message
15
- <<-MSG
16
- Cannot validate options with custom validator.
17
- Use `should validate #{ validator.inspect }` (with no options) instead."
18
- MSG
16
+ match do |_actual|
17
+ if @attribute
18
+ validator.present? && (@options ? validator.options.should =~ @options : true)
19
+ else
20
+ callback.present? && (@options ? check_callback_options : true)
21
+ end
19
22
  end
20
23
 
21
- end
22
-
23
- RSpec::Matchers.define :validate do |*expected|
24
- attr_reader :expected_attribute, :expected_options, :expected_validator
24
+ match_when_negated do |_actual|
25
+ if @attribute
26
+ raise "Negating a matcher with options doesn't really make sense!" if @options
27
+ validator.should be_nil
28
+ else
29
+ callback.should be_nil
30
+ end
31
+ end
25
32
 
26
- chain(:of) { |field| @expected_attribute = field }
27
- chain(:with) { |hash| @expected_options = hash }
33
+ def callback
34
+ actual.class._validate_callbacks.detect { |c| c.filter == expected }
35
+ end
28
36
 
29
- match do |actual|
30
- @expected_options ||= {}
31
- @expected_validator = expected.first
37
+ def check_callback_options
38
+ opts = parse_callback_options
32
39
 
33
- validator? or callback?
40
+ if @options.is_a? Hash
41
+ raise 'Cannot expect custom procs' if @options.values.any? { |v| v.is_a? Proc }
42
+ @options.each { |k, _| opts[k].should =~ Array(@options[k]) }
43
+ else
44
+ opts.keys.should =~ @options
45
+ end
34
46
  end
35
47
 
36
- def callback_methods
37
- actual._validate_callbacks.select { |c| c.filter == expected_validator }
38
- end
48
+ def parse_callback_options
49
+ ifs = callback.instance_variable_get '@if'
39
50
 
40
- def callback?
41
- callback = callback_methods.any?
42
- fail UnexpectedOptions if callback and expected_options.any?
43
- callback
44
- end
51
+ if ifs.first.is_a? Proc
52
+ proc_binding = ifs.first.binding
53
+ if proc_binding.local_variables.include? :options
54
+ ons = proc_binding.local_variable_get(:options)[:on]
55
+ ifs = ifs[1..-1]
56
+ end
57
+ end
45
58
 
46
- def attribute_validators
47
- expected_attribute ? actual.class.validators_on(expected_attribute) : []
59
+ {
60
+ if: Array(ifs),
61
+ on: Array(ons),
62
+ unless: Array(callback.instance_variable_get('@unless'))
63
+ }.reject { |_, v| v.empty? }
48
64
  end
49
65
 
50
- def validator?
51
- attribute_validators.any? do |validator|
52
- validator.kind == expected_validator && validator.options == expected_options
53
- end
66
+ def validator
67
+ actual.class.validators_on(@attribute).detect { |v| v.kind == expected }
54
68
  end
55
69
  end
56
70
 
@@ -1,3 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ValidationMatcher
2
- VERSION = '3.2.0'
4
+
5
+ VERSION = '4.0.0'
6
+
3
7
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  libs = %w[
2
4
  active_model
3
5
  active_support/core_ext
@@ -38,6 +40,8 @@ class Thing
38
40
  validates :field_c, numericality: { allow_nil: false, only_integer: true }
39
41
 
40
42
  validate :custom_validator
43
+ validate :another_custom_validator, on: :update
44
+ validate :procs_cannot_be_speced, if: -> { new_record? }
41
45
 
42
46
  private
43
47
 
@@ -1,23 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Thing do
4
6
 
5
7
  describe 'each validators' do
6
8
 
7
- describe 'without options' do
9
+ describe 'with options' do
8
10
 
9
- it { should_not validate(:presence).of :field_a }
10
- it { should validate(:presence).of :field_b }
11
+ it 'can be expected without specifying options' do
12
+ should validate(:numericality).of :field_c
13
+ end
11
14
 
12
- it { should_not validate(:numericality).of :field_c }
15
+ it 'can be expected with specified options' do
16
+ should validate(:numericality).of(:field_c).with only_integer: true, allow_nil: false
17
+ end
13
18
 
14
- end
19
+ it 'cannot be negated with specified options' do
20
+ lambda do
21
+ opts = { only_integer: false }
22
+ should_not validate(:numericality).of(:field_c).with opts
23
+ end.should raise_exception RuntimeError
24
+ end
15
25
 
16
- describe 'with options' do
26
+ end
17
27
 
18
- it { should_not validate(:numericality).of(:field_c).with only_integer: true }
28
+ describe 'without options' do
19
29
 
20
- it { should validate(:numericality).of(:field_c).with only_integer: true, allow_nil: false }
30
+ it { should_not validate(:presence).of :field_a }
31
+ it { should validate(:presence).of :field_b }
21
32
 
22
33
  end
23
34
 
@@ -28,13 +39,26 @@ describe Thing do
28
39
  describe 'without options' do
29
40
 
30
41
  it { should validate :custom_validator }
42
+ it { should validate :another_custom_validator }
31
43
 
32
44
  end
33
45
 
34
46
  describe 'with options' do
35
47
 
36
- it 'is not supported ' do
37
- -> { should validate(:custom_validator).with on: :update }.should raise_exception ValidationMatcher::UnexpectedOptions
48
+ it { should validate(:another_custom_validator).with on: :update }
49
+
50
+ end
51
+
52
+ describe 'with a proc' do
53
+
54
+ it 'cannot be specced by key & value' do
55
+ lambda do
56
+ should validate(:procs_cannot_be_speced).with if: -> { new_record? }
57
+ end.should raise_exception RuntimeError
58
+ end
59
+
60
+ it 'can be specced by key ONLY' do
61
+ should validate(:procs_cannot_be_speced).with :if
38
62
  end
39
63
 
40
64
  end
@@ -1,5 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path('../lib', __FILE__)
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
5
  require 'validation_matcher/version'
4
6
 
5
7
  Gem::Specification.new do |s|
@@ -7,7 +9,7 @@ Gem::Specification.new do |s|
7
9
  s.version = ValidationMatcher::VERSION
8
10
  s.authors = ['BM5k']
9
11
  s.email = ['me@bm5k.com']
10
- s.homepage = ""
12
+ s.homepage = ''
11
13
  s.summary = 'RSpec matcher for ActiveModel validations'
12
14
  s.description = 'Use reflection to spec ActiveModel validations'
13
15
  s.licenses = ['MIT']
@@ -16,16 +18,18 @@ Gem::Specification.new do |s|
16
18
 
17
19
  s.files = `git ls-files`.split("\n")
18
20
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename f }
20
22
  s.require_paths = ['lib']
21
23
 
22
- s.required_ruby_version = '>= 2.1'
24
+ s.required_ruby_version = '>= 2.4.1'
23
25
 
24
26
  s.add_dependency 'rspec-expectations', '~> 3.1'
25
27
 
26
28
  s.add_development_dependency 'activemodel', '>= 3'
27
29
  s.add_development_dependency 'pry'
28
30
  s.add_development_dependency 'pry-doc'
31
+ s.add_development_dependency 'pry-byebug'
29
32
  s.add_development_dependency 'rake'
30
33
  s.add_development_dependency 'rspec'
34
+ s.add_development_dependency 'yoshiki'
31
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validation_matcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - BM5k
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-22 00:00:00.000000000 Z
11
+ date: 2017-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-expectations
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: yoshiki
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
97
125
  description: Use reflection to spec ActiveModel validations
98
126
  email:
99
127
  - me@bm5k.com
@@ -102,12 +130,16 @@ extensions: []
102
130
  extra_rdoc_files: []
103
131
  files:
104
132
  - ".gitignore"
133
+ - ".gitlab-ci.yml"
105
134
  - ".rspec"
106
- - ".travis.yml"
135
+ - ".rubocop.yml"
136
+ - ".rubocop_todo.yml"
137
+ - Dockerfile
107
138
  - Gemfile
108
139
  - LICENSE
109
140
  - README.md
110
141
  - Rakefile
142
+ - docker-compose.yml
111
143
  - lib/validation_matcher.rb
112
144
  - lib/validation_matcher/version.rb
113
145
  - spec/spec_helper.rb
@@ -125,7 +157,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
125
157
  requirements:
126
158
  - - ">="
127
159
  - !ruby/object:Gem::Version
128
- version: '2.1'
160
+ version: 2.4.1
129
161
  required_rubygems_version: !ruby/object:Gem::Requirement
130
162
  requirements:
131
163
  - - ">="
@@ -133,11 +165,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
165
  version: '0'
134
166
  requirements: []
135
167
  rubyforge_project: validation_matcher
136
- rubygems_version: 2.4.8
168
+ rubygems_version: 2.6.11
137
169
  signing_key:
138
170
  specification_version: 4
139
171
  summary: RSpec matcher for ActiveModel validations
140
172
  test_files:
141
173
  - spec/spec_helper.rb
142
174
  - spec/thing_spec.rb
143
- has_rdoc:
@@ -1,14 +0,0 @@
1
- bundler_args: --without development
2
-
3
- cache: bundler
4
-
5
- language: ruby
6
-
7
- rvm:
8
- - 2.1
9
- - 2.2
10
- - 2.3
11
-
12
- script: bundle exec rspec spec
13
-
14
- sudo: false