dry-initializer 2.4.0 → 3.0.3

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 (92) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +10 -21
  3. data/.github/ISSUE_TEMPLATE/----please-don-t-ask-for-support-via-issues.md +10 -0
  4. data/.github/ISSUE_TEMPLATE/---bug-report.md +30 -0
  5. data/.github/ISSUE_TEMPLATE/---feature-request.md +18 -0
  6. data/.github/workflows/custom_ci.yml +58 -0
  7. data/.github/workflows/docsite.yml +34 -0
  8. data/.github/workflows/sync_configs.yml +56 -0
  9. data/.gitignore +2 -0
  10. data/.rspec +1 -1
  11. data/.rubocop.yml +76 -25
  12. data/CHANGELOG.md +150 -14
  13. data/CODE_OF_CONDUCT.md +13 -0
  14. data/CONTRIBUTING.md +29 -0
  15. data/Gemfile +25 -18
  16. data/Gemfile.devtools +16 -0
  17. data/Guardfile +3 -3
  18. data/LICENSE +20 -0
  19. data/README.md +17 -79
  20. data/Rakefile +4 -4
  21. data/benchmarks/compare_several_defaults.rb +27 -27
  22. data/benchmarks/plain_options.rb +14 -14
  23. data/benchmarks/plain_params.rb +22 -22
  24. data/benchmarks/with_coercion.rb +14 -14
  25. data/benchmarks/with_defaults.rb +17 -17
  26. data/benchmarks/with_defaults_and_coercion.rb +14 -14
  27. data/bin/.gitkeep +0 -0
  28. data/docsite/source/attributes.html.md +106 -0
  29. data/docsite/source/container-version.html.md +39 -0
  30. data/docsite/source/index.html.md +43 -0
  31. data/docsite/source/inheritance.html.md +43 -0
  32. data/docsite/source/optionals-and-defaults.html.md +130 -0
  33. data/docsite/source/options-tolerance.html.md +27 -0
  34. data/docsite/source/params-and-options.html.md +74 -0
  35. data/docsite/source/rails-support.html.md +101 -0
  36. data/docsite/source/readers.html.md +43 -0
  37. data/docsite/source/skip-undefined.html.md +59 -0
  38. data/docsite/source/type-constraints.html.md +160 -0
  39. data/dry-initializer.gemspec +13 -13
  40. data/lib/dry-initializer.rb +1 -1
  41. data/lib/dry/initializer.rb +17 -16
  42. data/lib/dry/initializer/builders.rb +2 -2
  43. data/lib/dry/initializer/builders/attribute.rb +16 -11
  44. data/lib/dry/initializer/builders/initializer.rb +9 -13
  45. data/lib/dry/initializer/builders/reader.rb +4 -2
  46. data/lib/dry/initializer/builders/signature.rb +3 -3
  47. data/lib/dry/initializer/config.rb +25 -12
  48. data/lib/dry/initializer/definition.rb +20 -71
  49. data/lib/dry/initializer/dispatchers.rb +101 -33
  50. data/lib/dry/initializer/dispatchers/build_nested_type.rb +59 -0
  51. data/lib/dry/initializer/dispatchers/check_type.rb +43 -0
  52. data/lib/dry/initializer/dispatchers/prepare_default.rb +40 -0
  53. data/lib/dry/initializer/dispatchers/prepare_ivar.rb +12 -0
  54. data/lib/dry/initializer/dispatchers/prepare_optional.rb +13 -0
  55. data/lib/dry/initializer/dispatchers/prepare_reader.rb +30 -0
  56. data/lib/dry/initializer/dispatchers/prepare_source.rb +28 -0
  57. data/lib/dry/initializer/dispatchers/prepare_target.rb +44 -0
  58. data/lib/dry/initializer/dispatchers/unwrap_type.rb +22 -0
  59. data/lib/dry/initializer/dispatchers/wrap_type.rb +28 -0
  60. data/lib/dry/initializer/mixin.rb +4 -4
  61. data/lib/dry/initializer/mixin/root.rb +1 -0
  62. data/lib/dry/initializer/struct.rb +39 -0
  63. data/lib/dry/initializer/undefined.rb +2 -0
  64. data/lib/dry/initializer/version.rb +5 -0
  65. data/lib/tasks/benchmark.rake +13 -13
  66. data/lib/tasks/profile.rake +16 -16
  67. data/project.yml +2 -0
  68. data/spec/attributes_spec.rb +7 -7
  69. data/spec/coercion_of_nil_spec.rb +25 -0
  70. data/spec/custom_dispatchers_spec.rb +6 -6
  71. data/spec/custom_initializer_spec.rb +2 -2
  72. data/spec/default_values_spec.rb +9 -9
  73. data/spec/definition_spec.rb +16 -12
  74. data/spec/invalid_default_spec.rb +2 -2
  75. data/spec/list_type_spec.rb +32 -0
  76. data/spec/missed_default_spec.rb +2 -2
  77. data/spec/nested_type_spec.rb +48 -0
  78. data/spec/optional_spec.rb +16 -16
  79. data/spec/options_tolerance_spec.rb +2 -2
  80. data/spec/public_attributes_utility_spec.rb +5 -5
  81. data/spec/reader_spec.rb +13 -13
  82. data/spec/repetitive_definitions_spec.rb +9 -9
  83. data/spec/several_assignments_spec.rb +9 -9
  84. data/spec/spec_helper.rb +6 -3
  85. data/spec/subclassing_spec.rb +5 -5
  86. data/spec/support/coverage.rb +7 -0
  87. data/spec/support/warnings.rb +7 -0
  88. data/spec/type_argument_spec.rb +15 -15
  89. data/spec/type_constraint_spec.rb +46 -28
  90. data/spec/value_coercion_via_dry_types_spec.rb +8 -8
  91. metadata +51 -34
  92. data/.travis.yml +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 41bfe9bf29562e8ff2f907653002f1d1bae2e7bf
4
- data.tar.gz: de76e955208183a7e617367e553cfb97bfbfbf75
2
+ SHA256:
3
+ metadata.gz: b6ced45dbc940dabce6d9f202a03e1ffc01b46cc14cb8981961d959392837a56
4
+ data.tar.gz: 70357b155bbe3516384a62d42b222f31ca401f29d8377dec06220124c0e95c07
5
5
  SHA512:
6
- metadata.gz: c86812a57b0471dcee12d5ef97495036b350317eb8fea8044a2e85bfd21b68aa5f6f627b6bce7f882533c8fdc3137d52640493e966c195bbcd03d53e8861697a
7
- data.tar.gz: 726234048ec21a22da06de940bd25e3aae5ef0244b4489b238d856ba8a7992dab57af385fadf0a3f2553817257cf71cf56ed62ef688764507d54e66afd304e3b
6
+ metadata.gz: 9c24c4d7127c8723d2142033da1a50f87450b725f69aa6948ea5b311154006e754f2ceaca88419e07bd4d648749097a9037763d180cfe87b8db525da888d82c2
7
+ data.tar.gz: 39dd6072626a6e80cc485c63462c19a93f1fa72c9e91300bb175c6c4ac643e71189963d8ee2d2f67dab4c1265dc224119ff3b3aa488f294231e333def76e9770
data/.codeclimate.yml CHANGED
@@ -1,23 +1,12 @@
1
- ---
2
- engines:
1
+ # this file is managed by dry-rb/devtools project
2
+
3
+ version: "2"
4
+
5
+ exclude_patterns:
6
+ - "benchmarks/"
7
+ - "examples/"
8
+ - "spec/"
9
+
10
+ plugins:
3
11
  rubocop:
4
12
  enabled: true
5
- checks:
6
- Rubocop/Style/FrozenStringLiteralComment:
7
- enabled: false
8
- Rubocop/Style/PercentLiteralDelimiters:
9
- enabled: false
10
- Rubocop/Lint/UnderscorePrefixedVariableName:
11
- enabled: false
12
- duplication:
13
- enabled: true
14
- config:
15
- languages:
16
- - ruby
17
- exclude_paths:
18
- - "benchmarks/**/*"
19
- - "spec/**/*"
20
- - "lib/tasks/**/*"
21
- ratings:
22
- paths:
23
- - "lib/**/*"
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: "⚠️ Please don't ask for support via issues"
3
+ about: See CONTRIBUTING.md for more information
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: "\U0001F41B Bug report"
3
+ about: See CONTRIBUTING.md for more information
4
+ title: ''
5
+ labels: bug
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Before you submit this: WE ONLY ACCEPT BUG REPORTS AND FEATURE REQUESTS**
11
+
12
+ For more information see `CONTRIBUTING.md`.
13
+
14
+ **Describe the bug**
15
+
16
+ A clear and concise description of what the bug is.
17
+
18
+ **To Reproduce**
19
+
20
+ Provide detailed steps to reproduce, an executable script would be best.
21
+
22
+ **Expected behavior**
23
+
24
+ A clear and concise description of what you expected to happen.
25
+
26
+ **Your environment**
27
+
28
+ - Affects my production application: **YES/NO**
29
+ - Ruby version: ...
30
+ - OS: ...
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: "\U0001F6E0 Feature request"
3
+ about: See CONTRIBUTING.md for more information
4
+ title: ''
5
+ labels: feature
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ Summary of what the feature is supposed to do.
11
+
12
+ ## Examples
13
+
14
+ Code examples showing how the feature could be used.
15
+
16
+ ## Resources
17
+
18
+ Additional information, like a link to the discussion forum thread where the feature was discussed etc.
@@ -0,0 +1,58 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ paths:
6
+ - .github/workflows/custom_ci.yml
7
+ - lib/**
8
+ - spec/**
9
+ - Rakefile
10
+ - Gemfile
11
+ - Gemfile.devtools
12
+ - "*.gemspec"
13
+ - ".rubocop.yml"
14
+ pull_request:
15
+ branches:
16
+ - master
17
+
18
+ jobs:
19
+ tests:
20
+ runs-on: ubuntu-latest
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ ruby:
25
+ - "2.7"
26
+ - "2.6"
27
+ - "2.5"
28
+ - "2.4"
29
+ - "jruby"
30
+ runtime_deps:
31
+ - "dry-types-latest"
32
+ - "dry-types-master"
33
+ include:
34
+ - ruby: "2.6"
35
+ coverage: "true"
36
+ - runtime_deps: "dry-types-master"
37
+ dry_types_from_master: "true"
38
+ steps:
39
+ - uses: actions/checkout@v1
40
+ - name: Set up Ruby
41
+ uses: eregon/use-ruby-action@master
42
+ with:
43
+ ruby-version: ${{matrix.ruby}}
44
+ - name: Install latest bundler
45
+ run: |
46
+ gem install bundler
47
+ bundle config set without 'tools benchmarks docs'
48
+ - name: Bundle install
49
+ run: bundle install --jobs 4 --retry 3
50
+ env:
51
+ DRY_TYPES_FROM_MASTER: ${{matrix.dry_types_from_master}}
52
+ - name: Run all tests
53
+ env:
54
+ DRY_TYPES_FROM_MASTER: ${{matrix.dry_types_from_master}}
55
+ COVERAGE: ${{matrix.coverage}}
56
+ CODACY_RUN_LOCAL: true
57
+ CODACY_PROJECT_TOKEN: ${{secrets.CODACY_PROJECT_TOKEN}}
58
+ run: bundle exec rake
@@ -0,0 +1,34 @@
1
+ # this file is managed by dry-rb/devtools project
2
+
3
+ name: docsite
4
+
5
+ on:
6
+ push:
7
+ paths:
8
+ - docsite/**
9
+ - .github/workflows/docsite.yml
10
+ branches:
11
+ - master
12
+ - release-**
13
+ tags:
14
+
15
+ jobs:
16
+ update-docs:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v1
20
+ - name: Set up Ruby
21
+ uses: actions/setup-ruby@v1
22
+ with:
23
+ ruby-version: "2.6.x"
24
+ - name: Install dependencies
25
+ run: |
26
+ gem install bundler
27
+ bundle install --jobs 4 --retry 3 --without benchmarks sql
28
+ - name: Symlink ossy
29
+ run: mkdir -p bin && ln -sf "$(bundle show ossy)/bin/ossy" bin/ossy
30
+ - name: Trigger dry-rb.org deploy
31
+ env:
32
+ GITHUB_LOGIN: dry-bot
33
+ GITHUB_TOKEN: ${{ secrets.GH_PAT }}
34
+ run: bin/ossy github workflow dry-rb/dry-rb.org ci
@@ -0,0 +1,56 @@
1
+ # this file is managed by dry-rb/devtools project
2
+
3
+ name: sync_configs
4
+
5
+ on:
6
+ repository_dispatch:
7
+
8
+ jobs:
9
+ sync-configs:
10
+ runs-on: ubuntu-latest
11
+ if: github.event.action == 'sync_configs'
12
+ steps:
13
+ - uses: actions/checkout@v1
14
+ - name: Set up Ruby
15
+ uses: eregon/use-ruby-action@master
16
+ with:
17
+ ruby-version: 2.6
18
+ - name: Install latest bundler
19
+ run: |
20
+ gem install bundler
21
+ bundle config set without 'tools benchmarks docs'
22
+ - name: Install dependencies
23
+ run: bundle install --jobs 4 --retry 3 --without tools test benchmarks docs
24
+ - name: Symlink ossy
25
+ run: ln -sf "$(bundle info ossy --path)/bin/ossy" bin/ossy
26
+ - name: Clone devtools
27
+ run: git clone https://github.com/dry-rb/devtools.git tmp/devtools
28
+ - name: Compile file templates
29
+ env:
30
+ GITHUB_LOGIN: dry-bot
31
+ GITHUB_TOKEN: ${{ secrets.GH_PAT }}
32
+ run: |
33
+ if [ -f "project.yml" ]; then
34
+ for t in `ls tmp/devtools/templates`
35
+ do
36
+ bin/ossy t c tmp/devtools/templates/$t $(basename $t .erb) project.yml
37
+ done
38
+ fi
39
+ - name: Update configuration files from devtools
40
+ run: |
41
+ if [ -f ".github/workflows/custom_ci.yml" ]; then
42
+ rsync -arv --exclude '.github/workflows/ci.yml' tmp/devtools/shared/ . ;
43
+ else
44
+ rsync -arv tmp/devtools/shared/ . ;
45
+ fi
46
+ - name: Commit changes
47
+ run: |
48
+ rm bin/ossy
49
+ git config --local user.email "dry-bot@dry-rb.org"
50
+ git config --local user.name "dry-bot"
51
+ git add -A
52
+ git commit -m "[devtools] sync configs" || echo "nothing changed"
53
+ - name: Push changes
54
+ uses: ad-m/github-push-action@master
55
+ with:
56
+ github_token: ${{ secrets.GH_PAT }}
data/.gitignore CHANGED
@@ -8,3 +8,5 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  /*.gem
11
+
12
+ .vscode
data/.rspec CHANGED
@@ -1,4 +1,4 @@
1
- --format documentation
2
1
  --color
3
2
  --require spec_helper
3
+ --order random
4
4
  --warnings
data/.rubocop.yml CHANGED
@@ -1,51 +1,102 @@
1
- ---
1
+ # this file is managed by dry-rb/devtools project
2
+
2
3
  AllCops:
3
- DisplayCopNames: true
4
- DisplayStyleGuide: true
5
- StyleGuideCopsOnly: true
6
- TargetRubyVersion: 2.3
7
- Exclude:
8
- - lib/tasks/*.rake
4
+ TargetRubyVersion: 2.4
5
+
6
+ Style/EachWithObject:
7
+ Enabled: false
8
+
9
+ Style/StringLiterals:
10
+ Enabled: true
11
+ EnforcedStyle: single_quotes
9
12
 
10
- Bundler/DuplicatedGem:
13
+ Style/ParallelAssignment:
11
14
  Enabled: false
12
15
 
13
- Style/CaseEquality:
16
+ Style/Alias:
17
+ Enabled: true
18
+ EnforcedStyle: prefer_alias_method
19
+
20
+ Style/LambdaCall:
14
21
  Enabled: false
15
22
 
16
- Style/ClassVars:
23
+ Style/StabbyLambdaParentheses:
17
24
  Enabled: false
18
25
 
19
- Style/ClassAndModuleChildren:
26
+ Style/FormatString:
20
27
  Enabled: false
21
28
 
22
29
  Style/Documentation:
23
30
  Enabled: false
24
31
 
25
- Style/DoubleNegation:
32
+ Layout/SpaceInLambdaLiteral:
26
33
  Enabled: false
27
34
 
28
- Style/FileName:
35
+ Layout/MultilineMethodCallIndentation:
36
+ Enabled: true
37
+ EnforcedStyle: indented
38
+
39
+ Metrics/LineLength:
40
+ Max: 100
41
+
42
+ Metrics/MethodLength:
43
+ Enabled: false
44
+
45
+ Metrics/ClassLength:
46
+ Enabled: false
47
+
48
+ Metrics/BlockLength:
49
+ Enabled: false
50
+
51
+ Metrics/AbcSize:
52
+ Max: 20
53
+
54
+ Metrics/CyclomaticComplexity:
55
+ Enabled: true
56
+ Max: 10
57
+
58
+ Lint/BooleanSymbol:
59
+ Enabled: false
60
+
61
+ Style/AccessModifierDeclarations:
62
+ Enabled: false
63
+
64
+ Style/BlockDelimiters:
65
+ Enabled: false
66
+
67
+ Layout/IndentFirstArrayElement:
68
+ EnforcedStyle: consistent
69
+
70
+ Style/ClassAndModuleChildren:
29
71
  Exclude:
30
- - lib/dry-initializer.rb
72
+ - "spec/**/*_spec.rb"
31
73
 
32
- Style/Lambda:
74
+ Lint/HandleExceptions:
33
75
  Exclude:
34
- - spec/**/*.rb
76
+ - "spec/spec_helper.rb"
35
77
 
36
- Style/LambdaCall:
78
+ Naming/PredicateName:
37
79
  Enabled: false
38
80
 
39
- Style/RescueModified:
81
+ Naming/FileName:
40
82
  Exclude:
41
- - spec/**/*.rb
83
+ - "lib/dry-*.rb"
42
84
 
43
- Style/Semicolon:
85
+ Style/SymbolArray:
44
86
  Exclude:
45
- - spec/**/*.rb
87
+ - "spec/**/*_spec.rb"
46
88
 
47
- Style/StringLiterals:
48
- EnforcedStyle: double_quotes
89
+ Style/ConditionalAssignment:
90
+ Enabled: false
49
91
 
50
- Style/StringLiteralsInInterpolation:
51
- EnforcedStyle: double_quotes
92
+ Naming/MethodName:
93
+ Enabled: false
94
+
95
+ Style/AsciiComments:
96
+ Enabled: false
97
+
98
+ Style/DateTime:
99
+ Enabled: false
100
+
101
+ Style/IfUnlessModifier:
102
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -5,6 +5,135 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/).
7
7
 
8
+ ## [3.0.3] [2020-01-08]
9
+
10
+ ### Fixed
11
+
12
+ - Constrained member arrays work correctly now (see #33) (@bjeanes + @solnic)
13
+
14
+ ## [3.0.2] [2019-11-07]
15
+
16
+ ### Fixed
17
+
18
+ - Warnings about keyword arguments (flash-gordon)
19
+
20
+ ## [3.0.1] [2019-04-15]
21
+
22
+ ### Fixed
23
+
24
+ - Usage of underscored names of `option`-s and `param`-s (nepalez)
25
+
26
+ You can use any sequence of underscores except for in nested types.
27
+ In nested types single underscores can be used to split alphanumeric
28
+ parts only.
29
+
30
+ ```ruby
31
+ class Test
32
+ extend Dry::Initializer
33
+
34
+ # Proper usage
35
+ option :foo_bar do
36
+ option :__foo__, proc(&:to_s)
37
+ end
38
+ end
39
+
40
+ # Improper usage
41
+ option :__foo__ do
42
+ # ...
43
+ end
44
+
45
+ option :foo__bar do
46
+ # ...
47
+ end
48
+ end
49
+ ```
50
+
51
+ This restriction is necessary because we constantize option/param names
52
+ when defining nested structs.
53
+
54
+ ## [3.0.0] [2019-04-14]
55
+
56
+ ### Added
57
+
58
+ - Support of wrapped types/coercers (nepalez)
59
+
60
+ ```ruby
61
+ class Test
62
+ # Wrap type to the array
63
+ param :foo, [proc(&:to_s)]
64
+ end
65
+
66
+ # And the value will be wrapped as well
67
+ test = Test.new(42)
68
+ test.foo # => ["42"]
69
+ ```
70
+
71
+ - It works with several layers of nesting (nepalez)
72
+
73
+ ```ruby
74
+ class Test
75
+ # Wrap type to the array
76
+ param :foo, [[proc(&:to_s)]]
77
+ end
78
+
79
+ # And the value will be wrapped as well
80
+ test = Test.new(42)
81
+ test.foo # => [["42"]]
82
+ ```
83
+
84
+ - Support of nested types/coercers (nepalez)
85
+
86
+ ```ruby
87
+ class Test
88
+ param :foo do
89
+ option :bar do
90
+ option :baz, proc(&:to_s)
91
+ end
92
+ end
93
+ end
94
+
95
+ test = Test.new(bar: { "baz" => 42 })
96
+ test.foo.bar.baz # => "42"
97
+ ```
98
+
99
+ - Wrapped/nested combinations are supported as well (nepalez)
100
+
101
+ ```ruby
102
+ class Test
103
+ param :foo, [] do
104
+ option :bar, proc(&:to_s)
105
+ end
106
+ end
107
+
108
+ test = Test.new(bar: 42)
109
+ test.foo.first.bar # => "42"
110
+ ```
111
+
112
+ ## [2.7.0] Unreleazed
113
+
114
+ ### Fixed
115
+
116
+ - Roll back master to the state of [2.5.0].
117
+
118
+ Somehow distinction between `@default_null` and `@null` variables
119
+ in the `Dry::Initializer::Builders` broken the `rom` library.
120
+
121
+ The version [2.6.0] has been yanked on rubygems, so the master
122
+ was rolled back to the previous state until the reason for
123
+ the incompatibility become clear (bjeanes, nepalez)
124
+
125
+ ## [2.6.0] [2018-09-09] (YANKED)
126
+
127
+ ## [2.5.0] [2018-08-17]
128
+
129
+ ### Fixed
130
+
131
+ - `nil` coercion (belousovAV)
132
+
133
+ When default value is `nil` instead of `Dry::Initializer::UNDEFINED`,
134
+ the coercion should be applied to any value, including `nil`, because
135
+ we cannot distinct "undefined" `nil` from the "assigned" `nil` value.
136
+
8
137
  ## [2.4.0] [2018-02-01]
9
138
 
10
139
  ### Added
@@ -31,7 +160,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
31
160
  ```ruby
32
161
  class Location < String
33
162
  attr_reader :parameter # refers back to its parameter
34
-
163
+
35
164
  def initialize(name, parameter)
36
165
  super(name)
37
166
  @parameter = parameter
@@ -319,7 +448,7 @@ and to @gzigzigzeo for persuading me to do this refactoring.
319
448
 
320
449
  ### Added
321
450
  - No-undefined configuration of the initializer (nepalez, flash-gordon)
322
-
451
+
323
452
  You can either extend or include module `Dry::Initializer` with additional option
324
453
  `[undefined: false]`. This time `nil` will be assigned instead of
325
454
  `Dry::Initializer::UNDEFINED`. Readers becomes faster because there is no need
@@ -367,18 +496,20 @@ and to @gzigzigzeo for persuading me to do this refactoring.
367
496
  ### Added
368
497
  - enhancement via `Dry::Initializer::Attribute.dispatchers` registry (nepalez)
369
498
 
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
499
+ ```ruby
500
+ # Register dispatcher for `:string` option
501
+ Dry::Initializer::Attribute.dispatchers << ->(string: nil, **op) do
502
+ string ? op.merge(type: proc(&:to_s)) : op
503
+ end
374
504
 
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
505
+ # Now you can use the `:string` key for `param` and `option`
506
+ class User
507
+ extend Dry::Initializer
508
+ param :name, string: true
509
+ end
380
510
 
381
- User.new(:Andy).name # => "Andy"
511
+ User.new(:Andy).name # => "Andy"
512
+ ```
382
513
 
383
514
  ### Changed
384
515
  - optimize assignments for performance (nepalez)
@@ -429,7 +560,7 @@ In this version the code has been rewritten for simplicity
429
560
 
430
561
  ### Internal
431
562
  - Refactor the way [#initializer] method is (re)defined (nepalez)
432
-
563
+
433
564
  When you extend class with `Dry::Initializer::Mixin`, the initializer is
434
565
  defined not "inside" the class per se, but inside the included module. The
435
566
  reference to that module is stored as class-level `__initializer_mixin__`.
@@ -757,4 +888,9 @@ First public release
757
888
  [2.1.0]: https://github.com/dry-rb/dry-initializer/compare/v2.0.0...v2.1.0
758
889
  [2.2.0]: https://github.com/dry-rb/dry-initializer/compare/v2.1.0...v2.2.0
759
890
  [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
891
+ [2.4.0]: https://github.com/dry-rb/dry-initializer/compare/v2.3.0...v2.4.0
892
+ [2.6.0]: https://github.com/dry-rb/dry-initializer/compare/v2.4.0...v2.5.0
893
+ [2.6.0]: https://github.com/dry-rb/dry-initializer/compare/v2.5.0...v2.6.0
894
+ [3.0.0]: https://github.com/dry-rb/dry-initializer/compare/v2.5.0...v3.0.0
895
+ [3.0.1]: https://github.com/dry-rb/dry-initializer/compare/v3.0.0...v3.0.1
896
+ [3.0.2]: https://github.com/dry-rb/dry-initializer/compare/v3.0.1...v3.0.2