dry-struct 0.3.0 → 0.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -5
- data/CHANGELOG.md +12 -2
- data/CONTRIBUTING.md +29 -0
- data/lib/dry/struct.rb +27 -0
- data/lib/dry/struct/class_interface.rb +26 -18
- data/lib/dry/struct/constructor.rb +28 -0
- data/lib/dry/struct/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 223d319c97aced13759a063d7d19d0afc7eeff56
|
4
|
+
data.tar.gz: '09b4aecf6acb6981e71e9e98a8f3049e9e5b4ff6'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52ef521bf80136eb363dc53adb98e21f1b379fa7697edadf9e4f882e32a2334948beb316f997fa5c11fabb871674b40f86fd373b254253bb879e6a0db516e63e
|
7
|
+
data.tar.gz: f2fac5903962ee469f009a566fabd77fc8c0e9470222ef9a78fd63db6916a1b0e36958e34c0c083e5e146e11398dfdf567c7dfbefd18f82bfd03338cba8822bd
|
data/.travis.yml
CHANGED
@@ -11,15 +11,11 @@ rvm:
|
|
11
11
|
- 2.2.7
|
12
12
|
- 2.3.3
|
13
13
|
- 2.4.1
|
14
|
-
-
|
15
|
-
- jruby-9.1.8.0
|
14
|
+
- jruby-9.1.10.0
|
16
15
|
env:
|
17
16
|
global:
|
18
17
|
- COVERAGE=true
|
19
18
|
- JRUBY_OPTS='--dev -J-Xmx1024M'
|
20
|
-
matrix:
|
21
|
-
allow_failures:
|
22
|
-
- rvm: rbx-3
|
23
19
|
notifications:
|
24
20
|
email: false
|
25
21
|
webhooks:
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
|
1
|
+
# v0.3.1 to-be-released
|
2
|
+
|
3
|
+
## Added
|
4
|
+
|
5
|
+
* `Struct.constructor` that makes dry-struct more aligned with dry-types; now you can have a struct with a custom constructor that will be called _before_ calling the `new` method (v-kolesnikov)
|
6
|
+
* `Struct.attribute?` and `Struct.attribute_names` for introspecting struct attributes (flash-gordon)
|
7
|
+
* `Struct#__new__` is a safe-to-use-in-gems alias for `Struct#new` (flash-gordon)
|
8
|
+
|
9
|
+
[Compare v0.3.0...master](https://github.com/dry-rb/dry-struct/compare/v0.3.0...master)
|
10
|
+
|
11
|
+
# v0.3.0 2017-05-05
|
2
12
|
|
3
13
|
## Added
|
4
14
|
|
@@ -13,7 +23,7 @@ master
|
|
13
23
|
|
14
24
|
* `.new` without arguments doesn't use nil as an input for non-default types anymore (flash-gordon)
|
15
25
|
|
16
|
-
[Compare v0.2.1...
|
26
|
+
[Compare v0.2.1...v0.3.0](https://github.com/dry-rb/dry-struct/compare/v0.2.1...v0.3.0)
|
17
27
|
|
18
28
|
# v0.2.1 2017-02-27
|
19
29
|
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,29 @@
|
|
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 [discuss.dry-rb.org](https://discuss.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 [discuss.dry-rb.org](http://discuss.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 [discuss.dry-rb.org](https://discuss.dry-rb.org).
|
data/lib/dry/struct.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'dry/core/constants'
|
1
2
|
require 'dry-types'
|
2
3
|
|
3
4
|
require 'dry/struct/version'
|
@@ -56,6 +57,7 @@ module Dry
|
|
56
57
|
# refactoring.title #=> 'Refactoring'
|
57
58
|
# refactoring.subtitle #=> 'Improving the Design of Existing Code'
|
58
59
|
class Struct
|
60
|
+
include Dry::Core::Constants
|
59
61
|
extend ClassInterface
|
60
62
|
|
61
63
|
# {Dry::Types::Hash} subclass with specific behaviour defined for
|
@@ -64,6 +66,10 @@ module Dry
|
|
64
66
|
defines :input
|
65
67
|
input Types['coercible.hash']
|
66
68
|
|
69
|
+
# @return [Hash{Symbol => Dry::Types::Definition, Dry::Struct}]
|
70
|
+
defines :schema
|
71
|
+
schema EMPTY_HASH
|
72
|
+
|
67
73
|
# Sets or retrieves {#constructor} type as a symbol
|
68
74
|
#
|
69
75
|
# @note All examples below assume that you have defined {Struct} with
|
@@ -227,9 +233,30 @@ module Dry
|
|
227
233
|
end
|
228
234
|
alias_method :to_h, :to_hash
|
229
235
|
|
236
|
+
# Create a copy of {Dry::Struct} with overriden attributes
|
237
|
+
#
|
238
|
+
# @param [Hash{Symbol => Object}] changeset
|
239
|
+
#
|
240
|
+
# @return [Struct]
|
241
|
+
#
|
242
|
+
# @example
|
243
|
+
# class Book < Dry::Struct
|
244
|
+
# attribute :title, Types::Strict::String
|
245
|
+
# attribute :subtitle, Types::Strict::String.optional
|
246
|
+
# end
|
247
|
+
#
|
248
|
+
# rom_n_roda = Book.new(
|
249
|
+
# title: 'Web Development with ROM and Roda',
|
250
|
+
# subtitle: '2nd edition'
|
251
|
+
# )
|
252
|
+
# #=> #<Book title="Web Development with ROM and Roda" subtitle="2nd edition">
|
253
|
+
#
|
254
|
+
# rom_n_roda.new(subtitle: '3nd edition')
|
255
|
+
# #=> #<Book title="Web Development with ROM and Roda" subtitle="3nd edition">
|
230
256
|
def new(changeset)
|
231
257
|
self.class[to_hash.merge(changeset)]
|
232
258
|
end
|
259
|
+
alias_method :__new__, :new
|
233
260
|
end
|
234
261
|
end
|
235
262
|
|
@@ -2,6 +2,7 @@ require 'dry/core/class_attributes'
|
|
2
2
|
require 'dry/equalizer'
|
3
3
|
|
4
4
|
require 'dry/struct/errors'
|
5
|
+
require 'dry/struct/constructor'
|
5
6
|
|
6
7
|
module Dry
|
7
8
|
class Struct
|
@@ -11,20 +12,12 @@ module Dry
|
|
11
12
|
|
12
13
|
include Dry::Types::Builder
|
13
14
|
|
14
|
-
# @param [Module] base
|
15
|
-
def self.extended(base)
|
16
|
-
base.instance_variable_set(:@schema, EMPTY_HASH)
|
17
|
-
end
|
18
|
-
|
19
15
|
# @param [Class] klass
|
20
16
|
def inherited(klass)
|
21
17
|
super
|
22
18
|
|
23
|
-
klass.instance_variable_set(:@schema, EMPTY_HASH)
|
24
19
|
klass.equalizer Equalizer.new(*schema.keys)
|
25
20
|
klass.send(:include, klass.equalizer)
|
26
|
-
|
27
|
-
klass.attributes(EMPTY_HASH) unless equal?(Struct)
|
28
21
|
end
|
29
22
|
|
30
23
|
# Adds an attribute for this {Struct} with given `name` and `type`
|
@@ -69,9 +62,7 @@ module Dry
|
|
69
62
|
def attributes(new_schema)
|
70
63
|
check_schema_duplication(new_schema)
|
71
64
|
|
72
|
-
|
73
|
-
|
74
|
-
@schema = prev_schema.merge(new_schema)
|
65
|
+
schema schema.merge(new_schema)
|
75
66
|
input Types['coercible.hash'].public_send(constructor_type, schema)
|
76
67
|
|
77
68
|
attr_reader(*new_schema.keys)
|
@@ -90,12 +81,6 @@ module Dry
|
|
90
81
|
end
|
91
82
|
private :check_schema_duplication
|
92
83
|
|
93
|
-
# @return [Hash{Symbol => Dry::Types::Definition, Dry::Struct}]
|
94
|
-
def schema
|
95
|
-
super_schema = superclass.respond_to?(:schema) ? superclass.schema : EMPTY_HASH
|
96
|
-
super_schema.merge(@schema)
|
97
|
-
end
|
98
|
-
|
99
84
|
# @param [Hash{Symbol => Object},Dry::Struct] attributes
|
100
85
|
# @raise [Struct::Error] if the given attributes don't conform {#schema}
|
101
86
|
# with given {#constructor_type}
|
@@ -110,7 +95,7 @@ module Dry
|
|
110
95
|
end
|
111
96
|
|
112
97
|
# Calls type constructor. The behavior is identical to `.new` but returns
|
113
|
-
#
|
98
|
+
# the input back if it's a subclass of the struct.
|
114
99
|
#
|
115
100
|
# @param [Hash{Symbol => Object},Dry::Struct] attributes
|
116
101
|
# @return [Dry::Struct]
|
@@ -120,6 +105,14 @@ module Dry
|
|
120
105
|
end
|
121
106
|
alias_method :[], :call
|
122
107
|
|
108
|
+
# @param [#call,nil] constructor
|
109
|
+
# @param [Hash] options
|
110
|
+
# @param [#call,nil] block
|
111
|
+
# @return [Dry::Struct::Constructor]
|
112
|
+
def constructor(constructor = nil, **_options, &block)
|
113
|
+
Struct::Constructor.new(self, fn: constructor || block)
|
114
|
+
end
|
115
|
+
|
123
116
|
# Retrieves default attributes from defined {.schema}.
|
124
117
|
# Used in a {Struct} constructor if no attributes provided to {.new}
|
125
118
|
#
|
@@ -194,6 +187,21 @@ module Dry
|
|
194
187
|
def optional?
|
195
188
|
false
|
196
189
|
end
|
190
|
+
|
191
|
+
# Checks if this {Struct} has the given attribute
|
192
|
+
#
|
193
|
+
# @param [Symbol] key Attribute name
|
194
|
+
# @return [Boolean]
|
195
|
+
def attribute?(key)
|
196
|
+
schema.key?(key)
|
197
|
+
end
|
198
|
+
|
199
|
+
# Gets the list of attribute names
|
200
|
+
#
|
201
|
+
# @return [Array<Symbol>]
|
202
|
+
def attribute_names
|
203
|
+
schema.keys
|
204
|
+
end
|
197
205
|
end
|
198
206
|
end
|
199
207
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Dry
|
2
|
+
class Struct
|
3
|
+
class Constructor
|
4
|
+
include Dry::Equalizer(:type)
|
5
|
+
|
6
|
+
# @return [#call]
|
7
|
+
attr_reader :fn
|
8
|
+
|
9
|
+
# @return [#call]
|
10
|
+
attr_reader :type
|
11
|
+
|
12
|
+
# @param [Struct] type
|
13
|
+
# @param [Hash] options
|
14
|
+
# @param [#call, nil] block
|
15
|
+
def initialize(type, options = {}, &block)
|
16
|
+
@type = type
|
17
|
+
@fn = options.fetch(:fn, block)
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param [Object] input
|
21
|
+
# @return [Object]
|
22
|
+
def call(input)
|
23
|
+
type[fn[input]]
|
24
|
+
end
|
25
|
+
alias_method :[], :call
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/dry/struct/version.rb
CHANGED
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.3.
|
4
|
+
version: 0.3.1
|
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-
|
11
|
+
date: 2017-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-equalizer
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- ".travis.yml"
|
155
155
|
- ".yardopts"
|
156
156
|
- CHANGELOG.md
|
157
|
+
- CONTRIBUTING.md
|
157
158
|
- Gemfile
|
158
159
|
- LICENSE
|
159
160
|
- README.md
|
@@ -166,6 +167,7 @@ files:
|
|
166
167
|
- lib/dry-struct.rb
|
167
168
|
- lib/dry/struct.rb
|
168
169
|
- lib/dry/struct/class_interface.rb
|
170
|
+
- lib/dry/struct/constructor.rb
|
169
171
|
- lib/dry/struct/errors.rb
|
170
172
|
- lib/dry/struct/hashify.rb
|
171
173
|
- lib/dry/struct/value.rb
|