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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG.md +37 -0
  4. data/Gemfile.lock +7 -7
  5. data/README.md +84 -78
  6. data/lib/table_structure.rb +6 -12
  7. data/lib/table_structure/csv/writer.rb +4 -41
  8. data/lib/table_structure/iterator.rb +48 -89
  9. data/lib/table_structure/schema.rb +63 -76
  10. data/lib/table_structure/schema/class_methods.rb +2 -2
  11. data/lib/table_structure/schema/column_builder_factory.rb +75 -0
  12. data/lib/table_structure/schema/columns/attributes.rb +14 -9
  13. data/lib/table_structure/schema/columns/schema.rb +14 -9
  14. data/lib/table_structure/schema/composite_class.rb +40 -0
  15. data/lib/table_structure/schema/definition/columns/compiler.rb +7 -3
  16. data/lib/table_structure/schema/definition/columns/validator.rb +2 -6
  17. data/lib/table_structure/schema/dsl/column_builder.rb +29 -0
  18. data/lib/table_structure/schema/dsl/context_builder.rb +3 -5
  19. data/lib/table_structure/schema/dsl/row_builder.rb +5 -5
  20. data/lib/table_structure/schema/{key_converter.rb → keys_builder.rb} +2 -2
  21. data/lib/table_structure/schema/row_context_builder_factory.rb +30 -0
  22. data/lib/table_structure/table.rb +31 -56
  23. data/lib/table_structure/utils.rb +40 -0
  24. data/lib/table_structure/version.rb +1 -1
  25. data/lib/table_structure/writer.rb +7 -54
  26. metadata +8 -14
  27. data/lib/table_structure/schema/column_converter.rb +0 -48
  28. data/lib/table_structure/schema/definition/column_converter.rb +0 -31
  29. data/lib/table_structure/schema/definition/context_builder.rb +0 -17
  30. data/lib/table_structure/schema/definition/row_builder.rb +0 -25
  31. data/lib/table_structure/schema/dsl/column_converter.rb +0 -34
  32. data/lib/table_structure/schema/dsl/option.rb +0 -19
  33. data/lib/table_structure/schema/row_builder.rb +0 -22
  34. data/lib/table_structure/table/column_converter.rb +0 -46
  35. data/lib/table_structure/table/context_builder.rb +0 -49
  36. data/lib/table_structure/table/iterator.rb +0 -22
  37. data/lib/table_structure/table/row_builder.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c8d52660a94da1c1fbcc8a14a8332214c32ba1627a50239ee72f9916e12c8502
4
- data.tar.gz: 2156f6ebaa0ee6fd88dfb282a3c339e20101da8bf33cd250355eff7557915921
3
+ metadata.gz: 06f36abaa1bc4478901ea51a27e0e22b00ecf70ecbfd18b4c785c2e86e08ca1d
4
+ data.tar.gz: 26990e2f8ac30764a3d571dbf8a35e422ce163989f9eda5e92aa3c2b9e5cf498
5
5
  SHA512:
6
- metadata.gz: 9e5091c8a9c362a09b563e608cf78b74fddb53526ebd53ef30700f4c975429689c5ab8e27f72918d7c4fbdcd798b7911f20dd70593a313fe59bdb88d5deb8e35
7
- data.tar.gz: 6ae2d481a839d63271009435173250f929009bd2273a59f3aaa974cc14e7612d7cb55258c82c2fe189f304277249d298e0eaaa7d15d1d20b6acc53cee3bb02f9
6
+ metadata.gz: 288ea6944e5efa303a3c39e4502dce7b0d2994504796a7de0b69b28d8b0cd91f878670db9846a51cbb57d16797bb8124e50f2162db00ec89b49d83de3a345030
7
+ data.tar.gz: 72d983aef1de40282befe38d230806b1fb3deec4ecf08801822867d43ea656a6a307ad53c46ae87f2661bcc90ef5c6f0b3d8c5ea515eb80ddeb78e559b552585
@@ -8,4 +8,4 @@ rvm:
8
8
  - 2.5
9
9
  - 2.4
10
10
  - 2.3
11
- before_install: gem install bundler:2.1.2
11
+ before_install: gem install bundler:2.1.4
@@ -1,3 +1,40 @@
1
+ # 0.4.2
2
+ Changes:
3
+ - `TableStructure::Schema`
4
+ - Improve performance.
5
+ - `TableStructure::Iterator`
6
+ - `TableStructure::Writer`
7
+ - `TableStructure::CSV::Writer`
8
+ - Add validation for `header: { step: n }` option.
9
+ - `n` is allowed positive number or `nil`(default).
10
+
11
+ # 0.4.1
12
+ Changes:
13
+ - `TableStructure::Iterator`
14
+ - `TableStructure::Writer`
15
+ - `TableStructure::CSV::Writer`
16
+ - Add `header: { step: n }` option. Header rows are output at intervals of step number.
17
+ - e.g. `TableStructure::Iterator.new(schema, header: { step: 10 })`
18
+
19
+ # 0.4.0
20
+ Changes:
21
+ - Remove deprecated methods, arguments and options.
22
+ - It is recommended that you update to `0.3.23` first. If you get warnings or errors, fix them and then update to `0.4.0`.
23
+
24
+ # 0.3.23
25
+ Changes:
26
+ - `TableStructure::CSV::Writer`
27
+ - Fix not to output wrong warning.
28
+
29
+ # 0.3.22
30
+ Changes:
31
+ - `TableStructure::Schema`
32
+ - DSL
33
+ - `column_converter`
34
+ - Using `lambda` has been deprecated. Use `block` instead.
35
+ - `context_builder`
36
+ - Using `lambda` has been deprecated. Use `block` instead.
37
+
1
38
  # 0.3.21
2
39
  Changes:
3
40
  - Add `TableStructure::Table`
@@ -1,26 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- table_structure (0.3.21)
4
+ table_structure (0.4.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- diff-lcs (1.3)
9
+ diff-lcs (1.4.4)
10
10
  rake (13.0.1)
11
11
  rspec (3.9.0)
12
12
  rspec-core (~> 3.9.0)
13
13
  rspec-expectations (~> 3.9.0)
14
14
  rspec-mocks (~> 3.9.0)
15
- rspec-core (3.9.1)
16
- rspec-support (~> 3.9.1)
17
- rspec-expectations (3.9.0)
15
+ rspec-core (3.9.2)
16
+ rspec-support (~> 3.9.3)
17
+ rspec-expectations (3.9.2)
18
18
  diff-lcs (>= 1.2.0, < 2.0)
19
19
  rspec-support (~> 3.9.0)
20
20
  rspec-mocks (3.9.1)
21
21
  diff-lcs (>= 1.2.0, < 2.0)
22
22
  rspec-support (~> 3.9.0)
23
- rspec-support (3.9.2)
23
+ rspec-support (3.9.3)
24
24
 
25
25
  PLATFORMS
26
26
  ruby
@@ -32,4 +32,4 @@ DEPENDENCIES
32
32
  table_structure!
33
33
 
34
34
  BUNDLED WITH
35
- 2.1.2
35
+ 2.1.4
data/README.md CHANGED
@@ -56,7 +56,9 @@ class SampleTableSchema
56
56
  end
57
57
  }
58
58
 
59
- column_converter :to_s, ->(val, _row, _table) { val.to_s }
59
+ column_converter :to_s do |val, _row, _table|
60
+ val.to_s
61
+ end
60
62
  end
61
63
  ```
62
64
 
@@ -104,10 +106,10 @@ items = [
104
106
  ## or
105
107
  # items = Enumerator.new { |y| Item.find_each { |item| y << item } }
106
108
 
107
- table = []
108
- writer.write(items, to: table)
109
+ array = []
110
+ writer.write(items, to: array)
109
111
 
110
- # table
112
+ # array
111
113
  # => [["ID", "Name", "Pet 1", "Pet 2", "Pet 3", "Q1", "Q2", "Q3"], ["1", "Taro", "🐱", "🐶", "", "⭕️", "❌", "⭕️"], ["2", "Hanako", "🐇", "🐢", "🐿", "⭕️", "⭕️", "❌"]]
112
114
  ```
113
115
 
@@ -124,6 +126,7 @@ Write the items converted by the schema to stream as CSV with Rails:
124
126
  response.headers['Cache-Control'] = 'no-cache'
125
127
  response.headers['Content-Type'] = 'text/csv'
126
128
  response.headers['Content-Disposition'] = 'attachment; filename="sample.csv"'
129
+ response.headers['Last-Modified'] = Time.now.ctime.to_s # Required if Rack >= 2.2.0
127
130
  response_body = Enumerator.new do |y|
128
131
  # y << "\uFEFF" # BOM (Prevent garbled characters for Excel)
129
132
  writer.write(items, to: CSV.new(y))
@@ -133,8 +136,8 @@ end
133
136
  You can also convert CSV character code:
134
137
  ```ruby
135
138
  File.open('sample.csv', 'w') do |f|
136
- writer.write(items, to: CSV.new(f)) do |row_values|
137
- row_values.map { |val| val.to_s.encode('Shift_JIS', invalid: :replace, undef: :replace) }
139
+ writer.write(items, to: CSV.new(f)) do |row|
140
+ row.map { |val| val.to_s.encode('Shift_JIS', invalid: :replace, undef: :replace) }
138
141
  end
139
142
  end
140
143
  ```
@@ -178,10 +181,6 @@ class SampleTableSchema
178
181
  }
179
182
  end
180
183
  }
181
-
182
- ## If the schemas are nested, :key must be unique in parent and child schemas.
183
- ## This can also be avoided by using :key_prefix or :key_suffix option.
184
- # columns ->(table) { NestedTableSchema.new(context: table, key_prefix: 'foo_', key_suffix: '_bar') }
185
184
  end
186
185
  ```
187
186
 
@@ -257,6 +256,10 @@ Initialize a table with the schema and render the table:
257
256
  <% end %>
258
257
  ```
259
258
 
259
+ ### Sample with docker
260
+
261
+ https://github.com/jsmmr/ruby_table_structure_sample
262
+
260
263
  ### Advanced
261
264
 
262
265
  You can add definitions when initializing the schema.
@@ -272,7 +275,9 @@ class UserTableSchema
272
275
  end
273
276
 
274
277
  schema = UserTableSchema.new do
275
- column_converter :to_s, ->(val, *) { val.to_s }
278
+ column_converter :to_s do |val, *|
279
+ val.to_s
280
+ end
276
281
  end
277
282
  ```
278
283
 
@@ -324,53 +329,91 @@ context = { pet_num: 0 }
324
329
  schema = SampleTableSchema.new(context: context, nil_definitions_ignored: true)
325
330
  ```
326
331
 
327
- You can also nest the schemas.
332
+ You can also use `context_builder` to change the context object that the `lambda` receives.
328
333
  ```ruby
329
- class UserTableSchema
334
+ class SampleTableSchema
330
335
  include TableStructure::Schema
331
336
 
337
+ TableContext = Struct.new(:questions, keyword_init: true)
338
+
339
+ RowContext = Struct.new(:id, :name, :pets, :answers, keyword_init: true) do
340
+ def increase_pets
341
+ pets + pets
342
+ end
343
+ end
344
+
345
+ context_builder :table do |context|
346
+ TableContext.new(**context)
347
+ end
348
+
349
+ context_builder :row, :value do |context|
350
+ RowContext.new(**context)
351
+ end
352
+
332
353
  column name: 'ID',
333
- value: ->(row, *) { row[:id] }
354
+ value: ->(row, *) { row.id }
334
355
 
335
356
  column name: 'Name',
336
- value: ->(row, *) { row[:name] }
337
- end
338
-
339
- class PetTableSchema
340
- include TableStructure::Schema
357
+ value: ->(row, *) { row.name }
341
358
 
342
359
  columns name: ['Pet 1', 'Pet 2', 'Pet 3'],
343
- value: ->(row, *) { row[:pets] }
344
- end
345
-
346
- class QuestionTableSchema
347
- include TableStructure::Schema
360
+ value: ->(row, *) { row.increase_pets }
348
361
 
349
362
  columns ->(table) {
350
- table[:questions].map do |question|
363
+ table.questions.map do |question|
351
364
  {
352
365
  name: question[:id],
353
- value: ->(row, *) { row[:answers][question[:id]] }
366
+ value: ->(row, *) { row.answers[question[:id]] }
354
367
  }
355
368
  end
356
369
  }
357
370
  end
371
+ ```
372
+
373
+ You can also nest the schemas.
374
+ If you nest the schemas and use `row_type: :hash`, `:key` must be unique in the schemas.
375
+ You can also use `:key_prefix` or `:key_suffix` option to keep uniqueness of the keys.
376
+
377
+ ```ruby
378
+ class UserTableSchema
379
+ include TableStructure::Schema
380
+
381
+ column name: 'ID',
382
+ key: :id,
383
+ value: ->(row, *) { row[:id] }
384
+
385
+ column name: 'Name',
386
+ key: :name,
387
+ value: ->(row, *) { row[:name] }
388
+ end
358
389
 
359
390
  class SampleTableSchema
360
391
  include TableStructure::Schema
361
392
 
362
393
  columns UserTableSchema
363
- ## or
364
- # columns ->(table) { UserTableSchema.new(context: table) }
365
394
 
366
- columns PetTableSchema
367
- ## or
368
- # columns ->(table) { PetTableSchema.new(context: table) }
369
-
370
- columns QuestionTableSchema
371
- ## or
372
- # columns ->(table) { QuestionTableSchema.new(context: table) }
395
+ columns ->(table) {
396
+ UserTableSchema.new(context: table, name_prefix: 'Friend ', key_prefix: 'friend_') do
397
+ context_builder :row do |context|
398
+ context[:friend]
399
+ end
400
+ end
401
+ }
373
402
  end
403
+
404
+ items = [
405
+ {
406
+ id: 1,
407
+ name: 'Taro',
408
+ friend: {
409
+ id: 2,
410
+ name: 'Hanako'
411
+ }
412
+ }
413
+ ]
414
+
415
+ schema = SampleTableSchema.new(context: {})
416
+ TableStructure::Iterator.new(schema, row_type: :hash).iterate(items)
374
417
  ```
375
418
 
376
419
  You can also concatenate or merge the schema classes.
@@ -398,7 +441,9 @@ class PetTableSchema
398
441
  columns name: ['Pet 1', 'Pet 2', 'Pet 3'],
399
442
  value: ->(row, *) { row[:pets] }
400
443
 
401
- column_converter :same_name, ->(val, *) { "pet: #{val}" }
444
+ column_converter :same_name do |val, *|
445
+ "pet: #{val}"
446
+ end
402
447
  end
403
448
 
404
449
  class QuestionTableSchema
@@ -413,7 +458,9 @@ class QuestionTableSchema
413
458
  end
414
459
  }
415
460
 
416
- column_converter :same_name, ->(val, *) { "question: #{val}" }
461
+ column_converter :same_name do |val, *|
462
+ "question: #{val}"
463
+ end
417
464
  end
418
465
 
419
466
  context = {
@@ -429,47 +476,6 @@ concatenated_schema = (UserTableSchema + PetTableSchema + QuestionTableSchema).n
429
476
  merged_schema = UserTableSchema.merge(PetTableSchema, QuestionTableSchema).new(context: context)
430
477
  ```
431
478
 
432
- You can also use `context_builder`.
433
- This may be useful if `column(s)` lambda is complicated.
434
- ```ruby
435
- class SampleTableSchema
436
- include TableStructure::Schema
437
-
438
- TableContext = Struct.new(:questions, keyword_init: true)
439
-
440
- RowContext = Struct.new(:id, :name, :pets, :answers, keyword_init: true) do
441
- def more_pets
442
- pets + pets
443
- end
444
- end
445
-
446
- context_builder :table, ->(context) { TableContext.new(**context) }
447
- context_builder :row, ->(context) { RowContext.new(**context) }
448
-
449
- column name: 'ID',
450
- value: ->(row, *) { row.id }
451
-
452
- column name: 'Name',
453
- value: ->(row, *) { row.name }
454
-
455
- columns name: ['Pet 1', 'Pet 2', 'Pet 3'],
456
- value: ->(row, *) { row.more_pets }
457
-
458
- columns ->(table) {
459
- table.questions.map do |question|
460
- {
461
- name: question[:id],
462
- value: ->(row, *) { row.answers[question[:id]] }
463
- }
464
- end
465
- }
466
- end
467
- ```
468
-
469
- ## Sample with docker
470
-
471
- https://github.com/jsmmr/ruby_table_structure_sample
472
-
473
479
  ## Contributing
474
480
 
475
481
  Bug reports and pull requests are welcome on GitHub at https://github.com/jsmmr/ruby_table_structure.
@@ -5,33 +5,27 @@ module TableStructure
5
5
 
6
6
  require 'table_structure/version'
7
7
  require 'forwardable'
8
+ require 'table_structure/utils'
8
9
  require 'table_structure/schema'
9
10
  require 'table_structure/schema/class_methods'
10
- require 'table_structure/schema/dsl/column_converter'
11
+ require 'table_structure/schema/composite_class'
12
+ require 'table_structure/schema/dsl/column_builder'
11
13
  require 'table_structure/schema/dsl/column_definition'
12
14
  require 'table_structure/schema/dsl/context_builder'
13
- require 'table_structure/schema/dsl/option'
14
15
  require 'table_structure/schema/dsl/row_builder'
15
- require 'table_structure/schema/definition/column_converter'
16
- require 'table_structure/schema/definition/context_builder'
17
- require 'table_structure/schema/definition/row_builder'
18
16
  require 'table_structure/schema/definition/columns/compiler'
19
17
  require 'table_structure/schema/definition/columns/error'
20
18
  require 'table_structure/schema/definition/columns/validator'
21
19
  require 'table_structure/schema/definition/columns/attributes'
22
20
  require 'table_structure/schema/definition/columns/schema_class'
23
21
  require 'table_structure/schema/definition/columns/schema_instance'
24
- require 'table_structure/schema/column_converter'
25
- require 'table_structure/schema/row_builder'
26
- require 'table_structure/schema/key_converter'
22
+ require 'table_structure/schema/column_builder_factory'
23
+ require 'table_structure/schema/keys_builder'
24
+ require 'table_structure/schema/row_context_builder_factory'
27
25
  require 'table_structure/schema/columns/attributes'
28
26
  require 'table_structure/schema/columns/schema'
29
27
  require 'table_structure/schema/utils'
30
28
  require 'table_structure/table'
31
- require 'table_structure/table/column_converter'
32
- require 'table_structure/table/context_builder'
33
- require 'table_structure/table/row_builder'
34
- require 'table_structure/table/iterator'
35
29
  require 'table_structure/writer'
36
30
  require 'table_structure/csv/writer'
37
31
  require 'table_structure/iterator'
@@ -9,32 +9,19 @@ module TableStructure
9
9
  schema,
10
10
  bom: false,
11
11
  csv_options: {},
12
- header: { context: nil },
13
- **deprecated_options
12
+ header: { context: nil, step: nil }
14
13
  )
15
- if deprecated_options.key?(:header_omitted)
16
- header_omitted = deprecated_options[:header_omitted]
17
- warn "[TableStructure] `header_omitted: #{!!header_omitted}` option has been deprecated. Use `header: #{!header_omitted}` option instead."
18
- header = !header_omitted
19
- end
20
-
21
- if deprecated_options.key?(:header_context)
22
- header_context = deprecated_options[:header_context]
23
- warn '[TableStructure] `:header_context` option has been deprecated. Use `header: { context: ... }` option instead.'
24
- header = { context: header_context }
25
- end
26
-
27
14
  require 'csv'
28
15
 
29
16
  @options = {
30
17
  bom: bom,
31
18
  csv_options: csv_options
32
19
  }
33
- @inner_options = {
20
+ inner_options = {
34
21
  header: header
35
22
  }
36
23
 
37
- @writer = ::TableStructure::Writer.new(schema, **@inner_options)
24
+ @writer = ::TableStructure::Writer.new(schema, **inner_options)
38
25
  end
39
26
 
40
27
  def write(
@@ -42,36 +29,12 @@ module TableStructure
42
29
  to:,
43
30
  bom: @options[:bom],
44
31
  csv_options: @options[:csv_options],
45
- **deprecated_options,
46
32
  &block
47
33
  )
48
- header = @inner_options[:header]
49
-
50
- if deprecated_options.key?(:header)
51
- header = deprecated_options[:header]
52
- warn '[TableStructure] Specify :header option as an argument for initialize method.'
53
- end
54
-
55
- if deprecated_options.key?(:header_omitted)
56
- header_omitted = deprecated_options[:header_omitted]
57
- warn "[TableStructure] `header_omitted: #{!!header_omitted}` option has been deprecated. Use `header: #{!header_omitted}` option instead."
58
- header = !header_omitted
59
- end
60
-
61
- if deprecated_options.key?(:header_context)
62
- header_context = deprecated_options[:header_context]
63
- warn '[TableStructure] `:header_context` option has been deprecated. Use `header: { context: ... }` option instead.'
64
- header = { context: header_context }
65
- end
66
-
67
- inner_options = {
68
- header: header
69
- }
70
-
71
34
  to << BOM if bom
72
35
 
73
36
  csv = ::CSV.new(to, **csv_options)
74
- @writer.write(items, to: csv, **inner_options, &block)
37
+ @writer.write(items, to: csv, &block)
75
38
  end
76
39
  end
77
40
  end