dry-initializer 0.11.0 → 2.5.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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +8 -0
  3. data/.gitignore +1 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +14 -62
  6. data/.travis.yml +15 -11
  7. data/CHANGELOG.md +538 -158
  8. data/Gemfile +2 -2
  9. data/LICENSE.txt +1 -1
  10. data/README.md +6 -6
  11. data/Rakefile +2 -41
  12. data/benchmarks/{several_defaults.rb → compare_several_defaults.rb} +4 -4
  13. data/benchmarks/{without_options.rb → plain_options.rb} +21 -10
  14. data/benchmarks/{params.rb → plain_params.rb} +20 -9
  15. data/benchmarks/{with_types.rb → with_coercion.rb} +23 -16
  16. data/benchmarks/with_defaults.rb +19 -8
  17. data/benchmarks/{with_types_and_defaults.rb → with_defaults_and_coercion.rb} +21 -12
  18. data/dry-initializer.gemspec +4 -4
  19. data/lib/dry/initializer/builders/attribute.rb +81 -0
  20. data/lib/dry/initializer/builders/initializer.rb +61 -0
  21. data/lib/dry/initializer/builders/reader.rb +50 -0
  22. data/lib/dry/initializer/builders/signature.rb +32 -0
  23. data/lib/dry/initializer/builders.rb +7 -0
  24. data/lib/dry/initializer/config.rb +172 -0
  25. data/lib/dry/initializer/definition.rb +116 -0
  26. data/lib/dry/initializer/dispatchers.rb +44 -0
  27. data/lib/dry/initializer/dsl.rb +43 -0
  28. data/lib/dry/initializer/mixin/local.rb +19 -0
  29. data/lib/dry/initializer/mixin/root.rb +10 -0
  30. data/lib/dry/initializer/mixin.rb +8 -70
  31. data/lib/dry/initializer.rb +49 -12
  32. data/lib/tasks/benchmark.rake +41 -0
  33. data/lib/tasks/profile.rake +78 -0
  34. data/spec/attributes_spec.rb +38 -0
  35. data/spec/coercion_of_nil_spec.rb +25 -0
  36. data/spec/custom_dispatchers_spec.rb +35 -0
  37. data/spec/custom_initializer_spec.rb +1 -1
  38. data/spec/default_values_spec.rb +8 -8
  39. data/spec/definition_spec.rb +107 -0
  40. data/spec/invalid_default_spec.rb +2 -2
  41. data/spec/missed_default_spec.rb +3 -3
  42. data/spec/optional_spec.rb +35 -8
  43. data/spec/options_tolerance_spec.rb +1 -1
  44. data/spec/public_attributes_utility_spec.rb +22 -0
  45. data/spec/reader_spec.rb +11 -11
  46. data/spec/repetitive_definitions_spec.rb +41 -21
  47. data/spec/several_assignments_spec.rb +41 -0
  48. data/spec/spec_helper.rb +7 -0
  49. data/spec/subclassing_spec.rb +7 -3
  50. data/spec/type_argument_spec.rb +1 -1
  51. data/spec/type_constraint_spec.rb +38 -7
  52. data/spec/value_coercion_via_dry_types_spec.rb +12 -4
  53. metadata +37 -40
  54. data/benchmarks/options.rb +0 -54
  55. data/benchmarks/params_vs_options.rb +0 -35
  56. data/lib/dry/initializer/builder.rb +0 -100
  57. data/lib/dry/initializer/errors/default_value_error.rb +0 -6
  58. data/lib/dry/initializer/errors/order_error.rb +0 -7
  59. data/lib/dry/initializer/errors/plugin_error.rb +0 -6
  60. data/lib/dry/initializer/errors/redefinition_error.rb +0 -5
  61. data/lib/dry/initializer/errors/type_constraint_error.rb +0 -5
  62. data/lib/dry/initializer/errors.rb +0 -10
  63. data/lib/dry/initializer/plugins/base.rb +0 -47
  64. data/lib/dry/initializer/plugins/default_proc.rb +0 -28
  65. data/lib/dry/initializer/plugins/signature.rb +0 -28
  66. data/lib/dry/initializer/plugins/type_constraint.rb +0 -21
  67. data/lib/dry/initializer/plugins/variable_setter.rb +0 -30
  68. data/lib/dry/initializer/plugins.rb +0 -10
  69. data/lib/dry/initializer/signature.rb +0 -61
  70. data/spec/base_spec.rb +0 -21
  71. data/spec/container_spec.rb +0 -45
  72. data/spec/default_nil_spec.rb +0 -17
  73. data/spec/plugin_registry_spec.rb +0 -45
  74. data/spec/renaming_options_spec.rb +0 -20
data/CHANGELOG.md CHANGED
@@ -1,12 +1,434 @@
1
- ## v0.11.0 2017-01-02
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/)
6
+ and this project adheres to [Semantic Versioning](http://semver.org/).
7
+
8
+ ## [2.4.0] [2018-02-01]
2
9
 
3
10
  ### Added
11
+ - Dispatchers for adding syntax sugar to `param` and `options` (nepalez)
4
12
 
5
- * Support of reloading `#initializer` with `super` (@nepalez)
13
+ ```ruby
14
+ # Converts `integer: true` to `type: proc(&:to_i)`
15
+ dispatcher = ->(op) { op[:integer] ? op.merge(type: proc(&:to_i)) : op }
16
+ # Register a dispatcher
17
+ Dry::Initializer::Dispatchers << dispatcher
18
+ # Use syntax sugar
19
+ class User
20
+ param :id, integer: true # same as param :id, proc(&:to_i)
21
+ end
22
+ ```
6
23
 
7
- ### Internal
24
+ ## [2.3.0] [2017-09-19]
8
25
 
9
- * Refactor the way [#initializer] method is (re)defined (@nepalez)
26
+ ### Added
27
+ - Type coercer can take second argument for the initialized instance (nepalez)
28
+ This allows to wrap assigned value to the object that refers back
29
+ to the initializer instance. More verbose example:
30
+
31
+ ```ruby
32
+ class Location < String
33
+ attr_reader :parameter # refers back to its parameter
34
+
35
+ def initialize(name, parameter)
36
+ super(name)
37
+ @parameter = parameter
38
+ end
39
+ end
40
+
41
+ class Parameter
42
+ extend Dry::Initializer
43
+ param :name
44
+ param :location, ->(value, param) { Location.new(value, param) }
45
+ end
46
+
47
+ offset = Parameter.new "offset", location: "query"
48
+ offset.name # => "offset"
49
+ offset.location # => "query"
50
+ offset.location.parameter == offset # true
51
+ ```
52
+
53
+ ## [2.2.0] [2017-09-13]
54
+
55
+ ### Added
56
+ - Option `:desc` for option/param to add a description (nepalez)
57
+
58
+ - Methods `Definition#inch` and `Config#inch` to inspect definitions (nepalez)
59
+
60
+ ```ruby
61
+ class User
62
+ extend Dry::Initializer
63
+ option :name, proc(&:to_s), optional: true, desc: "User name"
64
+ option :email, optional: true, desc: "user email"
65
+ end
66
+
67
+ User.dry_initializer.inch
68
+ # @!method initialize(*, **options)
69
+ # Initializes an instance of User
70
+ # @option [Object] :name (optional) User name
71
+ # @option [Object] :email (optional) User email
72
+ # @return [User]
73
+ ```
74
+
75
+ ## [2.1.0] [2017-09-11]
76
+
77
+ ### Added
78
+ - Method `#options` to param/option definition (nepalez)
79
+
80
+ ```ruby
81
+ class User
82
+ extend Dry::Initializer
83
+ option :name, proc(&:to_s), optional: true
84
+ option :email, optional: true
85
+ end
86
+
87
+ User.dry_initializer.options.map do |option|
88
+ [option.source, option.options]
89
+ end
90
+ # => [
91
+ # [:name, { type: proc(&:to_s), as: :name, optional: true }],
92
+ # [:email, { as: :email, optional: true }]
93
+ # ]
94
+ ```
95
+
96
+ This method can be helpful for replicating params/options
97
+ in another class without inheritance.
98
+
99
+ ## [2.0.0] [2017-08-28]
100
+
101
+ The gem has been rewritten under the hood keeping its documented
102
+ interface about the same (see "Deleted" section below for the only
103
+ backward-incompatible change).
104
+
105
+ The main achievement of this version is fixing an edge case where
106
+ change in params/options of superclass wasn't reflected in its
107
+ previously declared subclasses.
108
+
109
+ Thanks to @solnic for the idea of class-level container,
110
+ and to @gzigzigzeo for persuading me to do this refactoring.
111
+
112
+ ### Deleted
113
+ - Undocumented variable `@__option__` which was the main reason for refactoring
114
+ (gzigzigzeo, nepalez).
115
+
116
+ ### Added
117
+ - Class method `.dry_initializer` -- a container for `.params` and `.options`
118
+ `.definitions` along with the `.null` setting (either `nil` or `UNDEFINED`)
119
+ used for unassigned values (nepalez)
120
+
121
+ - `.dry_initializer.attributes` method takes an instance of the same class
122
+ and returns the hash of assigned options. This provide the same
123
+ functionality as previously used instance variable `@__options__` (nepalez)
124
+
125
+ ```ruby
126
+ object.class.dry_initializer.attributes(object)
127
+ ```
128
+
129
+ When you use "Dry::Initializer.define -> { ... }" syntax,
130
+ the class method `.dry_initializer` is not defined. To access attributes
131
+ you should use private instance method `#__dry_initializer_config__` instead:
132
+
133
+ ```ruby
134
+ object.send(:__dry_initializer_config__).attributes(object)
135
+ ```
136
+
137
+ Both methods `.dry_initializer` and `#__dry_initializer_config__` refer
138
+ to the same object.
139
+
140
+ - `.dry_initializer.public_attributes`. This method works differently:
141
+ it looks through (possibly reloaded) readers instead of variables
142
+ (gzigzigzeo, nepalez)
143
+
144
+ ```ruby
145
+ object.class.dry_initializer.public_attributes(object)
146
+ ```
147
+
148
+ You can use the same trick as above mutatis mutandis.
149
+
150
+ ### Fixed
151
+ - Definition order dependency bug (nepalez)
152
+
153
+ I've found out that if you provided a subclass and then changed params
154
+ or options of its superclass, these changes woudn't be reflected in
155
+ subclasses until you change any of it params/options as well.
156
+
157
+ Now this bug is fixed: every time you call `param` or `option` at
158
+ any class, the gem scans through all its descendants to the very bottom
159
+ of the tree, and reloads their defintitions.
160
+
161
+ Being done in load time, the rebuilt makes no effect on runtime performance.
162
+
163
+ - Possible misbehavior when you define param and option with the same name (nepalez)
164
+
165
+ Doing this will provide `option :name` only, not both:
166
+
167
+ ```ruby
168
+ param :name
169
+ option :name
170
+ ```
171
+
172
+ - Attempt to redefine param/option of superclass with option/param in
173
+ its subclass will cause an exception because it would break
174
+ Liskov substitute principle with unexpected behaviour (nepalez)
175
+
176
+ No, you can do neither these definitions, nor vice versa:
177
+
178
+ ```ruby
179
+ class Foo
180
+ extend Dry::Intitializer
181
+ param :name
182
+ end
183
+
184
+ class Bar < Foo
185
+ option :name
186
+ end
187
+ ```
188
+
189
+ - When you reloading previously defined param of superclass, the gem
190
+ will check all its descendands for whether all required positional params
191
+ goes before optional ones (nepalez)
192
+
193
+ ```ruby
194
+ class Foo
195
+ param :name
196
+ # Foo: def initializer(name)
197
+ end
198
+
199
+ class Bar
200
+ param :email
201
+ # Bar: def initializer(name, email)
202
+ end
203
+
204
+ class Foo
205
+ # This raises SyntaxError because in Bar this would cause wrong definition
206
+ # Foo: def initializer(name = nil)
207
+ # Bar: def initializer(name = nil, email)
208
+ param :name, optional: true
209
+ end
210
+ ```
211
+
212
+ ### Changed
213
+ - Under the hood I've separated param/option settings declaration (a container
214
+ with param/option settings) from code builders for initializer and readers
215
+ (nepalez)
216
+
217
+ You can check both the code for the `__initializer__`:
218
+
219
+ ```ruby
220
+ class Foo
221
+ extend Dry::Initializer
222
+ # ...
223
+ end
224
+
225
+ Foo.dry_initializer.code
226
+ ```
227
+
228
+ and readers:
229
+
230
+ ```ruby
231
+ Foo.dry_initializer.params.map(&:code)
232
+ Foo.dry_initializer.options.map(&:code)
233
+
234
+ # or
235
+
236
+ Foo.dry_initializer.definitions.values.map(&:code)
237
+ ```
238
+
239
+ You can also check settings for every param and option using methods
240
+ `dry_initializer.params`, `dry_initializer.options` (lists), or
241
+ `dry_initializer.definitions` (hash).
242
+
243
+ You can check null value via `.dry_initializer.null` which is different
244
+ for `Dry::Initializer` and `Dry::Initializer[undefined: false]` modules.
245
+
246
+ - Optimized the code for `__initializer__`-s (the method where all magics occurs)
247
+ (nepalez)
248
+
249
+ Benchmarks remained about the same:
250
+
251
+ ```shell
252
+ rake benchmark
253
+ ```
254
+
255
+ ```
256
+ Benchmark for instantiation with plain params
257
+ value_struct: 4317196.9 i/s
258
+ plain Ruby: 4129803.9 i/s - 1.05x slower
259
+ dry-initializer: 1710702.1 i/s - 2.52x slower
260
+ concord: 1372630.4 i/s - 3.15x slower
261
+ values: 601651.8 i/s - 7.18x slower
262
+ attr_extras: 535599.5 i/s - 8.06x slower
263
+ ```
264
+
265
+ ```
266
+ Benchmark for instantiation with plain options
267
+ plain Ruby: 1769174.1 i/s
268
+ dry-initializer: 636634.1 i/s - 2.78x slower
269
+ kwattr: 423296.5 i/s - 4.18x slower
270
+ anima: 399415.0 i/s - 4.43x slower
271
+ ```
272
+
273
+ ```
274
+ Benchmark for instantiation with coercion
275
+ plain Ruby: 1565501.0 i/s
276
+ fast_attributes: 569952.9 i/s - 2.75x slower
277
+ dry-initializer: 461122.1 i/s - 3.39x slower
278
+ virtus: 138074.8 i/s - 11.34x slower
279
+ ```
280
+
281
+ ```
282
+ Benchmark for instantiation with default values
283
+ plain Ruby: 3402455.4 i/s
284
+ kwattr: 586206.5 i/s - 5.80x slower
285
+ dry-initializer: 528482.2 i/s - 6.44x slower
286
+ active_attr: 298697.7 i/s - 11.39x slower
287
+ ```
288
+
289
+ ```
290
+ Benchmark for instantiation with type constraints and default values
291
+ plain Ruby: 2881696.1 i/s
292
+ dry-initializer: 470815.1 i/s - 6.12x slower
293
+ virtus: 180272.6 i/s - 15.99x slower
294
+ ```
295
+
296
+ ## [1.4.1] [2017-04-05]
297
+
298
+ ### Fixed
299
+ - Warning about redefined `#initialize` in case the method reloaded in a klass
300
+ that extends the module (nepalez, sergey-chechaev)
301
+
302
+ ### Changed
303
+ - Rename `Dry::Initializer::DSL` -> `Dry::Initializer::ClassDSL` (nepalez)
304
+ - Add `Dry::Initializer::InstanceDSL` (nepalez)
305
+
306
+ ### Deprecated
307
+ - `Dry::Initializer::Mixin`. In latest version this was an alias for
308
+ `Dry::Initializer` that kept for backward compatibility for early versions of the gem.
309
+
310
+ This story will come to the end in `v2.1.0`.
311
+
312
+ ## [1.4.0] [2017-03-08]
313
+
314
+ ### Changed (backward-incompatible)
315
+ - The `@__options__` hash now collects all assigned attributes,
316
+ collected via `#option` (as before), and `#param` (nepalez)
317
+
318
+ ## [1.3.0] [2017-03-05]
319
+
320
+ ### Added
321
+ - No-undefined configuration of the initializer (nepalez, flash-gordon)
322
+
323
+ You can either extend or include module `Dry::Initializer` with additional option
324
+ `[undefined: false]`. This time `nil` will be assigned instead of
325
+ `Dry::Initializer::UNDEFINED`. Readers becomes faster because there is no need
326
+ to chech whether a variable was defined or not. At the same time the initializer
327
+ doesn't distinct cases when a variable was set to `nil` explicitly, and when it wasn's set at all:
328
+
329
+ class Foo # old behavior
330
+ extend Dry::Initializer
331
+ param :qux, optional: true
332
+ end
333
+
334
+ class Bar # new behavior
335
+ extend Dry::Initializer[undefined: false]
336
+ param :qux, optional: true
337
+ end
338
+
339
+ Foo.new.instance_variable_get(:@qux) # => Dry::Initializer::UNDEFINED
340
+ Bar.new.instance_variable_get(:@qux) # => nil
341
+
342
+ ### Changed
343
+ - Fixed method definitions for performance at the load time (nepalez, flash-gordon)
344
+
345
+ ## [1.2.0] [2017-03-05]
346
+
347
+ ### Fixed
348
+ - The `@__options__` variable collects renamed options after default values and coercions were applied (nepalez)
349
+
350
+ ## [1.1.3] [2017-03-01]
351
+
352
+ ### Added
353
+ - Support for lambdas as default values (nepalez, gzigzigzeo)
354
+
355
+ ## [1.1.2] [2017-02-06]
356
+
357
+ ### Changed
358
+ - Remove previously defined methods before redefining them (flash-gordon)
359
+
360
+ ## [1.1.1] [2017-02-04]
361
+
362
+ ### Fixed
363
+ - `@__options__` collects defined options only (nepalez)
364
+
365
+ ## [1.1.0] [2017-01-28]
366
+
367
+ ### Added
368
+ - enhancement via `Dry::Initializer::Attribute.dispatchers` registry (nepalez)
369
+
370
+ # Register dispatcher for `:string` option
371
+ Dry::Initializer::Attribute.dispatchers << ->(string: nil, **op) do
372
+ string ? op.merge(type: proc(&:to_s)) : op
373
+ end
374
+
375
+ # Now you can use the `:string` key for `param` and `option`
376
+ class User
377
+ extend Dry::Initializer
378
+ param :name, string: true
379
+ end
380
+
381
+ User.new(:Andy).name # => "Andy"
382
+
383
+ ### Changed
384
+ - optimize assignments for performance (nepalez)
385
+
386
+ ## [1.0.0] [2017-01-22]
387
+
388
+ In this version the code has been rewritten for simplicity
389
+
390
+ ### Changed
391
+ - [BREAKING] when `param` or `option` was not defined, the corresponding **variable** is set to `Dry::Initializer::UNDEFINED`, but the **reader** (when defined) will return `nil` (nepalez)
392
+
393
+ - `Dry::Initializer` and `Dry::Initializer::Mixin` became aliases (nepalez)
394
+
395
+ ### Added
396
+ - support for reloading `param` and `option` definitions (nepalez)
397
+
398
+ class User
399
+ extend Dry::Initializer
400
+ param :name
401
+ param :phone, optional: true
402
+ end
403
+
404
+ User.new # => Boom!
405
+
406
+ class Admin < User
407
+ param :name, default: proc { 'Merlin' }
408
+ end
409
+
410
+ # order of the param not changed
411
+ Admin.new.name # => "Merlin"
412
+
413
+ - support for assignment of attributes via several options (nepalez)
414
+
415
+ class User
416
+ extend Dry::Initializer
417
+ option :phone
418
+ option :number, as: :phone
419
+ end
420
+
421
+ # Both ways provide the same result
422
+ User.new(phone: '1234567890').phone # => '1234567890'
423
+ User.new(number: '1234567890').phone # => '1234567890'
424
+
425
+ ## [0.11.0] [2017-01-02]
426
+
427
+ ### Added
428
+ - Support of reloading `#initializer` with `super` (nepalez)
429
+
430
+ ### Internal
431
+ - Refactor the way [#initializer] method is (re)defined (nepalez)
10
432
 
11
433
  When you extend class with `Dry::Initializer::Mixin`, the initializer is
12
434
  defined not "inside" the class per se, but inside the included module. The
@@ -31,105 +453,74 @@
31
453
 
32
454
  See specification `spec/custom_initializer_spec.rb` to see how this works.
33
455
 
34
- [Compare v0.10.2...v0.11.0](https://github.com/dry-rb/dry-initializer/compare/v0.10.2...v0.11.0)
35
-
36
- ## v0.10.2 2016-12-31
456
+ ## [0.10.2] [2016-12-31]
37
457
 
38
458
  ### Added
39
-
40
- * Support of Ruby 2.4 (@flas-gordon)
459
+ - Support of Ruby 2.4 (flas-gordon)
41
460
 
42
461
  ### Internal
462
+ - Code clearance for ROM integration (flash-gordon)
43
463
 
44
- * Code clearance for ROM integration (@flash-gordon)
45
-
46
- [Compare v0.10.1...v0.10.2](https://github.com/dry-rb/dry-initializer/compare/v0.10.1...v0.10.2)
47
-
48
- ## v0.10.1 2016-12-27
464
+ ## [0.10.1] [2016-12-27]
49
465
 
50
466
  ### Fixed
467
+ - Wrong arity when there were no options and the last param had a default (nolith)
51
468
 
52
- * Wrong arity when there were no options and the last param had a default (@nolith)
53
-
54
- [Compare v0.10.0...v0.10.1](https://github.com/dry-rb/dry-initializer/compare/v0.10.0...v0.10.1)
55
-
56
- ## v0.10.0 2016-11-20
469
+ ## [0.10.0] [2016-11-20]
57
470
 
58
471
  ### Deleted (BREAKING CHANGE!)
472
+ - Deprecated method DSL#using (nepalez)
59
473
 
60
- * Deprecated method DSL#using (@nepalez)
61
-
62
- [Compare v0.9.3...v0.10.0](https://github.com/dry-rb/dry-initializer/compare/v0.9.3...v0.10.0)
63
-
64
- ## v0.9.3 2016-11-20
474
+ ## [0.9.3] [2016-11-20]
65
475
 
66
476
  ### Deprecated
67
-
68
- * After discussion in [PR #17](https://github.com/dry-rb/dry-initializer/pull/17)
477
+ - After discussion in [PR #17]: https://github.com/dry-rb/dry-initializer/pull/17)
69
478
  (many thanks to @sahal2080 and @hrom512 for starting that issue and PR),
70
- the method `using` is deprecated and will be removed from v0.10.0 (@nepalez)
479
+ the method `using` is deprecated and will be removed from v0.10.0 (nepalez)
71
480
 
72
481
  ### Fixed
73
-
74
- * Support of weird option names (@nepalez)
482
+ - Support of weird option names (nepalez)
75
483
 
76
484
  ```ruby
77
485
  option :"First name", as: :first_name
78
486
  ```
79
487
 
80
- [Compare v0.9.2...v0.9.3](https://github.com/dry-rb/dry-initializer/compare/v0.9.2...v0.9.3)
81
-
82
- ## v0.9.2 2016-11-10
488
+ ## [0.9.2] [2016-11-10]
83
489
 
84
490
  ### Fixed
491
+ - Validation of attributes (params and options) (nepalez)
85
492
 
86
- * Validation of attributes (params and options) (@nepalez)
87
-
88
- [Compare v0.9.1...v0.9.2](https://github.com/dry-rb/dry-initializer/compare/v0.9.1...v0.9.2)
89
-
90
- ## v0.9.1 2016-11-06
493
+ ## [0.9.1] [2016-11-06]
91
494
 
92
495
  ### Added
93
-
94
- * Support for renaming an option during initialization (@nepalez)
496
+ - Support for renaming an option during initialization (nepalez)
95
497
 
96
498
  option :name, as: :username # to take :name option and create :username attribute
97
499
 
98
- [Compare v0.9.0...v0.9.1](https://github.com/dry-rb/dry-initializer/compare/v0.9.0...v0.9.1)
99
-
100
- ## v0.9.0 2016-11-06
500
+ ## [0.9.0] [2016-11-06]
101
501
 
102
502
  ### Added
103
-
104
- * The method `#initialize` is defined when a class extended the module (@nepalez)
503
+ - The method `#initialize` is defined when a class extended the module (nepalez)
105
504
 
106
505
  In previous versions the method was defined only by `param` and `option` calls.
107
506
 
108
507
  ### Breaking Changes
109
-
110
- * The initializer accepts any option (but skips unknown) from the very beginning (@nepalez)
508
+ - The initializer accepts any option (but skips unknown) from the very beginning (nepalez)
111
509
 
112
510
  ### Deleted
113
-
114
- * Deprecated methods `tolerant_to_unknown_options` and `intolerant_to_unknown_options` (@nepalez)
511
+ - Deprecated methods `tolerant_to_unknown_options` and `intolerant_to_unknown_options` (nepalez)
115
512
 
116
513
  ### Internal
514
+ - Refactor scope (`using`) to support methods renaming and aliasing (nepalez)
117
515
 
118
- * Refactor scope (`using`) to support methods renaming and aliasing (@nepalez)
119
-
120
- [Compare v0.8.1...v0.9.0](https://github.com/dry-rb/dry-initializer/compare/v0.8.1...v0.9.0)
121
-
122
- ## v0.8.1 2016-11-05
516
+ ## [0.8.1] [2016-11-05]
123
517
 
124
518
  ### Added
125
-
126
- * Support for `dry-struct`ish syntax for constraints (type as a second parameter) (@nepalez)
519
+ - Support for `dry-struct`ish syntax for constraints (type as a second parameter) (nepalez)
127
520
 
128
521
  option :name, Dry::Types['strict.string']
129
522
 
130
- [Compare v0.8.0...v0.8.1](https://github.com/dry-rb/dry-initializer/compare/v0.8.0...v0.8.1)
131
-
132
- ## v0.8.0 2016-11-05
523
+ ## [0.8.0] [2016-11-05]
133
524
 
134
525
  In this version we switched from key arguments to ** to support special keys:
135
526
 
@@ -157,83 +548,57 @@ Methods `tolerant_to_unknown_options` and `intolerant_to_unknown_options`
157
548
  are deprecated and will be removed in the next version of the gem.
158
549
 
159
550
  ### Added
551
+ - support for special options like `option :end`, `option :begin` etc. (nepalez)
160
552
 
161
- * support for special options like `option :end`, `option :begin` etc. (@nepalez)
162
-
163
- ### Internals
164
-
165
- * switched from key arguments to serialized hash argument in the initializer (@nepalez)
553
+ ### Changed
554
+ - switched from key arguments to serialized hash argument in the initializer (nepalez)
166
555
 
167
556
  ### Breaking Changes
168
-
169
- * the initializer becomes tolerant to unknown options when any `option` was set,
557
+ - the initializer becomes tolerant to unknown options when any `option` was set,
170
558
  ignoring `intolerant_to_unknown_options` helper.
171
559
 
172
- * the initializer becomes intolerant to options when no `option` was set,
560
+ - the initializer becomes intolerant to options when no `option` was set,
173
561
  ignoring `tolerant_to_unknown_options` helper.
174
562
 
175
563
  ### Deprecated
564
+ - `tolerant_to_unknown_options`
565
+ - `intolerant_to_unknown_options`
176
566
 
177
- * `tolerant_to_unknown_options`
178
- * `intolerant_to_unknown_options`
179
-
180
- [Compare v0.7.0...v0.8.0](https://github.com/dry-rb/dry-initializer/compare/v0.7.0...v0.8.0)
181
-
182
- ## v0.7.0 2016-10-11
567
+ ## [0.7.0] [2016-10-11]
183
568
 
184
569
  ### Added
570
+ - Shared settings with `#using` method (nepalez)
185
571
 
186
- * Shared settings with `#using` method (@nepalez)
187
-
188
- [Compare v0.6.0...v0.7.0](https://github.com/dry-rb/dry-initializer/compare/v0.6.0...v0.7.0)
189
-
190
- ## v0.6.0 2016-10-09
572
+ ## [0.6.0] [2016-10-09]
191
573
 
192
574
  ### Added
575
+ - Support for private and protected readers in the `reader:` option (jmgarnier)
193
576
 
194
- * Support for private and protected readers in the `reader:` option (@jmgarnier)
195
-
196
- [Compare v0.5.0...v0.6.0](https://github.com/dry-rb/dry-initializer/compare/v0.5.0...v0.6.0)
197
-
198
- ## v0.5.0 2016-08-21
577
+ ## [0.5.0] [2016-08-21]
199
578
 
200
579
  ### Added
580
+ - Allow `optional` attribute to be left undefined (nepalez)
201
581
 
202
- * Allow `optional` attribute to be left undefined (@nepalez)
203
-
204
- [Compare v0.4.0...v0.5.0](https://github.com/dry-rb/dry-initializer/compare/v0.4.0...v0.5.0)
205
-
206
- ## v0.4.0 2016-05-28
582
+ ## [0.4.0] [2016-05-28]
207
583
 
208
584
  ### Deleted (backward-incompatible changes)
585
+ - Support of modules and case equality as type constraints (nepalez)
209
586
 
210
- * Support of modules and case equality as type constraints (@nepalez)
211
-
212
- [Compare v0.3.3...v0.4.0](https://github.com/dry-rb/dry-initializer/compare/v0.3.3...v0.4.0)
213
-
214
- ## v0.3.3 2016-05-28
215
-
216
- * Add deprecation warnings about modules and case equality as type constraints (@nepalez)
587
+ ## [0.3.3] [2016-05-28]
217
588
 
218
- [Compare v0.3.2...v0.3.3](https://github.com/dry-rb/dry-initializer/compare/v0.3.2...v0.3.3)
589
+ - Add deprecation warnings about modules and case equality as type constraints (nepalez)
219
590
 
220
- ## v0.3.2 2016-05-25
591
+ ## [0.3.2] [2016-05-25]
221
592
 
222
- ### Bugs Fixed
223
-
224
- * Add explicit requirement for ruby 'set' (@rickenharp)
225
-
226
- [Compare v0.3.1...v0.3.2](https://github.com/dry-rb/dry-initializer/compare/v0.3.1...v0.3.2)
593
+ ### Fixed
594
+ - Add explicit requirement for ruby 'set' (rickenharp)
227
595
 
228
- ## v0.3.1 2016-05-22
596
+ ## [0.3.1] [2016-05-22]
229
597
 
230
598
  ### Added
599
+ - Support for tolerance to unknown options (nepalez)
231
600
 
232
- * Support for tolerance to unknown options (@nepalez)
233
-
234
- [Compare v0.3.0...v0.3.1](https://github.com/dry-rb/dry-initializer/compare/v0.3.0...v0.3.1)
235
-
236
- ## v0.3.0 2016-05-19
601
+ ## [0.3.0] [2016-05-19]
237
602
 
238
603
  Breaks interface for adding new plugins. Register new plugin via:
239
604
 
@@ -255,39 +620,28 @@ While the private method ##initializer_builder is still accessible
255
620
  its method #register doesn't mutate the builder instance.
256
621
 
257
622
  ### Changed (backward-incompatible changes)
623
+ - Made Mixin##initializer_builder method private (nepalez)
624
+ - Add Mixin#register_initializer_plugin(plugin) method (nepalez)
258
625
 
259
- * Made Mixin##initializer_builder method private (@nepalez)
260
- * Add Mixin#register_initializer_plugin(plugin) method (@nepalez)
261
-
262
- ### Bugs Fixed
263
-
264
- * Prevent plugin's registry from polluting superclass (@nepalez)
265
-
266
- [Compare v0.2.1...v0.3.0](https://github.com/dry-rb/dry-initializer/compare/v0.2.1...v0.3.0)
267
-
268
- ### Internals
269
-
270
- * Make all instances (Builder and Signature) immutable (@nepalez)
271
- * Decouple mixin from a builder to prevent pollution (@nepalez)
272
- * Ensure default value block can use private variables (@jeremyf)
273
-
274
- [Compare v0.2.0...v0.2.1](https://github.com/dry-rb/dry-initializer/compare/v0.2.0...v0.2.1)
275
-
276
- ## v0.2.1 2016-05-19
277
-
278
- ### Bugs Fixed
626
+ ### Fixed
627
+ - Prevent plugin's registry from polluting superclass (nepalez)
279
628
 
280
- * Fix polluting superclass with declarations from subclass (@nepalez)
629
+ ### Changed
630
+ - Make all instances (Builder and Signature) immutable (nepalez)
631
+ - Decouple mixin from a builder to prevent pollution (nepalez)
632
+ - Ensure default value block can use private variables (jeremyf)
281
633
 
282
- ### Internals
634
+ ## [0.2.1] [2016-05-19]
283
635
 
284
- * Make all instances (Builder and Signature) immutable (@nepalez)
285
- * Decouple mixin from a builder to prevent pollution (@nepalez)
286
- * Ensure default value block can use private variables (@jeremyf)
636
+ ### Fixed
637
+ - Fix polluting superclass with declarations from subclass (nepalez)
287
638
 
288
- [Compare v0.2.0...v0.2.1](https://github.com/dry-rb/dry-initializer/compare/v0.2.0...v0.2.1)
639
+ ### Changed
640
+ - Make all instances (Builder and Signature) immutable (nepalez)
641
+ - Decouple mixin from a builder to prevent pollution (nepalez)
642
+ - Ensure default value block can use private variables (jeremyf)
289
643
 
290
- ## v0.2.0 2016-05-16
644
+ ## [0.2.0] [2016-05-16]
291
645
 
292
646
  The gem internals has been rewritten heavily to make the gem pluggable and fix
293
647
  bugs in "container style". Type constraints were extracted to a plugin
@@ -299,15 +653,14 @@ object, and apply value coercion via `dry-types`.
299
653
  Default assignments became slower (while plain type constraint are not)!
300
654
 
301
655
  ### Changed (backward-incompatible changes)
302
-
303
- * Make dry-types constraint to coerce variables (@nepalez)
656
+ - Make dry-types constraint to coerce variables (nepalez)
304
657
 
305
658
  ```ruby
306
659
  # This will coerce `name: :foo` to `"foo"`
307
660
  option :name, type: Dry::Types::Coercible::String
308
661
  ```
309
662
 
310
- * Stop supporing proc type constraint (@nepalez)
663
+ - Stop supporing proc type constraint (nepalez)
311
664
 
312
665
  ```ruby
313
666
  option :name, type: ->(v) { String === v } # this does NOT work any more
@@ -327,20 +680,18 @@ Default assignments became slower (while plain type constraint are not)!
327
680
  ```
328
681
 
329
682
  ### Added
330
-
331
- * Support type constraint via every object's case equality (@nepalez)
683
+ - Support type constraint via every object's case equality (nepalez)
332
684
 
333
685
  ```ruby
334
686
  option :name, type: /foo/
335
687
  option :name, type: (1...14)
336
688
  ```
337
689
 
338
- * Support defaults and type constraints for the "container" syntax (@nepalez)
339
- * Support adding extensions via plugin system (@nepalez)
690
+ - Support defaults and type constraints for the "container" syntax (nepalez)
691
+ - Support adding extensions via plugin system (nepalez)
340
692
 
341
693
  ### Internal
342
-
343
- * Private method `##__after_initialize__` is added by the `Mixin` along with `#initialize` (@nepalez)
694
+ - Private method `##__after_initialize__` is added by the `Mixin` along with `#initialize` (nepalez)
344
695
 
345
696
  The previous implementation required defaults and types to be stored in the class method `.initializer_builder`.
346
697
  That made "container" syntax to support neither defaults nor types.
@@ -350,31 +701,60 @@ Default assignments became slower (while plain type constraint are not)!
350
701
  They are made inside `##__after_initialize__` callback, that is biult via `default_method(&block)`
351
702
  using instance evals.
352
703
 
353
- [Compare v0.1.1...v0.2.0](https://github.com/dry-rb/dry-initializer/compare/v0.1.1...v0.2.0)
354
-
355
- ## v0.1.1 2016-04-28
704
+ ## [0.1.1] [2016-04-28]
356
705
 
357
706
  ### Added
707
+ - `include Dry::Initializer.define -> do ... end` syntax (flash-gordon)
358
708
 
359
- * `include Dry::Initializer.define -> do ... end` syntax (@flash-gordon)
360
-
361
- [Compare v0.1.0...v0.1.1](https://github.com/dry-rb/dry-initializer/compare/v0.1.0...v0.1.1)
362
-
363
- ## v0.1.0 2016-04-26
709
+ ## [0.1.0] [2016-04-26]
364
710
 
365
711
  Class DSL splitted to mixin and container versions (thanks to @AMHOL for the idea).
366
712
  Backward compatibility is broken.
367
713
 
368
714
  ### Changed (backward-incompatible changes)
369
-
370
- * Use `extend Dry::Initializer::Mixin` instead of `extend Dry::Initializer` (@nepalez)
715
+ - Use `extend Dry::Initializer::Mixin` instead of `extend Dry::Initializer` (nepalez)
371
716
 
372
717
  ### Added
718
+ - Use `include Dry::Initializer.define(&block)` as an alternative to extending the class (nepalez)
373
719
 
374
- * Use `include Dry::Initializer.define(&block)` as an alternative to extending the class (@nepalez)
375
-
376
- [Compare v0.0.1...v0.1.0](https://github.com/dry-rb/dry-initializer/compare/v0.0.1...v0.1.0)
377
-
378
- ## v0.0.1 2016-04-09
720
+ ## [0.0.1] [2016-04-09]
379
721
 
380
722
  First public release
723
+
724
+ [0.1.0]: https://github.com/dry-rb/dry-initializer/compare/v0.0.1...v0.1.0
725
+ [0.1.1]: https://github.com/dry-rb/dry-initializer/compare/v0.1.0...v0.1.1
726
+ [0.2.0]: https://github.com/dry-rb/dry-initializer/compare/v0.1.1...v0.2.0
727
+ [0.2.1]: https://github.com/dry-rb/dry-initializer/compare/v0.2.0...v0.2.1
728
+ [0.2.1]: https://github.com/dry-rb/dry-initializer/compare/v0.2.0...v0.2.1
729
+ [0.3.0]: https://github.com/dry-rb/dry-initializer/compare/v0.2.1...v0.3.0
730
+ [0.3.1]: https://github.com/dry-rb/dry-initializer/compare/v0.3.0...v0.3.1
731
+ [0.3.2]: https://github.com/dry-rb/dry-initializer/compare/v0.3.1...v0.3.2
732
+ [0.3.3]: https://github.com/dry-rb/dry-initializer/compare/v0.3.2...v0.3.3
733
+ [0.4.0]: https://github.com/dry-rb/dry-initializer/compare/v0.3.3...v0.4.0
734
+ [0.5.0]: https://github.com/dry-rb/dry-initializer/compare/v0.4.0...v0.5.0
735
+ [0.6.0]: https://github.com/dry-rb/dry-initializer/compare/v0.5.0...v0.6.0
736
+ [0.7.0]: https://github.com/dry-rb/dry-initializer/compare/v0.6.0...v0.7.0
737
+ [0.8.0]: https://github.com/dry-rb/dry-initializer/compare/v0.7.0...v0.8.0
738
+ [0.8.1]: https://github.com/dry-rb/dry-initializer/compare/v0.8.0...v0.8.1
739
+ [0.9.0]: https://github.com/dry-rb/dry-initializer/compare/v0.8.1...v0.9.0
740
+ [0.9.1]: https://github.com/dry-rb/dry-initializer/compare/v0.9.0...v0.9.1
741
+ [0.9.2]: https://github.com/dry-rb/dry-initializer/compare/v0.9.1...v0.9.2
742
+ [0.9.3]: https://github.com/dry-rb/dry-initializer/compare/v0.9.2...v0.9.3
743
+ [0.10.0]: https://github.com/dry-rb/dry-initializer/compare/v0.9.3...v0.10.0
744
+ [0.10.1]: https://github.com/dry-rb/dry-initializer/compare/v0.10.0...v0.10.1
745
+ [0.10.2]: https://github.com/dry-rb/dry-initializer/compare/v0.10.1...v0.10.2
746
+ [0.11.0]: https://github.com/dry-rb/dry-initializer/compare/v0.10.2...v0.11.0
747
+ [1.0.0]: https://github.com/dry-rb/dry-initializer/compare/v0.11.0...v1.0.0
748
+ [1.1.0]: https://github.com/dry-rb/dry-initializer/compare/v1.0.0...v1.1.0
749
+ [1.1.1]: https://github.com/dry-rb/dry-initializer/compare/v1.1.0...v1.1.1
750
+ [1.1.2]: https://github.com/dry-rb/dry-initializer/compare/v1.1.1...v1.1.2
751
+ [1.1.3]: https://github.com/dry-rb/dry-initializer/compare/v1.1.2...v1.1.3
752
+ [1.2.0]: https://github.com/dry-rb/dry-initializer/compare/v1.1.3...v1.2.0
753
+ [1.3.0]: https://github.com/dry-rb/dry-initializer/compare/v1.2.0...v1.3.0
754
+ [1.4.0]: https://github.com/dry-rb/dry-initializer/compare/v1.3.0...v1.4.0
755
+ [1.4.1]: https://github.com/dry-rb/dry-initializer/compare/v1.4.0...v1.4.1
756
+ [2.0.0]: https://github.com/dry-rb/dry-initializer/compare/v1.4.1...v2.0.0
757
+ [2.1.0]: https://github.com/dry-rb/dry-initializer/compare/v2.0.0...v2.1.0
758
+ [2.2.0]: https://github.com/dry-rb/dry-initializer/compare/v2.1.0...v2.2.0
759
+ [2.3.0]: https://github.com/dry-rb/dry-initializer/compare/v2.2.0...v2.3.0
760
+ [2.4.0]: https://github.com/dry-rb/dry-initializer/compare/v2.3.0...v2.4.0