ruby_reportable 0.3.1 → 0.4.0

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: 0ce6c1156d97b85a115a1da80e42bfcc8e42b412
4
- data.tar.gz: 7585d34ffae9d66e8b1e929ee2ddb4b635acaf7b
3
+ metadata.gz: 105e1e74042eaae1eaa26a163b12e78fd79212fe
4
+ data.tar.gz: 3f617be2415d29d5d1df070a87acf616faa06548
5
5
  SHA512:
6
- metadata.gz: f20eab08a891aba3b2239e607639dbe60eb5cb2acbc82099a06d01c35d51c3b132852781d072ba03f2e3a9127557668fa305a4a8926a73aa7a2581c36a7e29f5
7
- data.tar.gz: 147774a281b825ce2a0713b1a18bbbdb2e0104aefcd45fa67c1a0af682d78e7f4eb92ccbf8a245807b0cceaaba6faf6209e09fcb372d45642ff20760d5475acb
6
+ metadata.gz: 99b6e66e7c4b6bb142c24abc7218d28b7668c8f927d0a03d736f57abe6d0dc9867eff501a45c9fa66d2111c6ce90c2d4f4ca0e35750601bf2683cf53254611e6
7
+ data.tar.gz: 371b88318c0cd2d1d2ba3922ef2beb03178a6a0a6684bf262ed9cc8e95dc0cdc5e5a06dc193ff443bda10767d79ad80d62e49a26039714d80117078dc52a53ce
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby_reportable (0.3.0)
4
+ ruby_reportable (0.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -2,7 +2,7 @@ require 'benchmark'
2
2
 
3
3
  module RubyReportable
4
4
  module Report
5
- attr_accessor :data_source, :filters
5
+ attr_accessor :data_source, :filters, :records_returned
6
6
 
7
7
  def clear
8
8
  @outputs = []
@@ -12,6 +12,7 @@ module RubyReportable
12
12
  @category = 'Reports'
13
13
  @meta = {}
14
14
  @benchmarks = {}
15
+ @records_returned = 0
15
16
  end
16
17
 
17
18
  # :sandbox, :filters, :finalize, :output, :group, :sort
@@ -137,12 +138,12 @@ module RubyReportable
137
138
  # build sandbox for building outputs
138
139
  sandbox = RubyReportable::Sandbox.new(:meta => @meta, @data_source[:as] => nil)
139
140
 
140
- source_data.inject({:results => []}) do |rows, element|
141
+ source_data.inject([]) do |rows, element|
141
142
  # fill sandbox with data element
142
143
  sandbox[@data_source[:as]] = element
143
144
 
144
145
  # grab outputs
145
- rows[:results] << @outputs.inject({}) do |row, output|
146
+ rows << @outputs.inject({}) do |row, output|
146
147
  row[output.name] = sandbox.instance_eval(&output.logic)
147
148
  row
148
149
  end
@@ -151,27 +152,51 @@ module RubyReportable
151
152
  end
152
153
  end
153
154
 
154
- def _group(group, data, options = {})
155
- unless group.to_s.empty?
156
- data[:results].inject({}) do |hash, element|
157
- key = element[group]
158
- hash[key] ||= []
159
- hash[key] << element
160
- hash
161
- end
162
- else
155
+ def _sort(sort, data, options = {})
156
+ if sort.to_s.empty?
163
157
  data
158
+ else
159
+ data.sort_by {|element| element[sort]}
164
160
  end
165
161
  end
166
162
 
167
- def _sort(sort, data, options = {})
168
- unless sort.to_s.empty?
169
- data.inject(Hash.new([])) do |hash, (group, elements)|
170
- hash[group] = elements.sort_by {|element| element[sort]}
163
+ def _group(group, data, options = {})
164
+ # Run through elements in data which are ordered
165
+ # from the previous call to #_sort via #run
166
+ #
167
+ # Since the elements are already sorted, as we pop
168
+ # them into their grouping they will remain sorted as
169
+ # intended
170
+ #
171
+ if group.to_s.empty?
172
+ {:results => data}
173
+ else
174
+ group = [group] unless group.is_a?(Array)
175
+ group.map!(&:to_s)
176
+
177
+ # the last group critieria should contain an array
178
+ # so lets pop it off for special use
179
+ last_group = group.pop
180
+
181
+ data.inject({}) do |hash, element|
182
+ # grab a local reference to the hash
183
+ ref = hash
184
+
185
+ # run through initial groupings to grab local ref
186
+ # and default them to {}
187
+ group.map do |grouping|
188
+ key = element[grouping]
189
+ ref[key] ||= {}
190
+ ref = ref[key]
191
+ end
192
+
193
+ # handle our last grouping
194
+ key = element[last_group]
195
+ ref[key] ||= []
196
+ ref[key] << element
197
+
171
198
  hash
172
199
  end
173
- else
174
- data
175
200
  end
176
201
  end
177
202
 
@@ -198,14 +223,18 @@ module RubyReportable
198
223
  _output(source_data, options)
199
224
  end
200
225
 
201
- # transform into {group => [outputs => values]}
202
- grouped = benchmark(:group) do
203
- _group(options[:group], data, options)
226
+ # now that we have all of our data go ahead and cache the size
227
+ records_returned = data.size
228
+
229
+ # sort the data first cause that makes sense you know
230
+ sorted = benchmark(:sort) do
231
+ _sort(options[:sort], data, options)
204
232
  end
205
233
 
206
- # sort grouped data
207
- benchmark(:sort) do
208
- _sort(options[:sort], grouped, options)
234
+ # transform into {group => {group => [outputs => values]}}
235
+ # level of grouping depends on how many groups are passed in
236
+ benchmark(:group) do
237
+ _group(options[:group], sorted, options)
209
238
  end
210
239
  end # end def run
211
240
 
@@ -1,3 +1,3 @@
1
1
  module RubyReportable
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
data/spec/report_spec.rb CHANGED
@@ -135,6 +135,61 @@ describe RubyReportable::Report do
135
135
 
136
136
  @report._group('letter', @report._output(source_data)).should == {"m" => [{'name' => :method, 'letter' => 'm'}]}
137
137
  end
138
+
139
+ it "should handle multiple groupings" do
140
+
141
+ raw = []
142
+ raw[0] = ['test1', 29201, 'road']
143
+ raw[1] = ['test2', 29201, 'road']
144
+ raw[2] = ['test3', 29201, 'drive']
145
+ raw[3] = ['test4', 29204, 'road']
146
+
147
+ output = []
148
+ [0, 1, 2, 3].map do |index|
149
+ output[index] = {
150
+ 'name' => raw[index][0],
151
+ 'zip' => raw[index][1],
152
+ 'path' => raw[index][2]
153
+ }
154
+ end
155
+
156
+ result = {
157
+ 29201 => {
158
+ 'road' => [output[0], output[1]],
159
+ 'drive' => [output[2]]
160
+ },
161
+ 29204 => {
162
+ 'road' => [output[3]]
163
+ }
164
+ }
165
+
166
+ @report.source do
167
+ logic do
168
+ [
169
+ raw[0],
170
+ raw[1],
171
+ raw[2],
172
+ raw[3]
173
+ ]
174
+ end
175
+ end
176
+
177
+ @report.output('name') do
178
+ element[0]
179
+ end
180
+
181
+ @report.output('zip') do
182
+ element[1]
183
+ end
184
+
185
+ @report.output('path') do
186
+ element[2]
187
+ end
188
+
189
+ source_data = @report._data(@report._source).source
190
+
191
+ @report._group(['zip', 'path'], @report._output(source_data)).should == result
192
+ end
138
193
  end
139
194
 
140
195
  context "#_sort" do
@@ -152,7 +207,7 @@ describe RubyReportable::Report do
152
207
  source_data = @report._data(@report._source).source
153
208
  final = @report._sort('name', @report._output(source_data))
154
209
 
155
- final.should == {:results => Object.methods.sort.map {|method| {'name' => method}}}
210
+ final.should == Object.methods.sort.map {|method| {'name' => method}}
156
211
  end
157
212
  end
158
213
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_reportable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John 'asceth' Long
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-03 00:00:00.000000000 Z
11
+ date: 2013-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec