attio 0.1.1 → 0.2.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +39 -15
  3. data/.github/workflows/coverage.yml +67 -0
  4. data/.github/workflows/pr_checks.yml +25 -7
  5. data/.github/workflows/release.yml +27 -13
  6. data/.github/workflows/tests.yml +67 -0
  7. data/.rubocop.yml +362 -90
  8. data/CHANGELOG.md +49 -1
  9. data/CONCEPTS.md +428 -0
  10. data/CONTRIBUTING.md +4 -4
  11. data/Gemfile +8 -5
  12. data/Gemfile.lock +4 -4
  13. data/README.md +164 -2
  14. data/Rakefile +8 -6
  15. data/attio.gemspec +6 -7
  16. data/danger/Dangerfile +22 -34
  17. data/docs/example.rb +30 -29
  18. data/examples/advanced_filtering.rb +178 -0
  19. data/examples/basic_usage.rb +110 -0
  20. data/examples/collaboration_example.rb +173 -0
  21. data/examples/full_workflow.rb +348 -0
  22. data/examples/notes_and_tasks.rb +200 -0
  23. data/lib/attio/client.rb +67 -29
  24. data/lib/attio/connection_pool.rb +26 -14
  25. data/lib/attio/errors.rb +4 -2
  26. data/lib/attio/http_client.rb +70 -41
  27. data/lib/attio/logger.rb +37 -27
  28. data/lib/attio/resources/attributes.rb +12 -5
  29. data/lib/attio/resources/base.rb +66 -27
  30. data/lib/attio/resources/comments.rb +147 -0
  31. data/lib/attio/resources/lists.rb +21 -24
  32. data/lib/attio/resources/notes.rb +110 -0
  33. data/lib/attio/resources/objects.rb +11 -4
  34. data/lib/attio/resources/records.rb +49 -67
  35. data/lib/attio/resources/tasks.rb +131 -0
  36. data/lib/attio/resources/threads.rb +154 -0
  37. data/lib/attio/resources/users.rb +10 -4
  38. data/lib/attio/resources/workspaces.rb +9 -1
  39. data/lib/attio/retry_handler.rb +19 -11
  40. data/lib/attio/version.rb +3 -1
  41. data/lib/attio.rb +15 -9
  42. metadata +13 -18
  43. data/run_tests.rb +0 -52
  44. data/test_basic.rb +0 -51
  45. data/test_typhoeus.rb +0 -31
data/.rubocop.yml CHANGED
@@ -1,133 +1,405 @@
1
- require:
2
- - rubocop-rspec
3
-
4
1
  AllCops:
2
+ DisplayCopNames: true
5
3
  TargetRubyVersion: 3.0
6
4
  NewCops: enable
7
5
  Exclude:
8
6
  - 'vendor/**/*'
9
7
  - 'bin/**/*'
10
- - 'coverage/**/*'
11
- - 'docs/**/*'
12
8
  - 'tmp/**/*'
13
- - '*.gemspec'
14
- - 'Gemfile'
15
- - 'Rakefile'
9
+ - 'spec/**/*'
16
10
 
17
- # Layout and formatting
18
- Layout/LineLength:
19
- Max: 120
20
- AllowedPatterns: ['\A\s*#']
11
+ Style/Documentation:
12
+ Enabled: false
21
13
 
22
- Layout/MultilineMethodCallIndentation:
23
- EnforcedStyle: indented
14
+ Layout/CaseIndentation:
15
+ EnforcedStyle: end
24
16
 
25
- # Metrics
26
- Metrics/BlockLength:
27
- Exclude:
28
- - 'spec/**/*'
29
- - 'Rakefile'
17
+ Layout/FirstArrayElementIndentation:
18
+ EnforcedStyle: consistent
30
19
 
31
- Metrics/MethodLength:
32
- Max: 20
33
- CountAsOne: ['array', 'hash', 'heredoc']
20
+ Layout/FirstHashElementIndentation:
21
+ EnforcedStyle: consistent
34
22
 
35
- Metrics/ClassLength:
36
- Max: 150
23
+ Layout/LineLength:
24
+ Exclude:
25
+ - "lib/stripe/object_types.rb"
26
+ - "lib/stripe/stripe_client.rb"
27
+ - "lib/stripe/resources/**/*.rb"
28
+ - "lib/stripe/services/**/*.rb"
29
+ - "test/**/*.rb"
37
30
 
38
- Metrics/ModuleLength:
39
- Max: 150
31
+ Lint/MissingSuper:
32
+ Exclude:
33
+ - "lib/stripe/resources/**/*.rb"
34
+ - "lib/stripe/services/**/*.rb"
35
+ - "test/stripe/request_params_test.rb"
40
36
 
41
37
  Metrics/AbcSize:
42
- Max: 20
38
+ Enabled: false
39
+
40
+ Metrics/BlockLength:
41
+ Max: 40
42
+ Exclude:
43
+ # `context` in tests are blocks and get quite large, so exclude the test
44
+ # directory from having to adhere to this rule.
45
+ - "test/**/*.rb"
43
46
 
47
+ Metrics/ClassLength:
48
+ Enabled: false
49
+
50
+ # There are several methods with many branches in api_requestor due to
51
+ # request logic.
44
52
  Metrics/CyclomaticComplexity:
45
- Max: 8
53
+ Exclude:
54
+ - "lib/stripe/api_requestor.rb"
55
+ - "lib/stripe/util.rb"
46
56
 
47
57
  Metrics/PerceivedComplexity:
48
- Max: 8
58
+ Exclude:
59
+ - "lib/stripe/api_requestor.rb"
60
+ - "lib/stripe/stripe_object.rb"
61
+ - "lib/stripe/util.rb"
49
62
 
50
- # Style
51
- Style/Documentation:
52
- Enabled: false
63
+ Metrics/MethodLength:
64
+ # There's one long method in `NestedResource`. If we want to truncate it a little,
65
+ # we could move this to be closer to ~30 (but the default of 10 is probably too short).
66
+ Max: 55
67
+ Exclude:
68
+ - "lib/stripe/services/v1_services.rb"
69
+ - "lib/stripe/event_types.rb"
70
+ - "lib/stripe/api_requestor.rb"
71
+ AllowedMethods:
72
+ - initialize
73
+
74
+ # TODO(xavdid): remove this once the first `basil` release is out
75
+ Naming/MethodName:
76
+ # these endpoints are removed soon so we pulled their overrides, meaning their names are wrong
77
+ # that won't make it out to users, but it's breaking linting/formatting in the meantime
78
+ Exclude:
79
+ - "lib/stripe/services/invoice_service.rb"
80
+ - "lib/stripe/resources/invoice.rb"
53
81
 
54
- Style/StringLiterals:
55
- EnforcedStyle: double_quotes
82
+ Metrics/ModuleLength:
83
+ Enabled: false
56
84
 
57
- Style/StringLiteralsInInterpolation:
58
- EnforcedStyle: double_quotes
85
+ Metrics/ParameterLists:
86
+ # There's 2 methods in `StripeClient` that have long parameter lists.
87
+ Max: 8
88
+ # Optional parameters should be consistent across libraries, we need not be
89
+ # concerned about this. Was introduced with adding `base_address`
90
+ Exclude:
91
+ - "lib/stripe/api_operations/request.rb"
92
+ - "lib/stripe/stripe_object.rb"
93
+ - "lib/stripe/stripe_client.rb"
94
+ - "lib/stripe/resources/**/*.rb"
95
+ - "lib/stripe/services/**/*.rb"
96
+
97
+ Naming/MethodParameterName:
98
+ # We have many parameters that are less than 3 characters for tax codes
99
+ Exclude:
100
+ - "lib/stripe/resources/**/*.rb"
101
+ - "lib/stripe/services/**/*.rb"
59
102
 
60
- Style/FrozenStringLiteralComment:
61
- Enabled: true
103
+ Naming/VariableNumber:
104
+ # We use a variety of variable number syntaxes
105
+ Exclude:
106
+ - "lib/stripe/resources/**/*.rb"
107
+ - "lib/stripe/services/**/*.rb"
62
108
 
63
- Style/TrailingCommaInArrayLiteral:
64
- EnforcedStyleForMultiline: comma
109
+ Style/AccessModifierDeclarations:
110
+ EnforcedStyle: inline
65
111
 
66
- Style/TrailingCommaInHashLiteral:
67
- EnforcedStyleForMultiline: comma
112
+ Style/AsciiComments:
113
+ Enabled: false
68
114
 
69
- Style/TrailingCommaInArguments:
70
- EnforcedStyleForMultiline: no_comma
115
+ Style/FrozenStringLiteralComment:
116
+ EnforcedStyle: always
71
117
 
72
- Style/ClassAndModuleChildren:
73
- EnforcedStyle: compact
118
+ Style/HashEachMethods:
119
+ Enabled: true
74
120
 
75
- Style/EmptyMethod:
76
- EnforcedStyle: expanded
121
+ Style/HashTransformKeys:
122
+ Enabled: true
77
123
 
78
- # Naming
79
- Naming/PredicateName:
80
- ForbiddenPrefixes:
81
- - is_
124
+ Style/HashTransformValues:
125
+ Enabled: true
82
126
 
83
- Naming/AccessorMethodName:
127
+ Style/NumericPredicate:
84
128
  Enabled: false
85
129
 
86
- # RSpec specific cops
87
- RSpec/ExampleLength:
88
- Max: 15
130
+ Style/StringLiterals:
131
+ EnforcedStyle: double_quotes
89
132
 
90
- RSpec/MultipleExpectations:
91
- Max: 5
133
+ Style/TrailingCommaInArrayLiteral:
134
+ EnforcedStyleForMultiline: consistent_comma
92
135
 
93
- RSpec/NestedGroups:
94
- Max: 4
136
+ Style/TrailingCommaInHashLiteral:
137
+ EnforcedStyleForMultiline: consistent_comma
95
138
 
96
- RSpec/DescribeClass:
139
+ Gemspec/DeprecatedAttributeAssignment: # new in 1.30
97
140
  Enabled: true
98
-
99
- RSpec/FilePath:
141
+ Gemspec/DevelopmentDependencies: # new in 1.44
100
142
  Enabled: true
101
-
102
- RSpec/ContextWording:
103
- Prefixes:
104
- - when
105
- - with
106
- - without
107
- - if
108
- - unless
109
- - for
110
-
111
- RSpec/DescribedClass:
143
+ Gemspec/RequireMFA: # new in 1.23
144
+ Enabled: false
145
+ Layout/LineContinuationLeadingSpace: # new in 1.31
112
146
  Enabled: true
113
-
114
- # Security
115
- Security/Eval:
147
+ Layout/LineContinuationSpacing: # new in 1.31
116
148
  Enabled: true
117
-
118
- Security/Open:
149
+ Layout/LineEndStringConcatenationIndentation: # new in 1.18
119
150
  Enabled: true
120
-
121
- Security/YAMLLoad:
151
+ Layout/SpaceBeforeBrackets: # new in 1.7
122
152
  Enabled: true
123
-
124
- # Bundler
125
- Bundler/OrderedGems:
153
+ Lint/AmbiguousAssignment: # new in 1.7
126
154
  Enabled: true
127
-
128
- # Gemspec
129
- Gemspec/OrderedDependencies:
155
+ Lint/AmbiguousOperatorPrecedence: # new in 1.21
156
+ Enabled: true
157
+ Lint/AmbiguousRange: # new in 1.19
158
+ Enabled: true
159
+ Lint/ConstantOverwrittenInRescue: # new in 1.31
160
+ Enabled: true
161
+ Lint/DeprecatedConstants: # new in 1.8
162
+ Enabled: true
163
+ Lint/DuplicateBranch: # new in 1.3
164
+ Enabled: true
165
+ Lint/DuplicateMagicComment: # new in 1.37
166
+ Enabled: true
167
+ Lint/DuplicateMatchPattern: # new in 1.50
168
+ Enabled: true
169
+ Lint/DuplicateRegexpCharacterClassElement: # new in 1.1
170
+ Enabled: true
171
+ Lint/EmptyBlock: # new in 1.1
172
+ Enabled: true
173
+ Lint/EmptyClass: # new in 1.3
174
+ Enabled: true
175
+ Lint/EmptyInPattern: # new in 1.16
176
+ Enabled: true
177
+ Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
178
+ Enabled: true
179
+ Lint/LambdaWithoutLiteralBlock: # new in 1.8
180
+ Enabled: true
181
+ Lint/MixedCaseRange: # new in 1.53
182
+ Enabled: true
183
+ Lint/NoReturnInBeginEndBlocks: # new in 1.2
184
+ Enabled: true
185
+ Lint/NonAtomicFileOperation: # new in 1.31
186
+ Enabled: true
187
+ Lint/NumberedParameterAssignment: # new in 1.9
188
+ Enabled: true
189
+ Lint/OrAssignmentToConstant: # new in 1.9
190
+ Enabled: true
191
+ Lint/RedundantDirGlobSort: # new in 1.8
192
+ Enabled: true
193
+ Lint/RedundantRegexpQuantifiers: # new in 1.53
194
+ Enabled: true
195
+ Lint/RefinementImportMethods: # new in 1.27
196
+ Enabled: true
197
+ Lint/RequireRangeParentheses: # new in 1.32
198
+ Enabled: true
199
+ Lint/RequireRelativeSelfPath: # new in 1.22
200
+ Enabled: true
201
+ Lint/SymbolConversion: # new in 1.9
202
+ Enabled: true
203
+ Lint/ToEnumArguments: # new in 1.1
204
+ Enabled: true
205
+ Lint/TripleQuotes: # new in 1.9
206
+ Enabled: true
207
+ Lint/UnexpectedBlockArity: # new in 1.5
208
+ Enabled: true
209
+ Lint/UnmodifiedReduceAccumulator: # new in 1.1
210
+ Enabled: true
211
+ Lint/UselessAssignment:
212
+ Exclude:
213
+ - "test/stripe/generated_examples_test.rb"
214
+ Lint/UselessRescue: # new in 1.43
215
+ Enabled: true
216
+ Lint/UselessRuby2Keywords: # new in 1.23
217
+ Enabled: true
218
+ Metrics/CollectionLiteralLength: # new in 1.47
219
+ Enabled: true
220
+ Naming/BlockForwarding: # new in 1.24
221
+ Enabled: true
222
+ Security/CompoundHash: # new in 1.28
223
+ Enabled: true
224
+ Security/IoMethods: # new in 1.22
225
+ Enabled: true
226
+ Style/ArgumentsForwarding: # new in 1.1
227
+ Enabled: true
228
+ Style/ArrayIntersect: # new in 1.40
229
+ Enabled: true
230
+ Style/CollectionCompact: # new in 1.2
231
+ Enabled: true
232
+ Style/ComparableClamp: # new in 1.44
233
+ Enabled: true
234
+ Style/ConcatArrayLiterals: # new in 1.41
235
+ Enabled: true
236
+ Style/DataInheritance: # new in 1.49
237
+ Enabled: true
238
+ Style/DirEmpty: # new in 1.48
239
+ Enabled: true
240
+ Style/DocumentDynamicEvalDefinition: # new in 1.1
241
+ Enabled: true
242
+ Style/EmptyHeredoc: # new in 1.32
243
+ Enabled: true
244
+ Style/EndlessMethod: # new in 1.8
245
+ Enabled: true
246
+ Style/EnvHome: # new in 1.29
247
+ Enabled: true
248
+ Style/ExactRegexpMatch: # new in 1.51
249
+ Enabled: true
250
+ Style/FetchEnvVar: # new in 1.28
251
+ Enabled: true
252
+ Style/FileEmpty: # new in 1.48
253
+ Enabled: true
254
+ Style/FileRead: # new in 1.24
255
+ Enabled: true
256
+ Style/FileWrite: # new in 1.24
257
+ Enabled: true
258
+ Style/HashConversion: # new in 1.10
259
+ Enabled: true
260
+ Style/HashExcept: # new in 1.7
261
+ Enabled: true
262
+ Style/IfWithBooleanLiteralBranches: # new in 1.9
263
+ Enabled: true
264
+ Style/InPatternThen: # new in 1.16
265
+ Enabled: true
266
+ Style/MagicCommentFormat: # new in 1.35
267
+ Enabled: true
268
+ Style/MapCompactWithConditionalBlock: # new in 1.30
269
+ Enabled: true
270
+ Style/MapToHash: # new in 1.24
271
+ Enabled: true
272
+ Style/MapToSet: # new in 1.42
273
+ Enabled: true
274
+ Style/MinMaxComparison: # new in 1.42
275
+ Enabled: true
276
+ Style/MultilineInPatternThen: # new in 1.16
277
+ Enabled: true
278
+ Style/NegatedIfElseCondition: # new in 1.2
279
+ Enabled: true
280
+ Style/NestedFileDirname: # new in 1.26
281
+ Enabled: true
282
+ Style/NilLambda: # new in 1.3
283
+ Enabled: true
284
+ Style/NumberedParameters: # new in 1.22
285
+ Enabled: true
286
+ Style/NumberedParametersLimit: # new in 1.22
287
+ Enabled: true
288
+ Style/ObjectThen: # new in 1.28
289
+ Enabled: true
290
+ Style/OpenStructUse: # new in 1.23
291
+ Enabled: true
292
+ Style/OperatorMethodCall: # new in 1.37
293
+ Enabled: true
294
+ Style/QuotedSymbols: # new in 1.16
295
+ Enabled: true
296
+ Style/RedundantArgument: # new in 1.4
297
+ Enabled: true
298
+ Style/RedundantArrayConstructor: # new in 1.52
299
+ Enabled: true
300
+ Style/RedundantConstantBase: # new in 1.40
301
+ Enabled: true
302
+ Style/RedundantCurrentDirectoryInPath: # new in 1.53
303
+ Enabled: true
304
+ Style/RedundantDoubleSplatHashBraces: # new in 1.41
305
+ Enabled: true
306
+ Style/RedundantEach: # new in 1.38
307
+ Enabled: true
308
+ Style/RedundantFilterChain: # new in 1.52
309
+ Enabled: true
310
+ Style/RedundantHeredocDelimiterQuotes: # new in 1.45
311
+ Enabled: true
312
+ Style/RedundantInitialize: # new in 1.27
313
+ Enabled: true
314
+ Style/RedundantLineContinuation: # new in 1.49
315
+ Enabled: true
316
+ Style/RedundantRegexpArgument: # new in 1.53
317
+ Enabled: true
318
+ Style/RedundantRegexpConstructor: # new in 1.52
319
+ Enabled: true
320
+ Style/RedundantSelfAssignmentBranch: # new in 1.19
321
+ Enabled: true
322
+ Style/RedundantStringEscape: # new in 1.37
323
+ Enabled: true
324
+ Style/ReturnNilInPredicateMethodDefinition: # new in 1.53
325
+ Enabled: true
326
+ Style/SelectByRegexp: # new in 1.22
327
+ Enabled: true
328
+ Style/SingleLineDoEndBlock: # new in 1.57
329
+ Enabled: true
330
+ Style/StringChars: # new in 1.12
331
+ Enabled: true
332
+ Style/SwapValues: # new in 1.1
333
+ Enabled: true
334
+ Style/YAMLFileRead: # new in 1.53
335
+ Enabled: true
336
+ Gemspec/AddRuntimeDependency: # new in 1.65
337
+ Enabled: true
338
+ Lint/ArrayLiteralInRegexp: # new in 1.71
339
+ Enabled: true
340
+ Lint/ConstantReassignment: # new in 1.70
341
+ Enabled: true
342
+ Lint/CopDirectiveSyntax: # new in 1.72
343
+ Enabled: true
344
+ Lint/DuplicateSetElement: # new in 1.67
345
+ Enabled: true
346
+ Lint/HashNewWithKeywordArgumentsAsDefault: # new in 1.69
347
+ Enabled: true
348
+ Lint/ItWithoutArgumentsInBlock: # new in 1.59
349
+ Enabled: true
350
+ Lint/LiteralAssignmentInCondition: # new in 1.58
351
+ Enabled: true
352
+ Lint/NumericOperationWithConstantResult: # new in 1.69
353
+ Enabled: true
354
+ Lint/RedundantTypeConversion: # new in 1.72
355
+ Enabled: true
356
+ Lint/SharedMutableDefault: # new in 1.70
357
+ Enabled: true
358
+ Lint/SuppressedExceptionInNumberConversion: # new in 1.72
359
+ Enabled: true
360
+ Lint/UnescapedBracketInRegexp: # new in 1.68
361
+ Enabled: true
362
+ Lint/UselessConstantScoping: # new in 1.72
363
+ Enabled: true
364
+ Lint/UselessDefined: # new in 1.69
365
+ Enabled: true
366
+ Lint/UselessNumericOperation: # new in 1.66
367
+ Enabled: true
368
+ Style/AmbiguousEndlessMethodDefinition: # new in 1.68
369
+ Enabled: true
370
+ Style/BitwisePredicate: # new in 1.68
371
+ Enabled: true
372
+ Style/CombinableDefined: # new in 1.68
373
+ Enabled: true
374
+ Style/ComparableBetween: # new in 1.74
375
+ Enabled: true
376
+ Style/DigChain: # new in 1.69
377
+ Enabled: true
378
+ Style/FileNull: # new in 1.69
379
+ Enabled: true
380
+ Style/FileTouch: # new in 1.69
381
+ Enabled: true
382
+ Style/HashFetchChain: # new in 1.75
383
+ Enabled: true
384
+ Style/HashSlice: # new in 1.71
385
+ Enabled: true
386
+ Style/ItAssignment: # new in 1.70
387
+ Enabled: true
388
+ Style/ItBlockParameter: # new in 1.75
389
+ Enabled: true
390
+ Style/KeywordArgumentsMerging: # new in 1.68
391
+ Enabled: true
392
+ Style/MapIntoArray: # new in 1.63
393
+ Enabled: true
394
+ Style/RedundantFormat: # new in 1.72
395
+ Enabled: true
396
+ Style/RedundantInterpolationUnfreeze: # new in 1.66
397
+ Enabled: true
398
+ Style/SafeNavigationChainLength: # new in 1.68
399
+ Enabled: true
400
+ Style/SendWithLiteralMethodName: # new in 1.64
401
+ Enabled: true
402
+ Style/SuperArguments: # new in 1.64
403
+ Enabled: true
404
+ Style/SuperWithArgsParentheses: # new in 1.58
130
405
  Enabled: true
131
-
132
- Gemspec/RequiredRubyVersion:
133
- Enabled: true
data/CHANGELOG.md CHANGED
@@ -5,7 +5,55 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [0.2.0] - 2025-08-11
9
+
10
+ ### Added
11
+ - Comments resource with full CRUD operations and emoji reactions
12
+ - Threads resource with participant management and status control
13
+ - Tasks resource with assignment and completion tracking
14
+ - Notes resource for creating and managing notes on records
15
+ - DELETE with body support in HttpClient for participant management
16
+ - URL encoding for emoji reactions using CGI.escape
17
+ - Comprehensive examples for collaboration features
18
+ - Advanced filtering and querying examples
19
+ - Complete CRM workflow example
20
+
21
+ ### Improved
22
+ - Achieved 100% test coverage (376/376 lines)
23
+ - Increased test count from 147 to 265 tests
24
+ - Refactored Base class to reduce code duplication across resources
25
+ - Extracted common validation methods to base class
26
+ - Standardized error messages across all resources
27
+ - Fixed keyword arguments vs options hash issues in test mocks
28
+ - Updated README with all new features and comprehensive examples
29
+
30
+ ### Fixed
31
+ - Semantic correctness in all test files
32
+ - REST convention compliance for DELETE operations
33
+ - Proper URL encoding for special characters in API paths
34
+
35
+ ## [0.1.3] - 2025-08-11
36
+
37
+ ### Fixed
38
+ - Ruby 3.0 and 3.1 compatibility by using bundler 2.4.22
39
+ - All CI workflows now explicitly specify compatible bundler version
40
+
41
+ ## [0.1.2] - 2025-08-11 (yanked)
42
+
43
+ ### Added
44
+ - Ruby 3.4 support in CI/CD pipelines
45
+ - GitHub Actions badges for tests and coverage
46
+ - Comprehensive documentation for all classes
47
+
48
+ ### Improved
49
+ - Applied RuboCop with Stripe's best practices configuration
50
+ - Refactored HttpClient#handle_response to reduce cyclomatic complexity
51
+ - Fixed all code style violations (284 auto-corrected)
52
+ - Enhanced CI/CD workflows with proper bundler configuration
53
+
54
+ ### Removed
55
+ - Unnecessary test files (test_basic.rb, test_typhoeus.rb, run_tests.rb)
56
+ - .rubocop_todo.yml (all violations fixed)
9
57
 
10
58
  ## [0.1.1] - 2025-08-11
11
59