dry-struct 0.5.1 → 0.6.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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -5
- data/CHANGELOG.md +24 -0
- data/dry-struct.gemspec +2 -0
- data/lib/dry/struct.rb +2 -2
- data/lib/dry/struct/class_interface.rb +54 -10
- data/lib/dry/struct/hashify.rb +5 -1
- data/lib/dry/struct/version.rb +1 -1
- data/log/.gitkeep +0 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33cd05dd51a3310d7ede685ae1ce8631a0955d7563afca7633a7625b9b34dd17
|
4
|
+
data.tar.gz: 182c58865ccb3e74595aa22d6c9730ce8ca0e078d1b6ecb5e8b69e026ce6409d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f5e4f6609b93e80ae775ab556812cc872883eaf423a74ae2e5191d2bef6907152653fa7fe441bb9aab945b7cf9f4ec62dd4d359ffcb88f4e976b8b53fb42ac8
|
7
|
+
data.tar.gz: 4b76e94533ff98f1c1d9d427967a5c19af3d58484a5e785c7eac15d50211d70e4718d35572bb6e89fbafeb9b9f092a73f68e517244676f28d4c7e4854f1a055a
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -9,11 +9,11 @@ before_install:
|
|
9
9
|
after_success:
|
10
10
|
- '[ -d coverage ] && bundle exec codeclimate-test-reporter'
|
11
11
|
rvm:
|
12
|
-
- 2.2.
|
13
|
-
- 2.3.
|
14
|
-
- 2.4.
|
15
|
-
- 2.5.
|
16
|
-
- jruby-9.
|
12
|
+
- 2.2.10
|
13
|
+
- 2.3.7
|
14
|
+
- 2.4.4
|
15
|
+
- 2.5.1
|
16
|
+
- jruby-9.2.0.0
|
17
17
|
env:
|
18
18
|
global:
|
19
19
|
- COVERAGE=true
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
# v0.6.0 2018-10-24
|
2
|
+
|
3
|
+
## BREAKING CHANGES
|
4
|
+
|
5
|
+
* `Struct.attribute?` in the old sense is deprecated, use `has_attribute?` as a replacement
|
6
|
+
|
7
|
+
## Added
|
8
|
+
|
9
|
+
* `Struct.attribute?` is an easy way to define omittable attributes (flash-gordon):
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
class User < Dry::Struct
|
13
|
+
attribute :name, Types::Strict::String
|
14
|
+
attribute? :email, Types::Strict::String
|
15
|
+
end
|
16
|
+
# User.new(name: 'John') # => #<User name="John">
|
17
|
+
```
|
18
|
+
|
19
|
+
## Fixed
|
20
|
+
|
21
|
+
* `Struct#to_h` recursively converts hash values to hashes, this was done to be consistent with current behavior for arrays (oeoeaio + ZimbiX)
|
22
|
+
|
23
|
+
[Compare v0.5.1...v0.6.0](https://github.com/dry-rb/dry-struct/compare/v0.5.1...v0.6.0)
|
24
|
+
|
1
25
|
# v0.5.1 2018-08-11
|
2
26
|
|
3
27
|
## Fixed
|
data/dry-struct.gemspec
CHANGED
@@ -17,6 +17,8 @@ Gem::Specification.new do |spec|
|
|
17
17
|
# delete this section to allow pushing this gem to any host.
|
18
18
|
if spec.respond_to?(:metadata)
|
19
19
|
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
20
|
+
spec.metadata['changelog_uri'] = 'https://github.com/dry-rb/dry-struct/blob/master/CHANGELOG.md'
|
21
|
+
spec.metadata['source_code_uri'] = 'https://github.com/dry-rb/dry-struct'
|
20
22
|
else
|
21
23
|
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
22
24
|
end
|
data/lib/dry/struct.rb
CHANGED
@@ -167,8 +167,8 @@ module Dry
|
|
167
167
|
# )
|
168
168
|
# #=> #<Book title="Web Development with ROM and Roda" subtitle="2nd edition">
|
169
169
|
#
|
170
|
-
# rom_n_roda.new(subtitle: '
|
171
|
-
# #=> #<Book title="Web Development with ROM and Roda" subtitle="
|
170
|
+
# rom_n_roda.new(subtitle: '3rd edition')
|
171
|
+
# #=> #<Book title="Web Development with ROM and Roda" subtitle="3rd edition">
|
172
172
|
def new(changeset)
|
173
173
|
self.class[__attributes__.merge(changeset)]
|
174
174
|
end
|
@@ -100,17 +100,37 @@ module Dry
|
|
100
100
|
# ruby.celebrities[1].name #=> 'Aaron Patterson'
|
101
101
|
# ruby.celebrities[1].pseudonym #=> 'tenderlove'
|
102
102
|
def attribute(name, type = nil, &block)
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
103
|
+
attributes(name => build_type(name, type, &block))
|
104
|
+
end
|
105
|
+
|
106
|
+
# Adds an omittable (key is not required on initialization) attribute for this {Struct}
|
107
|
+
#
|
108
|
+
# @example
|
109
|
+
# class User < Dry::Struct
|
110
|
+
# attribute :name, Types::Strict::String
|
111
|
+
# attribute? :email, Types::Strict::String
|
112
|
+
# end
|
113
|
+
#
|
114
|
+
# User.new(name: 'John') # => #<User name="John">
|
115
|
+
#
|
116
|
+
# @param [Symbol] name name of the defined attribute
|
117
|
+
# @param [Dry::Types::Definition, nil] type or superclass of nested type
|
118
|
+
# @return [Dry::Struct]
|
119
|
+
#
|
120
|
+
def attribute?(*args, &block)
|
121
|
+
if args.size == 1 && block.nil?
|
122
|
+
Dry::Core::Deprecations.warn(
|
123
|
+
'Dry::Struct.attribute? is deprecated for checking attribute presence, '\
|
124
|
+
'use has_attribute? instead',
|
125
|
+
tag: :'dry-struct'
|
110
126
|
)
|
111
|
-
end
|
112
127
|
|
113
|
-
|
128
|
+
has_attribute?(args[0])
|
129
|
+
else
|
130
|
+
name, type = args
|
131
|
+
|
132
|
+
attribute(name, build_type(name, type, &block).meta(omittable: true))
|
133
|
+
end
|
114
134
|
end
|
115
135
|
|
116
136
|
# @param [Hash{Symbol => Dry::Types::Definition}] new_schema
|
@@ -297,7 +317,7 @@ module Dry
|
|
297
317
|
#
|
298
318
|
# @param [Symbol] key Attribute name
|
299
319
|
# @return [Boolean]
|
300
|
-
def
|
320
|
+
def has_attribute?(key)
|
301
321
|
schema.key?(key)
|
302
322
|
end
|
303
323
|
|
@@ -361,6 +381,30 @@ module Dry
|
|
361
381
|
type.is_a?(Class) && type <= Struct
|
362
382
|
end
|
363
383
|
private :struct?
|
384
|
+
|
385
|
+
# Constructs a type
|
386
|
+
#
|
387
|
+
# @return [Dry::Types::Type, Dry::Struct]
|
388
|
+
def build_type(name, type, &block)
|
389
|
+
type_object =
|
390
|
+
if type.is_a?(String)
|
391
|
+
Dry::Types[type]
|
392
|
+
elsif block.nil? && type.nil?
|
393
|
+
raise(
|
394
|
+
ArgumentError,
|
395
|
+
'you must supply a type or a block to `Dry::Struct.attribute`'
|
396
|
+
)
|
397
|
+
else
|
398
|
+
type
|
399
|
+
end
|
400
|
+
|
401
|
+
if block
|
402
|
+
struct_builder.(name, type_object, &block)
|
403
|
+
else
|
404
|
+
type_object
|
405
|
+
end
|
406
|
+
end
|
407
|
+
private :build_type
|
364
408
|
end
|
365
409
|
end
|
366
410
|
end
|
data/lib/dry/struct/hashify.rb
CHANGED
@@ -7,7 +7,11 @@ module Dry
|
|
7
7
|
# @return [Hash, Array]
|
8
8
|
def self.[](value)
|
9
9
|
if value.respond_to?(:to_hash)
|
10
|
-
|
10
|
+
if RUBY_VERSION >= '2.4'
|
11
|
+
value.to_hash.transform_values { |v| self[v] }
|
12
|
+
else
|
13
|
+
value.to_hash.each_with_object({}) { |(k, v), h| h[k] = self[v] }
|
14
|
+
end
|
11
15
|
elsif value.respond_to?(:to_ary)
|
12
16
|
value.to_ary.map { |item| self[item] }
|
13
17
|
else
|
data/lib/dry/struct/version.rb
CHANGED
data/log/.gitkeep
ADDED
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.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: 2018-
|
11
|
+
date: 2018-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-equalizer
|
@@ -162,11 +162,14 @@ files:
|
|
162
162
|
- lib/dry/struct/sum.rb
|
163
163
|
- lib/dry/struct/value.rb
|
164
164
|
- lib/dry/struct/version.rb
|
165
|
+
- log/.gitkeep
|
165
166
|
homepage: https://github.com/dry-rb/dry-struct
|
166
167
|
licenses:
|
167
168
|
- MIT
|
168
169
|
metadata:
|
169
170
|
allowed_push_host: https://rubygems.org
|
171
|
+
changelog_uri: https://github.com/dry-rb/dry-struct/blob/master/CHANGELOG.md
|
172
|
+
source_code_uri: https://github.com/dry-rb/dry-struct
|
170
173
|
post_install_message:
|
171
174
|
rdoc_options: []
|
172
175
|
require_paths:
|