validation_matcher 3.2.0 → 4.0.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.
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