goldmine 0.9.1 → 0.9.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.
- data/Gemfile +2 -6
- data/Gemfile.lock +18 -25
- data/README.md +12 -22
- data/Rakefile +6 -8
- data/lib/goldmine.rb +3 -133
- data/lib/goldmine/array_miner.rb +64 -0
- data/lib/goldmine/hash_miner.rb +69 -0
- data/lib/goldmine/version.rb +3 -0
- metadata +93 -11
data/Gemfile
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
|
+
gemspec
|
2
3
|
|
3
|
-
gem "minitest", :group => :test
|
4
|
-
gem "turn", :group => :test
|
5
|
-
gem "simplecov", :require => false, :group => :test
|
6
|
-
gem "debugger", :group => :development
|
7
|
-
gem "pry", :group => [:development, :test]
|
data/Gemfile.lock
CHANGED
@@ -1,37 +1,30 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
goldmine (0.9.2)
|
5
|
+
|
1
6
|
GEM
|
2
|
-
remote:
|
7
|
+
remote: https://rubygems.org/
|
3
8
|
specs:
|
4
|
-
ansi (1.4.
|
5
|
-
coderay (1.0.
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
debugger-linecache (~> 1.1.1)
|
10
|
-
debugger-ruby_core_source (~> 1.1.3)
|
11
|
-
debugger-linecache (1.1.1)
|
12
|
-
debugger-ruby_core_source (>= 1.1.1)
|
13
|
-
debugger-ruby_core_source (1.1.3)
|
14
|
-
method_source (0.7.1)
|
15
|
-
minitest (3.1.0)
|
16
|
-
multi_json (1.3.6)
|
17
|
-
pry (0.9.9.6)
|
9
|
+
ansi (1.4.3)
|
10
|
+
coderay (1.0.9)
|
11
|
+
method_source (0.8.1)
|
12
|
+
minitest (4.7.2)
|
13
|
+
pry (0.9.12)
|
18
14
|
coderay (~> 1.0.5)
|
19
|
-
method_source (~> 0.
|
20
|
-
slop (
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
simplecov-html (0.5.3)
|
25
|
-
slop (2.4.4)
|
26
|
-
turn (0.9.5)
|
15
|
+
method_source (~> 0.8)
|
16
|
+
slop (~> 3.4)
|
17
|
+
rake (10.0.4)
|
18
|
+
slop (3.4.4)
|
19
|
+
turn (0.9.6)
|
27
20
|
ansi
|
28
21
|
|
29
22
|
PLATFORMS
|
30
23
|
ruby
|
31
24
|
|
32
25
|
DEPENDENCIES
|
33
|
-
|
26
|
+
goldmine!
|
34
27
|
minitest
|
35
28
|
pry
|
36
|
-
|
29
|
+
rake
|
37
30
|
turn
|
data/README.md
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
# Goldmine
|
2
2
|
|
3
|
+
[](https://travis-ci.org/hopsoft/goldmine)
|
4
|
+
[](https://gemnasium.com/hopsoft/goldmine)
|
5
|
+
[](https://codeclimate.com/github/hopsoft/goldmine)
|
6
|
+
|
3
7
|
## Pivot tables for the Rubyist
|
4
8
|
|
5
|
-
|
9
|
+

|
10
|
+
|
11
|
+
### Pivot any list into a wealth of information
|
6
12
|
|
7
13
|
Goldmine allows you to apply pivot table logic to any list for powerful data mining capabilities.
|
8
14
|
|
@@ -19,7 +25,7 @@ Goldmine allows you to apply pivot table logic to any list for powerful data min
|
|
19
25
|
|
20
26
|
Install
|
21
27
|
|
22
|
-
```
|
28
|
+
```bash
|
23
29
|
$gem install goldmine
|
24
30
|
```
|
25
31
|
|
@@ -36,7 +42,6 @@ require "goldmine"
|
|
36
42
|
* [Create a named pivot](#explicitly-name-a-pivot)
|
37
43
|
* [Pivot values that are lists themselves](#pivot-values-that-are-lists-themselves)
|
38
44
|
* [Chain pivots](#chain-pivots-together)
|
39
|
-
* [Chain pivots conditionally](#conditionally-chain-pivots-together)
|
40
45
|
* [Dig deep and extract meaningful data](#deep-cuts)
|
41
46
|
|
42
47
|
## The Basics
|
@@ -114,23 +119,6 @@ data = list.pivot { |i| i < 5 }.pivot { |i| i % 2 == 0 }
|
|
114
119
|
}
|
115
120
|
```
|
116
121
|
|
117
|
-
### Conditionally chain pivots together
|
118
|
-
|
119
|
-
```ruby
|
120
|
-
# operation
|
121
|
-
params = { :divisible_by_two => false, :next_greater_than_five => true }
|
122
|
-
list = [1,2,3,4,5,6,7,8,9]
|
123
|
-
data = list.pivot("less than 5") { |i| i < 5 }
|
124
|
-
data = data.pivot("divisible by 2") { |i| i % 2 == 0 } if params[:divisible_by_two]
|
125
|
-
data = data.pivot("next greater than 5") { |i| i.next > 5 } if params[:next_greater_than_five]
|
126
|
-
|
127
|
-
# resulting data
|
128
|
-
{
|
129
|
-
{ "less than 5" => true, "next greater than 5" => false } => [1, 2, 3, 4],
|
130
|
-
{ "less than 5" => false, "next greater than 5" => true } => [5, 6, 7, 8, 9]
|
131
|
-
}
|
132
|
-
```
|
133
|
-
|
134
122
|
## Deep Cuts
|
135
123
|
|
136
124
|
### Build a moderately complex dataset of Cities
|
@@ -208,7 +196,7 @@ data = cities
|
|
208
196
|
|
209
197
|
Here is a table view of the pivoted city data from above.
|
210
198
|
|
211
|
-
<table>
|
199
|
+
<table class="table table-bordered table-striped">
|
212
200
|
<thead>
|
213
201
|
<tr>
|
214
202
|
<th>state</th>
|
@@ -301,7 +289,7 @@ data = cities
|
|
301
289
|
|
302
290
|
Here is the corresponding table view for the above dataset.
|
303
291
|
|
304
|
-
<table>
|
292
|
+
<table class="table table-bordered table-striped">
|
305
293
|
<thead>
|
306
294
|
<tr>
|
307
295
|
<th>airline</th>
|
@@ -384,6 +372,8 @@ Hopefully you can see the potential even though the above examples are somewhat
|
|
384
372
|
|
385
373
|
* [One on One Marketing](http://www.1on1.com/) - for sponsoring the development of Goldmine
|
386
374
|
* [Eric Berry](https://github.com/cavneb/) - for constructive feedback
|
375
|
+
* [Spencer Roan](https://github.com/spencerroan) - for constructive feedback
|
387
376
|
* [Brian Johnson](https://github.com/whap/) - for bringing some sanity to the recursion
|
388
377
|
* [Josh Bowles](https://github.com/jbowles/) - for early adoption and feedback
|
389
378
|
* [Brett Beers](https://github.com/beersbr/) - for early adoption and feedback
|
379
|
+
|
data/Rakefile
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
|
5
|
-
|
1
|
+
require "rake"
|
2
|
+
require "rake/testtask"
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
|
5
|
+
task :default => [:test]
|
6
6
|
|
7
7
|
Rake::TestTask.new(:test) do |t|
|
8
|
-
t.test_files =
|
8
|
+
t.test_files = Dir["test/test_*.rb"]
|
9
9
|
end
|
10
10
|
|
11
|
-
task 'test:units' => ['test'] do
|
12
|
-
end
|
data/lib/goldmine.rb
CHANGED
@@ -1,136 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
module Goldmine
|
5
|
-
|
6
|
-
# Extends Array with a pivot method.
|
7
|
-
module ArrayMiner
|
8
|
-
|
9
|
-
# Pivots the Array into a Hash of mined data.
|
10
|
-
# Think of it as creating a pivot table or perhaps an OLAP cube.
|
11
|
-
#
|
12
|
-
# @example Simple pivot
|
13
|
-
# list = [1,2,3,4,5,6,7,8,9]
|
14
|
-
# data = list.pivot { |i| i < 5 }
|
15
|
-
#
|
16
|
-
# # resulting data
|
17
|
-
# # {
|
18
|
-
# # true => [1, 2, 3, 4],
|
19
|
-
# # false => [5, 6, 7, 8, 9]
|
20
|
-
# # }
|
21
|
-
#
|
22
|
-
# @example Named pivot
|
23
|
-
# list = [1,2,3,4,5,6,7,8,9]
|
24
|
-
# data = list.pivot("less than 5") { |i| i < 5 }
|
25
|
-
#
|
26
|
-
# # resulting data
|
27
|
-
# # {
|
28
|
-
# # { "less than 5" => true } => [1, 2, 3, 4],
|
29
|
-
# # { "less than 5" => false } => [5, 6, 7, 8, 9]
|
30
|
-
# # }
|
31
|
-
#
|
32
|
-
# @example Chained pivot
|
33
|
-
# list = [1,2,3,4,5,6,7,8,9]
|
34
|
-
# data = list.pivot { |i| i < 5 }.pivot { |i| i % 2 == 0 }
|
35
|
-
#
|
36
|
-
# # resulting data
|
37
|
-
# {
|
38
|
-
# [true, false] => [1, 3],
|
39
|
-
# [true, true] => [2, 4],
|
40
|
-
# [false, false] => [5, 7, 9],
|
41
|
-
# [false, true] => [6, 8]
|
42
|
-
# }
|
43
|
-
#
|
44
|
-
# @param [String] name The named of the pivot.
|
45
|
-
# @yield [Object] Yields once for each item in the Array
|
46
|
-
# @return [Hash] The pivoted Hash of data.
|
47
|
-
def pivot(name=nil, &block)
|
48
|
-
reduce({}) do |memo, item|
|
49
|
-
value = yield(item)
|
50
|
-
|
51
|
-
if value.is_a?(Array)
|
52
|
-
if value.empty?
|
53
|
-
memo.assign_mined(name, nil, item)
|
54
|
-
else
|
55
|
-
value.each { |v| memo.assign_mined(name, v, item) }
|
56
|
-
end
|
57
|
-
else
|
58
|
-
memo.assign_mined(name, value, item)
|
59
|
-
end
|
60
|
-
|
61
|
-
memo.goldmine = true
|
62
|
-
memo
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Extends Hash with a pivot method.
|
68
|
-
module HashMiner
|
69
|
-
|
70
|
-
attr_accessor :goldmine
|
71
|
-
|
72
|
-
# Further pivots the Hash into mined data.
|
73
|
-
# This method is what enables the pivot method chaining.
|
74
|
-
#
|
75
|
-
# @example Chained pivot
|
76
|
-
# list = [1,2,3,4,5,6,7,8,9]
|
77
|
-
# data = list.pivot { |i| i < 5 }.pivot { |i| i % 2 == 0 }
|
78
|
-
#
|
79
|
-
# # resulting data
|
80
|
-
# {
|
81
|
-
# [true, false] => [1, 3],
|
82
|
-
# [true, true] => [2, 4],
|
83
|
-
# [false, false] => [5, 7, 9],
|
84
|
-
# [false, true] => [6, 8]
|
85
|
-
# }
|
86
|
-
#
|
87
|
-
# @note This method should not be called directly. Call Array#pivot instead.
|
88
|
-
#
|
89
|
-
# @param [String] name The named of the pivot.
|
90
|
-
# @yield [Object] Yields once for each item in the Array
|
91
|
-
# @return [Hash] The pivoted Hash of data.
|
92
|
-
def pivot(name=nil, &block)
|
93
|
-
return self unless goldmine
|
94
|
-
|
95
|
-
reduce({}) do |memo, item|
|
96
|
-
key = item.first
|
97
|
-
value = item.last
|
98
|
-
value.pivot(name, &block).each do |k, v|
|
99
|
-
if key.is_a? Hash
|
100
|
-
k = { block.to_s => k } unless k.is_a?(Hash)
|
101
|
-
new_key = key.merge(k)
|
102
|
-
else
|
103
|
-
new_key = [key, k].flatten
|
104
|
-
end
|
105
|
-
memo[new_key] = v
|
106
|
-
end
|
107
|
-
memo.goldmine = true
|
108
|
-
memo
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
# Assigns a key/value pair to the Hash.
|
113
|
-
# @param [String] name The name of a pivot (can be null).
|
114
|
-
# @param [Object] key The key to use.
|
115
|
-
# @param [Object] value The value to assign
|
116
|
-
# @return [Object] The result of the assignment.
|
117
|
-
def assign_mined(name, key, value)
|
118
|
-
goldmine_key = goldmine_key(name, key)
|
119
|
-
self[goldmine_key] ||= []
|
120
|
-
self[goldmine_key] << value
|
121
|
-
end
|
122
|
-
|
123
|
-
# Creates a key for a pivot-name/key combo.
|
124
|
-
# @param [String] name The name of a pivot (can be null).
|
125
|
-
# @param [Object] key The key to use.
|
126
|
-
# @return [Object] The constructed key.
|
127
|
-
def goldmine_key(name, key)
|
128
|
-
goldmine_key = { name => key } if name
|
129
|
-
goldmine_key ||= key
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|
133
|
-
end
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "goldmine")
|
2
|
+
require "array_miner"
|
3
|
+
require "hash_miner"
|
134
4
|
|
135
5
|
::Array.send(:include, Goldmine::ArrayMiner)
|
136
6
|
::Hash.send(:include, Goldmine::HashMiner)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Goldmine
|
2
|
+
|
3
|
+
# Extends Array with a pivot method.
|
4
|
+
module ArrayMiner
|
5
|
+
|
6
|
+
# Pivots the Array into a Hash of mined data.
|
7
|
+
# Think of it as creating a pivot table or perhaps an OLAP cube.
|
8
|
+
#
|
9
|
+
# @example Simple pivot
|
10
|
+
# list = [1,2,3,4,5,6,7,8,9]
|
11
|
+
# data = list.pivot { |i| i < 5 }
|
12
|
+
#
|
13
|
+
# # resulting data
|
14
|
+
# # {
|
15
|
+
# # true => [1, 2, 3, 4],
|
16
|
+
# # false => [5, 6, 7, 8, 9]
|
17
|
+
# # }
|
18
|
+
#
|
19
|
+
# @example Named pivot
|
20
|
+
# list = [1,2,3,4,5,6,7,8,9]
|
21
|
+
# data = list.pivot("less than 5") { |i| i < 5 }
|
22
|
+
#
|
23
|
+
# # resulting data
|
24
|
+
# # {
|
25
|
+
# # { "less than 5" => true } => [1, 2, 3, 4],
|
26
|
+
# # { "less than 5" => false } => [5, 6, 7, 8, 9]
|
27
|
+
# # }
|
28
|
+
#
|
29
|
+
# @example Chained pivot
|
30
|
+
# list = [1,2,3,4,5,6,7,8,9]
|
31
|
+
# data = list.pivot { |i| i < 5 }.pivot { |i| i % 2 == 0 }
|
32
|
+
#
|
33
|
+
# # resulting data
|
34
|
+
# {
|
35
|
+
# [true, false] => [1, 3],
|
36
|
+
# [true, true] => [2, 4],
|
37
|
+
# [false, false] => [5, 7, 9],
|
38
|
+
# [false, true] => [6, 8]
|
39
|
+
# }
|
40
|
+
#
|
41
|
+
# @param [String] name The named of the pivot.
|
42
|
+
# @yield [Object] Yields once for each item in the Array
|
43
|
+
# @return [Hash] The pivoted Hash of data.
|
44
|
+
def pivot(name=nil, &block)
|
45
|
+
reduce({}) do |memo, item|
|
46
|
+
value = yield(item)
|
47
|
+
|
48
|
+
if value.is_a?(Array)
|
49
|
+
if value.empty?
|
50
|
+
memo.assign_mined(name, nil, item)
|
51
|
+
else
|
52
|
+
value.each { |v| memo.assign_mined(name, v, item) }
|
53
|
+
end
|
54
|
+
else
|
55
|
+
memo.assign_mined(name, value, item)
|
56
|
+
end
|
57
|
+
|
58
|
+
memo.goldmine = true
|
59
|
+
memo
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Goldmine
|
2
|
+
|
3
|
+
# Extends Hash with a pivot method.
|
4
|
+
module HashMiner
|
5
|
+
|
6
|
+
attr_accessor :goldmine
|
7
|
+
|
8
|
+
# Further pivots the Hash into mined data.
|
9
|
+
# This method is what enables the pivot method chaining.
|
10
|
+
#
|
11
|
+
# @example Chained pivot
|
12
|
+
# list = [1,2,3,4,5,6,7,8,9]
|
13
|
+
# data = list.pivot { |i| i < 5 }.pivot { |i| i % 2 == 0 }
|
14
|
+
#
|
15
|
+
# # resulting data
|
16
|
+
# {
|
17
|
+
# [true, false] => [1, 3],
|
18
|
+
# [true, true] => [2, 4],
|
19
|
+
# [false, false] => [5, 7, 9],
|
20
|
+
# [false, true] => [6, 8]
|
21
|
+
# }
|
22
|
+
#
|
23
|
+
# @note This method should not be called directly. Call Array#pivot instead.
|
24
|
+
#
|
25
|
+
# @param [String] name The named of the pivot.
|
26
|
+
# @yield [Object] Yields once for each item in the Array
|
27
|
+
# @return [Hash] The pivoted Hash of data.
|
28
|
+
def pivot(name=nil, &block)
|
29
|
+
return self unless goldmine
|
30
|
+
|
31
|
+
reduce({}) do |memo, item|
|
32
|
+
key = item.first
|
33
|
+
value = item.last
|
34
|
+
value.pivot(name, &block).each do |k, v|
|
35
|
+
if key.is_a? Hash
|
36
|
+
k = { block.to_s => k } unless k.is_a?(Hash)
|
37
|
+
new_key = key.merge(k)
|
38
|
+
else
|
39
|
+
new_key = [key, k].flatten
|
40
|
+
end
|
41
|
+
memo[new_key] = v
|
42
|
+
end
|
43
|
+
memo.goldmine = true
|
44
|
+
memo
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Assigns a key/value pair to the Hash.
|
49
|
+
# @param [String] name The name of a pivot (can be null).
|
50
|
+
# @param [Object] key The key to use.
|
51
|
+
# @param [Object] value The value to assign
|
52
|
+
# @return [Object] The result of the assignment.
|
53
|
+
def assign_mined(name, key, value)
|
54
|
+
goldmine_key = goldmine_key(name, key)
|
55
|
+
self[goldmine_key] ||= []
|
56
|
+
self[goldmine_key] << value
|
57
|
+
end
|
58
|
+
|
59
|
+
# Creates a key for a pivot-name/key combo.
|
60
|
+
# @param [String] name The name of a pivot (can be null).
|
61
|
+
# @param [Object] key The key to use.
|
62
|
+
# @return [Object] The constructed key.
|
63
|
+
def goldmine_key(name, key)
|
64
|
+
goldmine_key = { name => key } if name
|
65
|
+
goldmine_key ||= key
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goldmine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,25 +9,105 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
date: 2013-04-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: minitest
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: simplecov
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: turn
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: pry
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
description: Pivot tables for the Rubyist.
|
18
95
|
email:
|
19
96
|
- natehop@gmail.com
|
20
97
|
executables: []
|
21
98
|
extensions: []
|
22
99
|
extra_rdoc_files: []
|
23
100
|
files:
|
101
|
+
- lib/goldmine/array_miner.rb
|
102
|
+
- lib/goldmine/hash_miner.rb
|
103
|
+
- lib/goldmine/version.rb
|
24
104
|
- lib/goldmine.rb
|
25
105
|
- Gemfile
|
26
106
|
- Gemfile.lock
|
27
107
|
- Rakefile
|
28
108
|
- README.md
|
29
109
|
- test/test_goldmine.rb
|
30
|
-
homepage:
|
110
|
+
homepage: https://github.com/hopsoft/goldmine
|
31
111
|
licenses:
|
32
112
|
- MIT
|
33
113
|
post_install_message:
|
@@ -48,8 +128,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
128
|
version: '0'
|
49
129
|
requirements: []
|
50
130
|
rubyforge_project:
|
51
|
-
rubygems_version: 1.8.
|
131
|
+
rubygems_version: 1.8.23
|
52
132
|
signing_key:
|
53
133
|
specification_version: 3
|
54
|
-
summary: Pivot tables for the Rubyist
|
55
|
-
test_files:
|
134
|
+
summary: Pivot tables for the Rubyist.
|
135
|
+
test_files:
|
136
|
+
- test/test_goldmine.rb
|
137
|
+
has_rdoc:
|