karafka-testing 2.5.4 → 2.5.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0bac7810f07fb9324256c1cdb77d41a703a9b4d9333de1f191d74502fc93948
4
- data.tar.gz: 1d4a0400c7e7784f377eae9a2bf94ff4046a8c21214844019a2300c71b1c4e9c
3
+ metadata.gz: 1b3f0a88c86d120feff8bfdddb122bd93437bd44bd6f4d3dbf5207ff940ee699
4
+ data.tar.gz: 4b60d4ea6e294735883d11e35b807ffdb7913f1b67e72e8c6ff8e56bddf47db0
5
5
  SHA512:
6
- metadata.gz: 27c816ab440addf35afde363c2ad742b02089ea2b1b863e33087d80d2284bac83b6cbe1bc62fee3eebfff7bd50126a80e8f10fe9c9c9b1df9c8396b00cb7af15
7
- data.tar.gz: 31ef6e3808dc2e2c5263c981974c0b360749c02cf8ac8d3a9dee9339f6dd909b2bdd871e9bcc33ffcbcc987ba240e005828e556fae46e78563cc970278e20e14
6
+ metadata.gz: e352a7fcebc358d5a9cc21c58e2e64ff8ea4e3dd8a70ce8493afbf1c255907d83cb4cd5425a7d3c289d1c595f0a23a36240f2255e3a7262ae0efffab333b9676
7
+ data.tar.gz: 28d77f9ac53ff9e97302e754fe4b777405bb9df018716ab8ef576bdcbbbf1019e4f656d0fd7ed02f65b21ead5a1f900ccfab9bbd5a3bd7bb0fd06698d92f2483
@@ -14,23 +14,22 @@ permissions:
14
14
  contents: read
15
15
 
16
16
  jobs:
17
- specs:
17
+ tests:
18
18
  timeout-minutes: 30
19
19
  runs-on: ubuntu-latest
20
- needs: diffend
21
20
  strategy:
22
21
  fail-fast: false
23
22
  matrix:
24
23
  ruby:
25
- - '3.5.0-preview1'
24
+ - '4.0'
26
25
  - '3.4'
27
26
  - '3.3'
28
27
  - '3.2'
29
28
  include:
30
- - ruby: '3.3'
29
+ - ruby: '4.0'
31
30
  coverage: 'true'
32
31
  steps:
33
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
32
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
34
33
  with:
35
34
  fetch-depth: 0
36
35
 
@@ -38,7 +37,7 @@ jobs:
38
37
  run: "[ -e $APT_DEPS ] || sudo apt-get install -y --no-install-recommends $APT_DEPS"
39
38
 
40
39
  - name: Set up Ruby
41
- uses: ruby/setup-ruby@0481980f17b760ef6bca5e8c55809102a0af1e5a # v1.263.0
40
+ uses: ruby/setup-ruby@eab2afb99481ca09a4e91171a8e0aee0e89bfedd # v1.296.0
42
41
  with:
43
42
  ruby-version: ${{matrix.ruby}}
44
43
  bundler: 'latest'
@@ -53,65 +52,104 @@ jobs:
53
52
  run: |
54
53
  bundle install --jobs 4 --retry 3
55
54
 
56
- diffend:
55
+ - name: Run all tests
56
+ env:
57
+ GITHUB_COVERAGE: ${{matrix.coverage}}
58
+ run: bundle exec rake test
59
+
60
+ rubocop:
57
61
  timeout-minutes: 5
58
62
  runs-on: ubuntu-latest
59
- strategy:
60
- fail-fast: false
63
+ env:
64
+ BUNDLE_GEMFILE: Gemfile.lint
61
65
  steps:
62
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
66
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
63
67
  with:
64
68
  fetch-depth: 0
65
-
66
69
  - name: Set up Ruby
67
- uses: ruby/setup-ruby@0481980f17b760ef6bca5e8c55809102a0af1e5a # v1.263.0
70
+ uses: ruby/setup-ruby@eab2afb99481ca09a4e91171a8e0aee0e89bfedd # v1.296.0
68
71
  with:
69
- ruby-version: 3.3
72
+ ruby-version: '4.0.2'
73
+ bundler-cache: true
74
+ - name: Run rubocop
75
+ run: bundle exec rubocop
70
76
 
71
- - name: Install latest bundler
72
- run: gem install bundler --no-document
73
-
74
- - name: Install Diffend plugin
75
- run: bundle plugin install diffend
76
-
77
- - name: Bundle Secure
78
- run: bundle secure
77
+ yard-lint:
78
+ timeout-minutes: 5
79
+ runs-on: ubuntu-latest
80
+ env:
81
+ BUNDLE_GEMFILE: Gemfile.lint
82
+ steps:
83
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
84
+ - name: Set up Ruby
85
+ uses: ruby/setup-ruby@eab2afb99481ca09a4e91171a8e0aee0e89bfedd # v1.296.0
86
+ with:
87
+ ruby-version: '4.0.2'
88
+ bundler-cache: true
89
+ - run: bundle exec yard-lint lib/
79
90
 
80
- coditsu:
91
+ minitest-integration:
81
92
  timeout-minutes: 5
82
93
  runs-on: ubuntu-latest
83
- strategy:
84
- fail-fast: false
85
94
  steps:
86
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
95
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
87
96
  with:
88
97
  fetch-depth: 0
98
+ - name: Set up Ruby
99
+ uses: ruby/setup-ruby@eab2afb99481ca09a4e91171a8e0aee0e89bfedd # v1.296.0
100
+ with:
101
+ ruby-version: '4.0.2'
102
+ bundler: 'latest'
103
+ - name: Install dependencies
104
+ run: bundle install --jobs 4 --retry 3
105
+ - name: Run minitest integration tests
106
+ run: bundle exec ruby -e "Dir['test/integration/minitest/*_test.rb'].sort.each { |f| require File.expand_path(f) }"
89
107
 
90
- - name: Download Coditsu script
91
- run: |
92
- curl -sSL https://api.coditsu.io/run/ci -o coditsu_script.sh
93
- chmod +x coditsu_script.sh
94
-
95
- - name: Verify Coditsu script checksum
96
- run: |
97
- EXPECTED_SHA256="0aecc5aa010f53fca264548a41467a2b0a1208d750ce1da3e98a217304cacbbc"
98
- ACTUAL_SHA256=$(sha256sum coditsu_script.sh | awk '{ print $1 }')
99
- if [ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]; then
100
- echo "::error::Checksum verification failed. Expected $EXPECTED_SHA256 but got $ACTUAL_SHA256."
101
- exit 1
102
- fi
108
+ rspec-integration:
109
+ timeout-minutes: 5
110
+ runs-on: ubuntu-latest
111
+ steps:
112
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
113
+ with:
114
+ fetch-depth: 0
115
+ - name: Set up Ruby
116
+ uses: ruby/setup-ruby@eab2afb99481ca09a4e91171a8e0aee0e89bfedd # v1.296.0
117
+ with:
118
+ ruby-version: '4.0.2'
119
+ bundler: 'latest'
120
+ - name: Install dependencies
121
+ run: bundle install --jobs 4 --retry 3
122
+ - name: Run rspec integration tests
123
+ run: bundle exec rspec test/integration/rspec --require ./test/integration/rspec_helper.rb
103
124
 
104
- - name: Run Coditsu
105
- run: ./coditsu_script.sh
125
+ lostconf:
126
+ timeout-minutes: 5
127
+ runs-on: ubuntu-latest
128
+ steps:
129
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
130
+ with:
131
+ fetch-depth: 0
132
+ - name: Set up Node.js
133
+ uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
134
+ with:
135
+ node-version: '20'
136
+ cache: 'npm'
137
+ - name: Install dependencies
138
+ run: npm ci
139
+ - name: Run lostconf
140
+ run: npx lostconf --fail-on-stale
106
141
 
107
142
  ci-success:
108
143
  name: CI Success
109
144
  runs-on: ubuntu-latest
110
145
  if: always()
111
146
  needs:
112
- - diffend
113
- - coditsu
114
- - specs
147
+ - rubocop
148
+ - tests
149
+ - minitest-integration
150
+ - rspec-integration
151
+ - yard-lint
152
+ - lostconf
115
153
  steps:
116
154
  - name: Check all jobs passed
117
155
  if: |
@@ -19,12 +19,12 @@ jobs:
19
19
  id-token: write
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
22
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
23
23
  with:
24
24
  fetch-depth: 0
25
25
 
26
26
  - name: Set up Ruby
27
- uses: ruby/setup-ruby@0481980f17b760ef6bca5e8c55809102a0af1e5a # v1.263.0
27
+ uses: ruby/setup-ruby@eab2afb99481ca09a4e91171a8e0aee0e89bfedd # v1.296.0
28
28
  with:
29
29
  bundler-cache: false
30
30
 
@@ -32,4 +32,4 @@ jobs:
32
32
  run: |
33
33
  bundle install --jobs 4 --retry 3
34
34
 
35
- - uses: rubygems/release-gem@a25424ba2ba8b387abc8ef40807c2c85b96cbe32 # v1.1.1
35
+ - uses: rubygems/release-gem@e9a6361a0b14562539327c2a02373edc56dd3169 # v1.1.4
@@ -13,7 +13,7 @@ jobs:
13
13
  if: github.repository_owner == 'karafka'
14
14
  steps:
15
15
  - name: Trigger wiki refresh
16
- uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3.0.0
16
+ uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
17
17
  with:
18
18
  token: ${{ secrets.WIKI_REPO_TOKEN }}
19
19
  repository: karafka/wiki
@@ -7,7 +7,7 @@ jobs:
7
7
  verify_action_pins:
8
8
  runs-on: ubuntu-latest
9
9
  steps:
10
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
10
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
11
11
  - name: Check SHA pins
12
12
  run: |
13
13
  if grep -E -r "uses: .*/.*@(v[0-9]+|main|master)($|[[:space:]]|$)" --include="*.yml" --include="*.yaml" .github/workflows/ | grep -v "#"; then
data/.gitignore CHANGED
@@ -29,6 +29,7 @@ sftp-config.json
29
29
  /test/tmp/
30
30
  /test/version_tmp/
31
31
  /tmp/
32
+ /log
32
33
 
33
34
  ## Specific to RubyMotion:
34
35
  .dat*
data/.rubocop.yml ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ plugins:
4
+ - rubocop-minitest
5
+ - rubocop-performance
6
+ - rubocop-thread_safety
7
+
8
+ inherit_gem:
9
+ standard: config/base.yml
10
+ standard-performance: config/base.yml
11
+ standard-minitest: config/base.yml
12
+
13
+ AllCops:
14
+ NewCops: enable
15
+ TargetRubyVersion: 3.2
16
+
17
+ # Layout
18
+ Layout/LineLength:
19
+ Max: 100
20
+
21
+ Layout/SpaceInsideHashLiteralBraces:
22
+ EnforcedStyle: space
23
+
24
+ # ThreadSafety
25
+ ThreadSafety/ClassAndModuleAttributes:
26
+ Enabled: false
27
+
28
+ ThreadSafety/ClassInstanceVariable:
29
+ Enabled: false
30
+
31
+ ThreadSafety/NewThread:
32
+ Enabled: false
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.4.6
1
+ 4.0.2
data/.yard-lint.yml ADDED
@@ -0,0 +1,275 @@
1
+ # YARD-Lint Configuration
2
+ # See https://github.com/mensfeld/yard-lint for documentation
3
+
4
+ # Global settings for all validators
5
+ AllValidators:
6
+ YardOptions:
7
+ - "--private"
8
+ - "--protected"
9
+ Exclude:
10
+ - .git/**/*
11
+ - vendor/**/*
12
+ - node_modules/**/*
13
+ - test/**/*
14
+ FailOnSeverity: convention
15
+ MinCoverage: 99.0
16
+ DiffMode:
17
+ DefaultBaseRef:
18
+
19
+ # Documentation validators
20
+ Documentation/UndocumentedObjects:
21
+ Description: Checks for classes, modules, and methods without documentation.
22
+ Enabled: true
23
+ Severity: error
24
+ ExcludedMethods:
25
+ - initialize/0
26
+ - "/^_/"
27
+
28
+ Documentation/UndocumentedMethodArguments:
29
+ Description: Checks for method parameters without @param tags.
30
+ Enabled: true
31
+ Severity: error
32
+
33
+ Documentation/UndocumentedBooleanMethods:
34
+ Description: Checks that question mark methods document their boolean return.
35
+ Enabled: true
36
+ Severity: error
37
+
38
+ Documentation/UndocumentedOptions:
39
+ Description: Detects methods with options hash parameters but no @option tags.
40
+ Enabled: true
41
+ Severity: error
42
+
43
+ Documentation/MarkdownSyntax:
44
+ Description: Detects common markdown syntax errors in documentation.
45
+ Enabled: true
46
+ Severity: error
47
+
48
+ Documentation/EmptyCommentLine:
49
+ Description: Detects empty comment lines at the start or end of documentation blocks.
50
+ Enabled: true
51
+ Severity: convention
52
+ EnabledPatterns:
53
+ Leading: true
54
+ Trailing: true
55
+
56
+ Documentation/BlankLineBeforeDefinition:
57
+ Description: Detects blank lines between YARD documentation and method definition.
58
+ Enabled: true
59
+ Severity: convention
60
+ OrphanedSeverity: convention
61
+ EnabledPatterns:
62
+ SingleBlankLine: true
63
+ OrphanedDocs: true
64
+
65
+ # Tags validators
66
+ Tags/Order:
67
+ Description: Enforces consistent ordering of YARD tags.
68
+ Enabled: true
69
+ Severity: error
70
+ EnforcedOrder:
71
+ - param
72
+ - option
73
+ - return
74
+ - raise
75
+ - example
76
+
77
+ Tags/InvalidTypes:
78
+ Description: Validates type definitions in @param, @return, @option tags.
79
+ Enabled: true
80
+ Severity: error
81
+ ValidatedTags:
82
+ - param
83
+ - option
84
+ - return
85
+
86
+ Tags/TypeSyntax:
87
+ Description: Validates YARD type syntax using YARD parser.
88
+ Enabled: true
89
+ Severity: error
90
+ ValidatedTags:
91
+ - param
92
+ - option
93
+ - return
94
+ - yieldreturn
95
+
96
+ Tags/MeaninglessTag:
97
+ Description: Detects @param/@option tags on classes, modules, or constants.
98
+ Enabled: true
99
+ Severity: error
100
+ CheckedTags:
101
+ - param
102
+ - option
103
+ InvalidObjectTypes:
104
+ - class
105
+ - module
106
+ - constant
107
+
108
+ Tags/CollectionType:
109
+ Description: Validates Hash collection syntax consistency.
110
+ Enabled: true
111
+ Severity: error
112
+ EnforcedStyle: long
113
+ ValidatedTags:
114
+ - param
115
+ - option
116
+ - return
117
+ - yieldreturn
118
+
119
+ Tags/TagTypePosition:
120
+ Description: Validates type annotation position in tags.
121
+ Enabled: true
122
+ Severity: error
123
+ CheckedTags:
124
+ - param
125
+ - option
126
+ EnforcedStyle: type_after_name
127
+
128
+ Tags/ApiTags:
129
+ Description: Enforces @api tags on public objects.
130
+ Enabled: false
131
+ Severity: error
132
+ AllowedApis:
133
+ - public
134
+ - private
135
+ - internal
136
+
137
+ Tags/OptionTags:
138
+ Description: Requires @option tags for methods with options parameters.
139
+ Enabled: true
140
+ Severity: error
141
+
142
+ Tags/ExampleSyntax:
143
+ Description: Validates Ruby syntax in @example tags.
144
+ Enabled: true
145
+ Severity: warning
146
+
147
+ Tags/RedundantParamDescription:
148
+ Description: Detects meaningless parameter descriptions that add no value.
149
+ Enabled: true
150
+ Severity: convention
151
+ CheckedTags:
152
+ - param
153
+ - option
154
+ Articles:
155
+ - The
156
+ - the
157
+ - A
158
+ - a
159
+ - An
160
+ - an
161
+ MaxRedundantWords: 6
162
+ GenericTerms:
163
+ - object
164
+ - instance
165
+ - value
166
+ - data
167
+ - item
168
+ - element
169
+ EnabledPatterns:
170
+ ArticleParam: true
171
+ PossessiveParam: true
172
+ TypeRestatement: true
173
+ ParamToVerb: true
174
+ IdPattern: true
175
+ DirectionalDate: true
176
+ TypeGeneric: true
177
+
178
+ Tags/InformalNotation:
179
+ Description: Detects informal tag notation patterns like "Note:" instead of @note.
180
+ Enabled: true
181
+ Severity: warning
182
+ CaseSensitive: false
183
+ RequireStartOfLine: true
184
+ Patterns:
185
+ Note: "@note"
186
+ Todo: "@todo"
187
+ TODO: "@todo"
188
+ FIXME: "@todo"
189
+ See: "@see"
190
+ See also: "@see"
191
+ Warning: "@deprecated"
192
+ Deprecated: "@deprecated"
193
+ Author: "@author"
194
+ Version: "@version"
195
+ Since: "@since"
196
+ Returns: "@return"
197
+ Raises: "@raise"
198
+ Example: "@example"
199
+
200
+ Tags/NonAsciiType:
201
+ Description: Detects non-ASCII characters in type annotations.
202
+ Enabled: true
203
+ Severity: warning
204
+ ValidatedTags:
205
+ - param
206
+ - option
207
+ - return
208
+ - yieldreturn
209
+ - yieldparam
210
+
211
+ Tags/TagGroupSeparator:
212
+ Description: Enforces blank line separators between different YARD tag groups.
213
+ Enabled: false
214
+ Severity: convention
215
+ TagGroups:
216
+ param:
217
+ - param
218
+ - option
219
+ return:
220
+ - return
221
+ error:
222
+ - raise
223
+ - throws
224
+ example:
225
+ - example
226
+ meta:
227
+ - see
228
+ - note
229
+ - todo
230
+ - deprecated
231
+ - since
232
+ - version
233
+ - api
234
+ yield:
235
+ - yield
236
+ - yieldparam
237
+ - yieldreturn
238
+ RequireAfterDescription: false
239
+
240
+ # Warnings validators - catches YARD parser errors
241
+ Warnings/UnknownTag:
242
+ Description: Detects unknown YARD tags.
243
+ Enabled: true
244
+ Severity: error
245
+
246
+ Warnings/UnknownDirective:
247
+ Description: Detects unknown YARD directives.
248
+ Enabled: true
249
+ Severity: error
250
+
251
+ Warnings/InvalidTagFormat:
252
+ Description: Detects malformed tag syntax.
253
+ Enabled: true
254
+ Severity: error
255
+
256
+ Warnings/InvalidDirectiveFormat:
257
+ Description: Detects malformed directive syntax.
258
+ Enabled: true
259
+ Severity: error
260
+
261
+ Warnings/DuplicatedParameterName:
262
+ Description: Detects duplicate @param tags.
263
+ Enabled: true
264
+ Severity: error
265
+
266
+ Warnings/UnknownParameterName:
267
+ Description: Detects @param tags for non-existent parameters.
268
+ Enabled: true
269
+ Severity: error
270
+
271
+ # Semantic validators
272
+ Semantic/AbstractMethods:
273
+ Description: Ensures @abstract methods do not have real implementations.
274
+ Enabled: true
275
+ Severity: error
data/CHANGELOG.md CHANGED
@@ -1,8 +1,16 @@
1
1
  # Karafka Testing Changelog
2
2
 
3
+ ## 2.5.6 (2026-04-02)
4
+ - [Feature] Support custom `offset` option in `karafka.produce` for test message production (#230).
5
+ - [Feature] Restore ability to use implicit RSpec `subject` in consumer specs when `described_class` inherits from `Karafka::BaseConsumer` (#110).
6
+
7
+ ## 2.5.5 (2025-11-28)
8
+ - [Feature] Add `produce_to` method for explicit consumer targeting in multi-consumer scenarios.
9
+ - [Fix] Fix consumer mapping collision when multiple consumer groups listen to the same topic.
10
+
3
11
  ## 2.5.4 (2025-10-03)
4
12
  - [Fix] Topic present in second dynamically built subscription group not available for dispatch (#291).
5
- - [Change] Remove Ruby `3.1` according to the EOL schedule.
13
+ - **[EOL]** Remove Ruby `3.1` according to the EOL schedule.
6
14
 
7
15
  ## 2.5.3 (2025-08-12)
8
16
  - [Fix] Allow testing consumers with Pro expansions (i.e. Piping).
@@ -19,7 +27,7 @@
19
27
  - [Maintenance] Release matching Karafka `2.5.0` release.
20
28
 
21
29
  ## 2.4.7 (2025-04-01)
22
- - **[Breaking]** Drop Ruby `3.0` support according to the EOL schedule.
30
+ - **[EOL]** Drop Ruby `3.0` support according to the EOL schedule.
23
31
  - **[Fix]** Check not only that `Mocha` is loaded but also that its stubs are used.
24
32
 
25
33
  ## 2.4.6 (2024-07-31)
@@ -44,7 +52,7 @@
44
52
  - [Fix] Fix instance variable in minitest helper (tldn0718)
45
53
 
46
54
  ## 2.4.0 (2024-04-26)
47
- - **[Breaking]** Drop Ruby `2.7` support.
55
+ - **[EOL]** Drop Ruby `2.7` support.
48
56
  - [Refactor] Extract common components for Minitest and RSpec.
49
57
  - [Fix] Support again `require: false` on gem loading.
50
58
  - [Fix] Fix a case where multiplexed SG would fail with `TopicInManyConsumerGroupsError`
@@ -153,7 +161,7 @@
153
161
  - Change the API to be more comprehensive
154
162
  - Update to work with Karafka 2.0
155
163
  - Support for Ruby 3.1
156
- - Drop support for ruby 2.6
164
+ - **[EOL]** Drop support for ruby 2.6
157
165
 
158
166
  ## 1.4.*
159
167
 
data/Gemfile CHANGED
@@ -1,7 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
4
-
5
- plugin 'diffend'
3
+ source "https://rubygems.org"
6
4
 
7
5
  gemspec
6
+
7
+ group :test do
8
+ gem "minitest"
9
+ gem "mocha"
10
+ gem "ostruct"
11
+ gem "rspec"
12
+ gem "simplecov"
13
+ gem "warning"
14
+ end
data/Gemfile.lint ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Documentation linting
6
+ gem "yard-lint"
7
+
8
+ # Code style (StandardRB via RuboCop)
9
+ gem "standard"
10
+ gem "standard-performance"
11
+ gem "rubocop-performance"
12
+ gem "rubocop-minitest"
13
+ gem "standard-minitest"
14
+ gem "rubocop-thread_safety"