dry-initializer 2.4.0 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
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