dry-validation 0.3.0 → 0.3.1

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