elskwid-munger 0.1.4.5 → 0.1.4.6
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.
- data/Rakefile +7 -32
- data/munger.gemspec +44 -34
- data/{spec/munger/render/csv_spec.rb → test/munger/csv_test.rb} +9 -9
- data/test/munger/data_ar_test.rb +194 -0
- data/test/munger/data_test.rb +185 -0
- data/test/munger/html_test.rb +87 -0
- data/test/munger/item_test.rb +43 -0
- data/{spec/munger/data/new_spec.rb → test/munger/new_test.rb} +9 -9
- data/test/munger/render_test.rb +37 -0
- data/test/munger/report_test.rb +156 -0
- data/{spec/munger/render/text_spec.rb → test/munger/text_test.rb} +9 -9
- data/test/test_helper.rb +60 -0
- metadata +88 -50
- data/spec/munger/data_spec.rb +0 -183
- data/spec/munger/item_spec.rb +0 -43
- data/spec/munger/render/html_spec.rb +0 -87
- data/spec/munger/render_spec.rb +0 -38
- data/spec/munger/report_spec.rb +0 -155
- data/spec/spec_helper.rb +0 -107
data/Rakefile
CHANGED
@@ -1,35 +1,10 @@
|
|
1
|
-
require
|
2
|
-
# Gem::manage_gems
|
3
|
-
require 'rake/gempackagetask'
|
4
|
-
require 'rake/rdoctask'
|
5
|
-
require 'rspec/core/rake_task'
|
1
|
+
require "rake/testtask"
|
6
2
|
|
7
|
-
|
3
|
+
task default: [:test]
|
8
4
|
|
9
|
-
Rake::
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
puts "generated latest version"
|
15
|
-
end
|
16
|
-
|
17
|
-
desc 'Run specs'
|
18
|
-
RSpec::Core::RakeTask.new
|
19
|
-
|
20
|
-
desc 'Generate coverage reports'
|
21
|
-
RSpec::Core::RakeTask.new('spec:coverage') do |t|
|
22
|
-
t.rcov = true
|
23
|
-
end
|
24
|
-
|
25
|
-
task :doc => [:rdoc]
|
26
|
-
namespace :doc do
|
27
|
-
Rake::RDocTask.new do |rdoc|
|
28
|
-
files = ["README", "lib/**/*.rb"]
|
29
|
-
rdoc.rdoc_files.add(files)
|
30
|
-
rdoc.main = "README"
|
31
|
-
rdoc.title = "Munger Docs"
|
32
|
-
rdoc.rdoc_dir = "doc"
|
33
|
-
rdoc.options << "--line-numbers" << "--inline-source"
|
34
|
-
end
|
5
|
+
Rake::TestTask.new(:test) do |t|
|
6
|
+
t.libs << "lib"
|
7
|
+
t.libs << "test"
|
8
|
+
t.pattern = "test/**/*_test.rb"
|
9
|
+
t.verbose = false
|
35
10
|
end
|
data/munger.gemspec
CHANGED
@@ -1,36 +1,46 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
2
|
+
s.platform = Gem::Platform::RUBY
|
3
|
+
s.name = "elskwid-munger"
|
4
|
+
s.version = "0.1.4.6"
|
5
|
+
s.authors = ['Scott Chacon', 'Brandon Mitchell', 'Don Morrison', 'Eric Lindvall']
|
6
|
+
s.email = "elskwid@gmail.com"
|
7
|
+
s.summary = "A reporting engine in Ruby - the elskwid fork!"
|
8
|
+
s.homepage = "http://github.com/elskwid/munger"
|
9
|
+
s.has_rdoc = true
|
10
|
+
|
11
|
+
s.files = [
|
12
|
+
"munger.gemspec",
|
13
|
+
"Rakefile",
|
14
|
+
"README",
|
15
|
+
"examples/column_add.rb",
|
16
|
+
"examples/development.log",
|
17
|
+
"examples/example_helper.rb",
|
18
|
+
"examples/sinatra_app.rb",
|
19
|
+
"examples/test.html",
|
20
|
+
"lib/munger.rb",
|
21
|
+
"lib/munger/data.rb",
|
22
|
+
"lib/munger/item.rb",
|
23
|
+
"lib/munger/render.rb",
|
24
|
+
"lib/munger/report.rb",
|
25
|
+
"lib/munger/render/csv.rb",
|
26
|
+
"lib/munger/render/html.rb",
|
27
|
+
"lib/munger/render/sortable_html.rb",
|
28
|
+
"lib/munger/render/text.rb"]
|
29
|
+
|
30
|
+
s.test_files = [
|
31
|
+
"test/test_helper.rb",
|
32
|
+
"test/munger/csv_test.rb",
|
33
|
+
"test/munger/data_ar_test.rb",
|
34
|
+
"test/munger/data_test.rb",
|
35
|
+
"test/munger/html_test.rb",
|
36
|
+
"test/munger/item_test.rb",
|
37
|
+
"test/munger/new_test.rb",
|
38
|
+
"test/munger/render_test.rb",
|
39
|
+
"test/munger/report_test.rb",
|
40
|
+
"test/munger/text_test.rb"]
|
41
|
+
|
42
|
+
s.add_dependency "builder"
|
43
|
+
|
44
|
+
s.add_development_dependency "rake"
|
45
|
+
s.add_development_dependency "minitest", "~>5.0.8"
|
36
46
|
end
|
@@ -1,27 +1,27 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
describe Munger::Render::CSV do
|
3
|
+
describe Munger::Render::CSV do
|
4
4
|
include MungerSpecHelper
|
5
|
-
|
5
|
+
|
6
6
|
before(:each) do
|
7
7
|
@data = Munger::Data.new(:data => test_data + [{:name => 'Comma, Guy', :age => 100, :day => 0, :score => 0}])
|
8
8
|
@report = Munger::Report.new(:data => @data)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should accept a Munger::Report object" do
|
12
|
-
Munger::Render::Text.new(@report.process).
|
12
|
+
Munger::Render::Text.new(@report.process).must_be :valid?
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it "should render a basic text table" do
|
16
16
|
@render = Munger::Render::CSV.new(@report.process)
|
17
17
|
count = @report.rows
|
18
18
|
text = @render.render
|
19
|
-
text.split("\n").
|
19
|
+
text.split("\n").size.must_be :>, count
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
it "should quote data with commas" do
|
23
23
|
@render = Munger::Render::CSV.new(@report.process)
|
24
24
|
text = @render.render
|
25
|
-
text.
|
25
|
+
text.must_match /"Comma, Guy"/
|
26
26
|
end
|
27
|
-
end
|
27
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe "Munger::Data with AR like records" do
|
4
|
+
include MungerSpecHelper
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@data = Munger::Data.new(:data => test_ar_data)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "must accept an AR dataset" do
|
11
|
+
Munger::Data.new(:data => test_ar_data).must_be :valid?
|
12
|
+
end
|
13
|
+
|
14
|
+
it "must be able to set AR data after init" do
|
15
|
+
m = Munger::Data.new
|
16
|
+
m.data = test_ar_data
|
17
|
+
m.must_be :valid?
|
18
|
+
end
|
19
|
+
|
20
|
+
it "must be able to set AR data in init block" do
|
21
|
+
m = Munger::Data.new do |d|
|
22
|
+
d.data = test_ar_data
|
23
|
+
end
|
24
|
+
m.must_be :valid?
|
25
|
+
end
|
26
|
+
#
|
27
|
+
it "must be able to add more data after init" do
|
28
|
+
m = Munger::Data.new
|
29
|
+
m.data = test_ar_data
|
30
|
+
m.add_data more_test_data
|
31
|
+
m.must_be :valid?
|
32
|
+
additional_names = m.data.select { |r| r[:name] == 'David' || r[:name] == 'Michael' }
|
33
|
+
additional_names.size.must_equal(4)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
it "must be able to extract columns from AR data" do
|
38
|
+
@titles = @data.columns
|
39
|
+
@titles.size.must_equal(4)
|
40
|
+
@titles.must_include(:name)
|
41
|
+
@titles.must_include(:score)
|
42
|
+
@titles.must_include(:age)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "must be able to add a new column with a default value" do
|
46
|
+
@data.add_column('new_column', :default => 1)
|
47
|
+
@data.data.first['new_column'].must_equal(1)
|
48
|
+
@data.must_be :valid?
|
49
|
+
end
|
50
|
+
|
51
|
+
it "must be able to add a new column with a block" do
|
52
|
+
@data.add_column('new_column') { |c| c.age + 1 }
|
53
|
+
@data.data.first['new_column'].must_equal(24)
|
54
|
+
@data.must_be :valid?
|
55
|
+
end
|
56
|
+
|
57
|
+
it "must be able to add multiple new columns with defaults" do
|
58
|
+
@data.add_column(['col1', 'col2'], :default => [1, 2])
|
59
|
+
@data.data.first['col1'].must_equal(1)
|
60
|
+
@data.data.first['col2'].must_equal(2)
|
61
|
+
@data.must_be :valid?
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
it "must be able to add multiple new columns with a block" do
|
66
|
+
@data.add_column(['col1', 'col2']) { |c| [c.age * 2, c.score * 3]}
|
67
|
+
@data.data.first['col1'].must_equal(46)
|
68
|
+
@data.data.first['col2'].must_equal(36)
|
69
|
+
@data.must_be :valid?
|
70
|
+
end
|
71
|
+
|
72
|
+
it "must work with add_columns, too" do
|
73
|
+
@data.add_columns(['col1', 'col2'], :default => [1, 2])
|
74
|
+
@data.data.first['col1'].must_equal(1)
|
75
|
+
@data.data.first['col2'].must_equal(2)
|
76
|
+
@data.must_be :valid?
|
77
|
+
end
|
78
|
+
|
79
|
+
it "must be able to transform a column" do
|
80
|
+
@data.data.first[:age].must_equal(23)
|
81
|
+
@data.transform_column(:age) { |c| c.age * 2 }
|
82
|
+
@data.data.first[:age].must_equal(46)
|
83
|
+
@data.must_be :valid?
|
84
|
+
end
|
85
|
+
|
86
|
+
it "must be able to transform multiple rows" do
|
87
|
+
@data.data.first[:age].must_equal(23)
|
88
|
+
@data.data.first[:score].must_equal(12)
|
89
|
+
@data.transform_columns([:age, :score]) { |c| [c.age * 2, c.score * 3] }
|
90
|
+
@data.data.first[:age].must_equal(46)
|
91
|
+
@data.data.first[:score].must_equal(36)
|
92
|
+
@data.must_be :valid?
|
93
|
+
end
|
94
|
+
|
95
|
+
it "must be able to filter the data down" do
|
96
|
+
orig_size = @data.size
|
97
|
+
@data.filter_rows { |r| r.age < 30 }
|
98
|
+
@data.size.must_be :<, orig_size
|
99
|
+
@data.size.must_equal(4)
|
100
|
+
@data.must_be :valid?
|
101
|
+
end
|
102
|
+
|
103
|
+
it "must be able to pivot the data (1 column)" do
|
104
|
+
orig_size = @data.size
|
105
|
+
new_keys = @data.pivot(:day, :name, :score)
|
106
|
+
@data.size.must_be :<, orig_size
|
107
|
+
new_keys.must_include(1)
|
108
|
+
new_keys.must_include(2)
|
109
|
+
scott = @data.data.select { |r| r.name == 'Scott' }.first
|
110
|
+
scott[1].must_equal(43)
|
111
|
+
@data.must_be :valid?
|
112
|
+
end
|
113
|
+
|
114
|
+
it "must be able to pivot the data with average aggregation" do
|
115
|
+
new_keys = @data.pivot(:day, :name, :score, :average)
|
116
|
+
new_keys.must_include(1)
|
117
|
+
new_keys.must_include(2)
|
118
|
+
scott = @data.data.select { |r| r.name == 'Scott' }.first
|
119
|
+
scott[1].must_equal(21)
|
120
|
+
@data.must_be :valid?
|
121
|
+
end
|
122
|
+
|
123
|
+
it "must be able to pivot the data with count aggregation" do
|
124
|
+
new_keys = @data.pivot(:day, :name, :score, :count)
|
125
|
+
scott = @data.data.select { |r| r.name == 'Scott' }.first
|
126
|
+
scott[1].must_equal(2)
|
127
|
+
@data.must_be :valid?
|
128
|
+
end
|
129
|
+
|
130
|
+
it "must be able to pivot the data in three dimensions (1 col, 2 row)" do
|
131
|
+
new_keys = @data.pivot(:name, [:score, :age], :score, :count)
|
132
|
+
alice = @data.data.select { |r| r.name == 'Alice' }.first
|
133
|
+
alice.Alice.must_equal(2)
|
134
|
+
@data.must_be :valid?
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
it "must be able to add a column then pivot the data (1 column)" do
|
139
|
+
@data.add_column(:day_of_week) { |c| Date::DAYNAMES[c.day] }
|
140
|
+
@data.add_column(:name_length) { |c| c.name.length }
|
141
|
+
orig_size = @data.size
|
142
|
+
new_keys = @data.pivot(:day_of_week, :name, :score)
|
143
|
+
@data.size.must_be :<, orig_size
|
144
|
+
new_keys.must_include("Monday")
|
145
|
+
new_keys.must_include("Tuesday")
|
146
|
+
alice = @data.data.select { |r| r.name == 'Alice' }.first
|
147
|
+
alice["Monday"].must_equal(12)
|
148
|
+
alice["Tuesday"].must_equal(24)
|
149
|
+
@data.must_be :valid?
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
# like sql group command, give aggregation block
|
154
|
+
it "must be able to group the data like sql" do
|
155
|
+
@data.group(:name)
|
156
|
+
@data.size.must_equal(6)
|
157
|
+
@data.must_be :valid?
|
158
|
+
end
|
159
|
+
|
160
|
+
it "must be able to group on multiple columns" do
|
161
|
+
@data.group([:age, :score], :count => :day, :sum => :day, :average => :score)
|
162
|
+
alice = @data.data.select { |r| (r.score == 12) && (r.age == 33)}.first
|
163
|
+
alice.count_day.must_equal(2)
|
164
|
+
alice.sum_day.must_equal(3)
|
165
|
+
alice.average_day.must_equal(nil)
|
166
|
+
@data.must_be :valid?
|
167
|
+
end
|
168
|
+
|
169
|
+
it "must be able to group with a proc aggregation" do
|
170
|
+
pr = Proc.new {|arr| arr.inject(0) { |a,b| a + (b*2) }}
|
171
|
+
@data.group([:age, :score], :sum => :day, ['test', pr] => :age)
|
172
|
+
alice = @data.data.select { |r| (r.score == 12) && (r.age == 33)}.first
|
173
|
+
alice.test_age.must_equal(132)
|
174
|
+
alice.sum_day.must_equal(3)
|
175
|
+
@data.must_be :valid?
|
176
|
+
end
|
177
|
+
|
178
|
+
it "must be able to output an array" do
|
179
|
+
array = @data.to_a
|
180
|
+
array.must_be_kind_of(Array)
|
181
|
+
array.first.size.must_equal(@data.columns.size)
|
182
|
+
@data.must_be :valid?
|
183
|
+
end
|
184
|
+
|
185
|
+
it "must be able to output a filtered array" do
|
186
|
+
array = @data.to_a([:name, :age])
|
187
|
+
array.must_be_kind_of(Array)
|
188
|
+
array.first.size.must_equal(2)
|
189
|
+
scotts = array.select { |a| a.include?('Scott') }
|
190
|
+
scotts.first.must_include('Scott')
|
191
|
+
scotts.first.must_include(23)
|
192
|
+
@data.must_be :valid?
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe Munger::Data do
|
4
|
+
include MungerSpecHelper
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@data = Munger::Data.new(:data => test_data)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "must accept an array of hashes" do
|
11
|
+
Munger::Data.new(:data => test_data).must_be :valid?
|
12
|
+
end
|
13
|
+
|
14
|
+
it "must be able to set data after init" do
|
15
|
+
m = Munger::Data.new
|
16
|
+
m.data = test_data
|
17
|
+
m.must_be :valid?
|
18
|
+
end
|
19
|
+
|
20
|
+
it "must be able to set data in init block" do
|
21
|
+
m = Munger::Data.new do |d|
|
22
|
+
d.data = test_data
|
23
|
+
end
|
24
|
+
m.must_be :valid?
|
25
|
+
end
|
26
|
+
|
27
|
+
it "must be able to add more data after init" do
|
28
|
+
m = Munger::Data.new
|
29
|
+
m.data = test_data
|
30
|
+
m.add_data more_test_data
|
31
|
+
m.must_be :valid?
|
32
|
+
additional_names = m.data.select { |r| r[:name] == 'David' || r[:name] == 'Michael' }
|
33
|
+
additional_names.size.must_equal(4)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "must be able to add data without initial data" do
|
37
|
+
m = Munger::Data.new
|
38
|
+
m.add_data more_test_data
|
39
|
+
m.must_be :valid?
|
40
|
+
m.size.must_equal(4)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "must be able to extract columns from data" do
|
44
|
+
@titles = @data.columns
|
45
|
+
@titles.size.must_equal(4)
|
46
|
+
@titles.must_include(:name)
|
47
|
+
@titles.must_include(:score)
|
48
|
+
@titles.must_include(:age)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "must be able to add a new column with a default value" do
|
52
|
+
@data.add_column('new_column', :default => 1)
|
53
|
+
@data.data.first['new_column'].must_equal(1)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "must be able to add a new column with a block" do
|
57
|
+
@data.add_column('new_column') { |c| c.age + 1 }
|
58
|
+
@data.data.first['new_column'].must_equal(24)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "must be able to add multiple new columns with defaults" do
|
62
|
+
@data.add_column(['col1', 'col2'], :default => [1, 2])
|
63
|
+
@data.data.first['col1'].must_equal(1)
|
64
|
+
@data.data.first['col2'].must_equal(2)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "must be able to add multiple new columns with a block" do
|
68
|
+
@data.add_column(['col1', 'col2']) { |c| [c.age * 2, c.score * 3]}
|
69
|
+
@data.data.first['col1'].must_equal(46)
|
70
|
+
@data.data.first['col2'].must_equal(36)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "must work with add_columns, too" do
|
74
|
+
@data.add_columns(['col1', 'col2'], :default => [1, 2])
|
75
|
+
@data.data.first['col1'].must_equal(1)
|
76
|
+
@data.data.first['col2'].must_equal(2)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "must be able to transform a column" do
|
80
|
+
@data.data.first[:age].must_equal(23)
|
81
|
+
@data.transform_column(:age) { |c| c.age * 2 }
|
82
|
+
@data.data.first[:age].must_equal(46)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "must be able to transform multiple rows" do
|
86
|
+
@data.data.first[:age].must_equal(23)
|
87
|
+
@data.data.first[:score].must_equal(12)
|
88
|
+
@data.transform_columns([:age, :score]) { |c| [c.age * 2, c.score * 3] }
|
89
|
+
@data.data.first[:age].must_equal(46)
|
90
|
+
@data.data.first[:score].must_equal(36)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "must be able to filter the data down" do
|
94
|
+
orig_size = @data.size
|
95
|
+
@data.filter_rows { |r| r.age < 30 }
|
96
|
+
@data.size.must_be :<, orig_size
|
97
|
+
@data.size.must_equal(4)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "must be able to pivot the data (1 column)" do
|
101
|
+
orig_size = @data.size
|
102
|
+
new_keys = @data.pivot(:day, :name, :score)
|
103
|
+
@data.size.must_be :<, orig_size
|
104
|
+
new_keys.must_include(1, 2)
|
105
|
+
scott = @data.data.select { |r| r.name == 'Scott' }.first
|
106
|
+
scott[1].must_equal(43)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "must be able to pivot the data with average aggregation" do
|
110
|
+
new_keys = @data.pivot(:day, :name, :score, :average)
|
111
|
+
new_keys.must_include(1, 2)
|
112
|
+
scott = @data.data.select { |r| r.name == 'Scott' }.first
|
113
|
+
scott[1].must_equal(21)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "must be able to pivot the data with count aggregation" do
|
117
|
+
new_keys = @data.pivot(:day, :name, :score, :count)
|
118
|
+
scott = @data.data.select { |r| r.name == 'Scott' }.first
|
119
|
+
scott[1].must_equal(2)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "must be able to pivot the data in three dimensions (1 col, 2 row)" do
|
123
|
+
new_keys = @data.pivot(:name, [:score, :age], :score, :count)
|
124
|
+
alice = @data.data.select { |r| r.name == 'Alice' }.first
|
125
|
+
alice.Alice.must_equal(2)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "must be able to add a column then pivot the data (1 column)" do
|
129
|
+
@data.add_column(:day_of_week) { |c| Date::DAYNAMES[c.day] }
|
130
|
+
orig_size = @data.size
|
131
|
+
new_keys = @data.pivot(:day_of_week, :name, :score)
|
132
|
+
@data.size.must_be :<, orig_size
|
133
|
+
new_keys.must_include("Monday", "Tuesday")
|
134
|
+
alice = @data.data.select { |r| r.name == 'Alice' }.first
|
135
|
+
alice["Monday"].must_equal(12)
|
136
|
+
alice["Tuesday"].must_equal(24)
|
137
|
+
end
|
138
|
+
|
139
|
+
# like sql group command, give aggregation block
|
140
|
+
it "must be able to group the data like sql" do
|
141
|
+
@data.group(:name)
|
142
|
+
@data.size.must_equal(6)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "must be able to group on multiple columns" do
|
146
|
+
@data.group([:age, :score], :count => :day, :sum => :day, :average => :score)
|
147
|
+
alice = @data.data.select { |r| (r.score == 12) && (r.age == 33)}.first
|
148
|
+
alice.count_day.must_equal(2)
|
149
|
+
alice.sum_day.must_equal(3)
|
150
|
+
alice.average_day.must_equal(nil)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "must be able to group with a proc aggregation" do
|
154
|
+
pr = Proc.new {|arr| arr.inject(0) { |a,b| a + (b*2) }}
|
155
|
+
@data.group([:age, :score], :sum => :day, ['test', pr] => :age)
|
156
|
+
alice = @data.data.select { |r| (r.score == 12) && (r.age == 33)}.first
|
157
|
+
alice.test_age.must_equal(132)
|
158
|
+
alice.sum_day.must_equal(3)
|
159
|
+
end
|
160
|
+
|
161
|
+
it "must be able to output an array" do
|
162
|
+
array = @data.to_a
|
163
|
+
array.must_be_kind_of(Array)
|
164
|
+
array.first.size.must_equal(@data.columns.size)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "must be able to output a filtered array" do
|
168
|
+
array = @data.to_a([:name, :age])
|
169
|
+
array.must_be_kind_of(Array)
|
170
|
+
array.first.size.must_equal(2)
|
171
|
+
scotts = array.select { |a| a.include?('Scott') }
|
172
|
+
scotts.first.must_include('Scott', 23)
|
173
|
+
end
|
174
|
+
|
175
|
+
it "must be able to pivot the data in three dimensions (2 col, 1 row)"
|
176
|
+
|
177
|
+
it "must be able to pivot the data in four dimensions (2 col, 2 row)"
|
178
|
+
|
179
|
+
it "must be able to add two Munger::Datas together if they have the same columns"
|
180
|
+
|
181
|
+
it "must be able to add data and check if it is Munger::Data"
|
182
|
+
|
183
|
+
it "(maybe) must be able to zip two Munger::Datas together given a unique key column in each"
|
184
|
+
|
185
|
+
end
|