dry-types 1.1.1 → 1.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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +381 -208
  3. data/LICENSE +17 -17
  4. data/README.md +14 -13
  5. data/dry-types.gemspec +27 -31
  6. data/lib/dry/types.rb +7 -11
  7. data/lib/dry/types/any.rb +2 -2
  8. data/lib/dry/types/array/member.rb +3 -3
  9. data/lib/dry/types/builder.rb +5 -1
  10. data/lib/dry/types/builder_methods.rb +22 -8
  11. data/lib/dry/types/coercions.rb +6 -0
  12. data/lib/dry/types/coercions/params.rb +1 -1
  13. data/lib/dry/types/compiler.rb +2 -2
  14. data/lib/dry/types/constrained.rb +2 -2
  15. data/lib/dry/types/constructor.rb +7 -34
  16. data/lib/dry/types/constructor/function.rb +17 -31
  17. data/lib/dry/types/core.rb +3 -1
  18. data/lib/dry/types/decorator.rb +3 -9
  19. data/lib/dry/types/default.rb +2 -2
  20. data/lib/dry/types/enum.rb +2 -2
  21. data/lib/dry/types/errors.rb +5 -5
  22. data/lib/dry/types/extensions.rb +4 -0
  23. data/lib/dry/types/extensions/maybe.rb +14 -14
  24. data/lib/dry/types/extensions/monads.rb +29 -0
  25. data/lib/dry/types/hash.rb +3 -2
  26. data/lib/dry/types/lax.rb +2 -5
  27. data/lib/dry/types/meta.rb +3 -3
  28. data/lib/dry/types/module.rb +3 -3
  29. data/lib/dry/types/nominal.rb +1 -1
  30. data/lib/dry/types/params.rb +6 -0
  31. data/lib/dry/types/predicate_inferrer.rb +198 -0
  32. data/lib/dry/types/predicate_registry.rb +34 -0
  33. data/lib/dry/types/primitive_inferrer.rb +97 -0
  34. data/lib/dry/types/result.rb +2 -2
  35. data/lib/dry/types/schema.rb +23 -2
  36. data/lib/dry/types/schema/key.rb +16 -3
  37. data/lib/dry/types/spec/types.rb +14 -1
  38. data/lib/dry/types/sum.rb +5 -5
  39. data/lib/dry/types/version.rb +1 -1
  40. metadata +26 -45
  41. data/.codeclimate.yml +0 -15
  42. data/.gitignore +0 -11
  43. data/.rspec +0 -2
  44. data/.travis.yml +0 -27
  45. data/.yardopts +0 -9
  46. data/CONTRIBUTING.md +0 -29
  47. data/Gemfile +0 -27
  48. data/Rakefile +0 -22
  49. data/benchmarks/hash_schemas.rb +0 -55
  50. data/benchmarks/lax_schema.rb +0 -15
  51. data/benchmarks/profile_invalid_input.rb +0 -15
  52. data/benchmarks/profile_lax_schema_valid.rb +0 -16
  53. data/benchmarks/profile_valid_input.rb +0 -15
  54. data/benchmarks/schema_valid_vs_invalid.rb +0 -21
  55. data/benchmarks/setup.rb +0 -17
data/lib/dry/types/sum.rb CHANGED
@@ -14,7 +14,7 @@ module Dry
14
14
  include Options
15
15
  include Meta
16
16
  include Printable
17
- include Dry::Equalizer(:left, :right, :options, :meta, inspect: false)
17
+ include Dry::Equalizer(:left, :right, :options, :meta, inspect: false, immutable: true)
18
18
 
19
19
  # @return [Type]
20
20
  attr_reader :left
@@ -40,7 +40,7 @@ module Dry
40
40
  # @param [Hash] options
41
41
  #
42
42
  # @api private
43
- def initialize(left, right, options = {})
43
+ def initialize(left, right, **options)
44
44
  super
45
45
  @left, @right = left, right
46
46
  freeze
@@ -142,11 +142,11 @@ module Dry
142
142
  # @see [Meta#meta]
143
143
  #
144
144
  # @api public
145
- def meta(data = nil)
146
- if data.nil?
145
+ def meta(data = Undefined)
146
+ if Undefined.equal?(data)
147
147
  optional? ? right.meta : super
148
148
  elsif optional?
149
- self.class.new(left, right.meta(data), options)
149
+ self.class.new(left, right.meta(data), **options)
150
150
  else
151
151
  super
152
152
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Types
5
- VERSION = '1.1.1'
5
+ VERSION = '1.3.1'
6
6
  end
7
7
  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: 1.1.1
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-26 00:00:00.000000000 Z
11
+ date: 2020-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -64,20 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '0.2'
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 0.2.2
67
+ version: '0.3'
71
68
  type: :runtime
72
69
  prerelease: false
73
70
  version_requirements: !ruby/object:Gem::Requirement
74
71
  requirements:
75
72
  - - "~>"
76
73
  - !ruby/object:Gem::Version
77
- version: '0.2'
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: 0.2.2
74
+ version: '0.3'
81
75
  - !ruby/object:Gem::Dependency
82
76
  name: dry-inflector
83
77
  requirement: !ruby/object:Gem::Requirement
@@ -138,83 +132,67 @@ dependencies:
138
132
  requirements:
139
133
  - - "~>"
140
134
  - !ruby/object:Gem::Version
141
- version: '0.2'
135
+ version: '1.0'
142
136
  type: :development
143
137
  prerelease: false
144
138
  version_requirements: !ruby/object:Gem::Requirement
145
139
  requirements:
146
140
  - - "~>"
147
141
  - !ruby/object:Gem::Version
148
- version: '0.2'
142
+ version: '1.0'
149
143
  - !ruby/object:Gem::Dependency
150
144
  name: rake
151
145
  requirement: !ruby/object:Gem::Requirement
152
146
  requirements:
153
- - - "~>"
147
+ - - ">="
154
148
  - !ruby/object:Gem::Version
155
- version: '11.0'
149
+ version: '0'
156
150
  type: :development
157
151
  prerelease: false
158
152
  version_requirements: !ruby/object:Gem::Requirement
159
153
  requirements:
160
- - - "~>"
154
+ - - ">="
161
155
  - !ruby/object:Gem::Version
162
- version: '11.0'
156
+ version: '0'
163
157
  - !ruby/object:Gem::Dependency
164
158
  name: rspec
165
159
  requirement: !ruby/object:Gem::Requirement
166
160
  requirements:
167
- - - "~>"
161
+ - - ">="
168
162
  - !ruby/object:Gem::Version
169
- version: '3.3'
163
+ version: '0'
170
164
  type: :development
171
165
  prerelease: false
172
166
  version_requirements: !ruby/object:Gem::Requirement
173
167
  requirements:
174
- - - "~>"
168
+ - - ">="
175
169
  - !ruby/object:Gem::Version
176
- version: '3.3'
170
+ version: '0'
177
171
  - !ruby/object:Gem::Dependency
178
172
  name: yard
179
173
  requirement: !ruby/object:Gem::Requirement
180
174
  requirements:
181
- - - "~>"
175
+ - - ">="
182
176
  - !ruby/object:Gem::Version
183
- version: 0.9.5
177
+ version: '0'
184
178
  type: :development
185
179
  prerelease: false
186
180
  version_requirements: !ruby/object:Gem::Requirement
187
181
  requirements:
188
- - - "~>"
182
+ - - ">="
189
183
  - !ruby/object:Gem::Version
190
- version: 0.9.5
184
+ version: '0'
191
185
  description: Type system for Ruby supporting coercions, constraints and complex types
192
- like structs, value objects, enums etc.
186
+ like structs, value objects, enums etc
193
187
  email:
194
188
  - piotr.solnica@gmail.com
195
189
  executables: []
196
190
  extensions: []
197
191
  extra_rdoc_files: []
198
192
  files:
199
- - ".codeclimate.yml"
200
- - ".gitignore"
201
- - ".rspec"
202
- - ".rubocop.yml"
203
- - ".travis.yml"
204
- - ".yardopts"
205
193
  - CHANGELOG.md
206
- - CONTRIBUTING.md
207
- - Gemfile
208
194
  - LICENSE
209
195
  - README.md
210
- - Rakefile
211
- - benchmarks/hash_schemas.rb
212
- - benchmarks/lax_schema.rb
213
- - benchmarks/profile_invalid_input.rb
214
- - benchmarks/profile_lax_schema_valid.rb
215
- - benchmarks/profile_valid_input.rb
216
- - benchmarks/schema_valid_vs_invalid.rb
217
- - benchmarks/setup.rb
218
196
  - dry-types.gemspec
219
197
  - lib/dry-types.rb
220
198
  - lib/dry/types.rb
@@ -242,6 +220,7 @@ files:
242
220
  - lib/dry/types/errors.rb
243
221
  - lib/dry/types/extensions.rb
244
222
  - lib/dry/types/extensions/maybe.rb
223
+ - lib/dry/types/extensions/monads.rb
245
224
  - lib/dry/types/fn_container.rb
246
225
  - lib/dry/types/hash.rb
247
226
  - lib/dry/types/hash/constructor.rb
@@ -254,6 +233,9 @@ files:
254
233
  - lib/dry/types/nominal.rb
255
234
  - lib/dry/types/options.rb
256
235
  - lib/dry/types/params.rb
236
+ - lib/dry/types/predicate_inferrer.rb
237
+ - lib/dry/types/predicate_registry.rb
238
+ - lib/dry/types/primitive_inferrer.rb
257
239
  - lib/dry/types/printable.rb
258
240
  - lib/dry/types/printer.rb
259
241
  - lib/dry/types/result.rb
@@ -263,8 +245,7 @@ files:
263
245
  - lib/dry/types/sum.rb
264
246
  - lib/dry/types/type.rb
265
247
  - lib/dry/types/version.rb
266
- - log/.gitkeep
267
- homepage: https://github.com/dry-rb/dry-types
248
+ homepage: https://dry-rb.org/gems/dry-types
268
249
  licenses:
269
250
  - MIT
270
251
  metadata:
@@ -291,5 +272,5 @@ rubygems_version: 3.0.3
291
272
  signing_key:
292
273
  specification_version: 4
293
274
  summary: Type system for Ruby supporting coercions, constraints and complex types
294
- like structs, value objects, enums etc.
275
+ like structs, value objects, enums etc
295
276
  test_files: []
data/.codeclimate.yml DELETED
@@ -1,15 +0,0 @@
1
- version: "2"
2
-
3
- prepare:
4
- fetch:
5
- - url: "https://raw.githubusercontent.com/dry-rb/devtools/master/.rubocop.yml"
6
- path: ".rubocop.yml"
7
-
8
- exclude_patterns:
9
- - "benchmarks/"
10
- - "examples/"
11
- - "spec/"
12
-
13
- plugins:
14
- rubocop:
15
- enabled: true
data/.gitignore DELETED
@@ -1,11 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- log/
11
- .rubocop.yml
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --require ./spec/spec_helper
data/.travis.yml DELETED
@@ -1,27 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- bundler_args: --without benchmarks tools
4
- before_script:
5
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
6
- - chmod +x ./cc-test-reporter
7
- - ./cc-test-reporter before-build
8
- after_script:
9
- - "[ -d coverage ] && ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
10
- script:
11
- - bundle exec rake
12
- rvm:
13
- - 2.6.3
14
- - 2.5.5
15
- - 2.4.6
16
- - jruby-9.2.7.0
17
- env:
18
- global:
19
- - COVERAGE=true
20
- notifications:
21
- email: false
22
- webhooks:
23
- urls:
24
- - https://webhooks.gitter.im/e/19098b4253a72c9796db
25
- on_success: change # options: [always|never|change] default: always
26
- on_failure: always # options: [always|never|change] default: always
27
- on_start: false # default: false
data/.yardopts DELETED
@@ -1,9 +0,0 @@
1
- --title 'dry-types'
2
- --query '@api.text != "private"'
3
- --embed-mixins
4
- --output doc
5
- --readme README.md
6
- --files CHANGELOG.md
7
- --markup markdown
8
- --markup-provider=redcarpet
9
- lib/**/*.rb
data/CONTRIBUTING.md DELETED
@@ -1,29 +0,0 @@
1
- # Issue Guidelines
2
-
3
- ## Reporting bugs
4
-
5
- If you found a bug, report an issue and describe what's the expected behavior versus what actually happens. If the bug causes a crash, attach a full backtrace. If possible, a reproduction script showing the problem is highly appreciated.
6
-
7
- ## Reporting feature requests
8
-
9
- Report a feature request **only after discussing it first on [discourse.dry-rb.org](https://discourse.dry-rb.org)** where it was accepted. Please provide a concise description of the feature, don't link to a discussion thread, and instead summarize what was discussed.
10
-
11
- ## Reporting questions, support requests, ideas, concerns etc.
12
-
13
- **PLEASE DON'T** - use [discourse.dry-rb.org](https://discourse.dry-rb.org) instead.
14
-
15
- # Pull Request Guidelines
16
-
17
- A Pull Request will only be accepted if it addresses a specific issue that was reported previously, or fixes typos, mistakes in documentation etc.
18
-
19
- Other requirements:
20
-
21
- 1) Do not open a pull request if you can't provide tests along with it. If you have problems writing tests, ask for help in the related issue.
22
- 2) Follow the style conventions of the surrounding code. In most cases, this is standard ruby style.
23
- 3) Add API documentation if it's a new feature
24
- 4) Update API documentation if it changes an existing feature
25
- 5) Bonus points for sending a PR to [github.com/dry-rb/dry-rb.org](github.com/dry-rb/dry-rb.org) which updates user documentation and guides
26
-
27
- # Asking for help
28
-
29
- If these guidelines aren't helpful, and you're stuck, please post a message on [discourse.dry-rb.org](https://discourse.dry-rb.org).
data/Gemfile DELETED
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
-
7
- gemspec
8
-
9
- group :test do
10
- platform :mri do
11
- gem 'simplecov', require: false
12
- end
13
- end
14
-
15
- group :tools do
16
- gem 'pry-byebug', platform: :mri
17
- gem 'rubocop'
18
- end
19
-
20
- group :benchmarks do
21
- gem 'attrio'
22
- gem 'benchmark-ips'
23
- gem 'dry-struct'
24
- gem 'fast_attributes'
25
- gem 'hotch'
26
- gem 'virtus'
27
- end
data/Rakefile DELETED
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
-
6
- task :run_specs do
7
- require 'rspec/core'
8
-
9
- types_result = RSpec::Core::Runner.run(['spec/dry'])
10
- RSpec.clear_examples
11
-
12
- Dry::Types.load_extensions(:maybe)
13
- ext_result = RSpec::Core::Runner.run(['spec'])
14
-
15
- exit [types_result, ext_result].max
16
- end
17
-
18
- task default: :run_specs
19
-
20
- require 'yard'
21
- require 'yard/rake/yardoc_task'
22
- YARD::Rake::YardocTask.new(:doc)
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- $LOAD_PATH.unshift('lib')
4
-
5
- require 'bundler/setup'
6
- require 'dry-types'
7
-
8
- module SchemaBench
9
- def self.hash_schema(type)
10
- Dry::Types['nominal.hash'].public_send(
11
- type,
12
- email: Dry::Types['nominal.string'],
13
- age: Dry::Types['params.integer'],
14
- admin: Dry::Types['params.bool'],
15
- address: Dry::Types['nominal.hash'].public_send(
16
- type,
17
- city: Dry::Types['nominal.string'],
18
- street: Dry::Types['nominal.string']
19
- )
20
- )
21
- end
22
-
23
- private_class_method(:hash_schema)
24
-
25
- SCHEMAS =
26
- Dry::Types::Hash
27
- .public_instance_methods(false)
28
- .map { |schema_type| [schema_type, hash_schema(schema_type)] }
29
- .to_h
30
-
31
- INPUT = {
32
- email: 'jane@doe.org',
33
- age: '20',
34
- admin: '1',
35
- address: { city: 'NYC', street: 'Street 1/2' }
36
- }.freeze
37
- end
38
-
39
- require 'benchmark/ips'
40
-
41
- Benchmark.ips do |x|
42
- SchemaBench::SCHEMAS.each do |schema_type, schema|
43
- x.report("#{schema_type}#call") do
44
- schema.call(SchemaBench::INPUT)
45
- end
46
- end
47
-
48
- SchemaBench::SCHEMAS.each do |schema_type, schema|
49
- x.report("#{schema_type}#try") do
50
- schema.try(SchemaBench::INPUT)
51
- end
52
- end
53
-
54
- x.compare!
55
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'setup'
4
-
5
- schema = Dry::Types['params.hash'].schema(
6
- email?: 'string',
7
- age?: 'params.integer'
8
- ).lax
9
-
10
- params = { email: 'jane@doe.org', age: '19' }
11
-
12
- Benchmark.ips do |x|
13
- x.report("valid input") { schema.(params) }
14
- x.compare!
15
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'setup'
4
-
5
- INVALID_INPUT = {
6
- name: :John,
7
- age: '20',
8
- email: nil
9
- }.freeze
10
-
11
- profile do
12
- 10_000.times do
13
- PersonSchema.(INVALID_INPUT)
14
- end
15
- end