dry-types 0.9.4 → 0.10.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: c76d361159bd8a8f243bfdfeec8030dd1244ad0b
4
- data.tar.gz: c2e88582cb5976223aecbe4cafa5b1e6c9ce0f0c
3
+ metadata.gz: 2df871ef8f32a388ed641c5025ab9838a090f460
4
+ data.tar.gz: 2766ba15e0358b3ac14b30cbb3027c8887fa609d
5
5
  SHA512:
6
- metadata.gz: e44560fbe2c83f8e8ee91f57fa8f5e019404a43ca35302b680e85e4e4a8ad8fd823210870d797fd884f2d49ce1f7d85ca9cf949d16c7854e8aaf126ca379bbbc
7
- data.tar.gz: 6d5f3df1d0cdcd94ce42e8d39ccafdf079d187485cf791d00ab04c98cdd6b8298542359c856e28c29f2c1240cae857f8effa0508f81ec3125eec156211c1cd7a
6
+ metadata.gz: 83951c294c86aeeb1bed5ed85bb8e28b6e898ff72170b246012494d892ae9fb19a3d60ed635348e0e45d5048290f7d5bc8c2c0976bd0e42cebc13648537c19c9
7
+ data.tar.gz: 6a09c6f25ab11725d0c18adffb72eb93d3be87cffba4bb40bdd259a55dd3427953dc1026857540f8b83e0c8099c6748893bbbe9b1bca5dd536a95f7a4bc07836
data/.travis.yml CHANGED
@@ -4,14 +4,14 @@ sudo: required
4
4
  cache: bundler
5
5
  bundler_args: --without benchmarks tools
6
6
  after_success:
7
- - '[ "${TRAVIS_JOB_NUMBER#*.}" = "1" ] && [ "$TRAVIS_BRANCH" = "master" ] && bundle exec codeclimate-test-reporter'
7
+ - '[ -d coverage ] && bundle exec codeclimate-test-reporter'
8
8
  script:
9
9
  - bundle exec rake
10
10
  rvm:
11
- - 2.4
12
- - 2.3
13
- - 2.2
14
- - jruby-9.1.5.0
11
+ - 2.2.7
12
+ - 2.3.3
13
+ - 2.4.1
14
+ - jruby-9.1.8.0
15
15
  - rbx-3
16
16
  env:
17
17
  global:
@@ -20,7 +20,7 @@ env:
20
20
  matrix:
21
21
  allow_failures:
22
22
  - rvm: rbx-3
23
- - rvm: jruby-9.1.5.0
23
+ - rvm: jruby-9.1.8.0
24
24
  notifications:
25
25
  email: false
26
26
  webhooks:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ # v0.10.0 2017-04-26
2
+
3
+ ## Added
4
+
5
+ * Types can be used in `case` statements now (GustavoCaso)
6
+
7
+ ## Fixed
8
+
9
+ * Return original value when Date.parse raises a RangeError (jviney)
10
+
11
+ ## Changed
12
+
13
+ * Meta data are now stored separately from options (flash-gordon)
14
+ * `Types::Object` was renamed to `Types::Any` (flash-gordon)
15
+
16
+ [Compare v0.9.4...v0.10.0](https://github.com/dryrb/dry-types/compare/v0.9.4...v0.10.0)
17
+
1
18
  # v0.9.4 2017-01-24
2
19
 
3
20
  ## Added
data/lib/dry/types.rb CHANGED
@@ -12,6 +12,7 @@ require 'dry/core/constants'
12
12
 
13
13
  require 'dry/types/version'
14
14
  require 'dry/types/container'
15
+ require 'dry/types/type'
15
16
  require 'dry/types/definition'
16
17
  require 'dry/types/constructor'
17
18
 
@@ -51,8 +52,8 @@ module Dry
51
52
  end
52
53
 
53
54
  # @param [String] name
54
- # @param [Definition] type
55
- # @param [#call] block
55
+ # @param [Type] type
56
+ # @param [#call,nil] block
56
57
  # @return [Container{String => Definition}]
57
58
  def self.register(name, type = nil, &block)
58
59
  container.register(name, type || block.call)
@@ -67,8 +68,8 @@ module Dry
67
68
  container.register(identifier(klass), type)
68
69
  end
69
70
 
70
- # @param [String] name
71
- # @return [Definition]
71
+ # @param [String,Class] name
72
+ # @return [Type,Class]
72
73
  def self.[](name)
73
74
  type_map.fetch_or_store(name) do
74
75
  case name
@@ -93,7 +94,7 @@ module Dry
93
94
  end
94
95
  end
95
96
 
96
- # @param [Container{String => Definition}] namespace
97
+ # @param [Module] namespace
97
98
  # @param [<String>] identifiers
98
99
  # @return [<Definition>]
99
100
  def self.define_constants(namespace, identifiers)
@@ -0,0 +1,20 @@
1
+ module Dry
2
+ module Types
3
+ Any = Class.new(Definition) do
4
+ def initialize
5
+ super(::Object)
6
+ end
7
+
8
+ # @return [String]
9
+ def name
10
+ 'Any'
11
+ end
12
+
13
+ # @param [Object] any input is valid
14
+ # @return [true]
15
+ def valid?(_)
16
+ true
17
+ end
18
+ end.new
19
+ end
20
+ end
@@ -3,7 +3,7 @@ require 'dry/types/array/member'
3
3
  module Dry
4
4
  module Types
5
5
  class Array < Definition
6
- # @param [Definition] type
6
+ # @param [Type] type
7
7
  # @return [Array::Member]
8
8
  def member(type)
9
9
  member =
@@ -2,12 +2,12 @@ module Dry
2
2
  module Types
3
3
  class Array < Definition
4
4
  class Member < Array
5
- # @return [Definition]
5
+ # @return [Type]
6
6
  attr_reader :member
7
7
 
8
8
  # @param [Class] primitive
9
9
  # @param [Hash] options
10
- # @option options [Definition] :member
10
+ # @option options [Type] :member
11
11
  def initialize(primitive, options = {})
12
12
  @member = options.fetch(:member)
13
13
  super
@@ -21,17 +21,17 @@ module Dry
21
21
  end
22
22
  alias_method :[], :call
23
23
 
24
- # @param [Array, #all?] value
24
+ # @param [Array, #all?, Object] value
25
25
  # @return [Boolean]
26
26
  def valid?(value)
27
27
  super && value.all? { |el| member.valid?(el) }
28
28
  end
29
29
 
30
30
  # @param [Array, Object] input
31
- # @param [#call] block
31
+ # @param [#call,nil] block
32
32
  # @yieldparam [Failure] failure
33
33
  # @yieldreturn [Result]
34
- # @return [Result]
34
+ # @return [Result,Logic::Result]
35
35
  def try(input, &block)
36
36
  if input.is_a?(::Array)
37
37
  result = call(input, :try)
@@ -3,12 +3,12 @@ module Dry
3
3
  module Builder
4
4
  include Dry::Core::Constants
5
5
 
6
- # @return [Constrained]
6
+ # @return [Class]
7
7
  def constrained_type
8
8
  Constrained
9
9
  end
10
10
 
11
- # @param [Definition] other
11
+ # @param [Type] other
12
12
  # @return [Sum, Sum::Constrained]
13
13
  def |(other)
14
14
  klass = constrained? && other.constrained? ? Sum::Constrained : Sum
@@ -27,7 +27,7 @@ module Dry
27
27
  end
28
28
 
29
29
  # @param [Object] input
30
- # @param [#call] block
30
+ # @param [#call,nil] block
31
31
  # @raise [ConstraintError]
32
32
  # @return [Default]
33
33
  def default(input = Undefined, &block)
@@ -51,9 +51,9 @@ module Dry
51
51
  Safe.new(self)
52
52
  end
53
53
 
54
- # @param [#call] constructor
54
+ # @param [#call,nil] constructor
55
55
  # @param [Hash] options
56
- # @param [#call] block
56
+ # @param [#call,nil] block
57
57
  # @return [Constructor]
58
58
  def constructor(constructor = nil, **options, &block)
59
59
  Constructor.new(with(options), fn: constructor || block)
@@ -3,8 +3,9 @@ module Dry
3
3
  module Coercions
4
4
  include Dry::Core::Constants
5
5
 
6
- # @param [String] input
7
- # @return [String?]
6
+ # @param [String, Object] input
7
+ # @return [nil] if the input is an empty string
8
+ # @return [Object] otherwise the input object is returned
8
9
  def to_nil(input)
9
10
  input unless empty_str?(input)
10
11
  end
@@ -15,7 +16,7 @@ module Dry
15
16
  def to_date(input)
16
17
  return input unless input.respond_to?(:to_str)
17
18
  Date.parse(input)
18
- rescue ArgumentError
19
+ rescue ArgumentError, RangeError
19
20
  input
20
21
  end
21
22
 
@@ -12,7 +12,7 @@ module Dry
12
12
  extend Coercions
13
13
 
14
14
  # @param [String, Object] input
15
- # @return [Boolean?]
15
+ # @return [Boolean,Object]
16
16
  # @see TRUE_VALUES
17
17
  # @see FALSE_VALUES
18
18
  def self.to_true(input)
@@ -20,7 +20,7 @@ module Dry
20
20
  end
21
21
 
22
22
  # @param [String, Object] input
23
- # @return [Boolean?]
23
+ # @return [Boolean,Object]
24
24
  # @see TRUE_VALUES
25
25
  # @see FALSE_VALUES
26
26
  def self.to_false(input)
@@ -28,7 +28,7 @@ module Dry
28
28
  end
29
29
 
30
30
  # @param [#to_int, #to_i, Object] input
31
- # @return [Integer?, Object]
31
+ # @return [Integer, nil, Object]
32
32
  def self.to_int(input)
33
33
  if empty_str?(input)
34
34
  nil
@@ -40,7 +40,7 @@ module Dry
40
40
  end
41
41
 
42
42
  # @param [#to_f, Object] input
43
- # @return [Float?, Object]
43
+ # @return [Float, nil, Object]
44
44
  def self.to_float(input)
45
45
  if empty_str?(input)
46
46
  nil
@@ -52,7 +52,7 @@ module Dry
52
52
  end
53
53
 
54
54
  # @param [#to_d, Object] input
55
- # @return [BigDecimal?, Object]
55
+ # @return [BigDecimal, nil, Object]
56
56
  def self.to_decimal(input)
57
57
  result = to_float(input)
58
58
 
@@ -63,14 +63,14 @@ module Dry
63
63
  end
64
64
  end
65
65
 
66
- # @param [Array, '', Object] input
66
+ # @param [Array, String, Object] input
67
67
  # @return [Array, Object]
68
68
  def self.to_ary(input)
69
69
  empty_str?(input) ? [] : input
70
70
  end
71
71
 
72
- # @param [Hash, '', Object] input
73
- # @return [Hash]
72
+ # @param [Hash, String, Object] input
73
+ # @return [Hash, Object]
74
74
  def self.to_hash(input)
75
75
  empty_str?(input) ? {} : input
76
76
  end
@@ -10,7 +10,7 @@ module Dry
10
10
  extend Coercions
11
11
 
12
12
  # @param [#to_d, Object] input
13
- # @return [BigDecimal?]
13
+ # @return [BigDecimal,nil]
14
14
  def self.to_decimal(input)
15
15
  input.to_d unless empty_str?(input)
16
16
  end
@@ -5,6 +5,7 @@ require 'dry/types/constrained/coercible'
5
5
  module Dry
6
6
  module Types
7
7
  class Constrained
8
+ include Type
8
9
  include Dry::Equalizer(:type, :options, :rule)
9
10
  include Decorator
10
11
  include Builder
@@ -12,7 +13,7 @@ module Dry
12
13
  # @return [Dry::Logic::Rule]
13
14
  attr_reader :rule
14
15
 
15
- # @param [Definition] type
16
+ # @param [Type] type
16
17
  # @param [Hash] options
17
18
  def initialize(type, options)
18
19
  super
@@ -30,10 +31,11 @@ module Dry
30
31
  alias_method :[], :call
31
32
 
32
33
  # @param [Object] input
33
- # @param [#call] block
34
+ # @param [#call,nil] block
34
35
  # @yieldparam [Failure] failure
35
36
  # @yieldreturn [Result]
36
- # @return [Result]
37
+ # @return [Logic::Result, Result]
38
+ # @return [Object] if block given and try fails
37
39
  def try(input, &block)
38
40
  result = rule.(input)
39
41
 
@@ -65,6 +67,12 @@ module Dry
65
67
  true
66
68
  end
67
69
 
70
+ # @param [Object] value
71
+ # @return [Boolean]
72
+ def ===(value)
73
+ valid?(value)
74
+ end
75
+
68
76
  private
69
77
 
70
78
  # @param [Object] response
@@ -1,12 +1,14 @@
1
1
  module Dry
2
2
  module Types
3
3
  class Constrained
4
+ include Type
5
+
4
6
  class Coercible < Constrained
5
7
  # @param [Object] input
6
- # @param [#call] block
8
+ # @param [#call,nil] block
7
9
  # @yieldparam [Failure] failure
8
10
  # @yieldreturn [Result]
9
- # @return [Result]
11
+ # @return [Result,Logic::Result,nil]
10
12
  def try(input, &block)
11
13
  result = type.try(input)
12
14
 
@@ -8,20 +8,20 @@ module Dry
8
8
  # @return [#call]
9
9
  attr_reader :fn
10
10
 
11
- # @return [Definition]
11
+ # @return [Type]
12
12
  attr_reader :type
13
13
 
14
14
  # @param [Builder, Object] input
15
15
  # @param [Hash] options
16
- # @param [#call] block
16
+ # @param [#call, nil] block
17
17
  def self.new(input, options = {}, &block)
18
18
  type = input.is_a?(Builder) ? input : Definition.new(input)
19
19
  super(type, options, &block)
20
20
  end
21
21
 
22
- # @param [Definition] type
22
+ # @param [Type] type
23
23
  # @param [Hash] options
24
- # @param [#proc] block
24
+ # @param [#call, nil] block
25
25
  def initialize(type, options = {}, &block)
26
26
  @type = type
27
27
  @fn = options.fetch(:fn, block)
@@ -41,8 +41,9 @@ module Dry
41
41
  alias_method :[], :call
42
42
 
43
43
  # @param [Object] input
44
- # @param [#call] block
45
- # @return [Result]
44
+ # @param [#call,nil] block
45
+ # @return [Logic::Result, Types::Result]
46
+ # @return [Object] if block given and try fails
46
47
  def try(input, &block)
47
48
  type.try(fn[input], &block)
48
49
  rescue TypeError => e
@@ -51,7 +52,7 @@ module Dry
51
52
 
52
53
  # @param [#call, nil] new_fn
53
54
  # @param [Hash] options
54
- # @param [#call] block
55
+ # @param [#call, nil] block
55
56
  # @return [Constructor]
56
57
  def constructor(new_fn = nil, **options, &block)
57
58
  left = new_fn || block
@@ -83,7 +84,7 @@ module Dry
83
84
  # Delegates missing methods to {#type}
84
85
  # @param [Symbol] meth
85
86
  # @param [Array] args
86
- # @param [#call] block
87
+ # @param [#call, nil] block
87
88
  def method_missing(meth, *args, &block)
88
89
  if type.respond_to?(meth)
89
90
  response = type.__send__(meth, *args, &block)
@@ -1,3 +1,5 @@
1
+ require 'dry/types/any'
2
+
1
3
  module Dry
2
4
  module Types
3
5
  COERCIBLE = {
@@ -53,7 +55,8 @@ module Dry
53
55
  register("bool", self["true"] | self["false"])
54
56
  register("strict.bool", self["strict.true"] | self["strict.false"])
55
57
 
56
- register("object", Definition[::Object].new(::Object))
58
+ register("any", Any)
59
+ register("object", self['any'])
57
60
  end
58
61
  end
59
62
 
@@ -5,10 +5,10 @@ module Dry
5
5
  module Decorator
6
6
  include Options
7
7
 
8
- # @return [Definition]
8
+ # @return [Type]
9
9
  attr_reader :type
10
10
 
11
- # @param [Definition] type
11
+ # @param [Type] type
12
12
  def initialize(type, *)
13
13
  super
14
14
  @type = type
@@ -20,8 +20,9 @@ module Dry
20
20
  end
21
21
 
22
22
  # @param [Object] input
23
- # @param [#call] block
24
- # @return [Result]
23
+ # @param [#call, nil] block
24
+ # @return [Result,Logic::Result]
25
+ # @return [Object] if block given and try fails
25
26
  def try(input, &block)
26
27
  type.try(input, &block)
27
28
  end
@@ -60,7 +61,7 @@ module Dry
60
61
  # Delegates missing methods to {#type}
61
62
  # @param [Symbol] meth
62
63
  # @param [Array] args
63
- # @param [#call] block
64
+ # @param [#call, nil] block
64
65
  def method_missing(meth, *args, &block)
65
66
  if type.respond_to?(meth)
66
67
  response = type.__send__(meth, *args, &block)
@@ -3,6 +3,7 @@ require 'dry/types/decorator'
3
3
  module Dry
4
4
  module Types
5
5
  class Default
6
+ include Type
6
7
  include Dry::Equalizer(:type, :options, :value)
7
8
  include Decorator
8
9
  include Builder
@@ -23,7 +24,7 @@ module Dry
23
24
  alias_method :evaluate, :value
24
25
 
25
26
  # @param [Object, #call] value
26
- # @return [Default, Dry::Types::Default::Callable]
27
+ # @return [Class] {Default} or {Default::Callable}
27
28
  def self.[](value)
28
29
  if value.respond_to?(:call)
29
30
  Callable
@@ -32,7 +33,7 @@ module Dry
32
33
  end
33
34
  end
34
35
 
35
- # @param [Definition] type
36
+ # @param [Type] type
36
37
  # @param [Object] value
37
38
  def initialize(type, value, *)
38
39
  super
@@ -51,7 +52,7 @@ module Dry
51
52
  end
52
53
 
53
54
  # @param [Object] input
54
- # @return [Success]
55
+ # @return [Result::Success]
55
56
  def try(input)
56
57
  success(call(input))
57
58
  end
@@ -5,6 +5,7 @@ require 'dry/types/options'
5
5
  module Dry
6
6
  module Types
7
7
  class Definition
8
+ include Type
8
9
  include Dry::Equalizer(:primitive, :options)
9
10
  include Options
10
11
  include Builder
@@ -16,7 +17,7 @@ module Dry
16
17
  attr_reader :primitive
17
18
 
18
19
  # @param [Class] primitive
19
- # @return [Definition]
20
+ # @return [Type]
20
21
  def self.[](primitive)
21
22
  if primitive == ::Array
22
23
  Types::Array
@@ -27,7 +28,7 @@ module Dry
27
28
  end
28
29
  end
29
30
 
30
- # @param [Class] primitive
31
+ # @param [Type,Class] primitive
31
32
  # @param [Hash] options
32
33
  def initialize(primitive, options = {})
33
34
  super
@@ -50,18 +51,19 @@ module Dry
50
51
  false
51
52
  end
52
53
 
53
- # @param [Object] input
54
- # @return [Object]
54
+ # @param [BasicObject] input
55
+ # @return [BasicObject]
55
56
  def call(input)
56
57
  input
57
58
  end
58
59
  alias_method :[], :call
59
60
 
60
61
  # @param [Object] input
61
- # @param [#call] block
62
+ # @param [#call,nil] block
62
63
  # @yieldparam [Failure] failure
63
64
  # @yieldreturn [Result]
64
- # @return [Result]
65
+ # @return [Result,Logic::Result] when a block is not provided
66
+ # @return [nil] otherwise
65
67
  def try(input, &block)
66
68
  if valid?(input)
67
69
  success(input)
@@ -72,14 +74,14 @@ module Dry
72
74
  end
73
75
 
74
76
  # @param (see Dry::Types::Success#initialize)
75
- # @return [Success]
77
+ # @return [Result::Success]
76
78
  def success(input)
77
79
  Result::Success.new(input)
78
80
  end
79
81
 
80
82
 
81
83
  # @param (see Failure#initialize)
82
- # @return [Failure]
84
+ # @return [Result::Failure]
83
85
  def failure(input, error)
84
86
  Result::Failure.new(input, error)
85
87
  end
@@ -98,6 +100,7 @@ module Dry
98
100
  value.is_a?(primitive)
99
101
  end
100
102
  alias_method :valid?, :primitive?
103
+ alias_method :===, :primitive?
101
104
  end
102
105
  end
103
106
  end
@@ -3,6 +3,7 @@ require 'dry/types/decorator'
3
3
  module Dry
4
4
  module Types
5
5
  class Enum
6
+ include Type
6
7
  include Dry::Equalizer(:type, :options, :values)
7
8
  include Decorator
8
9
 
@@ -12,7 +13,7 @@ module Dry
12
13
  # @return [Hash]
13
14
  attr_reader :mapping
14
15
 
15
- # @param [Definition] type
16
+ # @param [Type] type
16
17
  # @param [Hash] options
17
18
  # @option options [Array] :values
18
19
  def initialize(type, options)
@@ -7,7 +7,7 @@ module Dry
7
7
  setting :namespace, self
8
8
 
9
9
  class SchemaError < TypeError
10
- # @param [String] key
10
+ # @param [String,Symbol] key
11
11
  # @param [Object] value
12
12
  def initialize(key, value)
13
13
  super("#{value.inspect} (#{value.class}) has invalid type for :#{key}")
@@ -18,7 +18,7 @@ module Dry
18
18
  private_constant(:SchemaKeyError)
19
19
 
20
20
  class MissingKeyError < SchemaKeyError
21
- # @param [String] key
21
+ # @param [String,Symbol] key
22
22
  def initialize(key)
23
23
  super(":#{key} is missing in Hash input")
24
24
  end
@@ -4,6 +4,7 @@ require 'dry/types/decorator'
4
4
  module Dry
5
5
  module Types
6
6
  class Maybe
7
+ include Type
7
8
  include Dry::Equalizer(:type, :options)
8
9
  include Decorator
9
10
  include Builder
@@ -17,7 +17,7 @@ module Dry
17
17
  end
18
18
  }
19
19
 
20
- klass.new(primitive, options.merge(member_types: member_types))
20
+ klass.new(primitive, options.merge(member_types: member_types, meta: meta))
21
21
  end
22
22
 
23
23
  # @param [{Symbol => Definition}] type_map
@@ -54,7 +54,7 @@ module Dry
54
54
 
55
55
  # @param [Hash] _result
56
56
  # @param [Symbol] _key
57
- # @param [Definition] _type
57
+ # @param [Type] _type
58
58
  def resolve_missing_value(_result, _key, _type)
59
59
  # noop
60
60
  end
@@ -29,10 +29,11 @@ module Dry
29
29
  alias_method :[], :call
30
30
 
31
31
  # @param [Hash] hash
32
- # @param [#call] block
32
+ # @param [#call,nil] block
33
33
  # @yieldparam [Failure] failure
34
34
  # @yieldreturn [Result]
35
- # @return [Result]
35
+ # @return [Logic::Result]
36
+ # @return [Object] if coercion fails and a block is given
36
37
  def try(hash, &block)
37
38
  success = true
38
39
  output = {}
@@ -95,7 +96,7 @@ module Dry
95
96
 
96
97
  # @param [Hash] result
97
98
  # @param [Symbol] key
98
- # @param [Definition] type
99
+ # @param [Type] type
99
100
  # @return [Object]
100
101
  # @see Dry::Types::Default#evaluate
101
102
  # @see Dry::Types::Default::Callable#evaluate
@@ -135,6 +136,10 @@ module Dry
135
136
  # @return [Hash{Symbol => Object}]
136
137
  # @raise [UnknownKeysError]
137
138
  # if there any unexpected key in given hash
139
+ # @raise [MissingKeyError]
140
+ # if a required key is not present
141
+ # @raise [SchemaError]
142
+ # if a value is the wrong type
138
143
  def resolve(hash)
139
144
  unexpected = hash.keys - member_types.keys
140
145
  raise UnknownKeysError.new(*unexpected) unless unexpected.empty?
@@ -157,7 +162,7 @@ module Dry
157
162
 
158
163
  # @param [Hash] result
159
164
  # @param [Symbol] key
160
- # @param [Definition] type
165
+ # @param [Type] type
161
166
  # @return [Object]
162
167
  # @see Dry::Types::Default#evaluate
163
168
  # @see Dry::Types::Default::Callable#evaluate
@@ -184,16 +189,17 @@ module Dry
184
189
  super(primitive, options.merge(member_types: member_types))
185
190
  end
186
191
 
187
- # @param [Hash] hash
188
- # @param [#call] block
192
+ # @param [Object] value
193
+ # @param [#call, nil] block
189
194
  # @yieldparam [Failure] failure
190
195
  # @yieldreturn [Result]
191
- # @return [Result]
192
- def try(hash, &block)
193
- if hash.is_a?(::Hash)
196
+ # @return [Object] if block given
197
+ # @return [Result,Logic::Result] otherwise
198
+ def try(value, &block)
199
+ if value.is_a?(::Hash)
194
200
  super
195
201
  else
196
- result = failure(hash, "#{hash} must be a hash")
202
+ result = failure(value, "#{value} must be a hash")
197
203
  block ? yield(result) : result
198
204
  end
199
205
  end
@@ -5,20 +5,24 @@ module Dry
5
5
  attr_reader :options
6
6
 
7
7
  # @see Definition#initialize
8
- def initialize(*args, **options)
8
+ def initialize(*args, meta: EMPTY_HASH, **options)
9
9
  @__args__ = args
10
10
  @options = options
11
- @meta = options.fetch(:meta, {})
11
+ @meta = meta
12
12
  end
13
13
 
14
14
  # @param [Hash] new_options
15
- # @return [Definition]
15
+ # @return [Type]
16
16
  def with(new_options)
17
- self.class.new(*@__args__, options.merge(new_options))
17
+ self.class.new(*@__args__, **options, meta: @meta, **new_options)
18
18
  end
19
19
 
20
- # @param [Hash] data
21
- # @return [Hash, Definition]
20
+ # @overload meta
21
+ # @return [Hash] metadata associated with type
22
+ #
23
+ # @overload meta(data)
24
+ # @param [Hash] new metadata to merge into existing metadata
25
+ # @return [Type] new type with added metadata
22
26
  def meta(data = nil)
23
27
  data ? with(meta: @meta.merge(data)) : @meta
24
28
  end
@@ -3,6 +3,7 @@ require 'dry/types/decorator'
3
3
  module Dry
4
4
  module Types
5
5
  class Safe
6
+ include Type
6
7
  include Dry::Equalizer(:type, :options)
7
8
  include Decorator
8
9
  include Builder
@@ -21,10 +22,10 @@ module Dry
21
22
  alias_method :[], :call
22
23
 
23
24
  # @param [Object] input
24
- # @param [#call] block
25
+ # @param [#call,nil] block
25
26
  # @yieldparam [Failure] failure
26
27
  # @yieldreturn [Result]
27
- # @return [Result]
28
+ # @return [Result,Logic::Result]
28
29
  def try(input, &block)
29
30
  type.try(input, &block)
30
31
  rescue TypeError, ArgumentError => e
data/lib/dry/types/sum.rb CHANGED
@@ -3,18 +3,19 @@ require 'dry/types/options'
3
3
  module Dry
4
4
  module Types
5
5
  class Sum
6
+ include Type
6
7
  include Dry::Equalizer(:left, :right, :options)
7
8
  include Builder
8
9
  include Options
9
10
 
10
- # @return [Definition]
11
+ # @return [Type]
11
12
  attr_reader :left
12
13
 
13
- # @return [Definition]
14
+ # @return [Type]
14
15
  attr_reader :right
15
16
 
16
17
  class Constrained < Sum
17
- # @return [Dry::Logic::Rule]
18
+ # @return [Dry::Logic::Operations::Or]
18
19
  def rule
19
20
  left.rule | right.rule
20
21
  end
@@ -35,8 +36,8 @@ module Dry
35
36
  alias_method :[], :call
36
37
  end
37
38
 
38
- # @param [Definition] left
39
- # @param [Definition] right
39
+ # @param [Type] left
40
+ # @param [Type] right
40
41
  # @param [Hash] options
41
42
  def initialize(left, right, options = {})
42
43
  super
@@ -0,0 +1,6 @@
1
+ module Dry
2
+ module Types
3
+ module Type
4
+ end
5
+ end
6
+ end
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Types
3
- VERSION = '0.9.4'.freeze
3
+ VERSION = '0.10.0'.freeze
4
4
  end
5
5
  end
@@ -42,6 +42,11 @@ RSpec.shared_examples_for 'Dry::Types::Definition#meta' do
42
42
  expect(with_meta).to be_instance_of(type.class)
43
43
  expect(with_meta.meta).to eql(foo: :bar, baz: '1')
44
44
  end
45
+
46
+ it "doesn't use meta in equality checks" do
47
+ expect(type.meta(foo: :bar)).to eql(type)
48
+ expect(type.meta(foo: :bar).hash).to eql(type.hash)
49
+ end
45
50
  end
46
51
  end
47
52
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-types
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-24 00:00:00.000000000 Z
11
+ date: 2017-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -217,6 +217,7 @@ files:
217
217
  - dry-types.gemspec
218
218
  - lib/dry-types.rb
219
219
  - lib/dry/types.rb
220
+ - lib/dry/types/any.rb
220
221
  - lib/dry/types/array.rb
221
222
  - lib/dry/types/array/member.rb
222
223
  - lib/dry/types/builder.rb
@@ -245,6 +246,7 @@ files:
245
246
  - lib/dry/types/result.rb
246
247
  - lib/dry/types/safe.rb
247
248
  - lib/dry/types/sum.rb
249
+ - lib/dry/types/type.rb
248
250
  - lib/dry/types/version.rb
249
251
  - lib/spec/dry/types.rb
250
252
  homepage: https://github.com/dryrb/dry-types
@@ -268,7 +270,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
268
270
  version: '0'
269
271
  requirements: []
270
272
  rubyforge_project:
271
- rubygems_version: 2.5.1
273
+ rubygems_version: 2.6.9
272
274
  signing_key:
273
275
  specification_version: 4
274
276
  summary: Type system for Ruby supporting coercions, constraints and complex types