dry-types 0.9.2 → 0.9.3

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: a297bd87145c7fe1400121a10e4a1909c70248a2
4
- data.tar.gz: 6de4360daa4b430468a47ab49473536075a4da7d
3
+ metadata.gz: b5aba3a0d92022b867e134a072196692b4f0d837
4
+ data.tar.gz: d2a5c7e8b8c489ec5b507a92f92be026e7337d78
5
5
  SHA512:
6
- metadata.gz: eb09ba97edd602648519073dac33d3cf4044fe28745ae42f384e37ec40ec9649f0a140b76fddbc04adc661fe34512b6cfad6d638cc633231fcb58be72207dd9a
7
- data.tar.gz: a73f58d044ed8c05aa820c86350bd3ae08a9ed93d838ef13c7fbb5b726579d9d268371e3d2a5d467b549d905761d9cdb136818c030d57eb2d55b06aab3f7bd11
6
+ metadata.gz: b5c1a092cf9a157bdcbecc6aec42fa6731ab1e9a9067c81bb7e109a7516393128c0c183ceb4d589258bea87631da55735e38a4b44860f005ea2230b43985e406
7
+ data.tar.gz: 706d91386ba41582d7eb927237790bf51c0790fc909b248b9a70c851070fb0f49e897e54098f51891fcd5afdd2ee7311fffb6deff7e8b9061b1b6b2135802743
data/.travis.yml CHANGED
@@ -1,21 +1,25 @@
1
1
  language: ruby
2
- sudo: false
2
+ dist: trusty
3
+ sudo: required
3
4
  cache: bundler
4
5
  bundler_args: --without benchmarks tools
6
+ after_success:
7
+ - '[ "$TRAVIS_RUBY_VERSION" = "2.3.1" ] && [ "$TRAVIS_BRANCH" = "master" ] && bundle exec codeclimate-test-reporter'
5
8
  script:
6
9
  - bundle exec rake
7
10
  rvm:
8
- - 2.1.10
9
- - 2.2.5
10
- - 2.3.1
11
+ - 2.1
12
+ - 2.2
13
+ - 2.3
11
14
  - jruby-9.1.5.0
12
- - rbx-3.60
15
+ - rbx-3
13
16
  env:
14
17
  global:
18
+ - COVERAGE=true
15
19
  - JRUBY_OPTS='--dev -J-Xmx1024M'
16
20
  matrix:
17
21
  allow_failures:
18
- - rvm: rbx-3.60
22
+ - rvm: rbx-3
19
23
  notifications:
20
24
  email: false
21
25
  webhooks:
data/.yardopts ADDED
@@ -0,0 +1,5 @@
1
+ --title 'dry-types'
2
+ --markup markdown
3
+ --readme README.md
4
+ --private
5
+ lib/**/*.rb
data/CHANGELOG.md CHANGED
@@ -1,4 +1,12 @@
1
- # v0.9.2 to-be-released
1
+ # v0.9.3 2016-12-03
2
+
3
+ ## Fixed
4
+
5
+ * Updated to dry-core >= 0.2.1 (ruby warnings are gone) (flash-gordon)
6
+
7
+ [Compare v0.9.2...v0.9.3](https://github.com/dryrb/dry-types/compare/v0.9.2...v0.9.3)
8
+
9
+ # v0.9.2 2016-11-13
2
10
 
3
11
  ## Added
4
12
 
data/Gemfile CHANGED
@@ -3,7 +3,10 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  group :test do
6
- gem "codeclimate-test-reporter", platform: :rbx, require: false
6
+ platform :mri do
7
+ gem "codeclimate-test-reporter", require: false
8
+ gem 'simplecov', require: false
9
+ end
7
10
  end
8
11
 
9
12
  group :tools do
data/Rakefile CHANGED
@@ -13,3 +13,7 @@ task :run_specs do
13
13
  end
14
14
 
15
15
  task default: :run_specs
16
+
17
+ require 'yard'
18
+ require 'yard/rake/yardoc_task'
19
+ YARD::Rake::YardocTask.new(:doc)
data/dry-types.gemspec CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.required_ruby_version = ">= 2.1.0"
30
30
 
31
31
  spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
32
- spec.add_runtime_dependency 'dry-core', '~> 0.2'
32
+ spec.add_runtime_dependency 'dry-core', '~> 0.2', '>= 0.2.1'
33
33
  spec.add_runtime_dependency 'dry-container', '~> 0.3'
34
34
  spec.add_runtime_dependency 'dry-equalizer', '~> 0.2'
35
35
  spec.add_runtime_dependency 'dry-configurable', '~> 0.1'
@@ -40,4 +40,5 @@ Gem::Specification.new do |spec|
40
40
  spec.add_development_dependency "rake", "~> 11.0"
41
41
  spec.add_development_dependency "rspec", "~> 3.3"
42
42
  spec.add_development_dependency 'dry-monads', '~> 0.2'
43
+ spec.add_development_dependency 'yard', '~> 0.9.5'
43
44
  end
data/lib/dry/types.rb CHANGED
@@ -8,6 +8,7 @@ require 'concurrent'
8
8
  require 'dry-container'
9
9
  require 'dry-equalizer'
10
10
  require 'dry/core/extensions'
11
+ require 'dry/core/constants'
11
12
 
12
13
  require 'dry/types/version'
13
14
  require 'dry/types/container'
@@ -20,17 +21,22 @@ module Dry
20
21
  module Types
21
22
  extend Dry::Configurable
22
23
  extend Dry::Core::Extensions
24
+ include Dry::Core::Constants
23
25
 
26
+ # @!attribute [r] namespace
27
+ # @return [Container{String => Definition}]
24
28
  setting :namespace, self
25
29
 
26
30
  TYPE_SPEC_REGEX = %r[(.+)<(.+)>].freeze
27
31
 
32
+ # @return [Module]
28
33
  def self.module
29
34
  namespace = Module.new
30
35
  define_constants(namespace, type_keys)
31
36
  namespace
32
37
  end
33
38
 
39
+ # @deprecated Include {Dry::Types.module} instead
34
40
  def self.finalize
35
41
  warn 'Dry::Types.finalize and configuring namespace is deprecated. Just'\
36
42
  ' do `include Dry::Types.module` in places where you want to have access'\
@@ -39,19 +45,30 @@ module Dry
39
45
  define_constants(config.namespace, type_keys)
40
46
  end
41
47
 
48
+ # @return [Container{String => Definition}]
42
49
  def self.container
43
50
  @container ||= Container.new
44
51
  end
45
52
 
53
+ # @param [String] name
54
+ # @param [Definition] type
55
+ # @param [#call] block
56
+ # @return [Container{String => Definition}]
46
57
  def self.register(name, type = nil, &block)
47
58
  container.register(name, type || block.call)
48
59
  end
49
60
 
61
+ # Registers given +klass+ in {#container} using +meth+ constructor
62
+ # @param [Class] klass
63
+ # @param [Symbol] meth
64
+ # @return [Container{String => Definition}]
50
65
  def self.register_class(klass, meth = :new)
51
66
  type = Definition.new(klass).constructor(klass.method(meth))
52
67
  container.register(identifier(klass), type)
53
68
  end
54
69
 
70
+ # @param [String] name
71
+ # @return [Definition]
55
72
  def self.[](name)
56
73
  type_map.fetch_or_store(name) do
57
74
  case name
@@ -76,6 +93,9 @@ module Dry
76
93
  end
77
94
  end
78
95
 
96
+ # @param [Container{String => Definition}] namespace
97
+ # @param [<String>] identifiers
98
+ # @return [<Definition>]
79
99
  def self.define_constants(namespace, identifiers)
80
100
  names = identifiers.map do |id|
81
101
  parts = id.split('.')
@@ -91,14 +111,19 @@ module Dry
91
111
  end
92
112
  end
93
113
 
114
+ # @param [#to_s] klass
115
+ # @return [String]
94
116
  def self.identifier(klass)
95
117
  Inflecto.underscore(klass).tr('/', '.')
96
118
  end
97
119
 
120
+ # @return [Concurrent::Map]
98
121
  def self.type_map
99
122
  @type_map ||= Concurrent::Map.new
100
123
  end
101
124
 
125
+ # List of type keys defined in {Dry::Types.container}
126
+ # @return [<String>]
102
127
  def self.type_keys
103
128
  container._container.keys
104
129
  end
@@ -3,6 +3,8 @@ require 'dry/types/array/member'
3
3
  module Dry
4
4
  module Types
5
5
  class Array < Definition
6
+ # @param [Definition] type
7
+ # @return [Array::Member]
6
8
  def member(type)
7
9
  member =
8
10
  case type
@@ -2,22 +2,36 @@ module Dry
2
2
  module Types
3
3
  class Array < Definition
4
4
  class Member < Array
5
+ # @return [Definition]
5
6
  attr_reader :member
6
7
 
8
+ # @param [Class] primitive
9
+ # @param [Hash] options
10
+ # @option options [Definition] :member
7
11
  def initialize(primitive, options = {})
8
12
  @member = options.fetch(:member)
9
13
  super
10
14
  end
11
15
 
16
+ # @param [Object] input
17
+ # @param [Symbol] meth
18
+ # @return [Array]
12
19
  def call(input, meth = :call)
13
20
  input.map { |el| member.__send__(meth, el) }
14
21
  end
15
22
  alias_method :[], :call
16
23
 
17
- def valid?(type)
18
- super && type.all? { |el| member.valid?(el) }
24
+ # @param [Array, #all?] value
25
+ # @return [Boolean]
26
+ def valid?(value)
27
+ super && value.all? { |el| member.valid?(el) }
19
28
  end
20
29
 
30
+ # @param [Array, Object] input
31
+ # @param [#call] block
32
+ # @yieldparam [Failure] failure
33
+ # @yieldreturn [Result]
34
+ # @return [Result]
21
35
  def try(input, &block)
22
36
  if input.is_a?(::Array)
23
37
  result = call(input, :try)
@@ -1,27 +1,35 @@
1
- require 'dry/core/constants'
2
-
3
1
  module Dry
4
2
  module Types
5
3
  module Builder
6
4
  include Dry::Core::Constants
7
5
 
6
+ # @return [Constrained]
8
7
  def constrained_type
9
8
  Constrained
10
9
  end
11
10
 
11
+ # @param [Definition] other
12
+ # @return [Sum, Sum::Constrained]
12
13
  def |(other)
13
14
  klass = constrained? && other.constrained? ? Sum::Constrained : Sum
14
15
  klass.new(self, other)
15
16
  end
16
17
 
18
+ # @return [Sum]
17
19
  def optional
18
20
  Types['strict.nil'] | self
19
21
  end
20
22
 
23
+ # @param [Hash] options constraining rule (see {Types.Rule})
24
+ # @return [Constrained]
21
25
  def constrained(options)
22
26
  constrained_type.new(self, rule: Types.Rule(options))
23
27
  end
24
28
 
29
+ # @param [Object] input
30
+ # @param [#call] block
31
+ # @raise [ConstraintError]
32
+ # @return [Default]
25
33
  def default(input = Undefined, &block)
26
34
  value = input == Undefined ? block : input
27
35
 
@@ -32,14 +40,21 @@ module Dry
32
40
  end
33
41
  end
34
42
 
43
+ # @param [Array] values
44
+ # @return [Enum]
35
45
  def enum(*values)
36
46
  Enum.new(constrained(included_in: values), values: values)
37
47
  end
38
48
 
49
+ # @return [Safe]
39
50
  def safe
40
51
  Safe.new(self)
41
52
  end
42
53
 
54
+ # @param [#call] constructor
55
+ # @param [Hash] options
56
+ # @param [#call] block
57
+ # @return [Constructor]
43
58
  def constructor(constructor = nil, **options, &block)
44
59
  Constructor.new(with(options), fn: constructor || block)
45
60
  end
@@ -1,14 +1,17 @@
1
- require 'dry/core/constants'
2
-
3
1
  module Dry
4
2
  module Types
5
3
  module Coercions
6
4
  include Dry::Core::Constants
7
5
 
6
+ # @param [String] input
7
+ # @return [String?]
8
8
  def to_nil(input)
9
9
  input unless empty_str?(input)
10
10
  end
11
11
 
12
+ # @param [#to_str, Object] input
13
+ # @return [Date, Object]
14
+ # @see Date.parse
12
15
  def to_date(input)
13
16
  return input unless input.respond_to?(:to_str)
14
17
  Date.parse(input)
@@ -16,6 +19,9 @@ module Dry
16
19
  input
17
20
  end
18
21
 
22
+ # @param [#to_str, Object] input
23
+ # @return [DateTime, Object]
24
+ # @see DateTime.parse
19
25
  def to_date_time(input)
20
26
  return input unless input.respond_to?(:to_str)
21
27
  DateTime.parse(input)
@@ -23,6 +29,9 @@ module Dry
23
29
  input
24
30
  end
25
31
 
32
+ # @param [#to_str, Object] input
33
+ # @return [Time, Object]
34
+ # @see Time.parse
26
35
  def to_time(input)
27
36
  return input unless input.respond_to?(:to_str)
28
37
  Time.parse(input)
@@ -32,6 +41,9 @@ module Dry
32
41
 
33
42
  private
34
43
 
44
+ # Checks whether String is empty
45
+ # @param [String, Object] value
46
+ # @return [Boolean]
35
47
  def empty_str?(value)
36
48
  EMPTY_STRING.eql?(value)
37
49
  end
@@ -11,14 +11,24 @@ module Dry
11
11
 
12
12
  extend Coercions
13
13
 
14
+ # @param [String, Object] input
15
+ # @return [Boolean?]
16
+ # @see TRUE_VALUES
17
+ # @see FALSE_VALUES
14
18
  def self.to_true(input)
15
19
  BOOLEAN_MAP.fetch(input.to_s, input)
16
20
  end
17
21
 
22
+ # @param [String, Object] input
23
+ # @return [Boolean?]
24
+ # @see TRUE_VALUES
25
+ # @see FALSE_VALUES
18
26
  def self.to_false(input)
19
27
  BOOLEAN_MAP.fetch(input.to_s, input)
20
28
  end
21
29
 
30
+ # @param [#to_int, #to_i, Object] input
31
+ # @return [Integer?, Object]
22
32
  def self.to_int(input)
23
33
  if empty_str?(input)
24
34
  nil
@@ -29,6 +39,8 @@ module Dry
29
39
  input
30
40
  end
31
41
 
42
+ # @param [#to_f, Object] input
43
+ # @return [Float?, Object]
32
44
  def self.to_float(input)
33
45
  if empty_str?(input)
34
46
  nil
@@ -39,6 +51,8 @@ module Dry
39
51
  input
40
52
  end
41
53
 
54
+ # @param [#to_d, Object] input
55
+ # @return [BigDecimal?, Object]
42
56
  def self.to_decimal(input)
43
57
  result = to_float(input)
44
58
 
@@ -49,10 +63,14 @@ module Dry
49
63
  end
50
64
  end
51
65
 
66
+ # @param [Array, '', Object] input
67
+ # @return [Array, Object]
52
68
  def self.to_ary(input)
53
69
  empty_str?(input) ? [] : input
54
70
  end
55
71
 
72
+ # @param [Hash, '', Object] input
73
+ # @return [Hash]
56
74
  def self.to_hash(input)
57
75
  empty_str?(input) ? {} : input
58
76
  end
@@ -9,6 +9,8 @@ module Dry
9
9
  module JSON
10
10
  extend Coercions
11
11
 
12
+ # @param [#to_d, Object] input
13
+ # @return [BigDecimal?]
12
14
  def self.to_decimal(input)
13
15
  input.to_d unless empty_str?(input)
14
16
  end
@@ -9,13 +9,19 @@ module Dry
9
9
  include Decorator
10
10
  include Builder
11
11
 
12
+ # @return [Dry::Logic::Rule]
12
13
  attr_reader :rule
13
14
 
15
+ # @param [Definition] type
16
+ # @param [Hash] options
14
17
  def initialize(type, options)
15
18
  super
16
19
  @rule = options.fetch(:rule)
17
20
  end
18
21
 
22
+ # @param [Object] input
23
+ # @return [Object]
24
+ # @raise [ConstraintError]
19
25
  def call(input)
20
26
  try(input) do |result|
21
27
  raise ConstraintError.new(result, input)
@@ -23,6 +29,11 @@ module Dry
23
29
  end
24
30
  alias_method :[], :call
25
31
 
32
+ # @param [Object] input
33
+ # @param [#call] block
34
+ # @yieldparam [Failure] failure
35
+ # @yieldreturn [Result]
36
+ # @return [Result]
26
37
  def try(input, &block)
27
38
  result = rule.(input)
28
39
 
@@ -34,20 +45,30 @@ module Dry
34
45
  end
35
46
  end
36
47
 
48
+ # @param [Object] value
49
+ # @return [Boolean]
37
50
  def valid?(value)
38
51
  rule.(value).success? && type.valid?(value)
39
52
  end
40
53
 
54
+ # @param [Hash] options
55
+ # The options hash provided to {Types.Rule} and combined
56
+ # using {&} with previous {#rule}
57
+ # @return [Constrained]
58
+ # @see Dry::Logic::Operators#and
41
59
  def constrained(options)
42
60
  with(rule: rule & Types.Rule(options))
43
61
  end
44
62
 
63
+ # @return [true]
45
64
  def constrained?
46
65
  true
47
66
  end
48
67
 
49
68
  private
50
69
 
70
+ # @param [Object] response
71
+ # @return [Boolean]
51
72
  def decorate?(response)
52
73
  super || response.kind_of?(Constructor)
53
74
  end