dry-validation 0.3.0 → 0.3.1

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: a4c5757cf4c0d97231cb5077aa617a731ae8b77c
4
- data.tar.gz: bb77ddf24b5108592e5ab92961bff80caefb20e6
3
+ metadata.gz: 0630ad4e7946a89c0562c0f064220eaa186e2157
4
+ data.tar.gz: 10200a87ef1ea0910e3c7acd490f36529df7e6b8
5
5
  SHA512:
6
- metadata.gz: 78c62e2a2585215397e12cb0621497e1b4332750b61501534b0e1f643f7d5ea7f82e05f3c64b9977a313acf87466c8031ec160e3706794b34ce90c1fe8a7300a
7
- data.tar.gz: 1a9685102ac167001c910e617dee87cea45f6413d105f5231e93790bc3dad0c7199e67a0d838b294185520e26a5475ab56f9b13df08be92e5880a630b129ca20
6
+ metadata.gz: e829d8b8a77b5ab749700b4a6340684503745008b39985a82bbdd604e00e4ab3e1c41ebbdfda37e1594de822cbc2457bfe88a58a625cfa2d3c51d0fd4ebf9c52
7
+ data.tar.gz: 59a24f1ee1d3036f9c6ed2232e2b809b2aa62529916b7e0c0a8490286569992cada68e9324e47b2776eecef144857ddd5cc44803f5da66fcf3572ca5ca253a36
@@ -1,4 +1,16 @@
1
- # v0.3.0 to-be-released
1
+ # v0.3.1 2015-12-08
2
+
3
+ ### Added
4
+
5
+ * Support for `Range` and `Array` as an argument in `size?` predicate (solnic)
6
+
7
+ ### Fixed
8
+
9
+ * Error compiler returns an empty hash rather than a nil when there are no errors (solnic)
10
+
11
+ [Compare v0.3.0...v0.3.1](https://github.com/dryrb/dry-validation/compare/v0.3.0...v0.3.1)
12
+
13
+ # v0.3.0 2015-12-07
2
14
 
3
15
  ### Added
4
16
 
@@ -6,6 +6,9 @@ require 'dry-container'
6
6
  # a common task in Ruby
7
7
  module Dry
8
8
  module Validation
9
+ def self.messages_paths
10
+ Messages::Abstract.config.paths
11
+ end
9
12
  end
10
13
  end
11
14
 
@@ -3,13 +3,15 @@ module Dry
3
3
  class ErrorCompiler
4
4
  attr_reader :messages, :options
5
5
 
6
+ DEFAULT_RESULT = {}.freeze
7
+
6
8
  def initialize(messages, options = {})
7
9
  @messages = messages
8
10
  @options = options
9
11
  end
10
12
 
11
13
  def call(ast)
12
- ast.map { |node| visit(node) }.reduce(:merge)
14
+ ast.map { |node| visit(node) }.reduce(:merge) || DEFAULT_RESULT
13
15
  end
14
16
 
15
17
  def with(options)
@@ -1,12 +1,15 @@
1
+ require 'pathname'
1
2
  require 'thread_safe/cache'
2
3
 
3
4
  module Dry
4
5
  module Validation
5
6
  module Messages
6
7
  class Abstract
8
+ DEFAULT_PATH = Pathname(__dir__).join('../../../../config/errors.yml').realpath.freeze
9
+
7
10
  extend Dry::Configurable
8
11
 
9
- setting :path, Pathname(__dir__).join('../../../../config/errors.yml').realpath.freeze
12
+ setting :paths, [DEFAULT_PATH]
10
13
  setting :root, 'errors'.freeze
11
14
  setting :lookup_options, [:root, :predicate, :rule, :val_type, :arg_type].freeze
12
15
 
@@ -6,7 +6,7 @@ module Dry
6
6
  class Messages::I18n < Messages::Abstract
7
7
  attr_reader :t
8
8
 
9
- ::I18n.load_path << config.path
9
+ ::I18n.load_path.concat(config.paths)
10
10
 
11
11
  def initialize
12
12
  @t = I18n.method(:t)
@@ -17,7 +17,7 @@ module Dry
17
17
  end
18
18
 
19
19
  def key?(key, options)
20
- I18n.exists?(key, options.fetch(:locale, I18n.default_locale))
20
+ ::I18n.exists?(key, options.fetch(:locale, I18n.default_locale))
21
21
  end
22
22
  end
23
23
  end
@@ -12,8 +12,8 @@ module Dry
12
12
  config.root = 'en.errors'.freeze
13
13
  end
14
14
 
15
- def self.load(path = config.path)
16
- new(load_file(path))
15
+ def self.load(paths = config.paths)
16
+ new(paths.map { |path| load_file(path) }.reduce(:merge))
17
17
  end
18
18
 
19
19
  def self.load_file(path)
@@ -88,8 +88,13 @@ module Dry
88
88
  !self[:lt?].(num, input)
89
89
  end
90
90
 
91
- predicate(:size?) do |num, input|
92
- input.size == num
91
+ predicate(:size?) do |size, input|
92
+ case size
93
+ when Fixnum then size == input.size
94
+ when Range, Array then size.include?(input.size)
95
+ else
96
+ raise ArgumentError, "+#{size}+ is not supported type for size? predicate"
97
+ end
93
98
  end
94
99
 
95
100
  predicate(:min_size?) do |num, input|
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Validation
3
- VERSION = '0.3.0'.freeze
3
+ VERSION = '0.3.1'.freeze
4
4
  end
5
5
  end
@@ -1,7 +1,19 @@
1
- RSpec.describe Dry::Validation, 'with custom messages' do
1
+ require 'dry/validation/messages/i18n'
2
+
3
+ RSpec.describe Dry::Validation do
2
4
  subject(:validation) { schema.new }
3
5
 
4
- describe 'defining schema' do
6
+ shared_context 'schema with customized messages' do
7
+ describe '#messages' do
8
+ it 'returns compiled error messages' do
9
+ expect(validation.(email: '').messages).to match_array([
10
+ [:email, [['Please provide your email', '']]]
11
+ ])
12
+ end
13
+ end
14
+ end
15
+
16
+ context 'yaml' do
5
17
  let(:schema) do
6
18
  Class.new(Dry::Validation::Schema) do
7
19
  configure do |config|
@@ -12,12 +24,27 @@ RSpec.describe Dry::Validation, 'with custom messages' do
12
24
  end
13
25
  end
14
26
 
15
- describe '#messages' do
16
- it 'returns compiled error messages' do
17
- expect(validation.(email: '').messages).to match_array([
18
- [:email, [['Please provide your email', '']]]
19
- ])
27
+ include_context 'schema with customized messages'
28
+ end
29
+
30
+ context 'i18n' do
31
+ context 'with custom messages set globally' do
32
+ before do
33
+ I18n.load_path << SPEC_ROOT.join('fixtures/locales/en.yml')
34
+ I18n.backend.load_translations
20
35
  end
36
+
37
+ let(:schema) do
38
+ Class.new(Dry::Validation::Schema) do
39
+ configure do |config|
40
+ config.messages = :i18n
41
+ end
42
+
43
+ key(:email, &:filled?)
44
+ end
45
+ end
46
+
47
+ include_context 'schema with customized messages'
21
48
  end
22
49
  end
23
50
  end
@@ -1,9 +1,11 @@
1
+ require 'dry/validation/messages/i18n'
2
+
1
3
  RSpec.describe Dry::Validation, 'with localized messages' do
2
4
  subject(:validation) { schema.new }
3
5
 
4
6
  before do
5
7
  I18n.config.available_locales_set << :pl
6
- I18n.load_path = %w(en pl).map { |l| SPEC_ROOT.join("fixtures/locales/#{l}.yml") }
8
+ I18n.load_path.concat(%w(en pl).map { |l| SPEC_ROOT.join("fixtures/locales/#{l}.yml") })
7
9
  I18n.backend.load_translations
8
10
  end
9
11
 
@@ -5,7 +5,7 @@ RSpec.describe Messages::I18n do
5
5
 
6
6
  before do
7
7
  I18n.config.available_locales_set << :pl
8
- I18n.load_path << %w(en pl).map { |l| SPEC_ROOT.join("fixtures/locales/#{l}.yml") }
8
+ I18n.load_path.concat(%w(en pl).map { |l| SPEC_ROOT.join("fixtures/locales/#{l}.yml") })
9
9
  I18n.backend.load_translations
10
10
  end
11
11
 
@@ -16,8 +16,8 @@ RSpec.shared_examples 'a passing predicate' do
16
16
  let(:predicate) { Dry::Validation::Predicates[predicate_name] }
17
17
 
18
18
  it do
19
- arguments_list.each do |args|
20
- expect(predicate.call(*args)).to be true
19
+ arguments_list.each do |(left, right)|
20
+ expect(predicate.call(left, right)).to be(true)
21
21
  end
22
22
  end
23
23
  end
@@ -26,8 +26,8 @@ RSpec.shared_examples 'a failing predicate' do
26
26
  let(:predicate) { Dry::Validation::Predicates[predicate_name] }
27
27
 
28
28
  it do
29
- arguments_list.each do |args|
30
- expect(predicate.call(*args)).to be false
29
+ arguments_list.each do |(left, right)|
30
+ expect(predicate.call(left, right)).to be(false)
31
31
  end
32
32
  end
33
33
  end
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'i18n'
4
3
  require 'dry-validation'
5
4
 
6
5
  begin
@@ -16,4 +15,11 @@ include Dry::Validation
16
15
 
17
16
  RSpec.configure do |config|
18
17
  config.disable_monkey_patching!
18
+
19
+ config.after do
20
+ if defined?(I18n)
21
+ I18n.load_path = Dry::Validation.messages_paths.dup
22
+ I18n.backend.reload!
23
+ end
24
+ end
19
25
  end
@@ -0,0 +1,7 @@
1
+ RSpec.describe ErrorCompiler, '#call' do
2
+ subject(:error_compiler) { ErrorCompiler.new({}) }
3
+
4
+ it 'returns an empty hash when there are no errors' do
5
+ expect(error_compiler.([])).to be(ErrorCompiler::DEFAULT_RESULT)
6
+ end
7
+ end
@@ -7,43 +7,49 @@ RSpec.describe Dry::Validation::Predicates do
7
7
  context 'when value size is equal to n' do
8
8
  let(:arguments_list) do
9
9
  [
10
- [2, [1, 2]],
10
+ [[8], 2],
11
11
  [4, 'Jill'],
12
12
  [2, { 1 => 'st', 2 => 'nd' }],
13
- [8, 1],
14
- [5, 1..5]
13
+ [8, 8],
14
+ [1..8, 5]
15
15
  ]
16
16
  end
17
17
 
18
18
  it_behaves_like 'a passing predicate'
19
19
  end
20
20
 
21
- context 'when value size is less than n' do
21
+ context 'when value size is greater than n' do
22
22
  let(:arguments_list) do
23
23
  [
24
- [3, [1, 2]],
24
+ [[1, 2], 3],
25
25
  [5, 'Jill'],
26
26
  [3, { 1 => 'st', 2 => 'nd' }],
27
- [9, 1],
28
- [6, 1..5]
27
+ [1, 9],
28
+ [1..5, 6]
29
29
  ]
30
30
  end
31
31
 
32
32
  it_behaves_like 'a failing predicate'
33
33
  end
34
34
 
35
- context 'with value size is greater than n' do
35
+ context 'with value size is less than n' do
36
36
  let(:arguments_list) do
37
37
  [
38
- [1, [1, 2]],
38
+ [[1, 2], 1],
39
39
  [3, 'Jill'],
40
40
  [1, { 1 => 'st', 2 => 'nd' }],
41
- [7, 1],
42
- [4, 1..5]
41
+ [1, 7],
42
+ [1..5, 4]
43
43
  ]
44
44
  end
45
45
 
46
46
  it_behaves_like 'a failing predicate'
47
47
  end
48
+
49
+ context 'with an unsupported size' do
50
+ it 'raises an error' do
51
+ expect { Predicates[:size?].call('oops', 1) }.to raise_error(ArgumentError, /oops/)
52
+ end
53
+ end
48
54
  end
49
55
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-validation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Holland
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-12-07 00:00:00.000000000 Z
12
+ date: 2015-12-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dry-configurable
@@ -191,6 +191,7 @@ files:
191
191
  - spec/integration/schema_spec.rb
192
192
  - spec/shared/predicates.rb
193
193
  - spec/spec_helper.rb
194
+ - spec/unit/error_compiler_spec.rb
194
195
  - spec/unit/input_type_compiler_spec.rb
195
196
  - spec/unit/predicate_spec.rb
196
197
  - spec/unit/predicates/bool_spec.rb
@@ -264,6 +265,7 @@ test_files:
264
265
  - spec/integration/schema_spec.rb
265
266
  - spec/shared/predicates.rb
266
267
  - spec/spec_helper.rb
268
+ - spec/unit/error_compiler_spec.rb
267
269
  - spec/unit/input_type_compiler_spec.rb
268
270
  - spec/unit/predicate_spec.rb
269
271
  - spec/unit/predicates/bool_spec.rb