ruport 0.8.14 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/README +42 -107
  2. data/Rakefile +29 -32
  3. data/examples/centered_pdf_text_box.rb +13 -19
  4. data/examples/example.csv +3 -0
  5. data/examples/line_plotter.rb +15 -15
  6. data/examples/pdf_complex_report.rb +10 -23
  7. data/examples/pdf_table_with_title.rb +12 -12
  8. data/examples/rope_examples/itunes/Rakefile +22 -1
  9. data/examples/rope_examples/itunes/config/environment.rb +4 -0
  10. data/examples/rope_examples/itunes/lib/init.rb +32 -2
  11. data/examples/rope_examples/itunes/util/build +50 -16
  12. data/examples/rope_examples/sales_report/README +1 -1
  13. data/examples/rope_examples/sales_report/Rakefile +22 -1
  14. data/examples/rope_examples/sales_report/config/environment.rb +4 -0
  15. data/examples/rope_examples/sales_report/lib/init.rb +32 -2
  16. data/examples/rope_examples/sales_report/lib/reports/sales.rb +10 -16
  17. data/examples/rope_examples/sales_report/util/build +50 -16
  18. data/examples/row_renderer.rb +39 -0
  19. data/examples/ruport_list/png_embed.rb +61 -0
  20. data/examples/ruport_list/roadmap.png +0 -0
  21. data/examples/sample.rb +16 -0
  22. data/examples/simple_pdf_lines.rb +24 -0
  23. data/lib/ruport.rb +143 -57
  24. data/lib/ruport/acts_as_reportable.rb +246 -0
  25. data/lib/ruport/data.rb +1 -2
  26. data/lib/ruport/data/grouping.rb +311 -0
  27. data/lib/ruport/data/record.rb +113 -84
  28. data/lib/ruport/data/table.rb +275 -174
  29. data/lib/ruport/formatter.rb +149 -0
  30. data/lib/ruport/formatter/csv.rb +87 -0
  31. data/lib/ruport/formatter/html.rb +89 -0
  32. data/lib/ruport/formatter/pdf.rb +357 -0
  33. data/lib/ruport/formatter/text.rb +151 -0
  34. data/lib/ruport/generator.rb +127 -30
  35. data/lib/ruport/query.rb +46 -99
  36. data/lib/ruport/renderer.rb +238 -194
  37. data/lib/ruport/renderer/grouping.rb +67 -0
  38. data/lib/ruport/renderer/table.rb +25 -98
  39. data/lib/ruport/report.rb +45 -96
  40. data/test/acts_as_reportable_test.rb +229 -0
  41. data/test/csv_formatter_test.rb +97 -0
  42. data/test/{_test_database.rb → database_test_.rb} +0 -0
  43. data/test/grouping_test.rb +305 -0
  44. data/test/html_formatter_test.rb +104 -0
  45. data/test/pdf_formatter_test.rb +25 -0
  46. data/test/{test_query.rb → query_test.rb} +32 -121
  47. data/test/{test_record.rb → record_test.rb} +40 -23
  48. data/test/renderer_test.rb +344 -0
  49. data/test/{test_report.rb → report_test.rb} +74 -44
  50. data/test/samples/ticket_count.csv +124 -0
  51. data/test/{test_sql_split.rb → sql_split_test.rb} +0 -0
  52. data/test/{test_table.rb → table_test.rb} +255 -44
  53. data/test/text_formatter_test.rb +144 -0
  54. data/util/bench/data/record/bench_as_vs_to.rb +17 -0
  55. data/util/bench/data/record/bench_constructor.rb +46 -0
  56. data/util/bench/data/record/bench_indexing.rb +65 -0
  57. data/util/bench/data/record/bench_reorder.rb +35 -0
  58. data/util/bench/data/record/bench_to_a.rb +19 -0
  59. data/util/bench/data/table/bench_column_manip.rb +103 -0
  60. data/util/bench/data/table/bench_dup.rb +24 -0
  61. data/util/bench/data/table/bench_init.rb +67 -0
  62. data/util/bench/data/table/bench_manip.rb +125 -0
  63. data/util/bench/formatter/bench_csv.rb +14 -0
  64. data/util/bench/formatter/bench_html.rb +14 -0
  65. data/util/bench/formatter/bench_pdf.rb +14 -0
  66. data/util/bench/formatter/bench_text.rb +14 -0
  67. data/util/bench/samples/tattle.csv +1237 -0
  68. metadata +121 -143
  69. data/TODO +0 -21
  70. data/examples/invoice.rb +0 -142
  71. data/examples/invoice_report.rb +0 -29
  72. data/examples/line_graph.rb +0 -38
  73. data/examples/rope_examples/itunes/config/ruport_config.rb +0 -8
  74. data/examples/rope_examples/sales_report/config/ruport_config.rb +0 -8
  75. data/lib/ruport/attempt.rb +0 -63
  76. data/lib/ruport/config.rb +0 -204
  77. data/lib/ruport/data/groupable.rb +0 -93
  78. data/lib/ruport/data/taggable.rb +0 -80
  79. data/lib/ruport/format.rb +0 -1
  80. data/lib/ruport/format/csv.rb +0 -29
  81. data/lib/ruport/format/html.rb +0 -42
  82. data/lib/ruport/format/latex.rb +0 -47
  83. data/lib/ruport/format/pdf.rb +0 -233
  84. data/lib/ruport/format/plugin.rb +0 -31
  85. data/lib/ruport/format/svg.rb +0 -60
  86. data/lib/ruport/format/text.rb +0 -103
  87. data/lib/ruport/format/xml.rb +0 -32
  88. data/lib/ruport/layout.rb +0 -1
  89. data/lib/ruport/layout/component.rb +0 -7
  90. data/lib/ruport/mailer.rb +0 -99
  91. data/lib/ruport/renderer/graph.rb +0 -46
  92. data/lib/ruport/report/graph.rb +0 -14
  93. data/lib/ruport/system_extensions.rb +0 -71
  94. data/test/test_config.rb +0 -88
  95. data/test/test_format_text.rb +0 -63
  96. data/test/test_graph_renderer.rb +0 -97
  97. data/test/test_groupable.rb +0 -56
  98. data/test/test_mailer.rb +0 -170
  99. data/test/test_renderer.rb +0 -151
  100. data/test/test_ruport.rb +0 -58
  101. data/test/test_table_renderer.rb +0 -141
  102. data/test/test_taggable.rb +0 -52
@@ -1,28 +1,28 @@
1
1
  require "ruport"
2
2
 
3
- class TitledPDFTable < Ruport::Format::PDF
3
+ class TitledPDFTable < Ruport::Formatter::PDF
4
4
 
5
- Ruport::Renderer::Table.add_format self, :titled_pdf
5
+ renders :titled_pdf, :for => Ruport::Renderer::Table
6
6
 
7
7
  def add_title( title )
8
8
  rounded_text_box("<b>#{title}</b>") do |o|
9
9
  o.fill_color = Color::RGB::Gray80
10
10
  o.radius = 5
11
- o.width = layout.header_width || 200
12
- o.height = layout.header_height || 20
13
- o.font_size = layout.header_font_size || 12
11
+ o.width = options.header_width || 200
12
+ o.height = options.header_height || 20
13
+ o.font_size = options.header_font_size || 12
14
14
  o.x = pdf_writer.absolute_right_margin - o.width
15
15
  o.y = pdf_writer.absolute_top_margin
16
16
  end
17
17
  end
18
18
 
19
19
  def prepare_table
20
- layout.header_margin ||= 50
20
+ options.header_margin ||= 50
21
21
  end
22
22
 
23
23
  def build_table_header
24
24
  add_title options.title
25
- move_cursor -layout.header_margin
25
+ move_cursor -options.header_margin
26
26
  end
27
27
 
28
28
  end
@@ -31,11 +31,11 @@ end
31
31
  a = Ruport::Renderer::Table.render_titled_pdf { |r|
32
32
  r.options.title = "This is a sample header"
33
33
  r.data = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
34
- # NOTE: uncomment some options to play with layout
35
- r.layout do |la|
36
- # la.header_margin = 25
37
- # la.header_width = 250
38
- # la.header_height = 50
34
+ # NOTE: uncomment some options to play with options
35
+ r.options do |o|
36
+ # o.header_margin = 25
37
+ # o.header_width = 250
38
+ # o.header_height = 50
39
39
  end
40
40
  }
41
41
 
@@ -10,9 +10,30 @@ Rake::TestTask.new do |test|
10
10
  end
11
11
 
12
12
  task :build do
13
- sh "ruby util/build report #{ENV['report']}"
13
+ if ENV['report']
14
+ sh "ruby util/build report #{ENV['report']}"
15
+ elsif ENV['renderer']
16
+ sh "ruby util/build renderer #{ENV['renderer']}"
17
+ end
14
18
  end
15
19
 
16
20
  task :run do
17
21
  sh "ruby lib/reports/#{ENV['report']}.rb"
18
22
  end
23
+
24
+ task :use_utils do
25
+ raise "File lib/init_utils.rb exists!" if File.exist?('lib/init_utils.rb')
26
+ File.open('lib/init_utils.rb','w') { |f|
27
+ if ENV['only']
28
+ ENV['only'].split(',').each { |e|
29
+ f.puts "require 'ruport/util/#{e}'"
30
+ }
31
+ else
32
+ f.puts "require 'ruport/util'"
33
+ end
34
+ }
35
+ File.open('lib/init.rb','a') { |f|
36
+ f.puts '#comment out the line below to disable auto-loading of utils'
37
+ f.puts 'require "lib/init_utils.rb"'
38
+ }
39
+ end
@@ -0,0 +1,4 @@
1
+ require "ruport"
2
+
3
+ Ruport::Query.add_source :default, :user => "root",
4
+ :dsn => "dbi:mysql:mydb"
@@ -1,9 +1,39 @@
1
1
  begin
2
2
  require "rubygems"
3
- gem "ruport","=0.8.0"
3
+ gem "ruport","=0.9.6"
4
4
  rescue LoadError
5
5
  nil
6
6
  end
7
7
  require "ruport"
8
8
  require "lib/helpers"
9
- require "config/ruport_config"
9
+ require "config/environment"
10
+
11
+ class String
12
+ def /(other)
13
+ self + "/" + other
14
+ end
15
+ end
16
+
17
+ class Ruport::Report
18
+
19
+ def output_dir
20
+ config.output_dir or dir('output')
21
+ end
22
+
23
+ def data_dir
24
+ config.data_dir or dir('data')
25
+ end
26
+
27
+ def query_dir
28
+ config.query_dir or dir('sql')
29
+ end
30
+
31
+ def template_dir
32
+ config.template_dir or dir('templates')
33
+ end
34
+
35
+ private
36
+ def dir(name)
37
+ "/Users/mikem836/ruport/itunes/#{name}"
38
+ end
39
+ end
@@ -1,11 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'fileutils'
4
+ require 'lib/init.rb'
5
+ require "ruport/generator"
4
6
  include FileUtils
5
-
6
- def format_class_name(string)
7
- string.downcase.split("_").map { |s| s.capitalize }.join
8
- end
7
+ include Ruport::Generator::Helpers
9
8
 
10
9
  unless ARGV.length > 1
11
10
  puts "usage: build [command] [options]"
@@ -14,31 +13,23 @@ end
14
13
 
15
14
  class_name = format_class_name(ARGV[1])
16
15
 
17
- exit if File.exist? "lib/reports/#{ARGV[1]}.rb"
18
16
  if ARGV[0].eql? "report"
17
+ check_for_files
19
18
  File.open("lib/reports.rb", "a") { |f|
20
19
  f.puts("require \"lib/reports/#{ARGV[1]}\"")
21
20
  }
22
21
  REP = <<EOR
23
22
  require "lib/init"
24
23
  class #{class_name} < Ruport::Report
25
-
26
- def prepare
27
24
 
28
- end
29
-
30
25
  def generate
31
26
 
32
27
  end
33
-
34
- def cleanup
35
-
36
- end
37
-
28
+
38
29
  end
39
30
 
40
31
  if __FILE__ == $0
41
- #{class_name}.run { |res| puts res.results }
32
+ puts #{class_name}.run
42
33
  end
43
34
  EOR
44
35
 
@@ -52,11 +43,54 @@ class Test#{class_name} < Test::Unit::TestCase
52
43
  end
53
44
  end
54
45
  EOR
55
- puts "report file: lib/reports/#{ARGV[1]}.rb"
46
+
56
47
  File.open("lib/reports/#{ARGV[1]}.rb", "w") { |f| f << REP }
48
+ puts "reports file: lib/reports/#{ARGV[1]}.rb"
57
49
  puts "test file: test/test_#{ARGV[1]}.rb"
58
50
  puts "class name: #{class_name}"
59
51
  File.open("test/test_#{ARGV[1]}.rb","w") { |f| f << TEST }
52
+
53
+ elsif ARGV[0].eql? "renderer"
54
+
55
+ check_for_files
56
+ File.open("lib/renderers.rb","a") { |f|
57
+ f.puts("require \"lib/renderers/#{ARGV[1]}\"")
58
+ }
59
+ REP = <<EOR
60
+ require "lib/init"
61
+
62
+ class #{class_name} < Ruport::Renderer
63
+ stage :#{class_name.downcase}
64
+ end
65
+
66
+ class #{class_name}Formatter < Ruport::Formatter
67
+
68
+ # change to your format name, or add additional formats
69
+ renders :my_format, :for => #{class_name}
70
+
71
+ def build_#{class_name.downcase}
72
+
73
+ end
74
+
75
+ end
76
+ EOR
77
+
78
+ TEST = <<EOR
79
+ require "test/unit"
80
+ require "lib/renderers/#{ARGV[1]}"
81
+
82
+ class Test#{class_name} < Test::Unit::TestCase
83
+ def test_flunk
84
+ flunk "Write your real tests here or in any test/test_* file"
85
+ end
86
+ end
87
+ EOR
88
+ puts "renderer file: lib/renderers/#{ARGV[1]}.rb"
89
+ File.open("lib/renderers/#{ARGV[1]}.rb", "w") { |f| f << REP }
90
+ puts "test file: test/test_#{ARGV[1]}.rb"
91
+
92
+ puts "class name: #{class_name}"
93
+ File.open("test/test_#{ARGV[1]}.rb","w") { |f| f << TEST }
60
94
  else
61
95
  puts "Incorrect usage."
62
96
  end
@@ -1,4 +1,4 @@
1
1
  This example is based on the code in James Healy's excellent formatting system
2
- tutorial, but includes updated features from 0.8
2
+ tutorial, but includes updated features from 0.9
3
3
 
4
4
  http://www.yob.id.au/articles/ruport_formatting_system.html
@@ -10,9 +10,30 @@ Rake::TestTask.new do |test|
10
10
  end
11
11
 
12
12
  task :build do
13
- sh "ruby util/build report #{ENV['report']}"
13
+ if ENV['report']
14
+ sh "ruby util/build report #{ENV['report']}"
15
+ elsif ENV['renderer']
16
+ sh "ruby util/build renderer #{ENV['renderer']}"
17
+ end
14
18
  end
15
19
 
16
20
  task :run do
17
21
  sh "ruby lib/reports/#{ENV['report']}.rb"
18
22
  end
23
+
24
+ task :use_utils do
25
+ raise "File lib/init_utils.rb exists!" if File.exist?('lib/init_utils.rb')
26
+ File.open('lib/init_utils.rb','w') { |f|
27
+ if ENV['only']
28
+ ENV['only'].split(',').each { |e|
29
+ f.puts "require 'ruport/util/#{e}'"
30
+ }
31
+ else
32
+ f.puts "require 'ruport/util'"
33
+ end
34
+ }
35
+ File.open('lib/init.rb','a') { |f|
36
+ f.puts '#comment out the line below to disable auto-loading of utils'
37
+ f.puts 'require "lib/init_utils.rb"'
38
+ }
39
+ end
@@ -0,0 +1,4 @@
1
+ require "ruport"
2
+
3
+ Ruport::Query.add_source :default, :user => "root",
4
+ :dsn => "dbi:mysql:mydb"
@@ -1,9 +1,39 @@
1
1
  begin
2
2
  require "rubygems"
3
- gem "ruport","=0.8.0"
3
+ gem "ruport","=0.9.6"
4
4
  rescue LoadError
5
5
  nil
6
6
  end
7
7
  require "ruport"
8
8
  require "lib/helpers"
9
- require "config/ruport_config"
9
+ require "config/environment"
10
+
11
+ class String
12
+ def /(other)
13
+ self + "/" + other
14
+ end
15
+ end
16
+
17
+ class Ruport::Report
18
+
19
+ def output_dir
20
+ config.output_dir or dir('output')
21
+ end
22
+
23
+ def data_dir
24
+ config.data_dir or dir('data')
25
+ end
26
+
27
+ def query_dir
28
+ config.query_dir or dir('sql')
29
+ end
30
+
31
+ def template_dir
32
+ config.template_dir or dir('templates')
33
+ end
34
+
35
+ private
36
+ def dir(name)
37
+ "/Users/mikem836/sales_report/#{name}"
38
+ end
39
+ end
@@ -3,20 +3,16 @@ require "lib/init"
3
3
  module MyModule
4
4
  class SalesRenderer < Ruport::Renderer
5
5
 
6
- include Ruport::Renderer::Helpers
7
-
8
- required_option :report_title
6
+ option :report_title
9
7
  required_option :titles
10
8
 
11
- stage :document_header
12
- stage :document_body
9
+ stage :document_header, :document_body
13
10
 
14
11
  finalize :document
15
12
  end
16
13
 
17
- class Text < Ruport::Format::Plugin
18
-
19
- SalesRenderer.add_format self, :txt
14
+ class Text < Ruport::Formatter
15
+ renders :txt, :for => SalesRenderer
20
16
 
21
17
  def pad(str, len)
22
18
  return "".ljust(len) if str.nil?
@@ -50,20 +46,18 @@ module MyModule
50
46
  output << "".ljust(75,"#") << "\n"
51
47
  end
52
48
 
53
- def finalize_document; output end
54
-
55
49
  end
56
50
 
57
- class PDF < Ruport::Format::PDF
58
- SalesRenderer.add_format self, :pdf
51
+ class PDF < Ruport::Formatter::PDF
52
+ renders :pdf, :for => SalesRenderer
59
53
 
60
54
  def add_title( title )
61
55
  rounded_text_box("<b>#{title}</b>") do |o|
62
56
  o.fill_color = Color::RGB::Gray80
63
57
  o.radius = 5
64
- o.width = layout.header_width || 200
65
- o.height = layout.header_height || 20
66
- o.font_size = layout.header_font_size || 12
58
+ o.width = options.header_width || 200
59
+ o.height = options.header_height || 20
60
+ o.font_size = options.header_font_size || 12
67
61
  o.x = pdf_writer.absolute_right_margin - o.width
68
62
  o.y = pdf_writer.absolute_top_margin
69
63
  end
@@ -86,7 +80,7 @@ module MyModule
86
80
  end
87
81
 
88
82
  def finalize_document
89
- output << pdf_writer.render
83
+ render_pdf
90
84
  end
91
85
 
92
86
  end
@@ -1,11 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'fileutils'
4
+ require 'lib/init.rb'
5
+ require "ruport/generator"
4
6
  include FileUtils
5
-
6
- def format_class_name(string)
7
- string.downcase.split("_").map { |s| s.capitalize }.join
8
- end
7
+ include Ruport::Generator::Helpers
9
8
 
10
9
  unless ARGV.length > 1
11
10
  puts "usage: build [command] [options]"
@@ -14,31 +13,23 @@ end
14
13
 
15
14
  class_name = format_class_name(ARGV[1])
16
15
 
17
- exit if File.exist? "lib/reports/#{ARGV[1]}.rb"
18
16
  if ARGV[0].eql? "report"
17
+ check_for_files
19
18
  File.open("lib/reports.rb", "a") { |f|
20
19
  f.puts("require \"lib/reports/#{ARGV[1]}\"")
21
20
  }
22
21
  REP = <<EOR
23
22
  require "lib/init"
24
23
  class #{class_name} < Ruport::Report
25
-
26
- def prepare
27
24
 
28
- end
29
-
30
25
  def generate
31
26
 
32
27
  end
33
-
34
- def cleanup
35
-
36
- end
37
-
28
+
38
29
  end
39
30
 
40
31
  if __FILE__ == $0
41
- #{class_name}.run { |res| puts res.results }
32
+ puts #{class_name}.run
42
33
  end
43
34
  EOR
44
35
 
@@ -52,11 +43,54 @@ class Test#{class_name} < Test::Unit::TestCase
52
43
  end
53
44
  end
54
45
  EOR
55
- puts "report file: lib/reports/#{ARGV[1]}.rb"
46
+
56
47
  File.open("lib/reports/#{ARGV[1]}.rb", "w") { |f| f << REP }
48
+ puts "reports file: lib/reports/#{ARGV[1]}.rb"
57
49
  puts "test file: test/test_#{ARGV[1]}.rb"
58
50
  puts "class name: #{class_name}"
59
51
  File.open("test/test_#{ARGV[1]}.rb","w") { |f| f << TEST }
52
+
53
+ elsif ARGV[0].eql? "renderer"
54
+
55
+ check_for_files
56
+ File.open("lib/renderers.rb","a") { |f|
57
+ f.puts("require \"lib/renderers/#{ARGV[1]}\"")
58
+ }
59
+ REP = <<EOR
60
+ require "lib/init"
61
+
62
+ class #{class_name} < Ruport::Renderer
63
+ stage :#{class_name.downcase}
64
+ end
65
+
66
+ class #{class_name}Formatter < Ruport::Formatter
67
+
68
+ # change to your format name, or add additional formats
69
+ renders :my_format, :for => #{class_name}
70
+
71
+ def build_#{class_name.downcase}
72
+
73
+ end
74
+
75
+ end
76
+ EOR
77
+
78
+ TEST = <<EOR
79
+ require "test/unit"
80
+ require "lib/renderers/#{ARGV[1]}"
81
+
82
+ class Test#{class_name} < Test::Unit::TestCase
83
+ def test_flunk
84
+ flunk "Write your real tests here or in any test/test_* file"
85
+ end
86
+ end
87
+ EOR
88
+ puts "renderer file: lib/renderers/#{ARGV[1]}.rb"
89
+ File.open("lib/renderers/#{ARGV[1]}.rb", "w") { |f| f << REP }
90
+ puts "test file: test/test_#{ARGV[1]}.rb"
91
+
92
+ puts "class name: #{class_name}"
93
+ File.open("test/test_#{ARGV[1]}.rb","w") { |f| f << TEST }
60
94
  else
61
95
  puts "Incorrect usage."
62
96
  end