diva 1.0.3 → 2.0.1
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 +4 -4
- data/.circleci/config.yml +34 -7
- data/.rubocop.yml +394 -0
- data/Rakefile +5 -5
- data/bin/console +3 -3
- data/diva.gemspec +23 -18
- data/lib/diva/datasource.rb +2 -1
- data/lib/diva/error.rb +1 -1
- data/lib/diva/field_generator.rb +4 -8
- data/lib/diva/model.rb +28 -28
- data/lib/diva/model_extend.rb +3 -3
- data/lib/diva/spec.rb +1 -1
- data/lib/diva/type.rb +29 -24
- data/lib/diva/uri.rb +9 -5
- data/lib/diva/version.rb +1 -1
- data/lib/diva.rb +1 -2
- metadata +37 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1f4b5814e98320545b1b911edff9206dd0d701065496f6bc61a89c3ad1e102b
|
4
|
+
data.tar.gz: d07c6bcca5ad1c5c12d45373f3c813232356833fe000c39122b51686af2877d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0bfefc01f13322c81d39ef8cd7c4d31f1e66e30f12b5bb9061b25069eccd524989e0f83b9a84ea82f4d9f63f93a68376100ebbb77f2d1e095aaf06e3c02b53f
|
7
|
+
data.tar.gz: a1c7995794e5aec9cced403b1f59cd57b2e615ecb4dff64acf395b040792af26837f450ab08891aac6c9a0d271cd9fef200a4fed935c6d1ce63e64c2e57b9a14
|
data/.circleci/config.yml
CHANGED
@@ -6,7 +6,7 @@ executors:
|
|
6
6
|
tag:
|
7
7
|
type: string
|
8
8
|
docker:
|
9
|
-
- image:
|
9
|
+
- image: ruby:<< parameters.tag >>
|
10
10
|
|
11
11
|
jobs:
|
12
12
|
build:
|
@@ -26,15 +26,42 @@ jobs:
|
|
26
26
|
- run:
|
27
27
|
name: test
|
28
28
|
command: bundle exec rake test
|
29
|
+
lint:
|
30
|
+
parameters:
|
31
|
+
ruby-version:
|
32
|
+
type: string
|
33
|
+
executor:
|
34
|
+
name: ruby
|
35
|
+
tag: << parameters.ruby-version >>
|
36
|
+
steps:
|
37
|
+
- checkout
|
38
|
+
- run:
|
39
|
+
name: Which bundler?
|
40
|
+
command: bundle -v
|
41
|
+
- run:
|
42
|
+
command: bundle install --path vendor/bundle
|
43
|
+
- run:
|
44
|
+
name: rubocop
|
45
|
+
command: bundle exec rubocop lib/
|
46
|
+
|
29
47
|
workflows:
|
30
48
|
build:
|
31
49
|
jobs:
|
50
|
+
- lint:
|
51
|
+
name: 'lint'
|
52
|
+
ruby-version: '3.0.3'
|
32
53
|
- build:
|
33
|
-
name: 'ruby-2.
|
34
|
-
ruby-version: '2.5
|
54
|
+
name: 'ruby-2.7'
|
55
|
+
ruby-version: '2.7.5'
|
56
|
+
requires:
|
57
|
+
- 'lint'
|
35
58
|
- build:
|
36
|
-
name: 'ruby-
|
37
|
-
ruby-version: '
|
59
|
+
name: 'ruby-3.0'
|
60
|
+
ruby-version: '3.0.3'
|
61
|
+
requires:
|
62
|
+
- 'lint'
|
38
63
|
- build:
|
39
|
-
name: 'ruby-
|
40
|
-
ruby-version: '
|
64
|
+
name: 'ruby-3.1'
|
65
|
+
ruby-version: '3.1.0-preview1'
|
66
|
+
requires:
|
67
|
+
- 'lint'
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,394 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: '2.7'
|
3
|
+
|
4
|
+
Metrics/BlockLength:
|
5
|
+
Exclude:
|
6
|
+
- test/**/*.rb
|
7
|
+
- lib/tasks/**/*.rake
|
8
|
+
- Gemfile
|
9
|
+
Max: 156
|
10
|
+
|
11
|
+
Layout/LineLength:
|
12
|
+
AllowHeredoc: true
|
13
|
+
AllowURI: true
|
14
|
+
Max: 293
|
15
|
+
Exclude:
|
16
|
+
- test/**/*.rb
|
17
|
+
|
18
|
+
Metrics/ModuleLength:
|
19
|
+
Max: 109
|
20
|
+
CountAsOne: ['array', 'hash', 'heredoc']
|
21
|
+
Exclude:
|
22
|
+
- test/**/*.rb
|
23
|
+
|
24
|
+
Naming/AccessorMethodName:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
Style/Alias:
|
28
|
+
Enabled: false
|
29
|
+
|
30
|
+
Style/AsciiComments:
|
31
|
+
Enabled: false
|
32
|
+
|
33
|
+
Naming/AsciiIdentifiers:
|
34
|
+
Enabled: false
|
35
|
+
|
36
|
+
Metrics/BlockNesting:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
Style/CaseEquality:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
Style/ClassAndModuleChildren:
|
43
|
+
Enabled: false
|
44
|
+
|
45
|
+
Metrics/ClassLength:
|
46
|
+
Enabled: false
|
47
|
+
|
48
|
+
Style/ClassVars:
|
49
|
+
Enabled: false
|
50
|
+
|
51
|
+
Style/CollectionMethods:
|
52
|
+
PreferredMethods:
|
53
|
+
collect: map
|
54
|
+
detect: find
|
55
|
+
find_all: select
|
56
|
+
member?: include?
|
57
|
+
reduce: inject
|
58
|
+
|
59
|
+
Style/ColonMethodCall:
|
60
|
+
Enabled: true
|
61
|
+
|
62
|
+
Style/CommentAnnotation:
|
63
|
+
Enabled: false
|
64
|
+
|
65
|
+
Metrics/CyclomaticComplexity:
|
66
|
+
Enabled: false
|
67
|
+
|
68
|
+
Style/Documentation:
|
69
|
+
Enabled: false
|
70
|
+
|
71
|
+
Layout/DotPosition:
|
72
|
+
EnforcedStyle: leading
|
73
|
+
|
74
|
+
Style/DoubleNegation:
|
75
|
+
Enabled: false
|
76
|
+
|
77
|
+
Style/EachWithObject:
|
78
|
+
Enabled: false
|
79
|
+
|
80
|
+
Style/EmptyLiteral:
|
81
|
+
Enabled: true
|
82
|
+
|
83
|
+
Style/Encoding:
|
84
|
+
Enabled: false
|
85
|
+
|
86
|
+
Style/FormatString:
|
87
|
+
EnforcedStyle: percent
|
88
|
+
|
89
|
+
Style/FrozenStringLiteralComment:
|
90
|
+
Enabled: false
|
91
|
+
|
92
|
+
Style/GlobalVars:
|
93
|
+
Enabled: true
|
94
|
+
|
95
|
+
Style/GuardClause:
|
96
|
+
Enabled: false
|
97
|
+
|
98
|
+
Style/IfUnlessModifier:
|
99
|
+
Enabled: false
|
100
|
+
|
101
|
+
Style/IfWithSemicolon:
|
102
|
+
Enabled: false
|
103
|
+
|
104
|
+
Layout/IndentationConsistency:
|
105
|
+
EnforcedStyle: normal
|
106
|
+
|
107
|
+
Style/InlineComment:
|
108
|
+
Enabled: false
|
109
|
+
|
110
|
+
Style/Lambda:
|
111
|
+
EnforcedStyle: literal
|
112
|
+
|
113
|
+
Style/LambdaCall:
|
114
|
+
Enabled: false
|
115
|
+
|
116
|
+
Metrics/MethodLength:
|
117
|
+
Enabled: false
|
118
|
+
|
119
|
+
Style/ModuleFunction:
|
120
|
+
Enabled: false
|
121
|
+
|
122
|
+
Style/NegatedIf:
|
123
|
+
Enabled: true
|
124
|
+
EnforcedStyle: both
|
125
|
+
|
126
|
+
Style/Next:
|
127
|
+
Enabled: false
|
128
|
+
|
129
|
+
# false と nil の違いで分岐するようなコードは書くべきではない。
|
130
|
+
# `if a.nil?` のようなコードは、 `if a` に置き換える。
|
131
|
+
# nil と false を区別せざるを得ないところでのみ、 Style/NilComparison を無効化して nil? 利用すること
|
132
|
+
Style/NilComparison:
|
133
|
+
EnforcedStyle: comparison
|
134
|
+
|
135
|
+
Style/NumericLiterals:
|
136
|
+
Enabled: false
|
137
|
+
|
138
|
+
Style/OneLineConditional:
|
139
|
+
Enabled: false
|
140
|
+
|
141
|
+
Style/ParallelAssignment:
|
142
|
+
Enabled: false
|
143
|
+
|
144
|
+
Metrics/ParameterLists:
|
145
|
+
Enabled: false
|
146
|
+
|
147
|
+
Naming/PredicateName:
|
148
|
+
ForbiddenPrefixes:
|
149
|
+
- is_
|
150
|
+
MethodDefinitionMacros:
|
151
|
+
- define_method
|
152
|
+
- define_singleton_method
|
153
|
+
- defdsl
|
154
|
+
Exclude:
|
155
|
+
- 'test/*/'
|
156
|
+
|
157
|
+
Style/RaiseArgs:
|
158
|
+
Enabled: false
|
159
|
+
|
160
|
+
Style/RegexpLiteral:
|
161
|
+
Enabled: false
|
162
|
+
|
163
|
+
Style/SingleLineBlockParams:
|
164
|
+
Enabled: false
|
165
|
+
|
166
|
+
Style/SignalException:
|
167
|
+
Enabled: false
|
168
|
+
|
169
|
+
Style/StringLiterals:
|
170
|
+
EnforcedStyle: single_quotes
|
171
|
+
|
172
|
+
Style/TrailingCommaInArrayLiteral:
|
173
|
+
Enabled: true
|
174
|
+
EnforcedStyleForMultiline: no_comma
|
175
|
+
|
176
|
+
Style/TrailingCommaInHashLiteral:
|
177
|
+
Enabled: true
|
178
|
+
EnforcedStyleForMultiline: no_comma
|
179
|
+
|
180
|
+
Style/TrailingCommaInArguments:
|
181
|
+
Enabled: true
|
182
|
+
EnforcedStyleForMultiline: no_comma
|
183
|
+
|
184
|
+
Style/FormatStringToken:
|
185
|
+
EnforcedStyle: template
|
186
|
+
|
187
|
+
Style/TrivialAccessors:
|
188
|
+
Enabled: false
|
189
|
+
|
190
|
+
Lint/UnusedMethodArgument:
|
191
|
+
Enabled: false
|
192
|
+
|
193
|
+
Naming/VariableNumber:
|
194
|
+
Enabled: false
|
195
|
+
|
196
|
+
Style/WhileUntilModifier:
|
197
|
+
Enabled: false
|
198
|
+
|
199
|
+
Style/WordArray:
|
200
|
+
Enabled: false
|
201
|
+
|
202
|
+
Lint/AssignmentInCondition:
|
203
|
+
AllowSafeAssignment: false
|
204
|
+
|
205
|
+
Lint/SuppressedException:
|
206
|
+
Enabled: false
|
207
|
+
|
208
|
+
Lint/UnderscorePrefixedVariableName:
|
209
|
+
AllowKeywordBlockArguments: true
|
210
|
+
|
211
|
+
Lint/Void:
|
212
|
+
Enabled: true
|
213
|
+
|
214
|
+
Lint/UselessAssignment:
|
215
|
+
Exclude:
|
216
|
+
- test/**/*.rb
|
217
|
+
|
218
|
+
Layout/EmptyLines:
|
219
|
+
Exclude:
|
220
|
+
- test/**/*.rb
|
221
|
+
|
222
|
+
Style/NumericPredicate:
|
223
|
+
EnforcedStyle: comparison
|
224
|
+
|
225
|
+
# 結果が配列になるもの → []
|
226
|
+
# 配列にならないもの → <>
|
227
|
+
Style/PercentLiteralDelimiters:
|
228
|
+
PreferredDelimiters:
|
229
|
+
"%": '<>'
|
230
|
+
"%i": '[]'
|
231
|
+
"%q": '<>'
|
232
|
+
"%Q": '<>'
|
233
|
+
"%r": '<>'
|
234
|
+
"%s": '<>'
|
235
|
+
"%w": '[]'
|
236
|
+
"%W": '[]'
|
237
|
+
"%x": '<>'
|
238
|
+
|
239
|
+
Layout/SpaceAroundMethodCallOperator:
|
240
|
+
Enabled: true
|
241
|
+
|
242
|
+
Lint/RaiseException:
|
243
|
+
Enabled: true
|
244
|
+
|
245
|
+
Lint/StructNewOverride:
|
246
|
+
Enabled: true
|
247
|
+
|
248
|
+
Style/ExponentialNotation:
|
249
|
+
Enabled: true
|
250
|
+
|
251
|
+
Style/HashEachMethods:
|
252
|
+
Enabled: true
|
253
|
+
|
254
|
+
Style/HashTransformKeys:
|
255
|
+
Enabled: true
|
256
|
+
|
257
|
+
Style/HashTransformValues:
|
258
|
+
Enabled: true
|
259
|
+
|
260
|
+
Style/PreferredHashMethods:
|
261
|
+
EnforcedStyle: verbose
|
262
|
+
|
263
|
+
Layout/EmptyLineAfterGuardClause:
|
264
|
+
Enabled: false
|
265
|
+
|
266
|
+
Style/BlockDelimiters:
|
267
|
+
EnforcedStyle: braces_for_chaining
|
268
|
+
|
269
|
+
Metrics/AbcSize:
|
270
|
+
Max: 24.27
|
271
|
+
|
272
|
+
Style/MultilineBlockChain:
|
273
|
+
Enabled: false
|
274
|
+
|
275
|
+
Layout/MultilineMethodCallIndentation:
|
276
|
+
EnforcedStyle: indented_relative_to_receiver
|
277
|
+
|
278
|
+
Naming/MemoizedInstanceVariableName:
|
279
|
+
EnforcedStyleForLeadingUnderscores: optional
|
280
|
+
|
281
|
+
Layout/SpaceAroundOperators:
|
282
|
+
EnforcedStyleForExponentOperator: space
|
283
|
+
|
284
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
285
|
+
EnforcedStyle: no_space
|
286
|
+
|
287
|
+
Style/BlockComments:
|
288
|
+
Enabled: false
|
289
|
+
|
290
|
+
Naming/MethodName:
|
291
|
+
EnforcedStyle: snake_case
|
292
|
+
IgnoredPatterns:
|
293
|
+
- URI
|
294
|
+
- Type
|
295
|
+
|
296
|
+
Naming/RescuedExceptionsVariableName:
|
297
|
+
PreferredName: "exception"
|
298
|
+
|
299
|
+
Layout/SpaceBeforeBrackets: # (new in 1.7)
|
300
|
+
Enabled: true
|
301
|
+
Lint/AmbiguousAssignment: # (new in 1.7)
|
302
|
+
Enabled: true
|
303
|
+
Lint/DeprecatedConstants: # (new in 1.8)
|
304
|
+
Enabled: true
|
305
|
+
Lint/DuplicateBranch: # (new in 1.3)
|
306
|
+
Enabled: true
|
307
|
+
Lint/DuplicateRegexpCharacterClassElement: # (new in 1.1)
|
308
|
+
Enabled: true
|
309
|
+
Lint/EmptyBlock: # (new in 1.1)
|
310
|
+
Enabled: true
|
311
|
+
Lint/EmptyClass: # (new in 1.3)
|
312
|
+
Enabled: true
|
313
|
+
Lint/LambdaWithoutLiteralBlock: # (new in 1.8)
|
314
|
+
Enabled: true
|
315
|
+
Lint/NoReturnInBeginEndBlocks: # (new in 1.2)
|
316
|
+
Enabled: true
|
317
|
+
Lint/RedundantDirGlobSort: # (new in 1.8)
|
318
|
+
Enabled: true
|
319
|
+
Lint/ToEnumArguments: # (new in 1.1)
|
320
|
+
Enabled: true
|
321
|
+
Lint/UnexpectedBlockArity: # (new in 1.5)
|
322
|
+
Enabled: true
|
323
|
+
Lint/UnmodifiedReduceAccumulator: # (new in 1.1)
|
324
|
+
Enabled: true
|
325
|
+
Style/ArgumentsForwarding: # (new in 1.1)
|
326
|
+
Enabled: true
|
327
|
+
Style/CollectionCompact: # (new in 1.2)
|
328
|
+
Enabled: true
|
329
|
+
Style/DocumentDynamicEvalDefinition: # (new in 1.1)
|
330
|
+
Enabled: true
|
331
|
+
Style/EndlessMethod: # (new in 1.8)
|
332
|
+
Enabled: true
|
333
|
+
Style/HashExcept: # (new in 1.7)
|
334
|
+
Enabled: true
|
335
|
+
Style/NegatedIfElseCondition: # (new in 1.2)
|
336
|
+
Enabled: true
|
337
|
+
Style/NilLambda: # (new in 1.3)
|
338
|
+
Enabled: true
|
339
|
+
Style/RedundantArgument: # (new in 1.4)
|
340
|
+
Enabled: true
|
341
|
+
Style/SwapValues: # (new in 1.1)
|
342
|
+
Enabled: true
|
343
|
+
Gemspec/DateAssignment: # new in 1.10
|
344
|
+
Enabled: true
|
345
|
+
Gemspec/RequireMFA: # new in 1.23
|
346
|
+
Enabled: true
|
347
|
+
Layout/LineEndStringConcatenationIndentation: # new in 1.18
|
348
|
+
Enabled: true
|
349
|
+
Lint/AmbiguousOperatorPrecedence: # new in 1.21
|
350
|
+
Enabled: false
|
351
|
+
Lint/AmbiguousRange: # new in 1.19
|
352
|
+
Enabled: true
|
353
|
+
RequireParenthesesForMethodChains: true
|
354
|
+
Lint/EmptyInPattern: # new in 1.16
|
355
|
+
Enabled: true
|
356
|
+
Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
|
357
|
+
Enabled: true
|
358
|
+
Lint/NumberedParameterAssignment: # new in 1.9
|
359
|
+
Enabled: true
|
360
|
+
Lint/OrAssignmentToConstant: # new in 1.9
|
361
|
+
Enabled: true
|
362
|
+
Lint/RequireRelativeSelfPath: # new in 1.22
|
363
|
+
Enabled: true
|
364
|
+
Lint/SymbolConversion: # new in 1.9
|
365
|
+
Enabled: true
|
366
|
+
Lint/TripleQuotes: # new in 1.9
|
367
|
+
Enabled: true
|
368
|
+
Lint/UselessRuby2Keywords: # new in 1.23
|
369
|
+
Enabled: true
|
370
|
+
Security/IoMethods: # new in 1.22
|
371
|
+
Enabled: true
|
372
|
+
Style/HashConversion: # new in 1.10
|
373
|
+
Enabled: true
|
374
|
+
Style/IfWithBooleanLiteralBranches: # new in 1.9
|
375
|
+
Enabled: true
|
376
|
+
Style/InPatternThen: # new in 1.16
|
377
|
+
Enabled: true
|
378
|
+
Style/MultilineInPatternThen: # new in 1.16
|
379
|
+
Enabled: true
|
380
|
+
Style/NumberedParameters: # new in 1.22
|
381
|
+
Enabled: true
|
382
|
+
Style/NumberedParametersLimit: # new in 1.22
|
383
|
+
Enabled: true
|
384
|
+
Max: 1
|
385
|
+
Style/OpenStructUse: # new in 1.23
|
386
|
+
Enabled: true
|
387
|
+
Style/QuotedSymbols: # new in 1.16
|
388
|
+
Enabled: true
|
389
|
+
Style/RedundantSelfAssignmentBranch: # new in 1.19
|
390
|
+
Enabled: true
|
391
|
+
Style/SelectByRegexp: # new in 1.22
|
392
|
+
Enabled: true
|
393
|
+
Style/StringChars: # new in 1.12
|
394
|
+
Enabled: true
|
data/Rakefile
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
3
|
|
4
4
|
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs <<
|
6
|
-
t.libs <<
|
5
|
+
t.libs << 'test'
|
6
|
+
t.libs << 'lib'
|
7
7
|
t.test_files = FileList['test/**/*_test.rb']
|
8
8
|
end
|
9
9
|
|
10
|
-
task :
|
10
|
+
task default: :test
|
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'diva'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "diva"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/diva.gemspec
CHANGED
@@ -1,28 +1,33 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'diva/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'diva'
|
8
9
|
spec.version = Diva::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
|
12
|
-
spec.summary = %q{Implementation of expression for handling things.}
|
13
|
-
spec.homepage = "https://github.com/toshia/diva"
|
14
|
-
spec.license = "MIT"
|
10
|
+
spec.authors = ['Toshiaki Asai']
|
11
|
+
spec.email = ['toshi.alternative@gmail.com']
|
15
12
|
|
16
|
-
spec.
|
17
|
-
spec.
|
18
|
-
spec.
|
19
|
-
spec.
|
13
|
+
spec.summary = 'Implementation of expression for handling things.'
|
14
|
+
spec.homepage = 'https://github.com/toshia/diva'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
spec.required_ruby_version = '>= 2.7.0'
|
20
17
|
|
21
|
-
spec.
|
22
|
-
spec.
|
23
|
-
spec.
|
24
|
-
spec.
|
25
|
-
spec.add_development_dependency "simplecov", '>= 0.17.1', '< 1.0'
|
18
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r<^(test|spec|features)/>) }
|
19
|
+
spec.bindir = 'exe'
|
20
|
+
spec.executables = spec.files.grep(%r<^exe/>) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ['lib']
|
26
22
|
|
27
|
-
spec.
|
23
|
+
spec.add_development_dependency 'bundler', '>= 1.16.1', '< 3.0'
|
24
|
+
spec.add_development_dependency 'irb', '>= 1.3.7', '< 2.0'
|
25
|
+
spec.add_development_dependency 'minitest', '>= 5.14.4', '< 5.15'
|
26
|
+
spec.add_development_dependency 'rake', '>= 13.0.1', '< 14.0'
|
27
|
+
spec.add_development_dependency 'rubocop', '>= 1.23.0', '< 1.24.0'
|
28
|
+
spec.add_development_dependency 'simplecov', '>= 0.17.1', '< 1.0'
|
29
|
+
spec.add_dependency 'addressable', '>= 2.5.2', '< 3.0'
|
30
|
+
spec.metadata = {
|
31
|
+
'rubygems_mfa_required' => 'true'
|
32
|
+
}
|
28
33
|
end
|
data/lib/diva/datasource.rb
CHANGED
data/lib/diva/error.rb
CHANGED
data/lib/diva/field_generator.rb
CHANGED
@@ -9,6 +9,10 @@ class Diva::FieldGenerator
|
|
9
9
|
@model_klass.add_field(field_name, type: :int, required: required)
|
10
10
|
end
|
11
11
|
|
12
|
+
def float(field_name, required: false)
|
13
|
+
@model_klass.add_field(field_name, type: :float, required: required)
|
14
|
+
end
|
15
|
+
|
12
16
|
def string(field_name, required: false)
|
13
17
|
@model_klass.add_field(field_name, type: :string, required: required)
|
14
18
|
end
|
@@ -29,11 +33,3 @@ class Diva::FieldGenerator
|
|
29
33
|
@model_klass.add_field(field_name, type: type, required: required)
|
30
34
|
end
|
31
35
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
data/lib/diva/model.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
|
2
3
|
=begin rdoc
|
3
4
|
いろんなリソースの基底クラス
|
4
5
|
=end
|
@@ -23,7 +24,7 @@ class Diva::Model
|
|
23
24
|
# selfにあってotherにもあるカラムはotherの内容で上書きされる。
|
24
25
|
# 上書き後、データはDataSourceに保存される
|
25
26
|
def merge(other)
|
26
|
-
@value.update(other.
|
27
|
+
@value.update(other.to_h)
|
27
28
|
validate
|
28
29
|
self.class.store_datum(self)
|
29
30
|
end
|
@@ -56,13 +57,13 @@ class Diva::Model
|
|
56
57
|
end
|
57
58
|
|
58
59
|
def hash
|
59
|
-
@_hash ||=
|
60
|
+
@_hash ||= uri.to_s.hash ^ self.class.hash
|
60
61
|
end
|
61
62
|
|
62
63
|
def <=>(other)
|
63
64
|
if other.is_a?(Diva::Model)
|
64
65
|
created - other.created
|
65
|
-
elsif other.respond_to?(:[])
|
66
|
+
elsif other.respond_to?(:[]) && other[:created]
|
66
67
|
created - other[:created]
|
67
68
|
else
|
68
69
|
id - other
|
@@ -79,14 +80,12 @@ class Diva::Model
|
|
79
80
|
self == other
|
80
81
|
end
|
81
82
|
|
82
|
-
def
|
83
|
-
|
83
|
+
def to_h
|
84
|
+
self.class.fields.to_h { |f| [f.name, fetch(f.name)] }
|
84
85
|
end
|
85
86
|
|
86
87
|
def to_json(*rest)
|
87
|
-
|
88
|
-
self.class.fields.map{|f| [f.name, f.dump_for_json(fetch(f.name))] }
|
89
|
-
].to_json(*rest)
|
88
|
+
self.class.fields.to_h { |f| [f.name, f.dump_for_json(fetch(f.name))] }.to_json(*rest)
|
90
89
|
end
|
91
90
|
|
92
91
|
# カラムの生の内容を返す
|
@@ -100,32 +99,27 @@ class Diva::Model
|
|
100
99
|
def []=(key, value)
|
101
100
|
@value[key.to_sym] = value
|
102
101
|
self.class.store_datum(self)
|
103
|
-
value
|
104
102
|
end
|
105
103
|
|
106
104
|
# カラムと型が違うものがある場合、例外を発生させる。
|
107
105
|
def validate
|
108
|
-
raise
|
106
|
+
raise "argument is #{@value}, not Hash" unless @value.is_a?(Hash)
|
109
107
|
self.class.fields.each do |field|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
raise Diva::InvalidTypeError, "#{err} in field `#{field}'"
|
114
|
-
end
|
108
|
+
@value[field.name] = field.type.cast(@value[field.name])
|
109
|
+
rescue Diva::InvalidTypeError
|
110
|
+
raise Diva::InvalidTypeError, "#{self.class}.#{field} (#{field.type}): Invalid assign #{@value[field.name].inspect}:#{@value[field.name].class}"
|
115
111
|
end
|
116
112
|
end
|
117
113
|
|
118
114
|
# キーとして定義されていない値を全て除外した配列を生成して返す。
|
119
115
|
# また、Modelを子に含んでいる場合、それを外部キーに変換する。
|
120
116
|
def filtering
|
121
|
-
datum =
|
122
|
-
result =
|
117
|
+
datum = to_h
|
118
|
+
result = {}
|
123
119
|
self.class.fields.each do |field|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
raise Diva::InvalidTypeError, "#{err} in field `#{field}'"
|
128
|
-
end
|
120
|
+
result[field.name] = field.type.cast(datum[field.name])
|
121
|
+
rescue Diva::InvalidTypeError => exception
|
122
|
+
raise Diva::InvalidTypeError, "#{exception} in field `#{field}'"
|
129
123
|
end
|
130
124
|
result
|
131
125
|
end
|
@@ -133,10 +127,9 @@ class Diva::Model
|
|
133
127
|
# このインスタンスのタイトル。
|
134
128
|
def title
|
135
129
|
fields = self.class.fields.lazy.map(&:name)
|
136
|
-
|
137
|
-
when fields.include?(:name)
|
130
|
+
if fields.include?(:name)
|
138
131
|
name.gsub("\n", '')
|
139
|
-
|
132
|
+
elsif fields.include?(:description)
|
140
133
|
description.gsub("\n", '')
|
141
134
|
else
|
142
135
|
to_s.gsub("\n", '')
|
@@ -146,18 +139,25 @@ class Diva::Model
|
|
146
139
|
def dig(key, *args)
|
147
140
|
return nil unless key.respond_to?(:to_sym)
|
148
141
|
value = fetch(key)
|
149
|
-
if value
|
142
|
+
if value == nil || args.empty?
|
150
143
|
value
|
151
144
|
else
|
152
145
|
value.dig(*args)
|
153
146
|
end
|
154
147
|
end
|
155
148
|
|
149
|
+
def deconstruct_keys(keys)
|
150
|
+
if keys
|
151
|
+
@value.slice(*keys) # 高速化のため、fetchを呼び出していない
|
152
|
+
else
|
153
|
+
@value
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
156
157
|
private
|
158
|
+
|
157
159
|
# URIがデフォルトで使うpath要素
|
158
160
|
def path
|
159
161
|
@path ||= "/#{SecureRandom.uuid}"
|
160
162
|
end
|
161
|
-
|
162
163
|
end
|
163
|
-
|
data/lib/diva/model_extend.rb
CHANGED
@@ -15,14 +15,14 @@ module Diva::ModelExtend
|
|
15
15
|
# ==== Return
|
16
16
|
# [String] URIスキーム
|
17
17
|
def scheme
|
18
|
-
@_scheme ||=
|
18
|
+
@_scheme ||= to_s.split('::', 2).first.gsub(/\W/, '').downcase.freeze
|
19
19
|
end
|
20
20
|
|
21
21
|
# Modelのインスタンスのホスト名。オーバライドして適切な値にする
|
22
22
|
# ==== Return
|
23
23
|
# [String] ホスト名
|
24
24
|
def host
|
25
|
-
@_host ||=
|
25
|
+
@_host ||= to_s.split('::', 2).last.split('::').reverse.join('.').gsub(/[^\w.]/, '').downcase.freeze
|
26
26
|
end
|
27
27
|
|
28
28
|
# Modelにフィールドを追加する。
|
@@ -55,7 +55,7 @@ module Diva::ModelExtend
|
|
55
55
|
@fields ||= []
|
56
56
|
end
|
57
57
|
alias :keys :fields
|
58
|
-
deprecate :keys,
|
58
|
+
deprecate :keys, 'fields', 2018, 2
|
59
59
|
|
60
60
|
def schema
|
61
61
|
{
|
data/lib/diva/spec.rb
CHANGED
data/lib/diva/type.rb
CHANGED
@@ -27,7 +27,7 @@ Diva::Modelのサブクラスであれば、それを制約とすることがで
|
|
27
27
|
配列の全ての要素が設定された制約を満たしていれば、配列制約が満たされたことになる。
|
28
28
|
|
29
29
|
=end
|
30
|
-
require
|
30
|
+
require 'time'
|
31
31
|
require 'diva/uri'
|
32
32
|
|
33
33
|
module Diva::Type
|
@@ -73,7 +73,7 @@ module Diva::Type
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def inspect
|
76
|
-
"Diva::Type(#{
|
76
|
+
"Diva::Type(#{self})"
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -84,12 +84,12 @@ module Diva::Type
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def recommendation_point(value)
|
87
|
-
_, point = @recommended_classes.map.with_index{|k, i| [k, i] }.find{|k, _| value.is_a?(k) }
|
87
|
+
_, point = @recommended_classes.map.with_index { |k, i| [k, i] }.find { |k, _| value.is_a?(k) }
|
88
88
|
point
|
89
89
|
end
|
90
90
|
|
91
91
|
def schema
|
92
|
-
@schema ||= {type: uri}.freeze
|
92
|
+
@schema ||= { type: uri }.freeze
|
93
93
|
end
|
94
94
|
|
95
95
|
def uri
|
@@ -153,7 +153,11 @@ module Diva::Type
|
|
153
153
|
when Integer, Float
|
154
154
|
Time.at(v)
|
155
155
|
when String
|
156
|
-
|
156
|
+
begin
|
157
|
+
Time.iso8601(v)
|
158
|
+
rescue StandardError
|
159
|
+
Time.parse(v)
|
160
|
+
end
|
157
161
|
else
|
158
162
|
raise Diva::InvalidTypeError, "The value is not a `#{name}'."
|
159
163
|
end
|
@@ -169,7 +173,7 @@ module Diva::Type
|
|
169
173
|
end
|
170
174
|
end
|
171
175
|
NULL = AtomicType.new(:null, NilClass) do |v|
|
172
|
-
if v
|
176
|
+
if v == nil
|
173
177
|
v
|
174
178
|
else
|
175
179
|
raise Diva::InvalidTypeError, "The value is not a `#{name}'."
|
@@ -178,13 +182,14 @@ module Diva::Type
|
|
178
182
|
|
179
183
|
class ModelType < MetaType
|
180
184
|
attr_reader :model
|
185
|
+
|
181
186
|
def initialize(model, *rest, &cast)
|
182
187
|
super(:model, *rest)
|
183
188
|
@model = model
|
184
189
|
end
|
185
190
|
|
186
|
-
def recommendation_point(
|
187
|
-
|
191
|
+
def recommendation_point(value)
|
192
|
+
value.is_a?(model) && 0
|
188
193
|
end
|
189
194
|
|
190
195
|
def cast(value)
|
@@ -199,7 +204,7 @@ module Diva::Type
|
|
199
204
|
end
|
200
205
|
|
201
206
|
def schema
|
202
|
-
@schema ||= {type: uri}.freeze
|
207
|
+
@schema ||= { type: uri }.freeze
|
203
208
|
end
|
204
209
|
|
205
210
|
def to_s
|
@@ -219,7 +224,7 @@ module Diva::Type
|
|
219
224
|
end
|
220
225
|
|
221
226
|
def recommendation_point(values)
|
222
|
-
values.is_a?(Enumerable) && values.all?{|v| @type.recommendation_point(v) } && 0
|
227
|
+
values.is_a?(Enumerable) && values.all? { |v| @type.recommendation_point(v) } && 0
|
223
228
|
end
|
224
229
|
|
225
230
|
def cast(value)
|
@@ -232,7 +237,7 @@ module Diva::Type
|
|
232
237
|
end
|
233
238
|
|
234
239
|
def to_s
|
235
|
-
"Array of #{@type
|
240
|
+
"Array of #{@type}"
|
236
241
|
end
|
237
242
|
|
238
243
|
def schema
|
@@ -246,8 +251,8 @@ module Diva::Type
|
|
246
251
|
super("union_#{@types.map(&:name).join('_')}")
|
247
252
|
end
|
248
253
|
|
249
|
-
def recommendation_point(
|
250
|
-
@types.map{|t| t.recommendation_point(
|
254
|
+
def recommendation_point(value)
|
255
|
+
@types.map { |t| t.recommendation_point(value) }.compact.min
|
251
256
|
end
|
252
257
|
|
253
258
|
def cast(value)
|
@@ -267,18 +272,18 @@ module Diva::Type
|
|
267
272
|
end
|
268
273
|
|
269
274
|
def recommended_type_of(value)
|
270
|
-
@types.map{|t|
|
275
|
+
available_types = @types.map { |t|
|
271
276
|
[t, t.recommendation_point(value)]
|
272
|
-
}.select{|_,
|
273
|
-
|
274
|
-
|
277
|
+
}.select { |_, p| p }
|
278
|
+
unless available_types.empty?
|
279
|
+
best, = available_types.min_by { |_, p| p }
|
280
|
+
return best
|
281
|
+
end
|
275
282
|
@types.each do |type|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
# try next
|
281
|
-
end
|
283
|
+
type.cast(value)
|
284
|
+
return type
|
285
|
+
rescue Diva::InvalidTypeError
|
286
|
+
# try next
|
282
287
|
end
|
283
288
|
raise Diva::InvalidTypeError, "The value is not #{self}"
|
284
289
|
end
|
@@ -304,7 +309,7 @@ module Diva
|
|
304
309
|
Diva::Type::URI
|
305
310
|
when :null
|
306
311
|
Diva::Type::NULL
|
307
|
-
when ->x{x.
|
312
|
+
when ->(x) { x.instance_of?(Class) && x.ancestors.include?(Diva::Model) }
|
308
313
|
Diva::Type.model_of(type)
|
309
314
|
when Array
|
310
315
|
if type.size >= 2
|
data/lib/diva/uri.rb
CHANGED
@@ -46,9 +46,9 @@ class Diva::URI
|
|
46
46
|
def ==(other)
|
47
47
|
case other
|
48
48
|
when URI, Addressable::URI, String
|
49
|
-
other.to_s ==
|
49
|
+
other.to_s == to_s
|
50
50
|
when Diva::URI
|
51
|
-
if has_string?
|
51
|
+
if has_string? || other.has_string?
|
52
52
|
to_s == other.to_s
|
53
53
|
else
|
54
54
|
other.to_uri == to_uri
|
@@ -60,6 +60,10 @@ class Diva::URI
|
|
60
60
|
to_s.hash ^ self.class.hash
|
61
61
|
end
|
62
62
|
|
63
|
+
def eql?(other)
|
64
|
+
self == other
|
65
|
+
end
|
66
|
+
|
63
67
|
def has_string?
|
64
68
|
!!@uri_string
|
65
69
|
end
|
@@ -69,15 +73,15 @@ class Diva::URI
|
|
69
73
|
end
|
70
74
|
|
71
75
|
def to_s
|
72
|
-
@uri_string ||= to_uri.to_s.freeze
|
76
|
+
@uri_string ||= to_uri.to_s.freeze # rubocop:disable Naming/MemoizedInstanceVariableName
|
73
77
|
end
|
74
78
|
|
75
79
|
def to_uri
|
76
|
-
@uri ||= generate_uri.freeze
|
80
|
+
@uri ||= generate_uri.freeze # rubocop:disable Naming/MemoizedInstanceVariableName
|
77
81
|
end
|
78
82
|
|
79
83
|
def scheme
|
80
|
-
if has_string?
|
84
|
+
if has_string? && !has_uri?
|
81
85
|
match = @uri_string.match(%r<\A(\w+):>)
|
82
86
|
if match
|
83
87
|
match[1]
|
data/lib/diva/version.rb
CHANGED
data/lib/diva.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
|
2
3
|
require 'diva/version'
|
3
4
|
require 'diva/datasource'
|
4
5
|
require 'diva/error'
|
@@ -8,8 +9,6 @@ require 'diva/model'
|
|
8
9
|
require 'diva/spec'
|
9
10
|
require 'diva/type'
|
10
11
|
require 'diva/uri'
|
11
|
-
require 'diva/version'
|
12
|
-
|
13
12
|
|
14
13
|
module Diva
|
15
14
|
def self.URI(uri)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: diva
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toshiaki Asai
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -31,25 +31,25 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '3.0'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: irb
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
39
|
+
version: 1.3.7
|
40
40
|
- - "<"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '2.0'
|
43
43
|
type: :development
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
49
|
+
version: 1.3.7
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: '
|
52
|
+
version: '2.0'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: minitest
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -71,25 +71,45 @@ dependencies:
|
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '5.15'
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
|
-
name:
|
74
|
+
name: rake
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
76
76
|
requirements:
|
77
77
|
- - ">="
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version:
|
79
|
+
version: 13.0.1
|
80
80
|
- - "<"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '14.0'
|
83
83
|
type: :development
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 13.0.1
|
90
90
|
- - "<"
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
version: '
|
92
|
+
version: '14.0'
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: rubocop
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 1.23.0
|
100
|
+
- - "<"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.24.0
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.23.0
|
110
|
+
- - "<"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 1.24.0
|
93
113
|
- !ruby/object:Gem::Dependency
|
94
114
|
name: simplecov
|
95
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,6 +159,7 @@ extra_rdoc_files: []
|
|
139
159
|
files:
|
140
160
|
- ".circleci/config.yml"
|
141
161
|
- ".gitignore"
|
162
|
+
- ".rubocop.yml"
|
142
163
|
- ".travis.yml"
|
143
164
|
- Gemfile
|
144
165
|
- LICENSE.txt
|
@@ -161,7 +182,8 @@ files:
|
|
161
182
|
homepage: https://github.com/toshia/diva
|
162
183
|
licenses:
|
163
184
|
- MIT
|
164
|
-
metadata:
|
185
|
+
metadata:
|
186
|
+
rubygems_mfa_required: 'true'
|
165
187
|
post_install_message:
|
166
188
|
rdoc_options: []
|
167
189
|
require_paths:
|
@@ -170,14 +192,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
192
|
requirements:
|
171
193
|
- - ">="
|
172
194
|
- !ruby/object:Gem::Version
|
173
|
-
version:
|
195
|
+
version: 2.7.0
|
174
196
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
197
|
requirements:
|
176
198
|
- - ">="
|
177
199
|
- !ruby/object:Gem::Version
|
178
200
|
version: '0'
|
179
201
|
requirements: []
|
180
|
-
rubygems_version: 3.2.
|
202
|
+
rubygems_version: 3.2.29
|
181
203
|
signing_key:
|
182
204
|
specification_version: 4
|
183
205
|
summary: Implementation of expression for handling things.
|