pivot_table 0.1.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -22
- data/.travis.yml +1 -1
- data/CHANGELOG.md +6 -6
- data/Gemfile +4 -4
- data/README.md +20 -5
- data/Rakefile +1 -1
- data/lib/pivot_table/column.rb +6 -2
- data/lib/pivot_table/grid.rb +16 -4
- data/lib/pivot_table/row.rb +6 -2
- data/lib/pivot_table.rb +1 -1
- data/pivot_table.gemspec +1 -1
- data/spec/pivot_table/column_spec.rb +1 -2
- data/spec/pivot_table/grid_spec.rb +23 -6
- data/spec/pivot_table/row_spec.rb +2 -3
- metadata +11 -6
data/.rvmrc
CHANGED
@@ -1,22 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
environment_id="ruby-1.9.2-p290@pivot_table"
|
4
|
-
|
5
|
-
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
6
|
-
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
7
|
-
then
|
8
|
-
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
9
|
-
|
10
|
-
if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
|
11
|
-
then
|
12
|
-
. "${rvm_path:-$HOME/.rvm}/hooks/after_use"
|
13
|
-
fi
|
14
|
-
echo "RVM environment: ${environment_id}"
|
15
|
-
else
|
16
|
-
# If the environment file has not yet been created, use the RVM CLI to select.
|
17
|
-
if ! rvm --create "$environment_id"
|
18
|
-
then
|
19
|
-
echo "Failed to create RVM environment '${environment_id}'."
|
20
|
-
exit 1
|
21
|
-
fi
|
22
|
-
fi
|
1
|
+
rvm use ruby-1.9.3-p125@pivot_table --create
|
data/.travis.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
rvm:
|
2
|
-
- 1.9.
|
2
|
+
- 1.9.3
|
data/CHANGELOG.md
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
|
+
0.1.2
|
4
|
+
---
|
5
|
+
Removed testing gems and updated Ruby version to 1.9.3
|
3
6
|
|
4
7
|
0.0.3
|
5
|
-
|
6
|
-
|
8
|
+
---
|
7
9
|
Renamed gem to pivot_table
|
8
10
|
|
9
11
|
0.0.2
|
10
|
-
|
11
|
-
|
12
|
+
---
|
12
13
|
Major refactoring to allow unbalanced dataset to be pivoted.
|
13
14
|
|
14
15
|
0.0.1
|
15
|
-
|
16
|
-
|
16
|
+
---
|
17
17
|
Initial release.
|
data/Gemfile
CHANGED
@@ -6,12 +6,12 @@ gemspec
|
|
6
6
|
gem 'rake'
|
7
7
|
|
8
8
|
group :development, :test do
|
9
|
-
gem 'autotest'
|
9
|
+
#gem 'autotest'
|
10
10
|
#gem 'autotest-growl'
|
11
|
-
gem 'autotest-notification'
|
11
|
+
#gem 'autotest-notification'
|
12
12
|
gem 'bundler'
|
13
|
-
gem 'launchy'
|
14
|
-
gem 'rcov'
|
13
|
+
#gem 'launchy'
|
14
|
+
#gem 'rcov'
|
15
15
|
gem 'rspec'
|
16
16
|
gem 'shoulda-matchers'
|
17
17
|
end
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Pivot Table [![Build Status](https://secure.travis-ci.org/edjames/pivot_table.png)](http://travis-ci.org/edjames/pivot_table)
|
1
|
+
Pivot Table [![Build Status](https://secure.travis-ci.org/edjames/pivot_table.png)](http://travis-ci.org/edjames/pivot_table) [![Code Climate](https://codeclimate.com/github/edjames/pivot_table.png)](https://codeclimate.com/github/edjames/pivot_table)
|
2
2
|
===========
|
3
3
|
|
4
4
|
A handy tool for transforming a dataset into a spreadsheet-style pivot table.
|
@@ -16,12 +16,12 @@ Couldn't be easier...
|
|
16
16
|
|
17
17
|
gem install pivot_table
|
18
18
|
|
19
|
-
There are no dependencies and pivot
|
19
|
+
There are no dependencies and pivot *should* work on any version of Ruby.
|
20
20
|
|
21
21
|
Usage
|
22
22
|
-----
|
23
23
|
|
24
|
-
At the very least, you will need to provide
|
24
|
+
At the very least, you will need to provide three things to create a pivot table...
|
25
25
|
|
26
26
|
* a dataset (this doesn't necessarily have to be an ActiveRecord dataset, but it should at least behave like ActiveRecord e.g. OpenStruct)
|
27
27
|
* the method to be used as column names
|
@@ -43,12 +43,16 @@ Let's say you have a collection of Order objects that looks like this:
|
|
43
43
|
Instantiate a new PivotTable::Grid object like this...
|
44
44
|
|
45
45
|
grid = PivotTable::Grid.new do |g|
|
46
|
-
g.
|
46
|
+
g.source_data = data
|
47
47
|
g.column_name = :quarter
|
48
48
|
g.row_name = :city
|
49
|
+
g.value_name = :sales
|
49
50
|
end
|
50
51
|
|
51
52
|
|
53
|
+
The `value_name` parameter is only required if you want to access totals;
|
54
|
+
the others are required.
|
55
|
+
|
52
56
|
All you have to do now is build the grid...
|
53
57
|
|
54
58
|
g.build
|
@@ -93,6 +97,17 @@ E.g. The rows and columns collections make it very easy to produce horizontal, v
|
|
93
97
|
|
94
98
|
Ah, that's better.
|
95
99
|
|
100
|
+
If you want to get the totals for rows, columns, or the entire grid, you can pass a `value_name` as shown above, and then query the Grid like this:
|
101
|
+
|
102
|
+
g.column_totals
|
103
|
+
g.columns[0].total
|
104
|
+
g.columns[1].total
|
105
|
+
g.columns[2].total
|
106
|
+
g.row_totals
|
107
|
+
g.rows[0].total
|
108
|
+
g.rows[1].total
|
109
|
+
g.grand_total
|
110
|
+
|
96
111
|
Still to come
|
97
112
|
-------------
|
98
113
|
|
@@ -121,4 +136,4 @@ If you want to contribute:
|
|
121
136
|
Copyright
|
122
137
|
---------
|
123
138
|
|
124
|
-
Copyright (c) 2011 Ed James. See LICENSE for details.
|
139
|
+
Copyright (c) 2011 Ed James. See LICENSE for details.
|
data/Rakefile
CHANGED
data/lib/pivot_table/column.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module PivotTable
|
2
2
|
class Column
|
3
3
|
|
4
|
-
ACCESSORS = [:header, :data, :
|
4
|
+
ACCESSORS = [:header, :data, :value_name]
|
5
5
|
|
6
6
|
ACCESSORS.each do |a|
|
7
7
|
self.send(:attr_accessor, a)
|
@@ -13,5 +13,9 @@ module PivotTable
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def total
|
17
|
+
data.inject(0){|t,x| t + (x ? x.send(value_name) : 0)}
|
18
|
+
end
|
19
|
+
|
16
20
|
end
|
17
|
-
end
|
21
|
+
end
|
data/lib/pivot_table/grid.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module PivotTable
|
2
2
|
class Grid
|
3
3
|
|
4
|
-
attr_accessor :source_data, :row_name, :column_name
|
4
|
+
attr_accessor :source_data, :row_name, :column_name, :value_name
|
5
5
|
attr_reader :columns, :rows, :data_grid
|
6
6
|
|
7
7
|
def initialize(&block)
|
@@ -18,14 +18,14 @@ module PivotTable
|
|
18
18
|
def build_rows
|
19
19
|
@rows = []
|
20
20
|
@data_grid.each_with_index do |data, index|
|
21
|
-
@rows << Row.new(:header => row_headers[index], :data => data)
|
21
|
+
@rows << Row.new(:header => row_headers[index], :data => data, :value_name => value_name)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def build_columns
|
26
26
|
@columns = []
|
27
27
|
@data_grid.transpose.each_with_index do |data, index|
|
28
|
-
@columns << Column.new(:header => column_headers[index], :data => data)
|
28
|
+
@columns << Column.new(:header => column_headers[index], :data => data, :value_name => value_name)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -37,6 +37,18 @@ module PivotTable
|
|
37
37
|
headers @row_name
|
38
38
|
end
|
39
39
|
|
40
|
+
def column_totals
|
41
|
+
columns.map{|c| c.total}
|
42
|
+
end
|
43
|
+
|
44
|
+
def row_totals
|
45
|
+
rows.map{|r| r.total}
|
46
|
+
end
|
47
|
+
|
48
|
+
def grand_total
|
49
|
+
column_totals.inject(0){|t,x| t + x}
|
50
|
+
end
|
51
|
+
|
40
52
|
def prepare_grid
|
41
53
|
@data_grid = []
|
42
54
|
row_headers.count.times do
|
@@ -63,4 +75,4 @@ module PivotTable
|
|
63
75
|
end
|
64
76
|
|
65
77
|
end
|
66
|
-
end
|
78
|
+
end
|
data/lib/pivot_table/row.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module PivotTable
|
2
2
|
class Row
|
3
3
|
|
4
|
-
ACCESSORS = [:header, :data, :
|
4
|
+
ACCESSORS = [:header, :data, :value_name]
|
5
5
|
|
6
6
|
ACCESSORS.each do |a|
|
7
7
|
self.send(:attr_accessor, a)
|
@@ -13,5 +13,9 @@ module PivotTable
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def total
|
17
|
+
data.inject(0){|t,x| t + (x ? x.send(value_name) : 0)}
|
18
|
+
end
|
19
|
+
|
16
20
|
end
|
17
|
-
end
|
21
|
+
end
|
data/lib/pivot_table.rb
CHANGED
data/pivot_table.gemspec
CHANGED
@@ -22,12 +22,16 @@ module PivotTable
|
|
22
22
|
let(:column_0) { [d1, d4] }
|
23
23
|
let(:column_1) { [d2, d5] }
|
24
24
|
let(:column_2) { [d3, d6] }
|
25
|
+
let(:column_totals) { [d1.id + d4.id, d2.id + d5.id, d3.id + d6.id] }
|
26
|
+
let(:row_totals) { [d1.id + d2.id + d3.id, d4.id + d5.id + d6.id] }
|
27
|
+
let(:grand_total) { d1.id + d2.id + d3.id + d4.id + d5.id + d6.id }
|
25
28
|
|
26
29
|
let(:instance) do
|
27
30
|
Grid.new do |g|
|
28
31
|
g.source_data = data
|
29
32
|
g.row_name = :row_name
|
30
33
|
g.column_name = :column_name
|
34
|
+
g.value_name = :id
|
31
35
|
end
|
32
36
|
end
|
33
37
|
|
@@ -38,6 +42,7 @@ module PivotTable
|
|
38
42
|
it { should respond_to :column_name }
|
39
43
|
it { should respond_to :columns }
|
40
44
|
it { should respond_to :rows }
|
45
|
+
it { should respond_to :grand_total }
|
41
46
|
end
|
42
47
|
|
43
48
|
describe 'build' do
|
@@ -57,19 +62,22 @@ module PivotTable
|
|
57
62
|
context '1st column' do
|
58
63
|
subject { build_result.columns[0] }
|
59
64
|
its(:header) { should == column_headers[0] }
|
60
|
-
its(:data) { should
|
65
|
+
its(:data) { should == column_0 }
|
66
|
+
its(:total) { should == column_totals[0] }
|
61
67
|
end
|
62
68
|
|
63
69
|
context '2nd column' do
|
64
70
|
subject { build_result.columns[1] }
|
65
71
|
its(:header) { should == column_headers[1] }
|
66
|
-
its(:data) { should
|
72
|
+
its(:data) { should == column_1 }
|
73
|
+
its(:total) { should == column_totals[1] }
|
67
74
|
end
|
68
75
|
|
69
76
|
context '3rd column' do
|
70
77
|
subject { build_result.columns[2] }
|
71
78
|
its(:header) { should == column_headers[2] }
|
72
|
-
its(:data) { should
|
79
|
+
its(:data) { should == column_2 }
|
80
|
+
its(:total) { should == column_totals[2] }
|
73
81
|
end
|
74
82
|
end
|
75
83
|
|
@@ -85,13 +93,15 @@ module PivotTable
|
|
85
93
|
context '1st row' do
|
86
94
|
subject { build_result.rows[0] }
|
87
95
|
its(:header) { should == row_headers[0] }
|
88
|
-
its(:data) { should
|
96
|
+
its(:data) { should == row_0 }
|
97
|
+
its(:total) { should == row_totals[0] }
|
89
98
|
end
|
90
99
|
|
91
100
|
context '2nd row' do
|
92
101
|
subject { build_result.rows[1] }
|
93
102
|
its(:header) { should == row_headers[1] }
|
94
|
-
its(:data) { should
|
103
|
+
its(:data) { should == row_1 }
|
104
|
+
its(:total) { should == row_totals[1] }
|
95
105
|
end
|
96
106
|
end
|
97
107
|
|
@@ -107,6 +117,13 @@ module PivotTable
|
|
107
117
|
subject { build_result.data_grid }
|
108
118
|
it { should == [[d1, d2, d3], [d4, d5, d6]] }
|
109
119
|
end
|
120
|
+
|
121
|
+
context 'totals' do
|
122
|
+
subject { build_result }
|
123
|
+
its(:column_totals) { should == column_totals }
|
124
|
+
its(:row_totals) { should == row_totals }
|
125
|
+
its(:grand_total) { should == grand_total }
|
126
|
+
end
|
110
127
|
end
|
111
128
|
end
|
112
|
-
end
|
129
|
+
end
|
@@ -12,12 +12,11 @@ module PivotTable
|
|
12
12
|
it { should respond_to :total }
|
13
13
|
|
14
14
|
context 'initialize with hash' do
|
15
|
-
subject { klass.new(header: 'header', data: 'data'
|
15
|
+
subject { klass.new(header: 'header', data: 'data')}
|
16
16
|
|
17
17
|
its(:header) { should == 'header' }
|
18
18
|
its(:data) { should == 'data' }
|
19
|
-
its(:total) { should == 'total' }
|
20
19
|
end
|
21
20
|
|
22
21
|
end
|
23
|
-
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pivot_table
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,10 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-10-14 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Transform an ActiveRecord-ish data set into a pivot table of objects
|
15
|
-
email:
|
15
|
+
email: !binary |-
|
16
|
+
ZWQuamFtZXMuZW1haWxAZ21haWwuY29t
|
16
17
|
executables: []
|
17
18
|
extensions: []
|
18
19
|
extra_rdoc_files: []
|
@@ -55,8 +56,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
56
|
version: '0'
|
56
57
|
requirements: []
|
57
58
|
rubyforge_project: pivot_table
|
58
|
-
rubygems_version: 1.8.
|
59
|
+
rubygems_version: 1.8.15
|
59
60
|
signing_key:
|
60
61
|
specification_version: 3
|
61
|
-
summary: pivot_table-0.1.
|
62
|
-
test_files:
|
62
|
+
summary: pivot_table-0.1.3
|
63
|
+
test_files:
|
64
|
+
- spec/pivot_table/column_spec.rb
|
65
|
+
- spec/pivot_table/grid_spec.rb
|
66
|
+
- spec/pivot_table/row_spec.rb
|
67
|
+
- spec/spec_helper.rb
|