table_structure 0.3.1 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f880b928161f99c6d4346f06304cb9cfe4a1c44f8ffb307243a70d74ec5e400d
4
- data.tar.gz: 9d1a30376429abe0906e3e0879eb230e4daf51c5c7de87cf28b63673433df83e
3
+ metadata.gz: edea213f708a84a4bfaf1a149a7c4fd9a78b2c50e36b72b951f6c0bc2b4d3a14
4
+ data.tar.gz: 71db859f76a5a55a33772d0764647afcfb0b6fa814705649d26c09f37f3ae35c
5
5
  SHA512:
6
- metadata.gz: 3b5ee4c95815cb891a25ac377ec72359d70394da3ea1aaf58ea71f77618ffaaa8a5443fff95366ab0ca8ecccd871aa33bafbbe134ccb8109645146392dcbc4fa
7
- data.tar.gz: 422e6db13c3940bdf873535c1f02d3f32211cca6a81ced5d1aebf678504f14daeda50c8de46d47762be33fcad79f90cb924d6d175a3a19c2029406d02d5a5a43
6
+ metadata.gz: 72abcf6d37f57322848493cd45e335276dc729524000007385d382dc0cb835fbf6ebe740c970e6de06bd4a78e45b4f63a1858f060bbbbbfc86396a9c2b57d088
7
+ data.tar.gz: 9332514abe32694295162c5349d5058e57c1bdf37a9c26eafb83e3bf18d9e01c88a128563f74193aece52fa0158adc6c2d2979fbd2663ad3b380aa17c4c3e03b
data/CHANGELOG.md CHANGED
@@ -1,8 +1,16 @@
1
+ # 0.3.2
2
+ Changes:
3
+ - `TableStructure::Writer`
4
+ - When `result_type: :hash` option is specified and `column(s)` key of the schema is undefined, index number is used as the key.
5
+
1
6
  # 0.3.1
2
7
  Changes:
8
+ - `TableStructure::Writer`
9
+ - Make `:result_type` option available.
10
+ - `TableStructure::Iterator`
11
+ - Make `:result_type` option available. (Passed to the writer internally.)
3
12
  - `TableStructure::Schema`
4
- - Make `:result_type` option available for `TableStructure::Write` and `TableStructure::Iterator`.
5
- - `:result_type` option for `TableStructure::Schema` is deprecated.
13
+ - `:result_type` option is deprecated.
6
14
 
7
15
  # 0.3.0
8
16
  Changes:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- table_structure (0.3.1)
4
+ table_structure (0.3.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -107,7 +107,7 @@ response_body = Enumerator.new { |y| writer.write(items, to: CSV.new(y)) }
107
107
  ```
108
108
 
109
109
  #### TableStructure::Iterator
110
- Specifying `result_type: :hash` option of `TableStructure::Schema` works well.
110
+ Specifying `result_type: :hash` option works well.
111
111
  To use this option, define `column(s)` with `:key`.
112
112
  ```ruby
113
113
  class SampleTableSchema
@@ -8,7 +8,7 @@ module TableStructure
8
8
 
9
9
  def initialize(definition, options)
10
10
  @name = definition[:name]
11
- @key = definition[:key]
11
+ @keys = optimize_size([definition[:key]].flatten, definition[:size])
12
12
  @value = definition[:value]
13
13
  @size = definition[:size]
14
14
  @options = options
@@ -16,27 +16,29 @@ module TableStructure
16
16
 
17
17
  def name(header_context, table_context)
18
18
  name = Utils.evaluate_callable(@name, header_context, table_context)
19
- optimize_size(name)
19
+ optimize_size(name, @size)
20
20
  end
21
21
 
22
22
  def key
23
- key = optimize_size(@key)
24
- decorate_key(key)
23
+ if @options[:key_prefix] || @options[:key_suffix]
24
+ decorate_keys
25
+ else
26
+ @keys
27
+ end
25
28
  end
26
29
 
27
30
  def value(row_context, table_context)
28
31
  value = Utils.evaluate_callable(@value, row_context, table_context)
29
- optimize_size(value)
32
+ optimize_size(value, @size)
30
33
  end
31
34
 
32
35
  private
33
36
 
34
- def optimize_size(value)
35
- return value if @size == 1 && !value.is_a?(Array)
37
+ def optimize_size(value, expected_size)
38
+ return value if expected_size == 1 && !value.is_a?(Array)
36
39
 
37
40
  values = [value].flatten
38
41
  actual_size = values.size
39
- expected_size = @size
40
42
  if actual_size > expected_size
41
43
  values[0, expected_size]
42
44
  elsif actual_size < expected_size
@@ -46,10 +48,8 @@ module TableStructure
46
48
  end
47
49
  end
48
50
 
49
- def decorate_key(key)
50
- return key unless @options[:key_prefix] || @options[:key_suffix]
51
-
52
- [key].flatten.map do |key|
51
+ def decorate_keys
52
+ @keys.map do |key|
53
53
  next key unless key
54
54
 
55
55
  decorated_key = "#{@options[:key_prefix]}#{key}#{@options[:key_suffix]}"
@@ -11,17 +11,25 @@ module TableStructure
11
11
  end
12
12
 
13
13
  def name(header_context, _table_context)
14
- schema.header(context: header_context)
14
+ @schema.header(context: header_context)
15
15
  end
16
16
 
17
17
  def key
18
- schema
19
- .instance_variable_get(:@table_structure_schema_table_)
20
- .send(:keys)
18
+ table.send(:keys)
21
19
  end
22
20
 
23
21
  def value(row_context, _table_context)
24
- schema.row(context: row_context)
22
+ @schema.row(context: row_context)
23
+ end
24
+
25
+ def size
26
+ table.send(:size)
27
+ end
28
+
29
+ private
30
+
31
+ def table
32
+ @schema.instance_variable_get(:@table_structure_schema_table_)
25
33
  end
26
34
  end
27
35
  end
@@ -4,11 +4,12 @@ module TableStructure
4
4
  module Schema
5
5
  class Definition
6
6
  class Error < ::TableStructure::Error
7
- attr_reader :index
7
+ attr_reader :schema_name, :definition_index
8
8
 
9
- def initialize(error_message, index)
10
- @index = index
11
- super("#{error_message} [defined position of column(s): #{index + 1}]")
9
+ def initialize(error_message, schema_name, definition_index)
10
+ @schema_name = schema_name
11
+ @definition_index = definition_index
12
+ super("#{error_message} [#{schema_name}] defined position of column(s): #{definition_index + 1}")
12
13
  end
13
14
  end
14
15
  end
@@ -6,26 +6,24 @@ module TableStructure
6
6
  class Validator
7
7
  DEFAULT_SIZE = 1
8
8
 
9
- def initialize(index, options)
9
+ def initialize(name, index, options)
10
+ @name = name
10
11
  @index = index
11
12
  @options = options
12
13
  end
13
14
 
14
15
  def validate(name:, key:, size:, **)
15
16
  if key.respond_to?(:call)
16
- raise Error.new('"key" must not be lambda.', @index)
17
+ raise Error.new('"key" must not be lambda.', @name, @index)
17
18
  end
18
19
  if !key && name.respond_to?(:call) && !size
19
- raise Error.new('"size" must be defined, because column size cannot be determined.', @index)
20
+ raise Error.new('"size" must be defined, because column size cannot be determined.', @name, @index)
20
21
  end
21
22
  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 defined when "result_type: :hash" is specified.', @index)
23
+ raise Error.new('"size" must be positive.', @name, @index)
26
24
  end
27
25
  if key && size && [key].flatten.size < size
28
- raise Error.new('"key" size must be greater than or equal to specified "size".', @index)
26
+ raise Error.new('"key" size must be greater than or equal to specified "size".', @name, @index)
29
27
  end
30
28
 
31
29
  true
@@ -13,7 +13,8 @@ module TableStructure
13
13
 
14
14
  DEFAULT_SIZE = 1
15
15
 
16
- def initialize(definitions, options)
16
+ def initialize(name, definitions, options)
17
+ @name = name
17
18
  @definitions = definitions
18
19
  @options = options
19
20
  end
@@ -22,7 +23,7 @@ module TableStructure
22
23
  @definitions
23
24
  .map { |definition| Utils.evaluate_callable(definition, context) }
24
25
  .map.with_index do |definition, i|
25
- validator = Validator.new(i, @options)
26
+ validator = Validator.new(@name, i, @options)
26
27
 
27
28
  [definition]
28
29
  .flatten
@@ -40,7 +41,7 @@ module TableStructure
40
41
  elsif Utils.schema_class?(definition)
41
42
  definition.new(context: context)
42
43
  else
43
- raise Error.new('Invalid definition.', i)
44
+ raise Error.new('Invalid definition.', @name, i)
44
45
  end
45
46
  end
46
47
  end
@@ -4,13 +4,16 @@ module TableStructure
4
4
  module Schema
5
5
  class Table
6
6
  RESULT_BUILDERS = {
7
- hash: ->(values, keys, *) { keys.zip(values).to_h }
7
+ hash: lambda { |values, keys, *|
8
+ keys.map.with_index { |key, i| [key || i, values[i]] }.to_h
9
+ }
8
10
  }.freeze
9
11
 
10
12
  attr_reader :columns, :column_converters, :result_builders, :options
11
13
 
12
- def initialize(column_definitions, column_converters, result_builders, context, options)
13
- @columns = build_columns(column_definitions, context, options)
14
+ def initialize(name, column_definitions, column_converters, result_builders, context, options)
15
+ @name = name
16
+ @columns = build_columns(name, column_definitions, context, options)
14
17
  @column_converters = column_converters
15
18
  @result_builders = result_builders
16
19
  @context = context
@@ -29,11 +32,15 @@ module TableStructure
29
32
  @keys ||= @columns.map(&:key).flatten
30
33
  end
31
34
 
35
+ def size
36
+ @size ||= @columns.map(&:size).reduce(0) { |memo, size| memo + size }
37
+ end
38
+
32
39
  private
33
40
 
34
- def build_columns(definitions, context, options)
41
+ def build_columns(name, definitions, context, options)
35
42
  Definition
36
- .new(definitions, options)
43
+ .new(name, definitions, options)
37
44
  .compile(context)
38
45
  .map { |definition| Column.create(definition, options) }
39
46
  end
@@ -7,15 +7,6 @@ module TableStructure
7
7
  val.respond_to?(:call) ? val.call(*params) : val
8
8
  end
9
9
 
10
- def self.concat_key(key, prefix, suffix)
11
- case key
12
- when Symbol
13
- "#{prefix}#{key}#{suffix}".to_sym
14
- else
15
- "#{prefix}#{key}#{suffix}"
16
- end
17
- end
18
-
19
10
  def self.schema_class?(val)
20
11
  val.is_a?(Class) &&
21
12
  val.included_modules.include?(::TableStructure::Schema)
@@ -16,7 +16,7 @@ module TableStructure
16
16
  key_suffix: nil
17
17
  }.freeze
18
18
 
19
- def initialize(context: nil, **options)
19
+ def initialize(context: nil, name: self.class.name, **options)
20
20
  column_definitions = self.class.column_definitions
21
21
  column_converters = self.class.column_converters
22
22
  result_builders = self.class.result_builders
@@ -24,6 +24,7 @@ module TableStructure
24
24
  options = DEFAULT_OPTIONS.merge(self.class.options).merge(options)
25
25
  @table_structure_schema_table_ =
26
26
  Table.new(
27
+ name,
27
28
  column_definitions,
28
29
  column_converters,
29
30
  result_builders,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TableStructure
4
- VERSION = '0.3.1'
4
+ VERSION = '0.3.2'
5
5
  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.3.1
4
+ version: 0.3.2
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-30 00:00:00.000000000 Z
11
+ date: 2019-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler