table_structure 0.1.3 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a208013676cd213826e9c8f6fd29ef6e364bd321f198a3f87424806c79d87b8
4
- data.tar.gz: 4eda6349d9ab15a2d8183ec27678d19bcef4750376e2981e9feb15cf4d93d844
3
+ metadata.gz: af7a012ce96e50bfc67ff0360ba39b8f2c2f0b0772e0260b17729777b805eeb7
4
+ data.tar.gz: 4fd45259f91bde2016be845200cbd88ba3b50c3e7b6c75b257e228f4475a500a
5
5
  SHA512:
6
- metadata.gz: d903f50237ef4323d81fbec517a3c9206a444fc14063e5aa12e4696fa361419f8955bebb0c5e74c77398db8b8ec7a5dcb871487752ad65344b0bcfedb334b7d1
7
- data.tar.gz: 38de89299ff6745eb8ad32e12d8e64b081d36d6d510ef8e429b5189ec7bfabd33ce06768f08454e3e7cf576244ebb981506161e580440c7a010ef52eb3cd28cf
6
+ metadata.gz: dc61fd25875979c3c3e06ba9e0648bea2eed3abcf058072ef2802c1c0379b194aeee4213b76268ae10118368cbd0076303658ca3ce2d19c85ea366709ae6f3f5
7
+ data.tar.gz: 82203dac6eaf8418eecb9ee4ed62b550277f6c57d54f4f78d04b72edb317a7cec91b16f1f16fa43749d56a55ebb28d871be82e11bccf72ab3db128e45e3c6795
data/Gemfile.lock CHANGED
@@ -1,18 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- table_structure (0.1.3)
4
+ table_structure (0.1.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- ast (2.4.0)
10
9
  diff-lcs (1.3)
11
- jaro_winkler (1.5.3)
12
- parallel (1.17.0)
13
- parser (2.6.3.0)
14
- ast (~> 2.4.0)
15
- rainbow (3.0.0)
16
10
  rake (10.5.0)
17
11
  rspec (3.8.0)
18
12
  rspec-core (~> 3.8.0)
@@ -27,15 +21,6 @@ GEM
27
21
  diff-lcs (>= 1.2.0, < 2.0)
28
22
  rspec-support (~> 3.8.0)
29
23
  rspec-support (3.8.2)
30
- rubocop (0.74.0)
31
- jaro_winkler (~> 1.5.1)
32
- parallel (~> 1.10)
33
- parser (>= 2.6)
34
- rainbow (>= 2.2.2, < 4.0)
35
- ruby-progressbar (~> 1.7)
36
- unicode-display_width (>= 1.4.0, < 1.7)
37
- ruby-progressbar (1.10.1)
38
- unicode-display_width (1.6.0)
39
24
 
40
25
  PLATFORMS
41
26
  ruby
@@ -44,7 +29,6 @@ DEPENDENCIES
44
29
  bundler (~> 1.17)
45
30
  rake (~> 10.0)
46
31
  rspec (~> 3.0)
47
- rubocop (~> 0.74.0)
48
32
  table_structure!
49
33
 
50
34
  BUNDLED WITH
@@ -3,39 +3,18 @@
3
3
  module TableStructure
4
4
  module Schema
5
5
  class Column
6
- class Error < ::TableStructure::Error
7
- attr_reader :group_index
6
+ attr_reader :name, :key, :vlaue, :size
8
7
 
9
- def initialize(error_message, group_index)
10
- @group_index = group_index
11
- super("#{error_message} [defined position: #{group_index + 1}]")
12
- end
13
- end
14
-
15
- DEFAULT_DEFINITION = {
16
- name: nil,
17
- key: nil,
18
- value: nil,
19
- size: nil
20
- }.freeze
21
-
22
- DEFAULT_SIZE = 1
23
-
24
- attr_reader :size, :group_index
25
-
26
- def initialize(definition, group_index)
27
- @group_index = group_index
28
- definition = DEFAULT_DEFINITION.merge(definition)
29
- validate(definition)
30
- @name = definition[:name]
31
- @key = definition[:key]
32
- @value = definition[:value]
33
- @size = determine_size(definition)
8
+ def initialize(name:, key:, value:, size:)
9
+ @name = name
10
+ @key = key
11
+ @value = value
12
+ @size = size
34
13
  end
35
14
 
36
15
  def name(header_context, table_context)
37
- val = Utils.evaluate_callable(@name, header_context, table_context)
38
- optimize_size(val)
16
+ name = Utils.evaluate_callable(@name, header_context, table_context)
17
+ optimize_size(name)
39
18
  end
40
19
 
41
20
  def key
@@ -43,48 +22,22 @@ module TableStructure
43
22
  end
44
23
 
45
24
  def value(row_context, table_context)
46
- val = Utils.evaluate_callable(@value, row_context, table_context)
47
- optimize_size(val)
25
+ value = Utils.evaluate_callable(@value, row_context, table_context)
26
+ optimize_size(value)
48
27
  end
49
28
 
50
29
  private
51
30
 
52
- def validate(name:, key:, size:, **)
53
- if !key && name.respond_to?(:call) && !size
54
- raise Error.new('"size" must be specified, because column size cannot be determined.', @group_index)
55
- end
56
- if size && size < DEFAULT_SIZE
57
- raise Error.new('"size" must be positive.', @group_index)
58
- end
59
- end
60
-
61
- def determine_size(name:, key:, size:, **)
62
- return size if size
63
-
64
- [calculate_size(name), calculate_size(key)].max
65
- end
66
-
67
- def calculate_size(val)
68
- if val.is_a?(Array)
69
- return val.empty? ? DEFAULT_SIZE : val.size
70
- end
71
-
72
- DEFAULT_SIZE
73
- end
74
-
75
- def multiple?
76
- @size > DEFAULT_SIZE
77
- end
78
-
79
31
  def optimize_size(value)
80
- return value unless multiple?
32
+ return value if @size == 1
81
33
 
82
- values = value.is_a?(Array) ? value : [value]
34
+ values = [value].flatten
83
35
  actual_size = values.size
84
- if actual_size > @size
85
- values[0, @size]
86
- elsif actual_size < @size
87
- [].concat(values).fill(nil, actual_size, (@size - actual_size))
36
+ expected_size = @size
37
+ if actual_size > expected_size
38
+ values[0, expected_size]
39
+ elsif actual_size < expected_size
40
+ [].concat(values).fill(nil, actual_size, (expected_size - actual_size))
88
41
  else
89
42
  values
90
43
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TableStructure
4
+ module Schema
5
+ class Definition
6
+ class Error < ::TableStructure::Error
7
+ attr_reader :index
8
+
9
+ def initialize(error_message, index)
10
+ @index = index
11
+ super("#{error_message} [defined position of column(s): #{index + 1}]")
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TableStructure
4
+ module Schema
5
+ class Definition
6
+ class Validator
7
+ DEFAULT_SIZE = 1
8
+
9
+ def initialize(index, options)
10
+ @index = index
11
+ @options = options
12
+ end
13
+
14
+ def validate(name:, key:, size:, **)
15
+ if key.respond_to?(:call)
16
+ raise Error.new('"key" must not be lambda.', @index)
17
+ end
18
+ if !key && name.respond_to?(:call) && !size
19
+ raise Error.new('"size" must be specified, because column size cannot be determined.', @index)
20
+ end
21
+ if size && size < DEFAULT_SIZE
22
+ raise Error.new('"size" must be positive.', @index)
23
+ end
24
+ if @options[:result_type] == :hash && !key
25
+ raise Error.new('"key" must be specified when "result_type: :hash" is specified.', @index)
26
+ end
27
+
28
+ true
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TableStructure
4
+ module Schema
5
+ class Definition
6
+ DEFAULT_ATTRS = {
7
+ name: nil,
8
+ key: nil,
9
+ value: nil,
10
+ size: nil
11
+ }.freeze
12
+
13
+ DEFAULT_SIZE = 1
14
+
15
+ def initialize(definitions, options)
16
+ @definitions = definitions
17
+ @options = options
18
+ end
19
+
20
+ def compile(context = nil)
21
+ @definitions
22
+ .map { |definition| Utils.evaluate_callable(definition, context) }
23
+ .map.with_index do |definition, i|
24
+ validator = Validator.new(i, @options)
25
+
26
+ [definition]
27
+ .flatten
28
+ .map do |definition|
29
+ definition = DEFAULT_ATTRS.merge(definition)
30
+ validator.validate(definition)
31
+ definition[:size] = determine_size(definition)
32
+ definition
33
+ end
34
+ end
35
+ .flatten
36
+ end
37
+
38
+ private
39
+
40
+ def determine_size(name:, key:, size:, **)
41
+ return size if size
42
+
43
+ [calculate_size(name), calculate_size(key)].max
44
+ end
45
+
46
+ def calculate_size(val)
47
+ if val.is_a?(Array)
48
+ return val.empty? ? DEFAULT_SIZE : val.size
49
+ end
50
+
51
+ DEFAULT_SIZE
52
+ end
53
+ end
54
+ end
55
+ end
@@ -8,11 +8,11 @@ module TableStructure
8
8
  attr_reader :columns, :column_converters, :result_builders
9
9
 
10
10
  def initialize(column_definitions, column_converters, result_builders, context, options)
11
- @context = context
12
- @options = DEFAULT_OPTIONS.merge(options)
13
- @columns = build_columns(column_definitions)
11
+ options = DEFAULT_OPTIONS.merge(options)
12
+ @columns = build_columns(column_definitions, context, options)
14
13
  @column_converters = default_column_converters.merge(column_converters)
15
- @result_builders = default_result_builders.merge(result_builders)
14
+ @result_builders = default_result_builders(options).merge(result_builders)
15
+ @context = context
16
16
  end
17
17
 
18
18
  def header(context)
@@ -25,24 +25,20 @@ module TableStructure
25
25
 
26
26
  private
27
27
 
28
- def build_columns(definitions)
29
- definitions
30
- .map { |definition| Utils.evaluate_callable(definition, @context) }
31
- .map.with_index do |definition, i|
32
- [definition]
33
- .flatten
34
- .map { |definition| Column.new(definition, i) }
35
- end
36
- .flatten
28
+ def build_columns(definitions, context, options)
29
+ Definition
30
+ .new(definitions, options)
31
+ .compile(context)
32
+ .map { |attrs| Column.new(attrs) }
37
33
  end
38
34
 
39
35
  def default_column_converters
40
36
  {}
41
37
  end
42
38
 
43
- def default_result_builders
39
+ def default_result_builders(options)
44
40
  result_builders = {}
45
- if @options[:result_type] == :hash
41
+ if options[:result_type] == :hash
46
42
  result_builders[:to_h] = ->(array, *) { (@keys ||= keys).zip(array).to_h }
47
43
  end
48
44
  result_builders
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TableStructure
4
- VERSION = '0.1.3'
4
+ VERSION = '0.1.4'
5
5
  end
@@ -10,6 +10,9 @@ module TableStructure
10
10
  require 'table_structure/schema/dsl/column_definition'
11
11
  require 'table_structure/schema/dsl/context_builder'
12
12
  require 'table_structure/schema/dsl/result_builder'
13
+ require 'table_structure/schema/definition'
14
+ require 'table_structure/schema/definition/error'
15
+ require 'table_structure/schema/definition/validator'
13
16
  require 'table_structure/schema/table'
14
17
  require 'table_structure/schema/column'
15
18
  require 'table_structure/schema/utils'
@@ -27,5 +27,4 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency 'bundler', '~> 1.17'
28
28
  spec.add_development_dependency 'rake', '~> 10.0'
29
29
  spec.add_development_dependency 'rspec', '~> 3.0'
30
- spec.add_development_dependency 'rubocop', '~> 0.74.0'
31
30
  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.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - jsmmr
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-18 00:00:00.000000000 Z
11
+ date: 2019-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rubocop
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 0.74.0
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 0.74.0
69
55
  description: This gem creates and outputs table structure data. Useful for creating
70
56
  CSV.
71
57
  email:
@@ -87,6 +73,9 @@ files:
87
73
  - lib/table_structure.rb
88
74
  - lib/table_structure/schema.rb
89
75
  - lib/table_structure/schema/column.rb
76
+ - lib/table_structure/schema/definition.rb
77
+ - lib/table_structure/schema/definition/error.rb
78
+ - lib/table_structure/schema/definition/validator.rb
90
79
  - lib/table_structure/schema/dsl/column_converter.rb
91
80
  - lib/table_structure/schema/dsl/column_definition.rb
92
81
  - lib/table_structure/schema/dsl/context_builder.rb