data-table 1.0.0 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
- class DataTable
2
- VERSION = "1.0.0"
1
+ module DataTable
2
+ VERSION = '2.0.3'.freeze
3
3
  end
@@ -0,0 +1,11 @@
1
+ puts "Removing old gem file"
2
+ `rm data-table*.gem`
3
+
4
+ puts "Building new data-table gem"
5
+ `gem build ./data-table.gemspec`
6
+
7
+ puts "Uninstalling old data-table gem"
8
+ `gem uninstall -a data-table`
9
+
10
+ puts "Installing new build of data-table gem"
11
+ `gem install ./data-table*.gem`
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataTable::Column do
4
+ it "should store the name" do
5
+ column = DataTable::Column.new(:thing)
6
+ expect(column.name).to eq(:thing)
7
+ end
8
+
9
+ it "should add the column name as a css class" do
10
+ column = DataTable::Column.new(:thing)
11
+ expect(column.css_class_names).to include('thing')
12
+ end
13
+
14
+ it "should render a td tag" do
15
+ column = DataTable::Column.new(:thing)
16
+ expect(column.render_cell("Data")).to eq(%(<td class='thing text' >Data</td>))
17
+ end
18
+
19
+ it "should render the column header" do
20
+ column = DataTable::Column.new(:thing, 'Thing')
21
+ expect(column.render_column_header).to eq(%(<th class='thing ' >Thing</th>))
22
+ end
23
+
24
+ it "should add custom attributes to the td tag" do
25
+ options = {
26
+ attributes: {
27
+ 'data-type' => 'text',
28
+ 'data-id' => 1
29
+ }
30
+ }
31
+ column = DataTable::Column.new(:thing, 'Thing', options)
32
+ expect(column.custom_attributes).to eq("data-type='text' data-id='1'")
33
+ expect(column.render_cell('Data')).to include("data-type='text'")
34
+ end
35
+
36
+ it "should use the block for rendering" do
37
+ square = lambda { |v| v.to_i ** 2 }
38
+ column = DataTable::Column.new(:amount, 'Amount', &square)
39
+ expect(column.render_cell(5, amount: 5)).to eq(%(<td class='amount numeric' >25</td>))
40
+ end
41
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataTable do
4
+ let(:collection) {
5
+ [
6
+ {:name => 'Luke Skywalker', :class => 'Jedi Knight'},
7
+ {:name => 'Emporer Palpatine', :class => 'Sith Lord'},
8
+ {:name => 'Mithrander', :class => 'Wizard'},
9
+ {:name => 'Aragorn', :class => 'Ranger'}
10
+ ]
11
+ }
12
+
13
+
14
+ it "should render the collection" do
15
+ html = DataTable.render(collection) do |t|
16
+ t.column :name, 'Name'
17
+ t.column :class, 'Class'
18
+ end
19
+
20
+ expect(html).to eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr><tr class='row_2 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_3 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Enumerable do
4
+ context "with a non-empty collection of hashes" do
5
+ let(:collection) {
6
+ [
7
+ {name: 'Luke Skywalker', class: 'Jedi Knight', world: 'Star Wars', power_level: 50},
8
+ {name: 'Emporer Palpatine', class: 'Sith Lord', world: 'Star Wars', power_level: 95},
9
+ {name: 'Mithrander', class: 'Wizard', world: 'Middle Earth', power_level: 9001},
10
+ {name: 'Aragorn', class: 'Ranger', world: 'Middle Earth', power_level: 80}
11
+ ]
12
+ }
13
+
14
+ let(:groupings) { [:class] }
15
+
16
+ it "should transform a collection into nested hash based on and array of groups" do
17
+ expect(
18
+ collection.group_by_recursive(groupings)
19
+ ).to eq(
20
+ {
21
+ "Jedi Knight"=>[{:name=>"Luke Skywalker", :class=>"Jedi Knight", :world=>"Star Wars", :power_level=>50}],
22
+ "Sith Lord"=>[{:name=>"Emporer Palpatine", :class=>"Sith Lord", :world=>"Star Wars", :power_level=>95}],
23
+ "Wizard"=>[{:name=>"Mithrander", :class=>"Wizard", :world=>"Middle Earth", :power_level=>9001}],
24
+ "Ranger"=>[{:name=>"Aragorn", :class=>"Ranger", :world=>"Middle Earth", :power_level=>80}]
25
+ }
26
+ )
27
+ end
28
+
29
+ it "should traverse a nested hash" do
30
+ grouped_collection = collection.group_by_recursive(groupings)
31
+ ungrouped = []
32
+ grouped_collection.each_pair_recursive { |_k, v| ungrouped.concat(v) }
33
+ expect(ungrouped).to eq(collection)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ require 'data-table'
2
+ require 'pry'
3
+ # This file was generated by the `rspec --init` command. Conventionally, all
4
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
5
+ # Require this file using `require "spec_helper"` to ensure that it is only
6
+ # loaded once.
7
+ #
8
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
9
+ RSpec.configure do |config|
10
+ config.run_all_when_everything_filtered = true
11
+ config.filter_run :focus
12
+
13
+ # Run specs in random order to surface order dependencies. If you find an
14
+ # order dependency and want to debug it, you can fix the order by providing
15
+ # the seed, which is printed after each run.
16
+ # --seed 1234
17
+ config.order = 'random'
18
+ end
@@ -0,0 +1,281 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataTable::Table do
4
+ context "with a non-empty collection of hashes" do
5
+ let(:collection) {
6
+ [
7
+ {:name => 'Luke Skywalker', :class => 'Jedi Knight', :world => 'Star Wars', :power_level => 50},
8
+ {:name => 'Emporer Palpatine', :class => 'Sith Lord', :world => 'Star Wars', :power_level => 95},
9
+ {:name => 'Mithrander', :class => 'Wizard', :world => 'Middle Earth', :power_level => 9001},
10
+ {:name => 'Aragorn', :class => 'Ranger', :world => 'Middle Earth', :power_level => 80}
11
+ ]
12
+ }
13
+
14
+ let(:data_table) {DataTable::Table.new(collection)}
15
+
16
+ it "should add a column do @columns" do
17
+ data_table.column(:name, 'Name')
18
+ expect(data_table.columns).to_not be_empty
19
+ expect(data_table.columns.first.class).to be(DataTable::Column)
20
+ end
21
+
22
+ it "should render the collection" do
23
+ data_table.column(:name, 'Name')
24
+ data_table.column(:class, 'Class')
25
+ expect(data_table.render).to \
26
+ eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr><tr class='row_2 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_3 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
27
+ end
28
+
29
+ it "should group the records" do
30
+ grouping_column = :world
31
+
32
+ data_table.group_by grouping_column, level: 0
33
+ data_table.column(:name, 'Name')
34
+ data_table.column(:class, 'Class')
35
+ expect(data_table.grouped_data).to be true
36
+ data_table.prepare_data
37
+ expect(data_table.collection).to eq(collection.group_by {|g| g[grouping_column]})
38
+ expect(data_table.render).to eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody class='star_wars'><tr class='group_header level_0'><th colspan='2'>Star Wars</th></tr><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr></tbody><tbody class='middle_earth'><tr class='group_header level_0'><th colspan='2'>Middle Earth</th></tr><tr class='row_0 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_1 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
39
+ end
40
+
41
+ it "should do totaling" do
42
+ data_table.column :power_level
43
+ data_table.total :power_level, :sum, 0
44
+ data_table.calculate_totals!
45
+ expect(data_table.total_calculations).to eq([{:power_level=>9226.0}])
46
+ end
47
+
48
+ it "should do custom formatting for the total" do
49
+ data_table.column :power_level
50
+ data_table.total :power_level, :avg, 0 do |average|
51
+ "#{average / 100.0}%"
52
+ end
53
+ data_table.calculate_totals!
54
+ expect(data_table.total_calculations).to eq([{:power_level=>"23.065%"}])
55
+ end
56
+
57
+ it "should do custom totalling" do
58
+ data_table.column :power_level
59
+ data_table.total :power_level do |collection|
60
+ collection.inject(0) { |sum, c| sum + c[:power_level] }
61
+ end
62
+ data_table.calculate_totals!
63
+ expect(data_table.total_calculations).to eq([{:power_level=>9226}])
64
+ end
65
+
66
+ it "should do sub-totaling" do
67
+ data_table.group_by :world, level: 0
68
+ data_table.column :power_level
69
+ data_table.subtotal :power_level, :sum, 0
70
+
71
+ data_table.prepare_data
72
+ expect(data_table.subtotal_calculations).to eq({["Star Wars"]=>[{:power_level=>{:sum=>145.0}}], ["Middle Earth"]=>[{:power_level=>{:sum=>9081.0}}]})
73
+ end
74
+
75
+ it "should do sub-totaling starting with indexes > 0" do
76
+ data_table.group_by :world, level: 0
77
+ data_table.column :power_level
78
+ data_table.subtotal :power_level, :sum, 1
79
+
80
+ data_table.prepare_data
81
+
82
+ expect(data_table.subtotal_calculations).to eq({
83
+ ["Star Wars"] => [{}, {:power_level => {:sum => 145.0}}],
84
+ ["Middle Earth"] => [{}, {:power_level => {:sum => 9081.0}}]
85
+ })
86
+ end
87
+
88
+ it "should not render empty sub-total aggregate rows" do
89
+ data_table.group_by :world, level: 0
90
+ data_table.column :power_level
91
+ data_table.subtotal :power_level, nil, 1 do |_records, _column, path|
92
+ path
93
+ end
94
+
95
+ data_table.prepare_data
96
+ subtotal_calculations = data_table.subtotal_calculations
97
+
98
+ # this is convoluted because it's hard to assert a nested structure that includes procs
99
+ # [
100
+ # ["Middle Earth"] => [{}, {:power_level=>{#<Proc:0x03dbead8@table_spec.rb:78>=>"Middle Earth"}}],
101
+ # ["Star Wars"] => [{}, {:power_level=>{#<Proc:0x03dbead8@table_spec.rb:78>=>"Star Wars"}}]
102
+ # ]
103
+ expect(subtotal_calculations.keys).to eq([["Star Wars"], ["Middle Earth"]])
104
+ expect(subtotal_calculations.values.flatten.map(&:keys)).to eq([[], [:power_level], [], [:power_level]])
105
+ subtotal_calculations.values.flatten.map(&:values).flatten.map(&:keys).each do |k|
106
+ expect(k).to be_a(Array)
107
+ expect(k.length).to eq(1)
108
+ expect(k[0]).to be_a(Proc)
109
+ end
110
+ expect(subtotal_calculations.values.flatten.map(&:values).flatten.map(&:values)).to eq([["Star Wars"], ["Middle Earth"]])
111
+
112
+ # note how the rows are index_1, and there is no index_0 row
113
+ expect(data_table.render).to \
114
+ eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='power_level ' ></th></tr></thead><tbody class='star_wars'><tr class='group_header level_0'><th colspan='1'>Star Wars</th></tr><tr class='row_0 ' ><td class='power_level numeric' >50</td></tr><tr class='row_1 alt ' ><td class='power_level numeric' >95</td></tr><tr class='subtotal index_1 first'><td class='power_level numeric' >Star Wars</td></tr></tbody><tbody class='middle_earth'><tr class='group_header level_0'><th colspan='1'>Middle Earth</th></tr><tr class='row_0 ' ><td class='power_level numeric' >9001</td></tr><tr class='row_1 alt ' ><td class='power_level numeric' >80</td></tr><tr class='subtotal index_1 first'><td class='power_level numeric' >Middle Earth</td></tr></tbody></table>})
115
+ end
116
+
117
+ it "should render a custom header" do
118
+ data_table.custom_header do
119
+ th 'Two Columns', :colspan => 2
120
+ th 'One Column', :colspan => 1
121
+ end
122
+ expect(data_table.render_custom_table_header).to eq(%{<tr class='custom-header'><th class="" colspan="2" style="">Two Columns</th><th class="" colspan="1" style="">One Column</th></tr>})
123
+ end
124
+ end
125
+
126
+ context "with an empty collection" do
127
+ let(:collection) {Array.new}
128
+ let(:data_table) {DataTable::Table.new(collection)}
129
+
130
+ it "should render a table with the 'no records' message" do
131
+ expect(data_table.render).to \
132
+ eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr></tr></thead><tr><td class='empty_data_table' colspan='0'>No records found</td></tr></table>})
133
+ end
134
+
135
+ it "should render a custom empty text notice" do
136
+ text = "Nothing to see here"
137
+ data_table.empty_text = text
138
+ expect(data_table.render).to \
139
+ eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr></tr></thead><tr><td class='empty_data_table' colspan='0'>#{text}</td></tr></table>})
140
+ end
141
+
142
+ it "avoids dividing by zero" do
143
+ data_table.column :power_level
144
+ data_table.total :power_level, :avg, 0
145
+ data_table.calculate_totals!
146
+ expect(data_table.total_calculations).to eq([{:power_level=>0}])
147
+ end
148
+ end
149
+
150
+ context 'with a more complicated setup' do
151
+ it 'renders okay' do
152
+ raw_results = [
153
+ { 'class' => 'Basketball', 'grade_level' => '9', 'points' => 50 },
154
+ { 'class' => 'Basketball', 'grade_level' => '9', 'points' => 51 },
155
+ { 'class' => 'Basketball', 'grade_level' => '10', 'points' => 52 },
156
+ { 'class' => 'Basketball', 'grade_level' => '10', 'points' => 53 },
157
+ { 'class' => 'Basketball', 'grade_level' => '10', 'points' => 54 },
158
+ { 'class' => 'Basketball', 'grade_level' => '12', 'points' => 55 }
159
+ ]
160
+
161
+ fields = [{
162
+ field_name: 'class',
163
+ display_description: 'Class',
164
+ column_width: 1.23,
165
+ data_type: 2
166
+ }, {
167
+ field_name: 'grade_level',
168
+ display_description: 'Grade Level',
169
+ column_width: 2.34,
170
+ data_type: 2
171
+ }, {
172
+ field_name: 'points',
173
+ display_description: 'Points',
174
+ column_width: 3.45,
175
+ data_type: 4
176
+ }]
177
+
178
+ column_groups = {}
179
+
180
+ subtotal_headers = [
181
+ { field_name: 'class' },
182
+ { field_name: 'grade_level' }
183
+ ]
184
+
185
+ subtotal_aggregates = {
186
+ sum: [],
187
+ avg: [{
188
+ field_name: 'points',
189
+ data_type: 4
190
+ }],
191
+ min: [],
192
+ max: []
193
+ }
194
+
195
+ total_aggregates = {
196
+ sum: [],
197
+ avg: [],
198
+ min: [],
199
+ max: []
200
+ }
201
+
202
+ has_aggregates = true
203
+
204
+ raw_results.each_with_index do |record, index|
205
+ record[:___data_table_index___] = index
206
+ end
207
+
208
+ html = DataTable.render(raw_results) do |t|
209
+ if has_aggregates
210
+ t.column :__subtotal_header__, '&nbsp;', width: '30px' do |_v|
211
+ '&nbsp;'
212
+ end
213
+ end
214
+
215
+ # COLUMN GROUPS
216
+ if column_groups.any?
217
+ t.custom_header do
218
+ th '', colspan: 1, css: 'column-group', style: 'width: 30px;' unless subtotal_headers.empty?
219
+
220
+ column_groups.each do |_column_group_index, column_group|
221
+ th column_group[:description], colspan: column_group[:column_count], css: 'column-group', style: "width: #{column_group_width}in;"
222
+ end
223
+
224
+ # spacer column
225
+ th '', colspan: 1, css: 'column-group'
226
+ end
227
+ end
228
+
229
+ # COLUMNS
230
+ fields.each do |field|
231
+ t.column field[:field_name], field[:display_description], css_class: "data-type-#{field[:data_type]}", width: field[:column_width] do |_v, record|
232
+ record[field[:field_name]]
233
+ end
234
+ end
235
+
236
+ # SUBTOTAL HEADERS
237
+ subtotal_headers.each_with_index do |subtotal_header, index|
238
+ t.group_by subtotal_header[:field_name], level: index
239
+ end
240
+
241
+ # SUBTOTAL AGGREGATES
242
+ unless subtotal_headers.empty?
243
+ subtotal_aggregates.each_with_index do |(aggregate_function, columns), index|
244
+ next if columns.empty?
245
+
246
+ t.subtotal :__subtotal_header__, nil, index do |_records, _column, path|
247
+ "#{path}: #{aggregate_function.to_s.upcase}"
248
+ end
249
+
250
+ columns.each do |column|
251
+ t.subtotal column[:field_name], aggregate_function, index do |value|
252
+ value
253
+ end
254
+ end
255
+ end
256
+ end
257
+
258
+ # TOTAL AGGREGATES
259
+ total_aggregates.each_with_index do |(aggregate_function, columns), index|
260
+ next if columns.empty?
261
+
262
+ t.total :__subtotal_header__, nil, index do |_records|
263
+ aggregate_function.to_s.upcase
264
+ end
265
+
266
+ columns.each do |column|
267
+ t.total column[:field_name], aggregate_function, index do |value|
268
+ value
269
+ end
270
+ end
271
+ end
272
+
273
+ # spacer column
274
+ t.column :_empty_space, ''
275
+ end
276
+
277
+ expected_html = %(<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='__subtotal_header__ ' style='width: 30px'>&nbsp;</th><th class='points data-type-4' style='width: 3.45'>Points</th><th class='_empty_space ' ></th></tr></thead><tbody class='basketball'><tr class='group_header level_0'><th colspan='3'>Basketball</th></tr><tr class='group_header level_1'><th colspan='3'>9</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >50</td><td class='_empty_space nilclass' ></td></tr><tr class='row_1 alt ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >51</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >9: AVG</td><td class='points numeric data-type-4' >50.5</td><td class='_empty_space nilclass' ></td></tr><tr class='group_header level_1'><th colspan='3'>10</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >52</td><td class='_empty_space nilclass' ></td></tr><tr class='row_1 alt ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >53</td><td class='_empty_space nilclass' ></td></tr><tr class='row_2 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >54</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >10: AVG</td><td class='points numeric data-type-4' >53.0</td><td class='_empty_space nilclass' ></td></tr><tr class='group_header level_1'><th colspan='3'>12</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >55</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >12: AVG</td><td class='points numeric data-type-4' >55.0</td><td class='_empty_space nilclass' ></td></tr><tr class='parent_subtotal index_1 basketball'><td class='__subtotal_header__ nilclass' >Basketball: AVG</td><td class='points numeric data-type-4' >52.5</td><td class='_empty_space nilclass' ></td></tr></tbody></table>)
278
+ expect(html).to eq(expected_html)
279
+ end
280
+ end
281
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data-table
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 2.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Steve Erickson
@@ -10,46 +9,118 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2011-09-09 00:00:00.000000000Z
14
- dependencies: []
15
- description: data-table is a simple gem that provides a DSL for allowing you do turn
16
- an array of hashes or ActiveRecord objects into an HTML table.
12
+ date: 2020-06-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '12'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '12'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '3'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: guard
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '2'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '2'
56
+ - !ruby/object:Gem::Dependency
57
+ name: guard-rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '4'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '4'
70
+ description: |-
71
+ data-table is a simple gem that provides a DSL for
72
+ turning an array of hashes or ActiveRecord objects into an
73
+ HTML table.
17
74
  email:
18
75
  - sixfeetover@gmail.com
19
76
  executables: []
20
77
  extensions: []
21
78
  extra_rdoc_files: []
22
79
  files:
23
- - .gitignore
80
+ - ".gitignore"
81
+ - ".rspec"
82
+ - ".travis.yml"
24
83
  - Gemfile
84
+ - Guardfile
85
+ - LICENSE
86
+ - README.md
25
87
  - Rakefile
88
+ - assigments_table.html
26
89
  - data-table.gemspec
90
+ - examples/all_features.rb
27
91
  - lib/data-table.rb
28
- - lib/data-table/data_table.rb
29
- - lib/data-table/data_table_column.rb
92
+ - lib/data-table/column.rb
93
+ - lib/data-table/enum.rb
94
+ - lib/data-table/table.rb
30
95
  - lib/data-table/version.rb
31
- homepage: https://github.com/sixfeetover/data-table
32
- licenses: []
96
+ - rebuild_gem.rb
97
+ - spec/column_spec.rb
98
+ - spec/data_table_spec.rb
99
+ - spec/enum_spec.rb
100
+ - spec/spec_helper.rb
101
+ - spec/table_spec.rb
102
+ homepage: https://github.com/veracross/data-table
103
+ licenses:
104
+ - MIT
105
+ metadata: {}
33
106
  post_install_message:
34
107
  rdoc_options: []
35
108
  require_paths:
36
109
  - lib
37
110
  required_ruby_version: !ruby/object:Gem::Requirement
38
- none: false
39
111
  requirements:
40
- - - ! '>='
112
+ - - ">="
41
113
  - !ruby/object:Gem::Version
42
114
  version: '0'
43
115
  required_rubygems_version: !ruby/object:Gem::Requirement
44
- none: false
45
116
  requirements:
46
- - - ! '>='
117
+ - - ">="
47
118
  - !ruby/object:Gem::Version
48
119
  version: '0'
49
120
  requirements: []
50
- rubyforge_project: data-table
51
- rubygems_version: 1.8.8
121
+ rubyforge_project:
122
+ rubygems_version: 2.7.6
52
123
  signing_key:
53
- specification_version: 3
124
+ specification_version: 4
54
125
  summary: Turn arrays of hashes or models in to an HTML table.
55
126
  test_files: []