table_structure 0.4.2 → 0.4.3
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/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +23 -24
- data/lib/table_structure/schema/class_methods.rb +9 -28
- data/lib/table_structure/schema/column_builder_factory.rb +2 -2
- data/lib/table_structure/schema/composite_class.rb +1 -1
- data/lib/table_structure/schema/definition/columns/validator.rb +1 -1
- data/lib/table_structure/schema/dsl/column_definition.rb +12 -2
- data/lib/table_structure/schema/row_context_builder_factory.rb +2 -6
- data/lib/table_structure/table.rb +1 -1
- data/lib/table_structure/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bebf267d2cae044dd2f493b213950954c88b384d2b3e6dd15c09b7947b104eb7
|
4
|
+
data.tar.gz: cbe61559035246eb4dc80edf4e34b1b67a0e1f8db16749368e81d23e48bd2b81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd6f1e4299eda55eb1959c38248911c9fc052dee5cb541cc3b1517cb00947f069e5896ca9d69e792fa2258f6bb636aaee251efedb11af96cd55241cf44ab3dd1
|
7
|
+
data.tar.gz: 0e52a02afa1dc1c669233edc2e900cdfae5e5085bd6138bd2055aa57f4fadfdf0c587228f5eb560b5ba857555d34bbdc4477c1128fd193f144625e8f099a2cf7
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -44,19 +44,19 @@ class SampleTableSchema
|
|
44
44
|
column name: 'Name',
|
45
45
|
value: ->(row, *) { row[:name] }
|
46
46
|
|
47
|
-
|
47
|
+
column name: ['Pet 1', 'Pet 2', 'Pet 3'],
|
48
48
|
value: ->(row, *) { row[:pets] }
|
49
49
|
|
50
|
-
columns
|
50
|
+
columns do |table|
|
51
51
|
table[:questions].map do |question|
|
52
52
|
{
|
53
53
|
name: question[:id],
|
54
54
|
value: ->(row, *) { row[:answers][question[:id]] }
|
55
55
|
}
|
56
56
|
end
|
57
|
-
|
57
|
+
end
|
58
58
|
|
59
|
-
|
59
|
+
column_builder :to_s do |val, _row, _table|
|
60
60
|
val.to_s
|
61
61
|
end
|
62
62
|
end
|
@@ -159,7 +159,6 @@ Define a schema:
|
|
159
159
|
class SampleTableSchema
|
160
160
|
include TableStructure::Schema
|
161
161
|
|
162
|
-
# If `:header` is set to `false`, `:name` is optional.
|
163
162
|
column name: 'ID',
|
164
163
|
key: :id,
|
165
164
|
value: ->(row, *) { row[:id] }
|
@@ -168,11 +167,11 @@ class SampleTableSchema
|
|
168
167
|
key: :name,
|
169
168
|
value: ->(row, *) { row[:name] }
|
170
169
|
|
171
|
-
|
170
|
+
column name: ['Pet 1', 'Pet 2', 'Pet 3'],
|
172
171
|
key: %i[pet1 pet2 pet3],
|
173
172
|
value: ->(row, *) { row[:pets] }
|
174
173
|
|
175
|
-
columns
|
174
|
+
columns do |table|
|
176
175
|
table[:questions].map do |question|
|
177
176
|
{
|
178
177
|
name: question[:id],
|
@@ -180,7 +179,7 @@ class SampleTableSchema
|
|
180
179
|
value: ->(row, *) { row[:answers][question[:id]] }
|
181
180
|
}
|
182
181
|
end
|
183
|
-
|
182
|
+
end
|
184
183
|
end
|
185
184
|
```
|
186
185
|
|
@@ -275,7 +274,7 @@ class UserTableSchema
|
|
275
274
|
end
|
276
275
|
|
277
276
|
schema = UserTableSchema.new do
|
278
|
-
|
277
|
+
column_builder :to_s do |val|
|
279
278
|
val.to_s
|
280
279
|
end
|
281
280
|
end
|
@@ -314,14 +313,14 @@ class SampleTableSchema
|
|
314
313
|
column name: 'Name',
|
315
314
|
value: ->(row, *) { row[:name] }
|
316
315
|
|
317
|
-
columns
|
316
|
+
columns do |table|
|
318
317
|
if table[:pet_num].positive?
|
319
318
|
{
|
320
319
|
name: (1..table[:pet_num]).map { |num| "Pet #{num}" },
|
321
320
|
value: ->(row, *) { row[:pets] }
|
322
321
|
}
|
323
322
|
end
|
324
|
-
|
323
|
+
end
|
325
324
|
end
|
326
325
|
|
327
326
|
context = { pet_num: 0 }
|
@@ -346,7 +345,7 @@ class SampleTableSchema
|
|
346
345
|
TableContext.new(**context)
|
347
346
|
end
|
348
347
|
|
349
|
-
context_builder :row
|
348
|
+
context_builder :row do |context|
|
350
349
|
RowContext.new(**context)
|
351
350
|
end
|
352
351
|
|
@@ -356,17 +355,17 @@ class SampleTableSchema
|
|
356
355
|
column name: 'Name',
|
357
356
|
value: ->(row, *) { row.name }
|
358
357
|
|
359
|
-
|
358
|
+
column name: ['Pet 1', 'Pet 2', 'Pet 3'],
|
360
359
|
value: ->(row, *) { row.increase_pets }
|
361
360
|
|
362
|
-
columns
|
361
|
+
columns do |table|
|
363
362
|
table.questions.map do |question|
|
364
363
|
{
|
365
364
|
name: question[:id],
|
366
365
|
value: ->(row, *) { row.answers[question[:id]] }
|
367
366
|
}
|
368
367
|
end
|
369
|
-
|
368
|
+
end
|
370
369
|
end
|
371
370
|
```
|
372
371
|
|
@@ -392,13 +391,13 @@ class SampleTableSchema
|
|
392
391
|
|
393
392
|
columns UserTableSchema
|
394
393
|
|
395
|
-
columns
|
394
|
+
columns do |table|
|
396
395
|
UserTableSchema.new(context: table, name_prefix: 'Friend ', key_prefix: 'friend_') do
|
397
396
|
context_builder :row do |context|
|
398
397
|
context[:friend]
|
399
398
|
end
|
400
399
|
end
|
401
|
-
|
400
|
+
end
|
402
401
|
end
|
403
402
|
|
404
403
|
items = [
|
@@ -420,9 +419,9 @@ You can also concatenate or merge the schema classes.
|
|
420
419
|
Both create a schema class, with a few differences.
|
421
420
|
- `+`
|
422
421
|
- Similar to nesting the schemas.
|
423
|
-
`
|
422
|
+
`column_builder` works only to columns in the schema that they was defined.
|
424
423
|
- `merge`
|
425
|
-
- If there are some definitions of `
|
424
|
+
- If there are some definitions of `column_builder` with the same name in the schemas to be merged, the one in the schema that is merged last will work to all columns.
|
426
425
|
|
427
426
|
```ruby
|
428
427
|
class UserTableSchema
|
@@ -438,10 +437,10 @@ end
|
|
438
437
|
class PetTableSchema
|
439
438
|
include TableStructure::Schema
|
440
439
|
|
441
|
-
|
440
|
+
column name: ['Pet 1', 'Pet 2', 'Pet 3'],
|
442
441
|
value: ->(row, *) { row[:pets] }
|
443
442
|
|
444
|
-
|
443
|
+
column_builder :same_name do |val|
|
445
444
|
"pet: #{val}"
|
446
445
|
end
|
447
446
|
end
|
@@ -449,16 +448,16 @@ end
|
|
449
448
|
class QuestionTableSchema
|
450
449
|
include TableStructure::Schema
|
451
450
|
|
452
|
-
columns
|
451
|
+
columns do |table|
|
453
452
|
table[:questions].map do |question|
|
454
453
|
{
|
455
454
|
name: question[:id],
|
456
455
|
value: ->(row, *) { row[:answers][question[:id]] }
|
457
456
|
}
|
458
457
|
end
|
459
|
-
|
458
|
+
end
|
460
459
|
|
461
|
-
|
460
|
+
column_builder :same_name do |val|
|
462
461
|
"question: #{val}"
|
463
462
|
end
|
464
463
|
end
|
@@ -4,13 +4,11 @@ module TableStructure
|
|
4
4
|
module Schema
|
5
5
|
module ClassMethods
|
6
6
|
def +(other)
|
7
|
-
|
8
|
-
raise ::TableStructure::Error, "Must be a schema class. #{other}"
|
9
|
-
end
|
7
|
+
raise ::TableStructure::Error, "Must be a schema class. [#{other}]" unless Utils.schema_class?(other)
|
10
8
|
|
11
9
|
self_class = self
|
12
10
|
|
13
|
-
|
11
|
+
Schema.create_class do
|
14
12
|
columns self_class
|
15
13
|
columns other
|
16
14
|
end
|
@@ -18,33 +16,16 @@ module TableStructure
|
|
18
16
|
|
19
17
|
def merge(*others)
|
20
18
|
others.each do |other|
|
21
|
-
|
22
|
-
raise ::TableStructure::Error, "Must be a schema class. #{other}"
|
23
|
-
end
|
19
|
+
raise ::TableStructure::Error, "Must be a schema class. [#{other}]" unless Utils.schema_class?(other)
|
24
20
|
end
|
25
21
|
|
26
|
-
|
27
|
-
|
28
|
-
::TableStructure::Schema.create_class do
|
29
|
-
@__column_definitions__ =
|
30
|
-
schema_classes
|
31
|
-
.map(&:column_definitions)
|
32
|
-
.flatten
|
33
|
-
|
34
|
-
@__context_builders__ =
|
35
|
-
schema_classes
|
36
|
-
.map(&:context_builders)
|
37
|
-
.reduce({}, &:merge!)
|
38
|
-
|
39
|
-
@__column_builders__ =
|
40
|
-
schema_classes
|
41
|
-
.map(&:column_builders)
|
42
|
-
.reduce({}, &:merge!)
|
22
|
+
schema_class = CompositeClass.new.compose(self, *others)
|
43
23
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
24
|
+
Schema.create_class do
|
25
|
+
@__column_definitions__ = schema_class.column_definitions
|
26
|
+
@__context_builders__ = schema_class.context_builders
|
27
|
+
@__column_builders__ = schema_class.column_builders
|
28
|
+
@__row_builders__ = schema_class.row_builders
|
48
29
|
end
|
49
30
|
end
|
50
31
|
end
|
@@ -18,7 +18,7 @@ module TableStructure
|
|
18
18
|
optional_builders[:_name_prepender_] =
|
19
19
|
::TableStructure::Utils::TypedProc.new(
|
20
20
|
types: :header
|
21
|
-
) do |val
|
21
|
+
) do |val|
|
22
22
|
val.nil? ? val : "#{name_prefix}#{val}"
|
23
23
|
end
|
24
24
|
end
|
@@ -27,7 +27,7 @@ module TableStructure
|
|
27
27
|
optional_builders[:_name_appender_] =
|
28
28
|
::TableStructure::Utils::TypedProc.new(
|
29
29
|
types: :header
|
30
|
-
) do |val
|
30
|
+
) do |val|
|
31
31
|
val.nil? ? val : "#{val}#{name_suffix}"
|
32
32
|
end
|
33
33
|
end
|
@@ -13,7 +13,7 @@ module TableStructure
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def validate(name:, key:, size:, **)
|
16
|
-
raise Error.new('"key" must not be
|
16
|
+
raise Error.new('"key" must not be callable.', @name, @index) if key.respond_to?(:call)
|
17
17
|
if !key && name.respond_to?(:call) && !size
|
18
18
|
raise Error.new('"size" must be defined, because column size cannot be determined.', @name, @index)
|
19
19
|
end
|
@@ -5,12 +5,22 @@ module TableStructure
|
|
5
5
|
module DSL
|
6
6
|
module ColumnDefinition
|
7
7
|
def column(definition)
|
8
|
+
unless definition.is_a?(Hash)
|
9
|
+
warn "[TableStructure] Use `columns` instead of `column`.", uplevel: 1
|
10
|
+
end
|
8
11
|
column_definitions << definition
|
9
12
|
nil
|
10
13
|
end
|
11
14
|
|
12
|
-
def columns(definition)
|
13
|
-
|
15
|
+
def columns(definition = nil, &block)
|
16
|
+
if definition.is_a?(Hash)
|
17
|
+
warn "[TableStructure] Use `column` instead of `columns`.", uplevel: 1
|
18
|
+
end
|
19
|
+
if Utils.callable?(definition)
|
20
|
+
warn "[TableStructure] Use `block` instead of `lambda` or `proc`.", uplevel: 1
|
21
|
+
end
|
22
|
+
column_definitions << (block || definition)
|
23
|
+
nil
|
14
24
|
end
|
15
25
|
|
16
26
|
def column_definitions
|
@@ -12,18 +12,14 @@ module TableStructure
|
|
12
12
|
return unless @schema.contain_name_callable?
|
13
13
|
return unless @builders.key?(:header)
|
14
14
|
|
15
|
-
proc
|
16
|
-
@builders[:header].call(context)
|
17
|
-
end
|
15
|
+
proc { |context| @builders[:header].call(context) }
|
18
16
|
end
|
19
17
|
|
20
18
|
def create_data_builder
|
21
19
|
return unless @schema.contain_value_callable?
|
22
20
|
return unless @builders.key?(:row)
|
23
21
|
|
24
|
-
proc
|
25
|
-
@builders[:row].call(context)
|
26
|
-
end
|
22
|
+
proc { |context| @builders[:row].call(context) }
|
27
23
|
end
|
28
24
|
end
|
29
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table_structure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jsmmr
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|