tablesmith 0.1.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45818202ea467196502cd88dabbba91262f0476d
4
- data.tar.gz: b6ece78a22c856daee3f1aab6b1eeb13cfe0201f
3
+ metadata.gz: 422060113ff10de9d77319825d7c0584b1389e3e
4
+ data.tar.gz: c2672e0136fe3ccad708644232db70a7f3112ddd
5
5
  SHA512:
6
- metadata.gz: 43d69277e17bb8909aa962b96f97a6d02a14bdce203bacd37e4be3d07031fa8a8fa8adec62a58ca2b9ff0fa66a30cd0dba750ee5057c6b13157b264f0bf93ee9
7
- data.tar.gz: b6345a15062ebcb554494558880bff872fba9f96424bc4ae1ddeb43003d3137da96afbce0ea1210a0cc0e0c1ed4334895bb43a117517c932aaeb51440d867db8
6
+ metadata.gz: 362ffe3c1d3cb37c26a521de9eea14cc4bcfb5ec42534930486d05238ecb2fb1fb90621318eb2bab75d979d9040c274601626a456464317cd6f8e2d7e8f1e340
7
+ data.tar.gz: 7df00f39dc421aaa159900710dc2af3de41d4d8805a8936818fbca388d64cf3dca682cbfa08b900d28616cbd9dd10136979dd06d1214bf84a1155fe9fa606280
@@ -0,0 +1,5 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+
4
+ Layout/IndentHeredoc:
5
+ Enabled: true
@@ -0,0 +1 @@
1
+ language: ruby
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tablesmith (0.1.2)
4
+ tablesmith (0.2.1)
5
5
  text-table
6
6
 
7
7
  GEM
@@ -63,4 +63,4 @@ DEPENDENCIES
63
63
  tablesmith!
64
64
 
65
65
  BUNDLED WITH
66
- 1.15.3
66
+ 1.15.4
data/README.md CHANGED
@@ -26,8 +26,8 @@ Happy to learn about something else already out there, but have struggled to fin
26
26
  that doesn't require some sort of setup. I want drop-in ready-to-go table output for Hashes,
27
27
  Arrays and ActiveRecord objects.
28
28
 
29
- Other gems that I've tried out that are awesome and do much more than what Tablesmith does,
30
- but don't seem to specialize in what I want.
29
+ Here's a quick list of other gems that I've tried out that are awesome and do much more than what Tablesmith does,
30
+ but don't seem to specialize in what I want:
31
31
 
32
32
  - Hirb
33
33
  - text-table
@@ -1,5 +1,6 @@
1
- require 'tablesmith/batch'
2
- require 'tablesmith/active_record_source'
1
+ require 'tablesmith/table'
3
2
  require 'tablesmith/array_rows_source'
3
+ require 'tablesmith/hash_rows_base'
4
4
  require 'tablesmith/hash_rows_source'
5
+ require 'tablesmith/active_record_source'
5
6
  require 'tablesmith/version'
@@ -1,13 +1,11 @@
1
1
  module Tablesmith::ActiveRecordSource
2
+ include Tablesmith::HashRowsBase
3
+
2
4
  def convert_item_to_hash_row(item)
3
- # TODO: reload ActiveRecords automagically
4
- if item.respond_to? :serializable_hash
5
- hash = item.serializable_hash(process_all_columns(serializable_options))
6
- hash = fold_un_sourced_attributes_into_source_hash(first.class.name.underscore.to_sym, hash)
7
- flatten_inner_hashes(hash)
8
- else
9
- super
10
- end
5
+ item.reload unless item.new_record?
6
+ hash = item.serializable_hash(process_all_columns(serializable_options))
7
+ hash = fold_un_sourced_attributes_into_source_hash(first.class.name.underscore.to_sym, hash)
8
+ flatten_inner_hashes(hash)
11
9
  end
12
10
 
13
11
  def column_order
@@ -19,25 +17,30 @@ module Tablesmith::ActiveRecordSource
19
17
  {}
20
18
  end
21
19
 
22
- # TODO: memoize
23
20
  def process_all_columns(serializable_options)
24
- @columns = []
21
+ build_columns(serializable_options)
25
22
 
26
- process_columns(serializable_options, first.class)
23
+ serializable_options
24
+ end
27
25
 
28
- include = serializable_options[:include]
26
+ def build_columns(serializable_options)
27
+ @columns || begin
28
+ @columns = []
29
29
 
30
- # swiped from activemodel-3.2.17/lib/active_model/serialization.rb
31
- unless include.is_a?(Hash)
32
- include = Hash[Array.wrap(include).map { |n| n.is_a?(Hash) ? n.to_a.first : [n, {}] }]
33
- end
30
+ process_columns(serializable_options, first.class)
34
31
 
35
- include.each do |association, opts|
36
- ar_class = first.class.reflections[association].klass
37
- process_columns(opts, ar_class)
38
- end
32
+ include = serializable_options[:include]
39
33
 
40
- serializable_options
34
+ # swiped from activemodel-3.2.17/lib/active_model/serialization.rb
35
+ unless include.is_a?(Hash)
36
+ include = Hash[Array.wrap(include).map { |n| n.is_a?(Hash) ? n.to_a.first : [n, {}] }]
37
+ end
38
+
39
+ include.each do |association, opts|
40
+ ar_class = first.class.reflections[association].klass
41
+ process_columns(opts, ar_class)
42
+ end
43
+ end
41
44
  end
42
45
 
43
46
  def process_columns(serializable_options, ar_class)
@@ -0,0 +1,34 @@
1
+ # ActiveRecord and HashRowsSource share a lot, but not everything.
2
+ module Tablesmith::HashRowsBase
3
+ # not all resulting rows will have data in all columns, so make sure all rows pad out missing columns
4
+ def normalize_keys(rows)
5
+ all_keys = rows.map(&:keys).flatten.uniq
6
+ rows.map { |hash_row| all_keys.each { |key| hash_row[key] ||= '' } }
7
+ end
8
+
9
+ def sort_columns(rows)
10
+ rows.map! do |row|
11
+ # this sort gives preference to column_order then falls back to alphabetic for leftovers.
12
+ # this is handy when columns auto-generate based on hash data.
13
+ row.sort do |a, b|
14
+ a_col_name, b_col_name = [a.first, b.first]
15
+ a_col_index, b_col_index = [column_order.index(a_col_name), column_order.index(b_col_name)]
16
+
17
+ if a_col_index.nil? && b_col_index.nil?
18
+ a_col_name <=> b_col_name
19
+ else
20
+ (a_col_index || 999) <=> (b_col_index || 999)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ def row_values(row)
27
+ row.map(&:last)
28
+ end
29
+
30
+ def create_headers(rows)
31
+ column_names = rows.first.map(&:first)
32
+ grouped_headers(column_names) + [apply_column_aliases(column_names), :separator]
33
+ end
34
+ end
@@ -1,4 +1,6 @@
1
1
  module Tablesmith::HashRowsSource
2
+ include Tablesmith::HashRowsBase
3
+
2
4
  def text_table
3
5
  build_columns if columns.nil?
4
6
  super
@@ -60,36 +62,4 @@ module Tablesmith::HashRowsSource
60
62
  # Array addition from text-table
61
63
  table.to_table(:first_row_is_head => true)
62
64
  end
63
-
64
- # not all resulting rows will have data in all columns, so make sure all rows pad out missing columns
65
- def normalize_keys(rows)
66
- all_keys = rows.map { |hash_row| hash_row.keys }.flatten.uniq
67
- rows.map { |hash_row| all_keys.each { |key| hash_row[key] ||= '' } }
68
- end
69
-
70
- def sort_columns(rows)
71
- rows.map! do |row|
72
- # this sort gives preference to column_order then falls back to alphabetic for leftovers.
73
- # this is handy when columns auto-generate based on hash data.
74
- row.sort do |a, b|
75
- a_col_name, b_col_name = [a.first, b.first]
76
- a_col_index, b_col_index = [column_order.index(a_col_name), column_order.index(b_col_name)]
77
-
78
- if a_col_index.nil? && b_col_index.nil?
79
- a_col_name <=> b_col_name
80
- else
81
- (a_col_index || 999) <=> (b_col_index || 999)
82
- end
83
- end
84
- end
85
- end
86
-
87
- def row_values(row)
88
- row.map(&:last)
89
- end
90
-
91
- def create_headers(rows)
92
- column_names = rows.first.map(&:first)
93
- grouped_headers(column_names) + [apply_column_aliases(column_names), :separator]
94
- end
95
65
  end
@@ -1,7 +1,7 @@
1
1
  require 'text-table'
2
2
 
3
3
  module Tablesmith
4
- class Batch < Array
4
+ class Table < Array
5
5
  def method_missing(meth_id, *args)
6
6
  count = 1
7
7
  self.map do |t|
@@ -62,7 +62,6 @@ module Tablesmith
62
62
  []
63
63
  end
64
64
 
65
- # TODO: resolve with column_order
66
65
  def columns
67
66
  @columns
68
67
  end
@@ -118,12 +117,16 @@ module Tablesmith
118
117
  def full_unaliased_name
119
118
  "#{@source ? "#{@source}." : ''}#{@name}"
120
119
  end
120
+
121
+ def to_s
122
+ "#{@source}.#{@name}#{' as ' + @alias if @alias}"
123
+ end
121
124
  end
122
125
  end
123
126
 
124
127
  class Array
125
- def to_batch
126
- b = Tablesmith::Batch.new(self)
128
+ def to_table
129
+ b = Tablesmith::Table.new(self)
127
130
 
128
131
  if defined?(ActiveRecord) && defined?(ActiveRecord::Base)
129
132
  if b.first && b.first.is_a?(ActiveRecord::Base)
@@ -143,3 +146,9 @@ class Array
143
146
  end
144
147
  end
145
148
 
149
+ class Hash
150
+ def to_table
151
+ b = Tablesmith::Table.new([self])
152
+ b.extend Tablesmith::HashRowsSource
153
+ end
154
+ end
@@ -1,3 +1,3 @@
1
1
  module Tablesmith
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.1'.freeze
3
3
  end
@@ -4,40 +4,40 @@ describe 'ActiveRecordSource' do
4
4
  it 'outputs text table of multiple ActiveRecords' do
5
5
  a = Person.new.tap { |c| c.first_name = 'A' }
6
6
  b = Person.new.tap { |c| c.first_name = 'B' }
7
- expected = <<-TABLE
8
- +----+------------+-----------+-----+-------------------+
9
- | id | first_name | last_name | age | custom_attributes |
10
- +----+------------+-----------+-----+-------------------+
11
- | | A | | | |
12
- | | B | | | |
13
- +----+------------+-----------+-----+-------------------+
7
+ expected = <<~TABLE
8
+ +----+------------+-----------+-----+-------------------+
9
+ | id | first_name | last_name | age | custom_attributes |
10
+ +----+------------+-----------+-----+-------------------+
11
+ | | A | | | |
12
+ | | B | | | |
13
+ +----+------------+-----------+-----+-------------------+
14
14
  TABLE
15
- [a, b].to_batch.text_table.to_s.should == expected
15
+ [a, b].to_table.text_table.to_s.should == expected
16
16
  end
17
17
 
18
18
  it 'outputs ActiveRecord in column order' do
19
19
  p = Person.create(:first_name => 'chris', :last_name => 'mo', :age => 43)
20
- expected = <<-TABLE
21
- +----+------------+-----------+-----+-------------------+
22
- | id | first_name | last_name | age | custom_attributes |
23
- +----+------------+-----------+-----+-------------------+
24
- | 1 | chris | mo | 43 | |
25
- +----+------------+-----------+-----+-------------------+
20
+ expected = <<~TABLE
21
+ +----+------------+-----------+-----+-------------------+
22
+ | id | first_name | last_name | age | custom_attributes |
23
+ +----+------------+-----------+-----+-------------------+
24
+ | 1 | chris | mo | 43 | |
25
+ +----+------------+-----------+-----+-------------------+
26
26
  TABLE
27
- [p].to_batch.text_table.to_s.should == expected
27
+ [p].to_table.text_table.to_s.should == expected
28
28
  end
29
29
 
30
30
  it 'handles custom serialization options in batch' do
31
31
  p = Person.create(:first_name => 'chrismo', :age => 43)
32
32
 
33
- expected = <<-TABLE
34
- +------------+-----+-----------+
35
- | first_name | age | year_born |
36
- +------------+-----+-----------+
37
- | chrismo | 43 | 1971 |
38
- +------------+-----+-----------+
33
+ expected = <<~TABLE
34
+ +------------+-----+-----------+
35
+ | first_name | age | year_born |
36
+ +------------+-----+-----------+
37
+ | chrismo | 43 | 1971 |
38
+ +------------+-----+-----------+
39
39
  TABLE
40
- b = [p].to_batch
40
+ b = [p].to_table
41
41
 
42
42
  def b.serializable_options
43
43
  {:only => [:first_name, :age], :methods => [:year_born]}
@@ -46,16 +46,46 @@ describe 'ActiveRecordSource' do
46
46
  b.text_table.to_s.should == expected
47
47
  end
48
48
 
49
+ it 'auto reloads records' do
50
+ p = Person.create(:first_name => 'chrismo', :age => 43)
51
+
52
+ expected = <<~TABLE
53
+ +------------+-----+-----------+
54
+ | first_name | age | year_born |
55
+ +------------+-----+-----------+
56
+ | chrismo | 43 | 1971 |
57
+ +------------+-----+-----------+
58
+ TABLE
59
+ b = [p].to_table
60
+
61
+ def b.serializable_options
62
+ {:only => [:first_name, :age], :methods => [:year_born]}
63
+ end
64
+ b.text_table.to_s.should == expected
65
+
66
+ # update the value through another instance.
67
+ Person.last.update_column(:age, 46)
68
+
69
+ expected = <<~TABLE
70
+ +------------+-----+-----------+
71
+ | first_name | age | year_born |
72
+ +------------+-----+-----------+
73
+ | chrismo | 46 | 1968 |
74
+ +------------+-----+-----------+
75
+ TABLE
76
+ b.text_table.to_s.should == expected
77
+ end
78
+
49
79
  it 'handles column name partials' do
50
80
  p = Person.create(:first_name => 'chris', :last_name => 'mo', :age => 43)
51
- expected = <<-TABLE
52
- +-------+------+-----+
53
- | first | last | age |
54
- +-------+------+-----+
55
- | chris | mo | 43 |
56
- +-------+------+-----+
81
+ expected = <<~TABLE
82
+ +-------+------+-----+
83
+ | first | last | age |
84
+ +-------+------+-----+
85
+ | chris | mo | 43 |
86
+ +-------+------+-----+
57
87
  TABLE
58
- b = [p].to_batch
88
+ b = [p].to_table
59
89
 
60
90
  def b.serializable_options
61
91
  {:only => [:first, :last, :age]}
@@ -66,14 +96,14 @@ describe 'ActiveRecordSource' do
66
96
 
67
97
  it 'handles column name partials across words' do
68
98
  p = Person.create(:first_name => 'chris', :last_name => 'mo', :age => 43)
69
- expected = <<-TABLE
70
- +--------+--------+-----+
71
- | f_name | l_name | age |
72
- +--------+--------+-----+
73
- | chris | mo | 43 |
74
- +--------+--------+-----+
99
+ expected = <<~TABLE
100
+ +--------+--------+-----+
101
+ | f_name | l_name | age |
102
+ +--------+--------+-----+
103
+ | chris | mo | 43 |
104
+ +--------+--------+-----+
75
105
  TABLE
76
- b = [p].to_batch
106
+ b = [p].to_table
77
107
 
78
108
  def b.serializable_options
79
109
  {:only => [:f_name, :l_name, :age]}
@@ -84,14 +114,14 @@ describe 'ActiveRecordSource' do
84
114
 
85
115
  it 'handles explicit column aliases' do
86
116
  p = Person.create(:first_name => 'chris', :last_name => 'mo', :age => 43)
87
- expected = <<-TABLE
88
- +---------------+----------+-----+
89
- | primer_nombre | apellido | age |
90
- +---------------+----------+-----+
91
- | chris | mo | 43 |
92
- +---------------+----------+-----+
117
+ expected = <<~TABLE
118
+ +---------------+----------+-----+
119
+ | primer_nombre | apellido | age |
120
+ +---------------+----------+-----+
121
+ | chris | mo | 43 |
122
+ +---------------+----------+-----+
93
123
  TABLE
94
- b = [p].to_batch
124
+ b = [p].to_table
95
125
 
96
126
  def b.columns
97
127
  [Tablesmith::Column.new(name: :first_name, alias: :primer_nombre),
@@ -108,20 +138,20 @@ describe 'ActiveRecordSource' do
108
138
  it 'handles associations without aliases' do
109
139
  s = Supplier.create(name: 'supplier')
110
140
  s.account = Account.create(name: 'account', tax_identification_number: '123456')
111
- b = [s].to_batch
141
+ b = [s].to_table
112
142
 
113
143
  def b.serializable_options
114
144
  {:only => [:name], :include => {:account => {:only => [:name, :tax_identification_number]}}}
115
145
  end
116
146
 
117
- expected = <<-TABLE
118
- +----------+---------+---------------------------+
119
- | supplier | account |
120
- +----------+---------+---------------------------+
121
- | name | name | tax_identification_number |
122
- +----------+---------+---------------------------+
123
- | supplier | account | 123456 |
124
- +----------+---------+---------------------------+
147
+ expected = <<~TABLE
148
+ +----------+---------+---------------------------+
149
+ | supplier | account |
150
+ +----------+---------+---------------------------+
151
+ | name | name | tax_identification_number |
152
+ +----------+---------+---------------------------+
153
+ | supplier | account | 123456 |
154
+ +----------+---------+---------------------------+
125
155
  TABLE
126
156
 
127
157
  b.text_table.to_s.should == expected
@@ -130,20 +160,20 @@ describe 'ActiveRecordSource' do
130
160
  it 'handles associations with aliases' do
131
161
  s = Supplier.create(name: 'supplier')
132
162
  s.account = Account.create(name: 'account', tax_identification_number: '123456')
133
- b = [s].to_batch
163
+ b = [s].to_table
134
164
 
135
165
  def b.serializable_options
136
166
  {:only => [:name], :include => {:account => {:only => [:name, :tax_id]}}}
137
167
  end
138
168
 
139
- expected = <<-TABLE
140
- +----------+---------+--------+
141
- | supplier | account |
142
- +----------+---------+--------+
143
- | name | name | tax_id |
144
- +----------+---------+--------+
145
- | supplier | account | 123456 |
146
- +----------+---------+--------+
169
+ expected = <<~TABLE
170
+ +----------+---------+--------+
171
+ | supplier | account |
172
+ +----------+---------+--------+
173
+ | name | name | tax_id |
174
+ +----------+---------+--------+
175
+ | supplier | account | 123456 |
176
+ +----------+---------+--------+
147
177
  TABLE
148
178
 
149
179
  b.text_table.to_s.should == expected
@@ -158,17 +188,17 @@ describe 'ActiveRecordSource' do
158
188
  # may need/want to handle the hash resulting from an association differently from the hash resulting from a method/attr
159
189
  it 'supports field with hash contents' do
160
190
  p = Person.create(first_name: 'chrismo', custom_attributes: {skills: {instrument: 'piano', style: 'jazz'}})
161
- b = [p].to_batch
191
+ b = [p].to_table
162
192
 
163
193
  a = format_ids([p.id])[0]
164
- expected = <<-TABLE
165
- +----+------------+-----------+-----+----------------------------------------+
166
- | person | custom_attributes |
167
- +----+------------+-----------+-----+----------------------------------------+
168
- | id | first_name | last_name | age | skills |
169
- +----+------------+-----------+-----+----------------------------------------+
170
- |#{a}| chrismo | | | {:instrument=>"piano", :style=>"jazz"} |
171
- +----+------------+-----------+-----+----------------------------------------+
194
+ expected = <<~TABLE
195
+ +----+------------+-----------+-----+----------------------------------------+
196
+ | person | custom_attributes |
197
+ +----+------------+-----------+-----+----------------------------------------+
198
+ | id | first_name | last_name | age | skills |
199
+ +----+------------+-----------+-----+----------------------------------------+
200
+ |#{a}| chrismo | | | {:instrument=>"piano", :style=>"jazz"} |
201
+ +----+------------+-----------+-----+----------------------------------------+
172
202
  TABLE
173
203
 
174
204
  b.text_table.to_s.should == expected
@@ -178,20 +208,20 @@ describe 'ActiveRecordSource' do
178
208
  p2 = Person.create(first_name: 'romer', custom_attributes: {instrument: 'kazoo'})
179
209
  p1 = Person.create(first_name: 'chrismo', custom_attributes: {instrument: 'piano', style: 'jazz'})
180
210
  p3 = Person.create(first_name: 'glv', custom_attributes: {})
181
- batch = [p2, p1, p3].to_batch
211
+ batch = [p2, p1, p3].to_table
182
212
 
183
213
  a, b, c = format_ids([p2.id, p1.id, p3.id])
184
214
 
185
- expected = <<-TABLE
186
- +----+------------+-----------+-----+------------+-----------+
187
- | person | custom_attributes |
188
- +----+------------+-----------+-----+------------+-----------+
189
- | id | first_name | last_name | age | instrument | style |
190
- +----+------------+-----------+-----+------------+-----------+
191
- |#{a}| romer | | | kazoo | |
192
- |#{b}| chrismo | | | piano | jazz |
193
- |#{c}| glv | | | | |
194
- +----+------------+-----------+-----+------------+-----------+
215
+ expected = <<~TABLE
216
+ +----+------------+-----------+-----+------------+-----------+
217
+ | person | custom_attributes |
218
+ +----+------------+-----------+-----+------------+-----------+
219
+ | id | first_name | last_name | age | instrument | style |
220
+ +----+------------+-----------+-----+------------+-----------+
221
+ |#{a}| romer | | | kazoo | |
222
+ |#{b}| chrismo | | | piano | jazz |
223
+ |#{c}| glv | | | | |
224
+ +----+------------+-----------+-----+------------+-----------+
195
225
  TABLE
196
226
 
197
227
  batch.text_table.to_s.should == expected
@@ -200,19 +230,19 @@ describe 'ActiveRecordSource' do
200
230
  it 'supports consistent ordering of dynamic columns' do
201
231
  p1 = Person.create(first_name: 'chrismo', custom_attributes: {instrument: 'piano', style: 'jazz'})
202
232
  p2 = Person.create(first_name: 'romer', custom_attributes: {hobby: 'games'})
203
- batch = [p1, p2].to_batch
233
+ batch = [p1, p2].to_table
204
234
 
205
235
  a, b = format_ids([p1.id, p2.id])
206
236
 
207
- expected = <<-TABLE
208
- +----+------------+-----------+-----+--------+------------+--------+
209
- | person | custom_attributes |
210
- +----+------------+-----------+-----+--------+------------+--------+
211
- | id | first_name | last_name | age | hobby | instrument | style |
212
- +----+------------+-----------+-----+--------+------------+--------+
213
- |#{a}| chrismo | | | | piano | jazz |
214
- |#{b}| romer | | | games | | |
215
- +----+------------+-----------+-----+--------+------------+--------+
237
+ expected = <<~TABLE
238
+ +----+------------+-----------+-----+--------+------------+--------+
239
+ | person | custom_attributes |
240
+ +----+------------+-----------+-----+--------+------------+--------+
241
+ | id | first_name | last_name | age | hobby | instrument | style |
242
+ +----+------------+-----------+-----+--------+------------+--------+
243
+ |#{a}| chrismo | | | | piano | jazz |
244
+ |#{b}| romer | | | games | | |
245
+ +----+------------+-----------+-----+--------+------------+--------+
216
246
  TABLE
217
247
 
218
248
  batch.text_table.to_s.should == expected
@@ -220,18 +250,18 @@ describe 'ActiveRecordSource' do
220
250
 
221
251
  it 'handles AR instance without an association present' do
222
252
  s = Supplier.create(name: 'supplier')
223
- b = [s].to_batch
253
+ b = [s].to_table
224
254
 
225
255
  def b.serializable_options
226
256
  {:only => [:name], :include => {:account => {:only => [:name, :tax_id]}}}
227
257
  end
228
258
 
229
- expected = <<-TABLE
230
- +----------+
231
- | name |
232
- +----------+
233
- | supplier |
234
- +----------+
259
+ expected = <<~TABLE
260
+ +----------+
261
+ | name |
262
+ +----------+
263
+ | supplier |
264
+ +----------+
235
265
  TABLE
236
266
 
237
267
  b.text_table.to_s.should == expected
@@ -244,21 +274,21 @@ describe 'ActiveRecordSource' do
244
274
  ''
245
275
  end
246
276
 
247
- b = [s2].to_batch
277
+ b = [s2].to_table
248
278
 
249
279
  # methods need Columns as well
250
280
  def b.serializable_options
251
281
  {:only => [:name, :custom_attributes], :methods => [:foo]}
252
282
  end
253
283
 
254
- expected = <<-TABLE
255
- +----------+------+-------------------+
256
- | supplier | custom_attributes |
257
- +----------+------+-------------------+
258
- | name | foo | a |
259
- +----------+------+-------------------+
260
- | sup. two | | 1 |
261
- +----------+------+-------------------+
284
+ expected = <<~TABLE
285
+ +----------+------+-------------------+
286
+ | supplier | custom_attributes |
287
+ +----------+------+-------------------+
288
+ | name | foo | a |
289
+ +----------+------+-------------------+
290
+ | sup. two | | 1 |
291
+ +----------+------+-------------------+
262
292
  TABLE
263
293
 
264
294
  b.text_table.to_s.should == expected
@@ -268,15 +298,15 @@ describe 'ActiveRecordSource' do
268
298
  p = Parent.create(name: 'parent')
269
299
  c = Child.create(name: 'child', parent: p)
270
300
 
271
- b = [p].to_batch
301
+ b = [p].to_table
272
302
 
273
303
  # little weird looking at this point, but at least not broken
274
- expected = <<-TABLE
275
- +----+--------+-------------------+---------------------+
276
- | id | name | custom_attributes | children |
277
- +----+--------+-------------------+---------------------+
278
- | 1 | parent | | [{"name"=>"child"}] |
279
- +----+--------+-------------------+---------------------+
304
+ expected = <<~TABLE
305
+ +----+--------+-------------------+---------------------+
306
+ | id | name | custom_attributes | children |
307
+ +----+--------+-------------------+---------------------+
308
+ | 1 | parent | | [{"name"=>"child"}] |
309
+ +----+--------+-------------------+---------------------+
280
310
  TABLE
281
311
 
282
312
  def b.serializable_options
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Array Source' do
4
+ it 'just works in a console' do
5
+ expected = <<~TABLE
6
+ +---+---+---+
7
+ | a | b | c |
8
+ +---+---+---+
9
+ | d | e | f |
10
+ +---+---+---+
11
+ TABLE
12
+ [%w(a b c), %w(d e f)].to_table.text_table.to_s.should == expected
13
+ end
14
+ end
@@ -1,9 +1,11 @@
1
1
  require 'active_record'
2
2
 
3
- ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
3
+ ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
4
4
 
5
5
  class Person < ActiveRecord::Base
6
- connection.create_table table_name, :force => true do |t|
6
+ serialize :custom_attributes
7
+
8
+ connection.create_table table_name, force: true do |t|
7
9
  t.string :first_name
8
10
  t.string :last_name
9
11
  t.integer :age
@@ -11,14 +13,14 @@ class Person < ActiveRecord::Base
11
13
  end
12
14
 
13
15
  def year_born
14
- Time.local(2014, 1, 1).year - self.age
16
+ Time.local(2014, 1, 1).year - age
15
17
  end
16
18
  end
17
19
 
18
20
  class Parent < ActiveRecord::Base
19
21
  has_many :children
20
22
 
21
- connection.create_table table_name, :force => true do |t|
23
+ connection.create_table table_name, force: true do |t|
22
24
  t.string :name
23
25
  t.text :custom_attributes
24
26
  end
@@ -27,7 +29,7 @@ end
27
29
  class Child < ActiveRecord::Base
28
30
  belongs_to :parent
29
31
 
30
- connection.create_table table_name, :force => true do |t|
32
+ connection.create_table table_name, force: true do |t|
31
33
  t.integer :parent_id
32
34
  t.string :name
33
35
  end
@@ -35,11 +37,13 @@ end
35
37
 
36
38
  class Supplier < ActiveRecord::Base
37
39
  has_one :account
38
- has_one :account_history, :through => :account
40
+ has_one :account_history, through: :account
39
41
 
40
42
  accepts_nested_attributes_for :account, :account_history
41
43
 
42
- connection.create_table table_name, :force => true do |t|
44
+ serialize :custom_attributes
45
+
46
+ connection.create_table table_name, force: true do |t|
43
47
  t.integer :account_id
44
48
  t.integer :account_history_id
45
49
  t.string :name
@@ -53,7 +57,7 @@ class Account < ActiveRecord::Base
53
57
 
54
58
  accepts_nested_attributes_for :account_history
55
59
 
56
- connection.create_table table_name, :force => true do |t|
60
+ connection.create_table table_name, force: true do |t|
57
61
  t.integer :supplier_id
58
62
  t.string :name
59
63
  t.integer :tax_identification_number
@@ -63,7 +67,7 @@ end
63
67
  class AccountHistory < ActiveRecord::Base
64
68
  belongs_to :account
65
69
 
66
- connection.create_table table_name, :force => true do |t|
70
+ connection.create_table table_name, force: true do |t|
67
71
  t.integer :account_id
68
72
  t.integer :credit_rating
69
73
  end
@@ -2,42 +2,42 @@ require 'spec_helper'
2
2
 
3
3
  describe 'HashRowsSource' do
4
4
  it 'outputs text table of simple hash row with default columns' do
5
- expected = <<-TABLE
6
- +---+---+
7
- | a | b |
8
- +---+---+
9
- | 1 | 2 |
10
- +---+---+
5
+ expected = <<~TABLE
6
+ +---+---+
7
+ | a | b |
8
+ +---+---+
9
+ | 1 | 2 |
10
+ +---+---+
11
11
  TABLE
12
- [{a: 1, b: 2}].to_batch.text_table.to_s.should == expected
12
+ [{a: 1, b: 2}].to_table.text_table.to_s.should == expected
13
13
  end
14
14
 
15
15
  it 'outputs text table of mixed columns hash rows with default columns' do
16
- expected = <<-TABLE
17
- +---+---+---+
18
- | a | b | c |
19
- +---+---+---+
20
- | 1 | 2 | |
21
- | 2 | | ! |
22
- +---+---+---+
16
+ expected = <<~TABLE
17
+ +---+---+---+
18
+ | a | b | c |
19
+ +---+---+---+
20
+ | 1 | 2 | |
21
+ | 2 | | ! |
22
+ +---+---+---+
23
23
  TABLE
24
24
  [
25
25
  {a: 1, b: 2},
26
26
  {a: 2, c: '!'}
27
- ].to_batch.text_table.to_s.should == expected
27
+ ].to_table.text_table.to_s.should == expected
28
28
  end
29
29
 
30
30
  it 'outputs text table of deep hash rows with defined columns' do
31
- expected = <<-TABLE
32
- +---+---+---+
33
- | | b |
34
- +---+---+---+
35
- | a | c | d |
36
- +---+---+---+
37
- | 1 | 2 | 2 |
38
- +---+---+---+
31
+ expected = <<~TABLE
32
+ +---+---+---+
33
+ | | b |
34
+ +---+---+---+
35
+ | a | c | d |
36
+ +---+---+---+
37
+ | 1 | 2 | 2 |
38
+ +---+---+---+
39
39
  TABLE
40
- b = [{a: 1, b: {c: 2, d: 2}}].to_batch
40
+ b = [{a: 1, b: {c: 2, d: 2}}].to_table
41
41
  def b.columns
42
42
  [
43
43
  Column.new(name: :a),
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Hash Source' do
4
+ it 'just works in a console' do
5
+ expected = <<~TABLE
6
+ +---+---+---+
7
+ | a | b | c |
8
+ +---+---+---+
9
+ | 1 | 2 | 3 |
10
+ +---+---+---+
11
+ TABLE
12
+ {a: 1, b: 2, c: 3}.to_table.text_table.to_s.should == expected
13
+ end
14
+ end
@@ -2,19 +2,19 @@ require 'spec_helper'
2
2
 
3
3
  include Tablesmith
4
4
 
5
- describe Batch do
5
+ describe Table do
6
6
  it 'should subclass array' do
7
- b = Batch.new
7
+ b = Table.new
8
8
  b.length.should == 0
9
9
  b << 1
10
10
  b << 'a'
11
11
  b[0].should == 1
12
12
  b[1].should == 'a'
13
- b.class.should == Batch
13
+ b.class.should == Table
14
14
  end
15
15
 
16
16
  it 'should pass unmatched Array messages to all items' do
17
- b = Batch.new
17
+ b = Table.new
18
18
  b.length.should == 0
19
19
  b << 1
20
20
  b << '2'
@@ -22,24 +22,24 @@ describe Batch do
22
22
  end
23
23
 
24
24
  it 'should handle empty Array' do
25
- expected = <<-TEXT
26
- +---------+
27
- | (empty) |
28
- +---------+
25
+ expected = <<~TEXT
26
+ +---------+
27
+ | (empty) |
28
+ +---------+
29
29
  TEXT
30
- [].to_batch.text_table.to_s.should == expected
30
+ [].to_table.text_table.to_s.should == expected
31
31
  end
32
32
 
33
33
  it 'should handle a simple two row Array' do
34
34
  a = [%w(a b c), %w(d e f)]
35
35
  actual = a
36
- expected = <<-TABLE
37
- +---+---+---+
38
- | a | b | c |
39
- +---+---+---+
40
- | d | e | f |
41
- +---+---+---+
36
+ expected = <<~TABLE
37
+ +---+---+---+
38
+ | a | b | c |
39
+ +---+---+---+
40
+ | d | e | f |
41
+ +---+---+---+
42
42
  TABLE
43
- actual.to_batch.text_table.to_s.should == expected
43
+ actual.to_table.text_table.to_s.should == expected
44
44
  end
45
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tablesmith
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - chrismo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-18 00:00:00.000000000 Z
11
+ date: 2017-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: text-table
@@ -117,7 +117,9 @@ extra_rdoc_files: []
117
117
  files:
118
118
  - ".gitignore"
119
119
  - ".rspec"
120
+ - ".rubocop.yml"
120
121
  - ".ruby-version"
122
+ - ".travis.yml"
121
123
  - Gemfile
122
124
  - Gemfile.lock
123
125
  - LICENSE
@@ -126,16 +128,17 @@ files:
126
128
  - lib/tablesmith.rb
127
129
  - lib/tablesmith/active_record_source.rb
128
130
  - lib/tablesmith/array_rows_source.rb
129
- - lib/tablesmith/batch.rb
131
+ - lib/tablesmith/hash_rows_base.rb
130
132
  - lib/tablesmith/hash_rows_source.rb
133
+ - lib/tablesmith/table.rb
131
134
  - lib/tablesmith/version.rb
132
- - spec/active_record_batch_spec.rb
133
- - spec/array_batch_spec.rb
134
- - spec/batch_spec.rb
135
+ - spec/active_record_table_spec.rb
136
+ - spec/array_table_spec.rb
135
137
  - spec/fixtures.rb
136
- - spec/hash_rows_batch_spec.rb
137
- - spec/hash_spec.rb
138
+ - spec/hash_rows_table_spec.rb
139
+ - spec/hash_table_spec.rb
138
140
  - spec/spec_helper.rb
141
+ - spec/table_spec.rb
139
142
  - tablesmith.gemspec
140
143
  homepage: http://github.com/livingsocial/tablesmith
141
144
  licenses: []
@@ -161,10 +164,10 @@ signing_key:
161
164
  specification_version: 4
162
165
  summary: Minimal console table
163
166
  test_files:
164
- - spec/active_record_batch_spec.rb
165
- - spec/array_batch_spec.rb
166
- - spec/batch_spec.rb
167
+ - spec/active_record_table_spec.rb
168
+ - spec/array_table_spec.rb
167
169
  - spec/fixtures.rb
168
- - spec/hash_rows_batch_spec.rb
169
- - spec/hash_spec.rb
170
+ - spec/hash_rows_table_spec.rb
171
+ - spec/hash_table_spec.rb
170
172
  - spec/spec_helper.rb
173
+ - spec/table_spec.rb
@@ -1,14 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Array Source' do
4
- it 'just works in a console' do
5
- expected = <<-TABLE
6
- +---+---+---+
7
- | a | b | c |
8
- +---+---+---+
9
- | d | e | f |
10
- +---+---+---+
11
- TABLE
12
- [%w(a b c), %w(d e f)].to_batch.text_table.to_s.should == expected
13
- end
14
- end
@@ -1 +0,0 @@
1
- # Want stuff to work with a plain Hash