table_structure 0.3.15 → 0.3.16
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/.travis.yml +1 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +2 -2
- data/README.md +34 -9
- data/lib/table_structure/schema/class_methods.rb +35 -17
- data/lib/table_structure/schema.rb +35 -6
- 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: c8794a66493988290a6ddeea36604322559a519ba3f0f261af4243fd56687663
|
4
|
+
data.tar.gz: 57f9279940767cc9c0612a9ffda469711ac070d086a8780aeef4a23c8dafef7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e906e4e3bdb277218db13fc90b028470f794ae9f346de456a84c524219aeaf63a184d9a8e4802ed3cc0dab55f7891fe0b6a5012144b236d6da1f3a02c3abebe0
|
7
|
+
data.tar.gz: c68e1178bce24e496b77ab1b3cb3674120129b86b1e352ef6233f29504b11e7355d93a4975c3e3445fd88e03ed19ac1bf05f4f86dc38331a8e256a2d273356f2
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# 0.3.16
|
2
|
+
Changes:
|
3
|
+
- `TableStructure::Schema`
|
4
|
+
- Enable to add definitions in a block when initializing the schema.
|
5
|
+
- Add `merge` class method.
|
6
|
+
- Change `+` class method not to overwrite the definitions (`column_converter`, `context_builder`) by the last one with the same name. If you expect the same behavior as before, use `merge` instead.
|
7
|
+
|
1
8
|
# 0.3.15
|
2
9
|
Changes:
|
3
10
|
- `TableStructure::Schema`
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -268,7 +268,24 @@ context = { pet_num: 0 }
|
|
268
268
|
schema = SampleTableSchema.new(context: context, nil_definitions_ignored: true)
|
269
269
|
```
|
270
270
|
|
271
|
-
You can
|
271
|
+
You can add definitions when initializing the schema.
|
272
|
+
```ruby
|
273
|
+
class UserTableSchema
|
274
|
+
include TableStructure::Schema
|
275
|
+
|
276
|
+
column name: 'ID',
|
277
|
+
value: ->(row, _table) { row[:id] }
|
278
|
+
|
279
|
+
column name: 'Name',
|
280
|
+
value: ->(row, *) { row[:name] }
|
281
|
+
end
|
282
|
+
|
283
|
+
schema = UserTableSchema.new do
|
284
|
+
column_converter :to_s, ->(val, *) { val.to_s }
|
285
|
+
end
|
286
|
+
```
|
287
|
+
|
288
|
+
You can also nest the schemas.
|
272
289
|
```ruby
|
273
290
|
class PetTableSchema
|
274
291
|
include TableStructure::Schema
|
@@ -290,7 +307,7 @@ class QuestionTableSchema
|
|
290
307
|
}
|
291
308
|
end
|
292
309
|
|
293
|
-
class
|
310
|
+
class UserTableSchema
|
294
311
|
include TableStructure::Schema
|
295
312
|
|
296
313
|
column name: 'ID',
|
@@ -316,11 +333,17 @@ context = {
|
|
316
333
|
]
|
317
334
|
}
|
318
335
|
|
319
|
-
schema =
|
336
|
+
schema = UserTableSchema.new(context: context)
|
320
337
|
```
|
321
338
|
|
322
|
-
You can also concatenate
|
323
|
-
|
339
|
+
You can also concatenate or merge the schema classes.
|
340
|
+
Both create a schema class, with a few differences.
|
341
|
+
- `+`
|
342
|
+
- Similar to nesting the schemas.
|
343
|
+
`column_converter` or `context_builder` works only to columns in the schema that they was defined.
|
344
|
+
- `merge`
|
345
|
+
- If there are some definitions of `column_converter` or `context_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.
|
346
|
+
|
324
347
|
```ruby
|
325
348
|
class UserTableSchema
|
326
349
|
include TableStructure::Schema
|
@@ -338,7 +361,7 @@ class PetTableSchema
|
|
338
361
|
columns name: ['Pet 1', 'Pet 2', 'Pet 3'],
|
339
362
|
value: ->(row, *) { row[:pets] }
|
340
363
|
|
341
|
-
column_converter :same_name, ->(val, *) {
|
364
|
+
column_converter :same_name, ->(val, *) { "pet: #{val}" }
|
342
365
|
end
|
343
366
|
|
344
367
|
class QuestionTableSchema
|
@@ -353,7 +376,7 @@ class QuestionTableSchema
|
|
353
376
|
end
|
354
377
|
}
|
355
378
|
|
356
|
-
column_converter :same_name, ->(val, *) {
|
379
|
+
column_converter :same_name, ->(val, *) { "question: #{val}" }
|
357
380
|
end
|
358
381
|
|
359
382
|
context = {
|
@@ -364,7 +387,9 @@ context = {
|
|
364
387
|
]
|
365
388
|
}
|
366
389
|
|
367
|
-
|
390
|
+
concatenated_schema = (UserTableSchema + PetTableSchema + QuestionTableSchema).new(context: context)
|
391
|
+
|
392
|
+
merged_schema = UserTableSchema.merge(PetTableSchema, QuestionTableSchema).new(context: context)
|
368
393
|
```
|
369
394
|
|
370
395
|
You can also use `context_builder`.
|
@@ -404,7 +429,7 @@ class SampleTableSchema
|
|
404
429
|
end
|
405
430
|
```
|
406
431
|
|
407
|
-
If you want to convert CSV character code, you can do so
|
432
|
+
If you want to convert CSV character code, you can do so in a block of `write` method.
|
408
433
|
```ruby
|
409
434
|
File.open('sample.csv', 'w') do |f|
|
410
435
|
writer.write(items, to: CSV.new(f)) do |row_values|
|
@@ -3,30 +3,48 @@
|
|
3
3
|
module TableStructure
|
4
4
|
module Schema
|
5
5
|
module ClassMethods
|
6
|
-
def +(
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def +(other)
|
7
|
+
unless ::TableStructure::Schema::Utils.schema_class?(other)
|
8
|
+
raise ::TableStructure::Error, "Must be a schema class. #{other}"
|
9
|
+
end
|
10
|
+
|
11
|
+
self_class = self
|
12
|
+
|
13
|
+
::TableStructure::Schema.create_class do
|
14
|
+
columns self_class
|
15
|
+
columns other
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def merge(*others)
|
20
|
+
others.each do |other|
|
21
|
+
unless ::TableStructure::Schema::Utils.schema_class?(other)
|
22
|
+
raise ::TableStructure::Error, "Must be a schema class. #{other}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
schema_classes = [self, *others]
|
10
27
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
28
|
+
::TableStructure::Schema.create_class do
|
29
|
+
@__column_definitions__ =
|
30
|
+
schema_classes
|
31
|
+
.map(&:column_definitions)
|
32
|
+
.flatten
|
15
33
|
|
16
34
|
@__context_builders__ =
|
17
|
-
|
18
|
-
.
|
19
|
-
.merge!
|
35
|
+
schema_classes
|
36
|
+
.map(&:context_builders)
|
37
|
+
.reduce({}, &:merge!)
|
20
38
|
|
21
39
|
@__column_converters__ =
|
22
|
-
|
23
|
-
.
|
24
|
-
.merge!
|
40
|
+
schema_classes
|
41
|
+
.map(&:column_converters)
|
42
|
+
.reduce({}, &:merge!)
|
25
43
|
|
26
44
|
@__result_builders__ =
|
27
|
-
|
28
|
-
.
|
29
|
-
.merge!
|
45
|
+
schema_classes
|
46
|
+
.map(&:result_builders)
|
47
|
+
.reduce({}, &:merge!)
|
30
48
|
end
|
31
49
|
end
|
32
50
|
end
|
@@ -11,6 +11,16 @@ module TableStructure
|
|
11
11
|
klass.extend(ClassMethods)
|
12
12
|
end
|
13
13
|
|
14
|
+
def self.create_class(&block)
|
15
|
+
raise ::TableStructure::Error, 'No block given.' unless block
|
16
|
+
|
17
|
+
schema_module = self
|
18
|
+
Class.new do
|
19
|
+
include schema_module
|
20
|
+
class_eval(&block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
14
24
|
Definition = Struct.new(
|
15
25
|
'Definition',
|
16
26
|
:name,
|
@@ -30,7 +40,8 @@ module TableStructure
|
|
30
40
|
key_prefix: nil,
|
31
41
|
key_suffix: nil,
|
32
42
|
nil_definitions_ignored: false,
|
33
|
-
**deprecated_options
|
43
|
+
**deprecated_options,
|
44
|
+
&block
|
34
45
|
)
|
35
46
|
unless deprecated_options.empty?
|
36
47
|
caller_location = caller_locations(1, 1)
|
@@ -47,12 +58,30 @@ module TableStructure
|
|
47
58
|
nil_definitions_ignored: nil_definitions_ignored
|
48
59
|
}.merge!(self.class.options).merge!(deprecated_options)
|
49
60
|
|
50
|
-
|
51
|
-
column_converters = ColumnConverters.new({}.merge!(self.class.column_converters))
|
52
|
-
result_builders = ResultBuilders.new({}.merge!(self.class.result_builders))
|
61
|
+
schema_classes = [self.class]
|
53
62
|
|
54
|
-
|
55
|
-
|
63
|
+
if block_given?
|
64
|
+
schema_classes << ::TableStructure::Schema.create_class(&block)
|
65
|
+
end
|
66
|
+
|
67
|
+
context_builders = ContextBuilders.new(
|
68
|
+
schema_classes.map(&:context_builders).reduce({}, &:merge!)
|
69
|
+
)
|
70
|
+
|
71
|
+
column_converters = ColumnConverters.new(
|
72
|
+
schema_classes.map(&:column_converters).reduce({}, &:merge!)
|
73
|
+
)
|
74
|
+
|
75
|
+
result_builders = ResultBuilders.new(
|
76
|
+
schema_classes.map(&:result_builders).reduce({}, &:merge!)
|
77
|
+
)
|
78
|
+
|
79
|
+
columns = Column::Factory.create(
|
80
|
+
name,
|
81
|
+
schema_classes.map(&:column_definitions).reduce([], &:concat),
|
82
|
+
context_builders.build_for_table(context),
|
83
|
+
options
|
84
|
+
)
|
56
85
|
|
57
86
|
@_definition_ =
|
58
87
|
Definition.new(
|
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.3.
|
4
|
+
version: 0.3.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jsmmr
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-12-
|
11
|
+
date: 2019-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|