ruport 1.6.3 → 1.8.0

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.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +11 -0
  3. data/CHANGELOG.md +38 -0
  4. data/HACKING +1 -17
  5. data/README.md +97 -0
  6. data/Rakefile +9 -50
  7. data/examples/add_row_table.rb +46 -0
  8. data/examples/data/wine.csv +255 -0
  9. data/examples/pdf_grouping.rb +39 -0
  10. data/examples/pdf_table.rb +28 -0
  11. data/examples/pdf_table_from_csv.rb +26 -0
  12. data/examples/pdf_table_prawn.rb +30 -0
  13. data/examples/pdf_table_simple.rb +13 -0
  14. data/examples/row_renderer.rb +1 -1
  15. data/examples/simple_pdf_lines.rb +1 -1
  16. data/examples/trac_ticket_status.rb +1 -1
  17. data/lib/ruport/controller.rb +17 -21
  18. data/lib/ruport/data/feeder.rb +2 -2
  19. data/lib/ruport/data/grouping.rb +8 -8
  20. data/lib/ruport/data/record.rb +4 -4
  21. data/lib/ruport/data/table.rb +318 -206
  22. data/lib/ruport/formatter/csv.rb +6 -7
  23. data/lib/ruport/formatter/html.rb +13 -11
  24. data/lib/ruport/formatter/markdown.rb +105 -0
  25. data/lib/ruport/formatter/prawn_pdf.rb +159 -0
  26. data/lib/ruport/formatter/template.rb +1 -1
  27. data/lib/ruport/formatter/text.rb +1 -1
  28. data/lib/ruport/formatter.rb +54 -54
  29. data/lib/ruport/version.rb +1 -1
  30. data/lib/ruport.rb +7 -23
  31. data/test/controller_test.rb +201 -225
  32. data/test/csv_formatter_test.rb +36 -36
  33. data/test/data_feeder_test.rb +64 -64
  34. data/test/expected_outputs/prawn_pdf_formatter/pdf_basic.pdf.test +265 -0
  35. data/test/grouping_test.rb +103 -102
  36. data/test/helpers.rb +29 -10
  37. data/test/html_formatter_test.rb +46 -46
  38. data/test/markdown_formatter_test.rb +142 -0
  39. data/test/prawn_pdf_formatter_test.rb +108 -0
  40. data/test/record_test.rb +91 -91
  41. data/test/samples/sales.csv +21 -0
  42. data/test/table_pivot_test.rb +77 -26
  43. data/test/table_test.rb +376 -354
  44. data/test/template_test.rb +13 -13
  45. data/test/text_formatter_test.rb +52 -52
  46. data/util/bench/data/table/bench_column_manip.rb +0 -1
  47. data/util/bench/data/table/bench_dup.rb +0 -1
  48. data/util/bench/data/table/bench_init.rb +1 -2
  49. data/util/bench/data/table/bench_manip.rb +0 -1
  50. data/util/bench/formatter/bench_csv.rb +0 -1
  51. data/util/bench/formatter/bench_html.rb +0 -1
  52. data/util/bench/formatter/bench_pdf.rb +0 -1
  53. data/util/bench/formatter/bench_text.rb +0 -1
  54. metadata +131 -82
  55. data/README +0 -114
  56. data/lib/ruport/formatter/pdf.rb +0 -591
  57. data/test/pdf_formatter_test.rb +0 -354
@@ -0,0 +1,30 @@
1
+ $: << File.join(File.dirname(__FILE__), '..', 'lib')
2
+
3
+ require "ruport"
4
+
5
+ table = Ruport::Data::Table.new(
6
+ :column_names => %w(Make Model Year Class),
7
+ :data => [
8
+ %w(Nissan Skyline 1989 B),
9
+ %w(Mercedes-Benz 500SL 2005 A),
10
+ %w(Kia Sinatra 2008 C)
11
+ ])
12
+
13
+ pdf_options = { :pdf_format => {
14
+ :page_layout => :portrait,
15
+ :page_size => "LETTER",
16
+ },
17
+ :table_format => {
18
+ :cell_style => { :size => 8},
19
+ :row_colors => ["FFFFFF","F0F0F0"],
20
+ :column_widths => {
21
+ 0 => 100,
22
+ 1 => 100,
23
+ 2 => 50,
24
+ 3 => 40
25
+ }
26
+ },
27
+ :file => 'pdf_table_prawn.pdf'
28
+ }
29
+
30
+ table.to_prawn_pdf(pdf_options)
@@ -0,0 +1,13 @@
1
+ $: << File.join(File.dirname(__FILE__), '..', 'lib')
2
+ require "ruport"
3
+
4
+ # Quick and simple example using prawn 0.9.0 with to_prawn_pdf.
5
+ table = Ruport::Data::Table.new(
6
+ :column_names => %w(Make Model Year),
7
+ :data => [
8
+ %w(Nissan Skyline 1989),
9
+ %w(Mercedes-Benz 500SL 2005),
10
+ %w(Kia Sinatra 2008)
11
+ ])
12
+
13
+ table.to_prawn_pdf(:file => 'pdf_table_simple.pdf')
@@ -6,7 +6,7 @@ class CSV2Something < Ruport::Controller
6
6
 
7
7
  module Helpers
8
8
  def table_feeder
9
- Table(options.csv_file,:has_names => false) { |t,r| yield(r) }
9
+ Table(options.csv_file,:has_names => false) { |_t,r| yield(r) }
10
10
  end
11
11
  end
12
12
 
@@ -18,7 +18,7 @@ class PDFLines < Ruport::Formatter::PDF
18
18
  end
19
19
 
20
20
  # generate 35 random lines
21
- data = (0..34).inject([]) { |s,r|
21
+ data = (0..34).inject([]) { |s,_r|
22
22
  s << [rand(100),100+rand(400)]
23
23
  }
24
24
 
@@ -41,7 +41,7 @@ class TracSummaryReport
41
41
  Grouping(table,:by => :date)
42
42
  end
43
43
 
44
- def renderable_data(format)
44
+ def renderable_data(_format)
45
45
  summary = feed_data.summary :date,
46
46
  :opened => lambda { |g| g.sigma { |r| r.opened } },
47
47
  :closed => lambda { |g| g.sigma { |r| r.closed } },
@@ -165,19 +165,15 @@ class Ruport::Controller
165
165
  # Example:
166
166
  #
167
167
  # table.as(:csv, :show_table_headers => false)
168
- def as(format,options={})
168
+ def as(format, options = {})
169
169
  raise ControllerNotSetError unless self.class.controller
170
- unless self.class.controller.formats.include?(format)
171
- raise UnknownFormatError
170
+ raise UnknownFormatError unless self.class.controller.formats.include?(format)
171
+ self.class.controller.render(format, self.class.rendering_options.merge(options)) do |rend|
172
+ rend.data = respond_to?(:renderable_data) ? renderable_data(format) : self
173
+ yield(rend) if block_given?
172
174
  end
173
- self.class.controller.render(format,
174
- self.class.rendering_options.merge(options)) do |rend|
175
- rend.data =
176
- respond_to?(:renderable_data) ? renderable_data(format) : self
177
- yield(rend) if block_given?
178
- end
179
- end
180
-
175
+ end
176
+
181
177
  def save_as(file,options={})
182
178
  file =~ /.*\.(.*)/
183
179
  format = $1
@@ -220,7 +216,8 @@ class Ruport::Controller
220
216
  def built_in_formats
221
217
  { :html => Ruport::Formatter::HTML,
222
218
  :csv => Ruport::Formatter::CSV,
223
- :pdf => Ruport::Formatter::PDF,
219
+ :pdf => Ruport::Formatter::PrawnPDF,
220
+ :prawn_pdf => Ruport::Formatter::PrawnPDF,
224
221
  :text => Ruport::Formatter::Text }
225
222
  end
226
223
 
@@ -389,16 +386,16 @@ class Ruport::Controller
389
386
  # # other details omitted
390
387
  # end
391
388
  def required_option(*opts)
392
- self.required_options ||= []
393
- opts.each do |opt|
394
- self.required_options << opt
389
+ (self.required_options ||= []).concat(opts)
395
390
 
396
- o = opt
397
- unless instance_methods(false).include?(o.to_s)
398
- define_method(o) { options.send(o.to_s) }
391
+ opts.each do |opt|
392
+ unless method_defined?(opt)
393
+ define_method(opt) { options.send(opt) }
394
+ end
395
+ setter = "#{opt}="
396
+ unless method_defined?(setter)
397
+ define_method(setter) {|t| options.send(setter, t) }
399
398
  end
400
- opt = "#{opt}="
401
- define_method(opt) {|t| options.send(opt, t) }
402
399
  end
403
400
  end
404
401
 
@@ -573,7 +570,6 @@ class Ruport::Controller
573
570
  else
574
571
  execute_stages
575
572
  end
576
-
577
573
  finalize self.class.final_stage if self.class.final_stage
578
574
  maybe :finalize
579
575
  end
@@ -14,7 +14,7 @@
14
14
  #
15
15
  # Table Example:
16
16
  #
17
- # t = Table(%w[a b c]) do |feeder|
17
+ # t = Ruport::Data::Table(%w[a b c]) do |feeder|
18
18
  # feeder.filter { |r| r.a < 5 }
19
19
  # feeder.transform { |r| r.b = "B: #{r.b}"}
20
20
  # feeder << [1,2,3]
@@ -108,4 +108,4 @@ class Ruport::Data::Feeder
108
108
  @constraints << [:transform,block]
109
109
  end
110
110
 
111
- end
111
+ end
@@ -99,7 +99,7 @@ module Ruport::Data
99
99
  if @subgroups.empty?
100
100
  @subgroups = grouped_data(group_column)
101
101
  else
102
- @subgroups.each {|name,group|
102
+ @subgroups.each {|_name,group|
103
103
  group.send(:create_subgroups, group_column)
104
104
  }
105
105
  end
@@ -172,7 +172,7 @@ module Ruport::Data
172
172
  cols = Array(options[:by]).dup
173
173
  @data = data.to_group.send(:grouped_data, cols.shift)
174
174
  cols.each do |col|
175
- @data.each do |name,group|
175
+ @data.each do |_name,group|
176
176
  group.send(:create_subgroups, col)
177
177
  end
178
178
  end
@@ -200,9 +200,9 @@ module Ruport::Data
200
200
  #
201
201
  def each
202
202
  if @order.respond_to?(:call)
203
- @data.sort_by { |n,g| @order[g] }.each { |n,g| yield(n,g) }
203
+ @data.sort_by { |_n,g| @order[g] }.each { |n,g| yield(n,g) }
204
204
  elsif @order == :name
205
- @data.sort_by { |n,g| n }.each { |name,group| yield(name,group) }
205
+ @data.sort_by { |n,_g| n }.each { |name,group| yield(name,group) }
206
206
  else
207
207
  @data.each { |name,group| yield(name,group) }
208
208
  end
@@ -216,7 +216,7 @@ module Ruport::Data
216
216
  # by_size = grouping.sort_grouping_by { |g| g.size }
217
217
  def sort_grouping_by(type=nil,&block)
218
218
  a = Grouping.new(:by => @grouped_by, :order => type || block)
219
- each { |n,g| a << g }
219
+ each { |_n,g| a << g }
220
220
  return a
221
221
  end
222
222
 
@@ -285,7 +285,7 @@ module Ruport::Data
285
285
  else
286
286
  cols = procs.keys + [field]
287
287
  end
288
- expected = Table(cols) { |t|
288
+ Table.new(:column_names => cols) { |t|
289
289
  each do |name,group|
290
290
  t << procs.inject({field => name}) do |s,r|
291
291
  s.merge(r[0] => r[1].call(group))
@@ -327,7 +327,7 @@ module Ruport::Data
327
327
  # grouping.sigma { |r| r.col2 + 1 } #=> 15
328
328
  #
329
329
  def sigma(column=nil)
330
- inject(0) do |s, (group_name, group)|
330
+ inject(0) do |s, (_group_name, group)|
331
331
  if column
332
332
  s + group.sigma(column)
333
333
  else
@@ -379,7 +379,7 @@ module Kernel
379
379
  #
380
380
  # Example:
381
381
  #
382
- # a = Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
382
+ # a = Ruport::Data::Table.new(%w[a b c], :data => [[1,2,3],[4,5,6]])
383
383
  # b = Grouping(a, :by => "a") #=> creates a new grouping on column "a"
384
384
  #
385
385
  def Grouping(*args)
@@ -55,10 +55,10 @@ module Ruport::Data
55
55
  case(data)
56
56
  when Array
57
57
  @attributes = options[:attributes] || (0...data.length).to_a
58
- @data = @attributes.inject({}) { |h,a| h.merge(a => data.shift) }
58
+ @data = @attributes.each_with_object({}) { |a, h| h[a.freeze] = data.shift }
59
59
  when Hash
60
- @data = data.dup
61
- @attributes = options[:attributes] || data.keys
60
+ @data = data
61
+ @attributes = options[:attributes] || @data.keys
62
62
  end
63
63
  end
64
64
 
@@ -140,7 +140,7 @@ module Ruport::Data
140
140
  case name
141
141
  when String,Symbol
142
142
  self[name] || send(name)
143
- when Fixnum
143
+ when Integer
144
144
  self[name]
145
145
  else
146
146
  raise ArgumentError, "Whatchu Talkin' Bout, Willis?"