table_structure 0.3.21 → 0.4.2
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 +37 -0
- data/Gemfile.lock +7 -7
- data/README.md +84 -78
- data/lib/table_structure.rb +6 -12
- data/lib/table_structure/csv/writer.rb +4 -41
- data/lib/table_structure/iterator.rb +48 -89
- data/lib/table_structure/schema.rb +63 -76
- data/lib/table_structure/schema/class_methods.rb +2 -2
- data/lib/table_structure/schema/column_builder_factory.rb +75 -0
- data/lib/table_structure/schema/columns/attributes.rb +14 -9
- data/lib/table_structure/schema/columns/schema.rb +14 -9
- data/lib/table_structure/schema/composite_class.rb +40 -0
- data/lib/table_structure/schema/definition/columns/compiler.rb +7 -3
- data/lib/table_structure/schema/definition/columns/validator.rb +2 -6
- data/lib/table_structure/schema/dsl/column_builder.rb +29 -0
- data/lib/table_structure/schema/dsl/context_builder.rb +3 -5
- data/lib/table_structure/schema/dsl/row_builder.rb +5 -5
- data/lib/table_structure/schema/{key_converter.rb → keys_builder.rb} +2 -2
- data/lib/table_structure/schema/row_context_builder_factory.rb +30 -0
- data/lib/table_structure/table.rb +31 -56
- data/lib/table_structure/utils.rb +40 -0
- data/lib/table_structure/version.rb +1 -1
- data/lib/table_structure/writer.rb +7 -54
- metadata +8 -14
- data/lib/table_structure/schema/column_converter.rb +0 -48
- data/lib/table_structure/schema/definition/column_converter.rb +0 -31
- data/lib/table_structure/schema/definition/context_builder.rb +0 -17
- data/lib/table_structure/schema/definition/row_builder.rb +0 -25
- data/lib/table_structure/schema/dsl/column_converter.rb +0 -34
- data/lib/table_structure/schema/dsl/option.rb +0 -19
- data/lib/table_structure/schema/row_builder.rb +0 -22
- data/lib/table_structure/table/column_converter.rb +0 -46
- data/lib/table_structure/table/context_builder.rb +0 -49
- data/lib/table_structure/table/iterator.rb +0 -22
- data/lib/table_structure/table/row_builder.rb +0 -38
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
|
+
version: 0.4.2
|
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-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -75,31 +75,25 @@ files:
|
|
75
75
|
- lib/table_structure/iterator.rb
|
76
76
|
- lib/table_structure/schema.rb
|
77
77
|
- lib/table_structure/schema/class_methods.rb
|
78
|
-
- lib/table_structure/schema/
|
78
|
+
- lib/table_structure/schema/column_builder_factory.rb
|
79
79
|
- lib/table_structure/schema/columns/attributes.rb
|
80
80
|
- lib/table_structure/schema/columns/schema.rb
|
81
|
-
- lib/table_structure/schema/
|
81
|
+
- lib/table_structure/schema/composite_class.rb
|
82
82
|
- lib/table_structure/schema/definition/columns/attributes.rb
|
83
83
|
- lib/table_structure/schema/definition/columns/compiler.rb
|
84
84
|
- lib/table_structure/schema/definition/columns/error.rb
|
85
85
|
- lib/table_structure/schema/definition/columns/schema_class.rb
|
86
86
|
- lib/table_structure/schema/definition/columns/schema_instance.rb
|
87
87
|
- lib/table_structure/schema/definition/columns/validator.rb
|
88
|
-
- lib/table_structure/schema/
|
89
|
-
- lib/table_structure/schema/definition/row_builder.rb
|
90
|
-
- lib/table_structure/schema/dsl/column_converter.rb
|
88
|
+
- lib/table_structure/schema/dsl/column_builder.rb
|
91
89
|
- lib/table_structure/schema/dsl/column_definition.rb
|
92
90
|
- lib/table_structure/schema/dsl/context_builder.rb
|
93
|
-
- lib/table_structure/schema/dsl/option.rb
|
94
91
|
- lib/table_structure/schema/dsl/row_builder.rb
|
95
|
-
- lib/table_structure/schema/
|
96
|
-
- lib/table_structure/schema/
|
92
|
+
- lib/table_structure/schema/keys_builder.rb
|
93
|
+
- lib/table_structure/schema/row_context_builder_factory.rb
|
97
94
|
- lib/table_structure/schema/utils.rb
|
98
95
|
- lib/table_structure/table.rb
|
99
|
-
- lib/table_structure/
|
100
|
-
- lib/table_structure/table/context_builder.rb
|
101
|
-
- lib/table_structure/table/iterator.rb
|
102
|
-
- lib/table_structure/table/row_builder.rb
|
96
|
+
- lib/table_structure/utils.rb
|
103
97
|
- lib/table_structure/version.rb
|
104
98
|
- lib/table_structure/writer.rb
|
105
99
|
- table_structure.gemspec
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
module Schema
|
5
|
-
module ColumnConverter
|
6
|
-
class << self
|
7
|
-
def create_optional_converters(
|
8
|
-
name_prefix: nil,
|
9
|
-
name_suffix: nil
|
10
|
-
)
|
11
|
-
column_converters = {}
|
12
|
-
|
13
|
-
if name_prefix
|
14
|
-
column_converters[:_name_prepender_] =
|
15
|
-
create_prepender(name_prefix, header: true, body: false)
|
16
|
-
end
|
17
|
-
|
18
|
-
if name_suffix
|
19
|
-
column_converters[:_name_appender_] =
|
20
|
-
create_appender(name_suffix, header: true, body: false)
|
21
|
-
end
|
22
|
-
|
23
|
-
column_converters
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def create_prepender(string, **options)
|
29
|
-
Definition::ColumnConverter.new(
|
30
|
-
lambda { |val, *|
|
31
|
-
val.nil? ? val : "#{string}#{val}"
|
32
|
-
},
|
33
|
-
**options
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
|
-
def create_appender(string, **options)
|
38
|
-
Definition::ColumnConverter.new(
|
39
|
-
lambda { |val, *|
|
40
|
-
val.nil? ? val : "#{val}#{string}"
|
41
|
-
},
|
42
|
-
**options
|
43
|
-
)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
module Schema
|
5
|
-
module Definition
|
6
|
-
class ColumnConverter
|
7
|
-
extend Forwardable
|
8
|
-
|
9
|
-
def_delegator :@callable, :call
|
10
|
-
|
11
|
-
def initialize(
|
12
|
-
callable,
|
13
|
-
header: true,
|
14
|
-
body: true
|
15
|
-
)
|
16
|
-
@callable = callable
|
17
|
-
@applicable_to_header = header
|
18
|
-
@applicable_to_body = body
|
19
|
-
end
|
20
|
-
|
21
|
-
def applicable_to_header?
|
22
|
-
!!@applicable_to_header
|
23
|
-
end
|
24
|
-
|
25
|
-
def applicable_to_body?
|
26
|
-
!!@applicable_to_body
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
module Schema
|
5
|
-
module Definition
|
6
|
-
class ContextBuilder
|
7
|
-
extend Forwardable
|
8
|
-
|
9
|
-
def_delegator :@callable, :call
|
10
|
-
|
11
|
-
def initialize(callable)
|
12
|
-
@callable = callable
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
module Schema
|
5
|
-
module Definition
|
6
|
-
class RowBuilder
|
7
|
-
extend Forwardable
|
8
|
-
|
9
|
-
def_delegator :@callable, :call
|
10
|
-
|
11
|
-
def initialize(
|
12
|
-
callable,
|
13
|
-
enabled_row_types: %i[array hash]
|
14
|
-
)
|
15
|
-
@callable = callable
|
16
|
-
@enabled_row_types = [enabled_row_types].flatten
|
17
|
-
end
|
18
|
-
|
19
|
-
def enabled?(row_type)
|
20
|
-
@enabled_row_types.include?(row_type)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
module Schema
|
5
|
-
module DSL
|
6
|
-
module ColumnConverter
|
7
|
-
def column_converter(
|
8
|
-
name,
|
9
|
-
callable,
|
10
|
-
header: true,
|
11
|
-
body: true,
|
12
|
-
**deprecated_options
|
13
|
-
)
|
14
|
-
if deprecated_options.key?(:row)
|
15
|
-
warn '[TableStructure] `:row` option has been deprecated. Use `:body` option instead.'
|
16
|
-
body = deprecated_options[:row]
|
17
|
-
end
|
18
|
-
|
19
|
-
column_converters[name] =
|
20
|
-
::TableStructure::Schema::Definition::ColumnConverter.new(
|
21
|
-
callable,
|
22
|
-
header: header,
|
23
|
-
body: body
|
24
|
-
)
|
25
|
-
nil
|
26
|
-
end
|
27
|
-
|
28
|
-
def column_converters
|
29
|
-
@__column_converters__ ||= {}
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
module Schema
|
5
|
-
module DSL
|
6
|
-
module Option
|
7
|
-
def option(name, value)
|
8
|
-
warn "[TableStructure] The use of `option` DSL has been deprecated. #{caller_locations(1, 1)}"
|
9
|
-
options[name] = value
|
10
|
-
nil
|
11
|
-
end
|
12
|
-
|
13
|
-
def options
|
14
|
-
@__options__ ||= {}
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
module Schema
|
5
|
-
module RowBuilder
|
6
|
-
DEFAULT_ROW_BUILDERS = {
|
7
|
-
_to_hash_: Definition::RowBuilder.new(
|
8
|
-
lambda { |values, keys, *|
|
9
|
-
keys.map.with_index { |key, i| [key || i, values[i]] }.to_h
|
10
|
-
},
|
11
|
-
enabled_row_types: [:hash]
|
12
|
-
)
|
13
|
-
}.freeze
|
14
|
-
|
15
|
-
class << self
|
16
|
-
def prepend_default_builders(builders)
|
17
|
-
DEFAULT_ROW_BUILDERS.merge(builders)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
class Table::ColumnConverter
|
5
|
-
class ColumnConvertible < Module
|
6
|
-
def initialize(methods)
|
7
|
-
methods.each do |name, method|
|
8
|
-
define_method(name, &method)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def create_module(converters, context:)
|
15
|
-
return if converters.empty?
|
16
|
-
|
17
|
-
header_converters = converters.select { |_k, v| v.applicable_to_header? }
|
18
|
-
body_converters = converters.select { |_k, v| v.applicable_to_body? }
|
19
|
-
|
20
|
-
methods = {}
|
21
|
-
|
22
|
-
unless header_converters.empty?
|
23
|
-
methods[:header] = create_method(header_converters, context)
|
24
|
-
end
|
25
|
-
|
26
|
-
unless body_converters.empty?
|
27
|
-
methods[:data] = create_method(body_converters, context)
|
28
|
-
end
|
29
|
-
|
30
|
-
yield ColumnConvertible.new(methods)
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def create_method(converters, table_context)
|
36
|
-
proc do |context: nil|
|
37
|
-
super(context: context).map do |val|
|
38
|
-
converters.reduce(val) do |val, (_, converter)|
|
39
|
-
converter.call(val, context, table_context)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
class Table::ContextBuilder
|
5
|
-
class ContextBuildable < Module
|
6
|
-
def initialize(methods)
|
7
|
-
methods.each do |name, method|
|
8
|
-
define_method(name, &method)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def create_module(
|
15
|
-
builders,
|
16
|
-
apply_to_name: true,
|
17
|
-
apply_to_value: true,
|
18
|
-
context:
|
19
|
-
)
|
20
|
-
return if builders.empty?
|
21
|
-
|
22
|
-
header_builder = builders[:header] # will remove
|
23
|
-
row_builder = builders[:row]
|
24
|
-
|
25
|
-
methods = {}
|
26
|
-
|
27
|
-
if apply_to_name && builders.key?(:header)
|
28
|
-
methods[:header] = create_method(builders[:header])
|
29
|
-
end
|
30
|
-
|
31
|
-
if apply_to_value && builders.key?(:row)
|
32
|
-
methods[:data] = create_method(builders[:row])
|
33
|
-
end
|
34
|
-
|
35
|
-
yield ContextBuildable.new(methods)
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def create_method(builder)
|
41
|
-
return if builder.nil?
|
42
|
-
|
43
|
-
proc do |context: nil|
|
44
|
-
super(context: builder.call(context))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
class Table::Iterator
|
5
|
-
def initialize(table, header: { context: nil })
|
6
|
-
@table = table
|
7
|
-
@header_options = header
|
8
|
-
end
|
9
|
-
|
10
|
-
def iterate(items)
|
11
|
-
::Enumerator.new do |y|
|
12
|
-
if @header_options
|
13
|
-
header_context = @header_options.is_a?(Hash) ? @header_options[:context] : nil
|
14
|
-
y << @table.header(context: header_context)
|
15
|
-
end
|
16
|
-
@table
|
17
|
-
.body(items)
|
18
|
-
.each { |row| y << row }
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module TableStructure
|
4
|
-
class Table::RowBuilder
|
5
|
-
class ResultBuildable < Module
|
6
|
-
def initialize(methods)
|
7
|
-
methods.each do |name, method|
|
8
|
-
define_method(name, &method)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def create_module(builders, row_type:, keys:, context:)
|
15
|
-
return if builders.empty?
|
16
|
-
|
17
|
-
builders = builders.select { |_k, v| v.enabled?(row_type) }
|
18
|
-
return if builders.empty?
|
19
|
-
|
20
|
-
yield ResultBuildable.new(
|
21
|
-
header: create_method(builders, keys, context),
|
22
|
-
data: create_method(builders, keys, context)
|
23
|
-
)
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def create_method(builders, table_keys, table_context)
|
29
|
-
proc do |context: nil|
|
30
|
-
builders
|
31
|
-
.reduce(super(context: context)) do |vals, (_, builder)|
|
32
|
-
builder.call(vals, table_keys, context, table_context)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|