dry-types 0.7.2 → 0.8.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: 7c1311828855bfe56729ac94279d1522da021a55
4
- data.tar.gz: 20154b9c7e7cdbd446d722e3f472382d7563008d
3
+ metadata.gz: 9622054be99e8e44c40fe7cb054f81df88904d69
4
+ data.tar.gz: ea4110e3046187010e0b1c70f178ef90e50cbf37
5
5
  SHA512:
6
- metadata.gz: 244f03d865c9c63d2a1bf7b84bdf1dd5e52d6c4066a86b2603b5b2462411dc5f0411ff014e7567ccc5eda9eb325e82c26c9eec81656976ad3a48e77d1822c944
7
- data.tar.gz: ef5a74967de5c2a3824cac9717ec80982f3749858751af79d0ff32f1368220c17b6e6d7ddfa9c8337596cb119ad97555d12aaf0030ed403fe915c1f99acfd533
6
+ metadata.gz: 02330a45f810e8a15f1dc47c2778360cede0a686136bce6d39f9f8b726d654c143b0d1546f36e9143e2cf539c0768ff3be3588e9e6e42568b5067eb96a9e909c
7
+ data.tar.gz: 193d63f9c8acbc4a266cbaf9ccfac6d3aba6cfcd9de25323d040bfb5c2a325273cb98890787fe2b38fe9faa8ebb54371fd58f875fb2de814d18acaa7a0c2bbbb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ # v0.8.0 2016-07-01
2
+
3
+ ## Added
4
+
5
+ * `Struct` now implements `Type` interface so ie `SomeStruct | String` works now (flash-gordon)
6
+ * `:weak` Hash constructor which can partially coerce a hash even when it includes invalid values (solnic)
7
+ * Types include `Dry::Equalizer` now (flash-gordon)
8
+
9
+ ## Fixed
10
+
11
+ * `Struct#to_hash` descends into arrays too (nepalez)
12
+ * `Default#with` works now (flash-gordon)
13
+
14
+ ## Changed
15
+
16
+ * `:symbolized` hash schema is now based on `:weak` schema (solnic)
17
+ * `Struct::Value` instances are now **deeply frozen** via ice_nine (backus)
18
+
19
+ [Compare v0.7.2...v0.8.0](https://github.com/dryrb/dry-types/compare/v0.7.2...v0.8.0)
20
+
1
21
  # v0.7.2 2016-05-11
2
22
 
3
23
  ## Fixed
@@ -6,6 +26,7 @@
6
26
  - Creating an empty schema with input processor no longer fails (lasseebert)
7
27
 
8
28
  ## Changes
29
+
9
30
  - Allow multiple calls to meta (solnic)
10
31
  - Allow capitalised versions of true and false values for boolean coercions (nil0bject)
11
32
  - Replace kleisli with dry-monads (flash-gordon)
@@ -14,7 +35,7 @@
14
35
  - Coerce empty strings in form posts to blank arrays and hashes (timriley)
15
36
  - update to use dry-logic v0.2.3 (fran-worley)
16
37
 
17
- [Compare v0.7.0...v0.7.1](https://github.com/dryrb/dry-types/compare/v0.7.1...v0.7.2)
38
+ [Compare v0.7.1...v0.7.2](https://github.com/dryrb/dry-types/compare/v0.7.1...v0.7.2)
18
39
 
19
40
  # v0.7.1 2016-04-06
20
41
 
data/Gemfile CHANGED
@@ -21,4 +21,4 @@ group :benchmarks do
21
21
  gem 'attrio'
22
22
  end
23
23
 
24
- gem "dry-logic", git: 'https://github.com/dry-rb/dry-logic.git', branch: "master"
24
+ gem "dry-logic", git: 'https://github.com/dry-rb/dry-logic.git', branch: "master"
data/dry-types.gemspec CHANGED
@@ -31,9 +31,10 @@ Gem::Specification.new do |spec|
31
31
  spec.add_runtime_dependency 'dry-container', '~> 0.3'
32
32
  spec.add_runtime_dependency 'dry-equalizer', '~> 0.2'
33
33
  spec.add_runtime_dependency 'dry-configurable', '~> 0.1'
34
- spec.add_runtime_dependency 'dry-logic', '~> 0.2', '>= 0.2.3'
34
+ spec.add_runtime_dependency 'dry-logic', '~> 0.3', '>= 0.3.0'
35
35
  spec.add_runtime_dependency 'inflecto', '~> 0.0.0', '>= 0.0.2'
36
36
  spec.add_runtime_dependency 'dry-monads', '>= 0.0.1'
37
+ spec.add_runtime_dependency 'ice_nine', '~> 0.11'
37
38
 
38
39
  spec.add_development_dependency "bundler", "~> 1.6"
39
40
  spec.add_development_dependency "rake", "~> 11.0"
@@ -15,12 +15,18 @@ module Dry
15
15
  alias_method :[], :call
16
16
 
17
17
  def try(input, &block)
18
- result = call(input, :try)
18
+ if input.is_a?(::Array)
19
+ result = call(input, :try)
20
+ output = result.map(&:input)
19
21
 
20
- if result.all?(&:success?)
21
- success(result.map(&:input))
22
+ if result.all?(&:success?)
23
+ success(output)
24
+ else
25
+ failure = failure(output, result.select(&:failure?))
26
+ block ? yield(failure) : failure
27
+ end
22
28
  else
23
- failure = failure(input, result.select(&:failure?))
29
+ failure = failure(input, "#{input} is not an array")
24
30
  block ? yield(failure) : failure
25
31
  end
26
32
  end
@@ -26,7 +26,7 @@ module Dry
26
26
  value = input == Undefined ? block : input
27
27
 
28
28
  if value.is_a?(Proc) || valid?(value)
29
- Default[value].new(self, value: value)
29
+ Default[value].new(self, value)
30
30
  else
31
31
  raise ConstraintError, "default value #{value.inspect} violates constraints"
32
32
  end
@@ -5,6 +5,7 @@ require 'dry/types/constrained/coercible'
5
5
  module Dry
6
6
  module Types
7
7
  class Constrained
8
+ include Dry::Equalizer(:type, :options, :rule)
8
9
  include Decorator
9
10
  include Builder
10
11
 
@@ -3,22 +3,14 @@ require 'dry/logic/predicates'
3
3
 
4
4
  module Dry
5
5
  module Types
6
- module Predicates
7
- include Logic::Predicates
8
-
9
- predicate(:type?) do |type, value|
10
- value.kind_of?(type)
11
- end
12
- end
13
-
14
6
  def self.Rule(options)
15
7
  rule_compiler.(
16
- options.map { |key, val| [:val, [:predicate, [:"#{key}?", [val]]]] }
8
+ options.map { |key, val| [:val, Logic::Predicates[:"#{key}?"].curry(val).to_ast] }
17
9
  ).reduce(:and)
18
10
  end
19
11
 
20
12
  def self.rule_compiler
21
- @rule_compiler ||= Logic::RuleCompiler.new(Types::Predicates)
13
+ @rule_compiler ||= Logic::RuleCompiler.new(Logic::Predicates)
22
14
  end
23
15
  end
24
16
  end
@@ -1,25 +1,37 @@
1
+ require 'dry/types/options'
2
+
1
3
  module Dry
2
4
  module Types
3
5
  module Decorator
4
- attr_reader :type, :options
6
+ include Options
7
+
8
+ attr_reader :type
5
9
 
6
- def initialize(type, options = {})
10
+ def initialize(type, *)
11
+ super
7
12
  @type = type
8
- @options = options
9
13
  end
10
14
 
11
15
  def constructor
12
16
  type.constructor
13
17
  end
14
18
 
15
- def with(new_options)
16
- self.class.new(type, options.merge(new_options))
19
+ def try(input, &block)
20
+ type.try(input, &block)
17
21
  end
18
22
 
19
23
  def valid?(value)
20
24
  type.valid?(value)
21
25
  end
22
26
 
27
+ def default?
28
+ type.default?
29
+ end
30
+
31
+ def maybe?
32
+ type.maybe?
33
+ end
34
+
23
35
  def respond_to_missing?(meth, include_private = false)
24
36
  super || type.respond_to?(meth)
25
37
  end
@@ -3,10 +3,13 @@ require 'dry/types/decorator'
3
3
  module Dry
4
4
  module Types
5
5
  class Default
6
+ include Dry::Equalizer(:type, :options, :value)
6
7
  include Decorator
7
8
  include Builder
8
9
 
9
10
  class Callable < Default
11
+ include Dry::Equalizer(:type, :options)
12
+
10
13
  def evaluate
11
14
  value.call
12
15
  end
@@ -24,15 +27,23 @@ module Dry
24
27
  end
25
28
  end
26
29
 
27
- def initialize(type, options)
30
+ def initialize(type, value, *)
28
31
  super
29
- @value = options.fetch(:value)
32
+ @value = value
30
33
  end
31
34
 
32
35
  def constrained(*args)
33
36
  type.constrained(*args).default(value)
34
37
  end
35
38
 
39
+ def default?
40
+ true
41
+ end
42
+
43
+ def try(input)
44
+ success(call(input))
45
+ end
46
+
36
47
  def call(input)
37
48
  if input.nil?
38
49
  evaluate
@@ -33,6 +33,14 @@ module Dry
33
33
  primitive.name
34
34
  end
35
35
 
36
+ def default?
37
+ false
38
+ end
39
+
40
+ def maybe?
41
+ false
42
+ end
43
+
36
44
  def call(input)
37
45
  input
38
46
  end
@@ -3,6 +3,7 @@ require 'dry/types/decorator'
3
3
  module Dry
4
4
  module Types
5
5
  class Enum
6
+ include Dry::Equalizer(:type, :options, :values)
6
7
  include Decorator
7
8
 
8
9
  attr_reader :values, :mapping
@@ -43,7 +43,8 @@ module Dry
43
43
  def failure_message
44
44
  if result.respond_to?(:rule)
45
45
  rule = result.rule
46
- "#{rule.predicate.id}(#{rule.predicate.args.map(&:inspect).join(', ')}) failed"
46
+ args = rule.predicate.args - [rule.predicate.args.last]
47
+ "#{rule.predicate.id}(#{args.map(&:inspect).join(', ')}) failed"
47
48
  else
48
49
  result.inspect
49
50
  end
@@ -43,11 +43,11 @@ module Dry
43
43
  end
44
44
 
45
45
  register('form.array') do
46
- self['array'].safe.constructor(Coercions::Form.method(:to_ary))
46
+ self['array'].constructor(Coercions::Form.method(:to_ary)).safe
47
47
  end
48
48
 
49
49
  register('form.hash') do
50
- self['hash'].safe.constructor(Coercions::Form.method(:to_hash))
50
+ self['hash'].constructor(Coercions::Form.method(:to_hash)).safe
51
51
  end
52
52
  end
53
53
  end
@@ -3,7 +3,7 @@ require 'dry/types/hash/schema'
3
3
  module Dry
4
4
  module Types
5
5
  class Hash < Definition
6
- def schema(type_map, klass = Safe)
6
+ def schema(type_map, klass = Schema)
7
7
  member_types = type_map.each_with_object({}) { |(name, type), result|
8
8
  result[name] =
9
9
  case type
@@ -15,6 +15,10 @@ module Dry
15
15
  klass.new(primitive, options.merge(member_types: member_types))
16
16
  end
17
17
 
18
+ def weak(type_map)
19
+ schema(type_map, Weak)
20
+ end
21
+
18
22
  def strict(type_map)
19
23
  schema(type_map, Strict)
20
24
  end
@@ -9,13 +9,25 @@ module Dry
9
9
  super
10
10
  end
11
11
 
12
+ def call(hash, meth = :call)
13
+ member_types.each_with_object({}) do |(key, type), result|
14
+ if hash.key?(key)
15
+ result[key] = type.__send__(meth, hash[key])
16
+ else
17
+ resolve_missing_value(result, key, type)
18
+ end
19
+ end
20
+ end
21
+ alias_method :[], :call
22
+
12
23
  def try(hash, &block)
13
24
  result = call(hash, :try)
25
+ output = result.each_with_object({}) { |(key, res), h| h[key] = res.input }
14
26
 
15
27
  if result.values.all?(&:success?)
16
- success(result.each_with_object({}) { |(key, res), h| h[key] = res.input })
28
+ success(output)
17
29
  else
18
- failure = failure(hash, result)
30
+ failure = failure(output, result)
19
31
  block ? yield(failure) : failure
20
32
  end
21
33
  end
@@ -23,28 +35,50 @@ module Dry
23
35
  private
24
36
 
25
37
  def resolve_missing_value(result, key, type)
26
- if type.is_a?(Default)
38
+ if type.default?
27
39
  result[key] = type.evaluate
28
- elsif type.is_a?(Maybe)
40
+ elsif type.maybe?
29
41
  result[key] = type[nil]
30
42
  end
31
43
  end
32
44
  end
33
45
 
34
- class Safe < Schema
46
+ class Strict < Schema
35
47
  def call(hash, meth = :call)
36
48
  member_types.each_with_object({}) do |(key, type), result|
37
- if hash.key?(key)
38
- result[key] = type.__send__(meth, hash[key])
39
- else
40
- resolve_missing_value(result, key, type)
49
+ begin
50
+ value = hash.fetch(key)
51
+ result[key] = type.__send__(meth, value)
52
+ rescue TypeError
53
+ raise SchemaError.new(key, value)
54
+ rescue KeyError
55
+ raise SchemaKeyError.new(key)
41
56
  end
42
57
  end
43
58
  end
44
59
  alias_method :[], :call
45
60
  end
46
61
 
47
- class Symbolized < Schema
62
+ class Weak < Schema
63
+ def self.new(primitive, options = {})
64
+ member_types = options.
65
+ fetch(:member_types, {}).
66
+ each_with_object({}) { |(k, t), res| res[k] = t.safe }
67
+
68
+ super(primitive, options.merge(member_types: member_types))
69
+ end
70
+
71
+ def try(hash, &block)
72
+ if hash.is_a?(::Hash)
73
+ super
74
+ else
75
+ result = failure(hash, "#{hash} must be a hash")
76
+ block ? yield(result) : result
77
+ end
78
+ end
79
+ end
80
+
81
+ class Symbolized < Weak
48
82
  def call(hash, meth = :call)
49
83
  member_types.each_with_object({}) do |(key, type), result|
50
84
  if hash.key?(key)
@@ -62,22 +96,6 @@ module Dry
62
96
  end
63
97
  alias_method :[], :call
64
98
  end
65
-
66
- class Strict < Schema
67
- def call(hash, meth = :call)
68
- member_types.each_with_object({}) do |(key, type), result|
69
- begin
70
- value = hash.fetch(key)
71
- result[key] = type.__send__(meth, value)
72
- rescue TypeError
73
- raise SchemaError.new(key, value)
74
- rescue KeyError
75
- raise SchemaKeyError.new(key)
76
- end
77
- end
78
- end
79
- alias_method :[], :call
80
- end
81
99
  end
82
100
  end
83
101
  end
@@ -0,0 +1,12 @@
1
+ # Converts value to hash recursively
2
+ module Hashify
3
+ def self.[](value)
4
+ if value.respond_to?(:to_hash)
5
+ value.to_hash
6
+ elsif value.respond_to?(:map)
7
+ value.map { |item| self[item] }
8
+ else
9
+ value
10
+ end
11
+ end
12
+ end
@@ -4,6 +4,7 @@ require 'dry/types/decorator'
4
4
  module Dry
5
5
  module Types
6
6
  class Maybe
7
+ include Dry::Equalizer(:type, :options)
7
8
  include Decorator
8
9
  include Builder
9
10
  include Dry::Monads::Maybe::Mixin
@@ -13,6 +14,14 @@ module Dry
13
14
  end
14
15
  alias_method :[], :call
15
16
 
17
+ def try(input)
18
+ Result::Success.new(Maybe(type[input]))
19
+ end
20
+
21
+ def maybe?
22
+ true
23
+ end
24
+
16
25
  def default(value)
17
26
  if value.nil?
18
27
  raise ArgumentError, "nil cannot be used as a default of a maybe type"
@@ -5,7 +5,7 @@ module Dry
5
5
 
6
6
  attr_reader :meta
7
7
 
8
- def initialize(*args, **options )
8
+ def initialize(*args, **options)
9
9
  @__args__ = args
10
10
  @options = options
11
11
  @meta = options.fetch(:meta, {})
@@ -3,22 +3,20 @@ require 'dry/types/decorator'
3
3
  module Dry
4
4
  module Types
5
5
  class Safe
6
+ include Dry::Equalizer(:type, :options)
6
7
  include Decorator
7
8
  include Builder
8
9
 
9
10
  def call(input)
10
- if type.primitive?(input) || type.is_a?(Sum) || type.is_a?(Constructor)
11
- type[input]
12
- else
13
- input
14
- end
15
- rescue TypeError
16
- input
11
+ try(input).input
17
12
  end
18
13
  alias_method :[], :call
19
14
 
20
15
  def try(input, &block)
21
16
  type.try(input, &block)
17
+ rescue TypeError, ArgumentError => e
18
+ result = failure(input, e.message)
19
+ block ? yield(result) : result
22
20
  end
23
21
 
24
22
  private
@@ -1,76 +1,10 @@
1
+ require_relative 'hashify'
2
+ require 'dry/types/struct/class_interface'
3
+
1
4
  module Dry
2
5
  module Types
3
6
  class Struct
4
- class << self
5
- attr_reader :constructor
6
- end
7
-
8
- def self.inherited(klass)
9
- super
10
-
11
- klass.instance_variable_set('@equalizer', Equalizer.new(*schema.keys))
12
- klass.instance_variable_set('@constructor_type', constructor_type)
13
- klass.send(:include, klass.equalizer)
14
-
15
- unless klass == Value
16
- klass.instance_variable_set('@constructor', Types['coercible.hash'])
17
- Types.register_class(klass)
18
- end
19
-
20
- klass.attributes({}) unless equal?(Struct)
21
- end
22
-
23
- def self.equalizer
24
- @equalizer
25
- end
26
-
27
- def self.attribute(name, type)
28
- attributes(name => type)
29
- end
30
-
31
- def self.attributes(new_schema)
32
- check_schema_duplication(new_schema)
33
-
34
- prev_schema = schema
35
-
36
- @schema = prev_schema.merge(new_schema)
37
- @constructor = Types['coercible.hash'].public_send(constructor_type, schema)
38
-
39
- attr_reader(*new_schema.keys)
40
- equalizer.instance_variable_get('@keys').concat(new_schema.keys)
41
-
42
- self
43
- end
44
-
45
- def self.check_schema_duplication(new_schema)
46
- shared_keys = new_schema.keys & schema.keys
47
-
48
- fail RepeatedAttributeError, shared_keys.first if shared_keys.any?
49
- end
50
- private_class_method :check_schema_duplication
51
-
52
- def self.constructor_type(type = nil)
53
- if type
54
- @constructor_type = type
55
- else
56
- @constructor_type || :strict
57
- end
58
- end
59
-
60
- def self.schema
61
- super_schema = superclass.respond_to?(:schema) ? superclass.schema : {}
62
- super_schema.merge(@schema || {})
63
- end
64
-
65
- def self.new(attributes = {})
66
- if attributes.instance_of?(self)
67
- attributes
68
- else
69
- super(constructor[attributes])
70
- end
71
- rescue SchemaError, SchemaKeyError => error
72
- raise StructError, "[#{self}.new] #{error}"
73
- end
7
+ extend ClassInterface
74
8
 
75
9
  def initialize(attributes)
76
10
  attributes.each { |key, value| instance_variable_set("@#{key}", value) }
@@ -81,10 +15,9 @@ module Dry
81
15
  end
82
16
 
83
17
  def to_hash
84
- self.class.schema.keys.each_with_object({}) { |key, result|
85
- value = self[key]
86
- result[key] = value.respond_to?(:to_hash) ? value.to_hash : value
87
- }
18
+ self.class.schema.keys.each_with_object({}) do |key, result|
19
+ result[key] = Hashify[self[key]]
20
+ end
88
21
  end
89
22
  alias_method :to_h, :to_hash
90
23
  end
@@ -0,0 +1,107 @@
1
+ module Dry
2
+ module Types
3
+ class Struct
4
+ module ClassInterface
5
+ include Builder
6
+
7
+ attr_accessor :constructor
8
+
9
+ attr_accessor :equalizer
10
+
11
+ attr_writer :constructor_type
12
+
13
+ protected :constructor=, :equalizer=, :constructor_type=
14
+
15
+ def inherited(klass)
16
+ super
17
+
18
+ klass.equalizer = Equalizer.new(*schema.keys)
19
+ klass.constructor_type = constructor_type
20
+ klass.send(:include, klass.equalizer)
21
+
22
+ unless klass == Value
23
+ klass.constructor = Types['coercible.hash']
24
+ Types.register(Types.identifier(klass), klass)
25
+ end
26
+
27
+ klass.attributes({}) unless equal?(Struct)
28
+ end
29
+
30
+ def attribute(name, type)
31
+ attributes(name => type)
32
+ end
33
+
34
+ def attributes(new_schema)
35
+ check_schema_duplication(new_schema)
36
+
37
+ prev_schema = schema
38
+
39
+ @schema = prev_schema.merge(new_schema)
40
+ @constructor = Types['coercible.hash'].public_send(constructor_type, schema)
41
+
42
+ attr_reader(*new_schema.keys)
43
+ equalizer.instance_variable_get('@keys').concat(new_schema.keys)
44
+
45
+ self
46
+ end
47
+
48
+ def check_schema_duplication(new_schema)
49
+ shared_keys = new_schema.keys & schema.keys
50
+
51
+ fail RepeatedAttributeError, shared_keys.first if shared_keys.any?
52
+ end
53
+ private :check_schema_duplication
54
+
55
+ def constructor_type(type = nil)
56
+ if type
57
+ @constructor_type = type
58
+ else
59
+ @constructor_type || :strict
60
+ end
61
+ end
62
+
63
+ def schema
64
+ super_schema = superclass.respond_to?(:schema) ? superclass.schema : {}
65
+ super_schema.merge(@schema || {})
66
+ end
67
+
68
+ def new(attributes = default_attributes)
69
+ if attributes.instance_of?(self)
70
+ attributes
71
+ else
72
+ super(constructor[attributes])
73
+ end
74
+ rescue SchemaError, SchemaKeyError => error
75
+ raise StructError, "[#{self}.new] #{error}"
76
+ end
77
+ alias_method :call, :new
78
+ alias_method :[], :new
79
+
80
+ def default_attributes
81
+ schema.each_with_object({}) { |(name, type), result|
82
+ result[name] = type.default? ? type.evaluate : type[nil]
83
+ }
84
+ end
85
+
86
+ def try(input)
87
+ Result::Success.new(self[input])
88
+ rescue StructError => e
89
+ failure = Result::Failure.new(input, e.message)
90
+ block_given? ? yield(failure) : failure
91
+ end
92
+
93
+ def maybe?
94
+ false
95
+ end
96
+
97
+ def default?
98
+ false
99
+ end
100
+
101
+ def valid?(value)
102
+ self === value
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
data/lib/dry/types/sum.rb CHANGED
@@ -27,6 +27,14 @@ module Dry
27
27
  [left, right].map(&:name).join(' | ')
28
28
  end
29
29
 
30
+ def default?
31
+ false
32
+ end
33
+
34
+ def maybe?
35
+ false
36
+ end
37
+
30
38
  def call(input)
31
39
  try(input) do |result|
32
40
  raise ConstraintError, result
@@ -1,10 +1,12 @@
1
+ require 'ice_nine'
2
+
1
3
  require 'dry/types/struct'
2
4
 
3
5
  module Dry
4
6
  module Types
5
7
  class Value < Struct
6
8
  def self.new(*)
7
- super.freeze
9
+ IceNine.deep_freeze(super)
8
10
  end
9
11
  end
10
12
  end
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Types
3
- VERSION = '0.7.2'.freeze
3
+ VERSION = '0.8.0'.freeze
4
4
  end
5
5
  end
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.7.2
4
+ version: 0.8.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: 2016-05-11 00:00:00.000000000 Z
11
+ date: 2016-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -72,20 +72,20 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.2'
75
+ version: '0.3'
76
76
  - - ">="
77
77
  - !ruby/object:Gem::Version
78
- version: 0.2.3
78
+ version: 0.3.0
79
79
  type: :runtime
80
80
  prerelease: false
81
81
  version_requirements: !ruby/object:Gem::Requirement
82
82
  requirements:
83
83
  - - "~>"
84
84
  - !ruby/object:Gem::Version
85
- version: '0.2'
85
+ version: '0.3'
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
- version: 0.2.3
88
+ version: 0.3.0
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: inflecto
91
91
  requirement: !ruby/object:Gem::Requirement
@@ -120,6 +120,20 @@ dependencies:
120
120
  - - ">="
121
121
  - !ruby/object:Gem::Version
122
122
  version: 0.0.1
123
+ - !ruby/object:Gem::Dependency
124
+ name: ice_nine
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '0.11'
130
+ type: :runtime
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '0.11'
123
137
  - !ruby/object:Gem::Dependency
124
138
  name: bundler
125
139
  requirement: !ruby/object:Gem::Requirement
@@ -206,12 +220,14 @@ files:
206
220
  - lib/dry/types/form.rb
207
221
  - lib/dry/types/hash.rb
208
222
  - lib/dry/types/hash/schema.rb
223
+ - lib/dry/types/hashify.rb
209
224
  - lib/dry/types/json.rb
210
225
  - lib/dry/types/maybe.rb
211
226
  - lib/dry/types/options.rb
212
227
  - lib/dry/types/result.rb
213
228
  - lib/dry/types/safe.rb
214
229
  - lib/dry/types/struct.rb
230
+ - lib/dry/types/struct/class_interface.rb
215
231
  - lib/dry/types/sum.rb
216
232
  - lib/dry/types/value.rb
217
233
  - lib/dry/types/version.rb
@@ -236,9 +252,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
236
252
  version: '0'
237
253
  requirements: []
238
254
  rubyforge_project:
239
- rubygems_version: 2.4.8
255
+ rubygems_version: 2.5.1
240
256
  signing_key:
241
257
  specification_version: 4
242
258
  summary: Type system for Ruby supporting coercions, constraints and complex types
243
259
  like structs, value objects, enums etc.
244
260
  test_files: []
261
+ has_rdoc: