therefore 1.0.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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +451 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +8 -0
- data/LICENSE +21 -0
- data/README.md +106 -0
- data/Rakefile +12 -0
- data/lib/therefore/false_class_patch.rb +25 -0
- data/lib/therefore/kernel_patch.rb +21 -0
- data/lib/therefore/nil_class_patch.rb +25 -0
- data/lib/therefore/version.rb +3 -0
- data/lib/therefore.rb +4 -0
- metadata +61 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: b48be7ef4ee5a7ab3ace829843bc2f53129feb056f01e4697c752351aee5434c
|
|
4
|
+
data.tar.gz: 0631270b4eb1b7b3d116957083af143e1c7e7866b1717cf21101abe619ef761e
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: d51de8f98f23b3877165d6af60aabb12273bf8525c124eac96967e7ea95347838b165bd0788872cf6b5dc32505b88624d1a7bb286854a5cf90e818094f78b135
|
|
7
|
+
data.tar.gz: cefd3f2f6658fa5898d968f0cb32da6edd7aacb49f915ed637fd63d4d1e1a1b9f3e23be7ee81f15a471b9ff76dd8bffee8401f2a94ab14223f038cf0642a49fe
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
Exclude:
|
|
3
|
+
- 'bin/**'
|
|
4
|
+
|
|
5
|
+
Gemspec/DeprecatedAttributeAssignment:
|
|
6
|
+
Enabled: true
|
|
7
|
+
|
|
8
|
+
Gemspec/DevelopmentDependencies:
|
|
9
|
+
Enabled: true
|
|
10
|
+
|
|
11
|
+
Gemspec/RequireMFA:
|
|
12
|
+
Enabled: false
|
|
13
|
+
|
|
14
|
+
Layout/AccessModifierIndentation:
|
|
15
|
+
EnforcedStyle: outdent
|
|
16
|
+
|
|
17
|
+
Layout/BeginEndAlignment:
|
|
18
|
+
EnforcedStyleAlignWith: begin
|
|
19
|
+
|
|
20
|
+
Layout/BlockAlignment:
|
|
21
|
+
EnforcedStyleAlignWith: start_of_block
|
|
22
|
+
|
|
23
|
+
Layout/CommentIndentation:
|
|
24
|
+
AllowForAlignment: true
|
|
25
|
+
|
|
26
|
+
Layout/EmptyLineAfterMultilineCondition:
|
|
27
|
+
Enabled: true
|
|
28
|
+
|
|
29
|
+
Layout/EndOfLine:
|
|
30
|
+
EnforcedStyle: lf
|
|
31
|
+
|
|
32
|
+
Layout/ExtraSpacing:
|
|
33
|
+
AllowForAlignment: true
|
|
34
|
+
AllowBeforeTrailingComments: true
|
|
35
|
+
|
|
36
|
+
Layout/HashAlignment:
|
|
37
|
+
EnforcedHashRocketStyle: table
|
|
38
|
+
EnforcedColonStyle: table
|
|
39
|
+
EnforcedLastArgumentHashStyle: ignore_implicit
|
|
40
|
+
|
|
41
|
+
Layout/LineContinuationLeadingSpace:
|
|
42
|
+
Enabled: true
|
|
43
|
+
|
|
44
|
+
Layout/LineContinuationSpacing:
|
|
45
|
+
Enabled: true
|
|
46
|
+
|
|
47
|
+
Layout/LineEndStringConcatenationIndentation:
|
|
48
|
+
Enabled: true
|
|
49
|
+
|
|
50
|
+
Layout/MultilineArrayLineBreaks:
|
|
51
|
+
Enabled: true
|
|
52
|
+
|
|
53
|
+
Layout/MultilineAssignmentLayout:
|
|
54
|
+
Enabled: true
|
|
55
|
+
EnforcedStyle: same_line
|
|
56
|
+
|
|
57
|
+
Layout/MultilineHashKeyLineBreaks:
|
|
58
|
+
Enabled: true
|
|
59
|
+
|
|
60
|
+
Layout/MultilineMethodArgumentLineBreaks:
|
|
61
|
+
Enabled: true
|
|
62
|
+
|
|
63
|
+
Layout/MultilineMethodCallIndentation:
|
|
64
|
+
EnforcedStyle: indented_relative_to_receiver
|
|
65
|
+
|
|
66
|
+
Layout/SingleLineBlockChain:
|
|
67
|
+
Enabled: true
|
|
68
|
+
|
|
69
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
|
70
|
+
EnforcedStyle: no_space
|
|
71
|
+
|
|
72
|
+
Layout/SpaceAroundOperators:
|
|
73
|
+
EnforcedStyleForExponentOperator: space
|
|
74
|
+
|
|
75
|
+
Layout/SpaceBeforeBrackets:
|
|
76
|
+
Enabled: true
|
|
77
|
+
|
|
78
|
+
Layout/SpaceInsideHashLiteralBraces:
|
|
79
|
+
EnforcedStyle: no_space
|
|
80
|
+
|
|
81
|
+
Layout/TrailingWhitespace:
|
|
82
|
+
AllowInHeredoc: true
|
|
83
|
+
|
|
84
|
+
Lint/AmbiguousAssignment:
|
|
85
|
+
Enabled: true
|
|
86
|
+
|
|
87
|
+
Lint/AmbiguousOperatorPrecedence:
|
|
88
|
+
Enabled: true
|
|
89
|
+
|
|
90
|
+
Lint/AmbiguousRange:
|
|
91
|
+
Enabled: true
|
|
92
|
+
RequireParenthesesForMethodChains: true
|
|
93
|
+
|
|
94
|
+
Lint/AssignmentInCondition:
|
|
95
|
+
AllowSafeAssignment: false
|
|
96
|
+
|
|
97
|
+
Lint/ConstantOverwrittenInRescue:
|
|
98
|
+
Enabled: true
|
|
99
|
+
|
|
100
|
+
Lint/DeprecatedConstants:
|
|
101
|
+
Enabled: true
|
|
102
|
+
|
|
103
|
+
Lint/DuplicateBranch:
|
|
104
|
+
Enabled: true
|
|
105
|
+
IgnoreLiteralBranches: true
|
|
106
|
+
IgnoreConstantBranches: true
|
|
107
|
+
|
|
108
|
+
Lint/DuplicateMagicComment:
|
|
109
|
+
Enabled: true
|
|
110
|
+
|
|
111
|
+
Lint/DuplicateRegexpCharacterClassElement:
|
|
112
|
+
Enabled: true
|
|
113
|
+
|
|
114
|
+
Lint/EmptyBlock:
|
|
115
|
+
Enabled: true
|
|
116
|
+
|
|
117
|
+
Lint/EmptyClass:
|
|
118
|
+
Enabled: true
|
|
119
|
+
AllowComments: true
|
|
120
|
+
|
|
121
|
+
Lint/EmptyInPattern:
|
|
122
|
+
Enabled: true
|
|
123
|
+
|
|
124
|
+
Lint/HeredocMethodCallPosition:
|
|
125
|
+
Enabled: true
|
|
126
|
+
|
|
127
|
+
Lint/IncompatibleIoSelectWithFiberScheduler:
|
|
128
|
+
Enabled: false
|
|
129
|
+
|
|
130
|
+
Lint/LambdaWithoutLiteralBlock:
|
|
131
|
+
Enabled: true
|
|
132
|
+
|
|
133
|
+
Lint/NoReturnInBeginEndBlocks:
|
|
134
|
+
Enabled: true
|
|
135
|
+
|
|
136
|
+
Lint/NonAtomicFileOperation:
|
|
137
|
+
Enabled: true
|
|
138
|
+
|
|
139
|
+
Lint/NumberedParameterAssignment:
|
|
140
|
+
Enabled: true
|
|
141
|
+
|
|
142
|
+
Lint/OrAssignmentToConstant:
|
|
143
|
+
Enabled: true
|
|
144
|
+
|
|
145
|
+
Lint/RedundantDirGlobSort:
|
|
146
|
+
Enabled: true
|
|
147
|
+
|
|
148
|
+
Lint/RedundantSplatExpansion:
|
|
149
|
+
AllowPercentLiteralArrayArgument: false
|
|
150
|
+
|
|
151
|
+
Lint/RefinementImportMethods:
|
|
152
|
+
Enabled: true
|
|
153
|
+
|
|
154
|
+
Lint/RequireRangeParentheses:
|
|
155
|
+
Enabled: true
|
|
156
|
+
|
|
157
|
+
Lint/RequireRelativeSelfPath:
|
|
158
|
+
Enabled: true
|
|
159
|
+
|
|
160
|
+
Lint/SymbolConversion:
|
|
161
|
+
Enabled: true
|
|
162
|
+
|
|
163
|
+
Lint/ToEnumArguments:
|
|
164
|
+
Enabled: true
|
|
165
|
+
|
|
166
|
+
Lint/TripleQuotes:
|
|
167
|
+
Enabled: true
|
|
168
|
+
|
|
169
|
+
Lint/UnexpectedBlockArity:
|
|
170
|
+
Enabled: true
|
|
171
|
+
|
|
172
|
+
Lint/UnmodifiedReduceAccumulator:
|
|
173
|
+
Enabled: true
|
|
174
|
+
|
|
175
|
+
Lint/UnusedBlockArgument:
|
|
176
|
+
AutoCorrect: false
|
|
177
|
+
|
|
178
|
+
Lint/UnusedMethodArgument:
|
|
179
|
+
AutoCorrect: false
|
|
180
|
+
|
|
181
|
+
Lint/UselessRescue:
|
|
182
|
+
Enabled: true
|
|
183
|
+
|
|
184
|
+
Lint/UselessRuby2Keywords:
|
|
185
|
+
Enabled: true
|
|
186
|
+
|
|
187
|
+
Metrics:
|
|
188
|
+
Enabled: false
|
|
189
|
+
|
|
190
|
+
Naming/BlockForwarding:
|
|
191
|
+
Enabled: true
|
|
192
|
+
|
|
193
|
+
Naming/InclusiveLanguage:
|
|
194
|
+
Enabled: false
|
|
195
|
+
|
|
196
|
+
Security/CompoundHash:
|
|
197
|
+
Enabled: true
|
|
198
|
+
|
|
199
|
+
Security/Eval:
|
|
200
|
+
Enabled: false
|
|
201
|
+
|
|
202
|
+
Security/IoMethods:
|
|
203
|
+
Enabled: true
|
|
204
|
+
|
|
205
|
+
Style/AccessorGrouping:
|
|
206
|
+
EnforcedStyle: separated
|
|
207
|
+
|
|
208
|
+
Style/ArgumentsForwarding:
|
|
209
|
+
Enabled: false
|
|
210
|
+
|
|
211
|
+
Style/ArrayIntersect:
|
|
212
|
+
Enabled: true
|
|
213
|
+
|
|
214
|
+
Style/AutoResourceCleanup:
|
|
215
|
+
Enabled: true
|
|
216
|
+
|
|
217
|
+
Style/CollectionCompact:
|
|
218
|
+
Enabled: true
|
|
219
|
+
|
|
220
|
+
Style/CollectionMethods:
|
|
221
|
+
Enabled: true
|
|
222
|
+
|
|
223
|
+
Style/ComparableClamp:
|
|
224
|
+
Enabled: true
|
|
225
|
+
|
|
226
|
+
Style/ConcatArrayLiterals:
|
|
227
|
+
Enabled: true
|
|
228
|
+
|
|
229
|
+
Style/DirEmpty:
|
|
230
|
+
Enabled: true
|
|
231
|
+
|
|
232
|
+
Style/DocumentDynamicEvalDefinition:
|
|
233
|
+
Enabled: false
|
|
234
|
+
|
|
235
|
+
Style/Documentation:
|
|
236
|
+
Enabled: false
|
|
237
|
+
|
|
238
|
+
Style/DocumentationMethod:
|
|
239
|
+
Enabled: false
|
|
240
|
+
|
|
241
|
+
Style/DoubleNegation:
|
|
242
|
+
EnforcedStyle: forbidden
|
|
243
|
+
|
|
244
|
+
Style/EmptyHeredoc:
|
|
245
|
+
Enabled: true
|
|
246
|
+
|
|
247
|
+
Style/EmptyMethod:
|
|
248
|
+
EnforcedStyle: expanded
|
|
249
|
+
|
|
250
|
+
Style/EndlessMethod:
|
|
251
|
+
Enabled: true
|
|
252
|
+
EnforcedStyle: disallow
|
|
253
|
+
|
|
254
|
+
Style/EnvHome:
|
|
255
|
+
Enabled: true
|
|
256
|
+
|
|
257
|
+
Style/FetchEnvVar:
|
|
258
|
+
Enabled: false
|
|
259
|
+
|
|
260
|
+
Style/FileEmpty:
|
|
261
|
+
Enabled: true
|
|
262
|
+
|
|
263
|
+
Style/FileRead:
|
|
264
|
+
Enabled: true
|
|
265
|
+
|
|
266
|
+
Style/FileWrite:
|
|
267
|
+
Enabled: true
|
|
268
|
+
|
|
269
|
+
Style/FormatString:
|
|
270
|
+
EnforcedStyle: percent
|
|
271
|
+
|
|
272
|
+
Style/FrozenStringLiteralComment:
|
|
273
|
+
Enabled: false
|
|
274
|
+
|
|
275
|
+
Style/HashConversion:
|
|
276
|
+
Enabled: true
|
|
277
|
+
|
|
278
|
+
Style/HashExcept:
|
|
279
|
+
Enabled: true
|
|
280
|
+
|
|
281
|
+
Style/HashSyntax:
|
|
282
|
+
EnforcedShorthandSyntax: never
|
|
283
|
+
|
|
284
|
+
Style/IfWithBooleanLiteralBranches:
|
|
285
|
+
Enabled: true
|
|
286
|
+
|
|
287
|
+
Style/ImplicitRuntimeError:
|
|
288
|
+
Enabled: true
|
|
289
|
+
|
|
290
|
+
Style/InPatternThen:
|
|
291
|
+
Enabled: true
|
|
292
|
+
|
|
293
|
+
Style/IpAddresses:
|
|
294
|
+
Enabled: true
|
|
295
|
+
|
|
296
|
+
Style/MagicCommentFormat:
|
|
297
|
+
Enabled: true
|
|
298
|
+
|
|
299
|
+
Style/MapCompactWithConditionalBlock:
|
|
300
|
+
Enabled: true
|
|
301
|
+
|
|
302
|
+
Style/MapToHash:
|
|
303
|
+
Enabled: true
|
|
304
|
+
|
|
305
|
+
Style/MapToSet:
|
|
306
|
+
Enabled: true
|
|
307
|
+
|
|
308
|
+
Style/MethodCallWithArgsParentheses:
|
|
309
|
+
Enabled: true
|
|
310
|
+
EnforcedStyle: omit_parentheses
|
|
311
|
+
AllowParenthesesInMultilineCall: true
|
|
312
|
+
AllowParenthesesInChaining: true
|
|
313
|
+
AllowParenthesesInCamelCaseMethod: true
|
|
314
|
+
|
|
315
|
+
Style/MethodDefParentheses:
|
|
316
|
+
EnforcedStyle: require_no_parentheses_except_multiline
|
|
317
|
+
|
|
318
|
+
Style/MinMaxComparison:
|
|
319
|
+
Enabled: true
|
|
320
|
+
|
|
321
|
+
Style/MultilineBlockChain:
|
|
322
|
+
Enabled: false
|
|
323
|
+
|
|
324
|
+
Style/MultilineInPatternThen:
|
|
325
|
+
Enabled: true
|
|
326
|
+
|
|
327
|
+
Style/NegatedIfElseCondition:
|
|
328
|
+
Enabled: true
|
|
329
|
+
|
|
330
|
+
Style/NestedFileDirname:
|
|
331
|
+
Enabled: true
|
|
332
|
+
|
|
333
|
+
Style/NestedParenthesizedCalls:
|
|
334
|
+
Enabled: false
|
|
335
|
+
|
|
336
|
+
Style/NilLambda:
|
|
337
|
+
Enabled: true
|
|
338
|
+
|
|
339
|
+
Style/NonNilCheck:
|
|
340
|
+
Enabled: false
|
|
341
|
+
|
|
342
|
+
Style/NumberedParameters:
|
|
343
|
+
Enabled: true
|
|
344
|
+
EnforcedStyle: disallow
|
|
345
|
+
|
|
346
|
+
Style/NumberedParametersLimit:
|
|
347
|
+
Enabled: true
|
|
348
|
+
|
|
349
|
+
Style/ObjectThen:
|
|
350
|
+
Enabled: true
|
|
351
|
+
|
|
352
|
+
Style/OpenStructUse:
|
|
353
|
+
Enabled: false
|
|
354
|
+
|
|
355
|
+
Style/OperatorMethodCall:
|
|
356
|
+
Enabled: true
|
|
357
|
+
|
|
358
|
+
Style/OptionHash:
|
|
359
|
+
Enabled: true
|
|
360
|
+
|
|
361
|
+
Style/QuotedSymbols:
|
|
362
|
+
Enabled: true
|
|
363
|
+
|
|
364
|
+
Style/RedundantArgument:
|
|
365
|
+
Enabled: false
|
|
366
|
+
|
|
367
|
+
Style/RedundantConstantBase:
|
|
368
|
+
Enabled: false
|
|
369
|
+
|
|
370
|
+
Style/RedundantDoubleSplatHashBraces:
|
|
371
|
+
Enabled: true
|
|
372
|
+
|
|
373
|
+
Style/RedundantEach:
|
|
374
|
+
Enabled: true
|
|
375
|
+
|
|
376
|
+
Style/RedundantException:
|
|
377
|
+
Enabled: false
|
|
378
|
+
|
|
379
|
+
Style/RedundantHeredocDelimiterQuotes:
|
|
380
|
+
Enabled: true
|
|
381
|
+
|
|
382
|
+
Style/RedundantInitialize:
|
|
383
|
+
Enabled: true
|
|
384
|
+
|
|
385
|
+
Style/RedundantParentheses:
|
|
386
|
+
Enabled: false
|
|
387
|
+
|
|
388
|
+
Style/RedundantSelfAssignmentBranch:
|
|
389
|
+
Enabled: true
|
|
390
|
+
|
|
391
|
+
Style/RedundantStringEscape:
|
|
392
|
+
Enabled: true
|
|
393
|
+
|
|
394
|
+
Style/RegexpLiteral:
|
|
395
|
+
EnforcedStyle: percent_r
|
|
396
|
+
|
|
397
|
+
Style/ReturnNil:
|
|
398
|
+
Enabled: true
|
|
399
|
+
|
|
400
|
+
Style/SelectByRegexp:
|
|
401
|
+
Enabled: true
|
|
402
|
+
|
|
403
|
+
Style/SingleLineMethods:
|
|
404
|
+
AllowIfMethodIsEmpty: false
|
|
405
|
+
|
|
406
|
+
Style/StaticClass:
|
|
407
|
+
Enabled: true
|
|
408
|
+
|
|
409
|
+
Style/StringChars:
|
|
410
|
+
Enabled: true
|
|
411
|
+
|
|
412
|
+
Style/StringHashKeys:
|
|
413
|
+
Enabled: false
|
|
414
|
+
|
|
415
|
+
Style/SwapValues:
|
|
416
|
+
Enabled: true
|
|
417
|
+
|
|
418
|
+
Style/SymbolArray:
|
|
419
|
+
EnforcedStyle: brackets
|
|
420
|
+
|
|
421
|
+
Style/TernaryParentheses:
|
|
422
|
+
EnforcedStyle: require_parentheses_when_complex
|
|
423
|
+
AllowSafeAssignment: false
|
|
424
|
+
|
|
425
|
+
Style/TopLevelMethodDefinition:
|
|
426
|
+
Enabled: true
|
|
427
|
+
|
|
428
|
+
Style/TrailingCommaInArguments:
|
|
429
|
+
Enabled: true
|
|
430
|
+
EnforcedStyleForMultiline: no_comma
|
|
431
|
+
|
|
432
|
+
Style/TrailingCommaInArrayLiteral:
|
|
433
|
+
Enabled: true
|
|
434
|
+
EnforcedStyleForMultiline: no_comma
|
|
435
|
+
|
|
436
|
+
Style/TrailingCommaInBlockArgs:
|
|
437
|
+
Enabled: true
|
|
438
|
+
|
|
439
|
+
Style/TrailingCommaInHashLiteral:
|
|
440
|
+
Enabled: true
|
|
441
|
+
EnforcedStyleForMultiline: no_comma
|
|
442
|
+
|
|
443
|
+
Style/UnlessLogicalOperators:
|
|
444
|
+
EnforcedStyle: forbid_logical_operators
|
|
445
|
+
|
|
446
|
+
Style/WordArray:
|
|
447
|
+
EnforcedStyle: brackets
|
|
448
|
+
|
|
449
|
+
Style/YodaCondition:
|
|
450
|
+
Enabled: true
|
|
451
|
+
EnforcedStyle: forbid_for_all_comparison_operators
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Moku S.r.l., Riccardo Agatea
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Therefore
|
|
2
|
+
|
|
3
|
+
A simple wrapper for `if` conditionals, what `each` is for `while` loops.
|
|
4
|
+
|
|
5
|
+
Just like `each`, `therefore` relies on block semantics, so it's essentially an `if` conditional with a scope, a closure, and the ability to be chained with other methods.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
Add this line to your application's Gemfile:
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
gem 'therefore', '~> 1.0'
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
And then execute:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
$ bundle
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Or you can install the gem on its own:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
gem install therefore
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
`obj.therefore {...}` will invoke the block, yielding `obj` to it, unless `obj` is either `nil` or `false`. If the block is invoked its result is returned, otherwise `obj` is returned:
|
|
30
|
+
|
|
31
|
+
```ruby
|
|
32
|
+
def find_user input: {}
|
|
33
|
+
input[:id].therefore do |user_id|
|
|
34
|
+
User.find user_id
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
find_user input: {id: 1} # => #<User id: 1, ...>
|
|
39
|
+
find_user input: {id: nil} # => nil
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`obj.otherwise {...}` behaves symmetrically to `therefore`: it only invokes the block, again yielding `obj`, if `obj` is either `false` or `nil`. Again, if the block is invoked its result is returned, otherwise `obj` is returned. If you chain it with `therefore`, it can work as an `else` branch:
|
|
43
|
+
|
|
44
|
+
```ruby
|
|
45
|
+
def find_user input: {}
|
|
46
|
+
input[:id].therefore do |user_id|
|
|
47
|
+
User.find user_id
|
|
48
|
+
end.otherwise do
|
|
49
|
+
User.default
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
find_user input: {id: 1} # => #<User id: 1, ...>
|
|
54
|
+
find_user input: {id: nil} # => #<User default: true, ...>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
You can also invoke `otherwise` with a parameter, in which case it works as an `elsif` branch:
|
|
58
|
+
|
|
59
|
+
```ruby
|
|
60
|
+
obj.otherwise(other_obj) do |var|
|
|
61
|
+
...
|
|
62
|
+
end
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
is equivalent to
|
|
66
|
+
|
|
67
|
+
```ruby
|
|
68
|
+
obj.otherwise do
|
|
69
|
+
other_obj.therefore do |var|
|
|
70
|
+
...
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Both `therefore` and `otherwise` can be called without a block, in which case they return an enumerator. If the block would have been invoked the enumerator contains `obj`, otherwise it is empty:
|
|
76
|
+
|
|
77
|
+
```ruby
|
|
78
|
+
nil.therefore.to_a # => []
|
|
79
|
+
nil.otherwise.to_a # => [nil]
|
|
80
|
+
'string'.therefore.to_a # => ['string']
|
|
81
|
+
'string'.otherwise.to_a # => []
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Version numbers
|
|
85
|
+
|
|
86
|
+
Therefore loosely follows [Semantic Versioning](https://semver.org/), with a hard guarantee that breaking changes to the public API will always coincide with an increase to the `MAJOR` number.
|
|
87
|
+
|
|
88
|
+
Version numbers are in three parts: `MAJOR.MINOR.PATCH`.
|
|
89
|
+
|
|
90
|
+
- Breaking changes to the public API increment the `MAJOR`. There may also be changes that would otherwise increase the `MINOR` or the `PATCH`.
|
|
91
|
+
- Additions, deprecations, and "big" non breaking changes to the public API increment the `MINOR`. There may also be changes that would otherwise increase the `PATCH`.
|
|
92
|
+
- Bug fixes and "small" non breaking changes to the public API increment the `PATCH`.
|
|
93
|
+
|
|
94
|
+
Notice that any feature deprecated by a minor release can be expected to be removed by the next major release.
|
|
95
|
+
|
|
96
|
+
## Changelog
|
|
97
|
+
|
|
98
|
+
Full list of changes in [CHANGELOG.md](CHANGELOG.md)
|
|
99
|
+
|
|
100
|
+
## Contributing
|
|
101
|
+
|
|
102
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/moku-io/therefore.
|
|
103
|
+
|
|
104
|
+
## License
|
|
105
|
+
|
|
106
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class FalseClass
|
|
2
|
+
def therefore
|
|
3
|
+
if block_given?
|
|
4
|
+
self
|
|
5
|
+
else
|
|
6
|
+
Enumerator.new do
|
|
7
|
+
# Empty enumerator
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def otherwise *args, &block
|
|
13
|
+
if args.empty?
|
|
14
|
+
if block_given?
|
|
15
|
+
yield self
|
|
16
|
+
else
|
|
17
|
+
Enumerator.new do |yielder|
|
|
18
|
+
yielder << self
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
else
|
|
22
|
+
args.first.therefore(&block)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Kernel
|
|
2
|
+
def therefore
|
|
3
|
+
if block_given?
|
|
4
|
+
yield self
|
|
5
|
+
else
|
|
6
|
+
Enumerator.new do |yielder|
|
|
7
|
+
yielder << self
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def otherwise *_args
|
|
13
|
+
if block_given?
|
|
14
|
+
self
|
|
15
|
+
else
|
|
16
|
+
Enumerator.new do
|
|
17
|
+
# Empty enumerator
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class NilClass
|
|
2
|
+
def therefore
|
|
3
|
+
if block_given?
|
|
4
|
+
self
|
|
5
|
+
else
|
|
6
|
+
Enumerator.new do
|
|
7
|
+
# Empty enumerator
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def otherwise *args, &block
|
|
13
|
+
if args.empty?
|
|
14
|
+
if block_given?
|
|
15
|
+
yield self
|
|
16
|
+
else
|
|
17
|
+
Enumerator.new do |yielder|
|
|
18
|
+
yielder << self
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
else
|
|
22
|
+
args.first.therefore(&block)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/therefore.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: therefore
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Moku S.r.l.
|
|
8
|
+
- Riccardo Agatea
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: exe
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2023-05-04 00:00:00.000000000 Z
|
|
13
|
+
dependencies: []
|
|
14
|
+
description: Just like each, therefore relies on block semantics, so it's essentially
|
|
15
|
+
an if conditional with a scope, a closure, and the ability to be chained with other
|
|
16
|
+
methods.
|
|
17
|
+
email:
|
|
18
|
+
- info@moku.io
|
|
19
|
+
executables: []
|
|
20
|
+
extensions: []
|
|
21
|
+
extra_rdoc_files: []
|
|
22
|
+
files:
|
|
23
|
+
- ".rspec"
|
|
24
|
+
- ".rubocop.yml"
|
|
25
|
+
- CHANGELOG.md
|
|
26
|
+
- Gemfile
|
|
27
|
+
- LICENSE
|
|
28
|
+
- README.md
|
|
29
|
+
- Rakefile
|
|
30
|
+
- lib/therefore.rb
|
|
31
|
+
- lib/therefore/false_class_patch.rb
|
|
32
|
+
- lib/therefore/kernel_patch.rb
|
|
33
|
+
- lib/therefore/nil_class_patch.rb
|
|
34
|
+
- lib/therefore/version.rb
|
|
35
|
+
homepage: https://github.com/moku-io/therefore
|
|
36
|
+
licenses:
|
|
37
|
+
- MIT
|
|
38
|
+
metadata:
|
|
39
|
+
homepage_uri: https://github.com/moku-io/therefore
|
|
40
|
+
source_code_uri: https://github.com/moku-io/therefore
|
|
41
|
+
changelog_uri: https://github.com/moku-io/therefore/blob/master/CHANGELOG.md
|
|
42
|
+
post_install_message:
|
|
43
|
+
rdoc_options: []
|
|
44
|
+
require_paths:
|
|
45
|
+
- lib
|
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
47
|
+
requirements:
|
|
48
|
+
- - ">="
|
|
49
|
+
- !ruby/object:Gem::Version
|
|
50
|
+
version: 2.6.0
|
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
|
+
requirements:
|
|
53
|
+
- - ">="
|
|
54
|
+
- !ruby/object:Gem::Version
|
|
55
|
+
version: '0'
|
|
56
|
+
requirements: []
|
|
57
|
+
rubygems_version: 3.4.6
|
|
58
|
+
signing_key:
|
|
59
|
+
specification_version: 4
|
|
60
|
+
summary: A simple wrapper for if conditionals, what each is for while loops.
|
|
61
|
+
test_files: []
|