ruport 0.8.0 → 0.8.1

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 (42) hide show
  1. data/AUTHORS +1 -5
  2. data/README +4 -4
  3. data/Rakefile +2 -2
  4. data/examples/rope_examples/itunes/README +12 -0
  5. data/examples/rope_examples/itunes/Rakefile +18 -0
  6. data/examples/rope_examples/itunes/config/ruport_config.rb +8 -0
  7. data/examples/rope_examples/itunes/data/mix.txt +1 -0
  8. data/examples/rope_examples/itunes/lib/helpers.rb +0 -0
  9. data/examples/rope_examples/itunes/lib/init.rb +9 -0
  10. data/examples/rope_examples/itunes/lib/reports.rb +1 -0
  11. data/examples/rope_examples/itunes/lib/reports/playlist.rb +17 -0
  12. data/examples/rope_examples/itunes/log/ruport.log +1 -0
  13. data/examples/rope_examples/itunes/test/test_playlist.rb +8 -0
  14. data/examples/rope_examples/itunes/util/build +62 -0
  15. data/examples/rope_examples/itunes/util/sql_exec +5 -0
  16. data/examples/rope_examples/sales_report/README +4 -0
  17. data/examples/rope_examples/sales_report/Rakefile +18 -0
  18. data/examples/rope_examples/sales_report/config/ruport_config.rb +8 -0
  19. data/examples/rope_examples/sales_report/lib/helpers.rb +0 -0
  20. data/examples/rope_examples/sales_report/lib/init.rb +9 -0
  21. data/examples/rope_examples/sales_report/lib/reports.rb +1 -0
  22. data/examples/rope_examples/sales_report/lib/reports/sales.rb +138 -0
  23. data/examples/rope_examples/sales_report/log/ruport.log +1 -0
  24. data/examples/rope_examples/sales_report/output/books.pdf +170 -0
  25. data/examples/rope_examples/sales_report/output/books.txt +11 -0
  26. data/examples/rope_examples/sales_report/test/test_sales.rb +8 -0
  27. data/examples/rope_examples/sales_report/util/build +62 -0
  28. data/examples/rope_examples/sales_report/util/sql_exec +5 -0
  29. data/lib/ruport.rb +1 -1
  30. data/lib/ruport/data/groupable.rb +1 -1
  31. data/lib/ruport/data/record.rb +8 -8
  32. data/lib/ruport/data/table.rb +17 -14
  33. data/test/test_groupable.rb +14 -2
  34. data/test/test_table.rb +24 -0
  35. metadata +101 -60
  36. data/lib/ruport.rb.rej +0 -41
  37. data/lib/ruport.rb~ +0 -85
  38. data/lib/ruport/format/latex.rb.rej +0 -26
  39. data/lib/ruport/format/latex.rb~ +0 -47
  40. data/lib/ruport/format/pdf.rb.rej +0 -168
  41. data/lib/ruport/format/pdf.rb~ +0 -189
  42. data/test/unit.log +0 -259
@@ -0,0 +1,11 @@
1
+ ***************************************************************************
2
+ December 2006 Sales Figures
3
+ ***************************************************************************
4
+
5
+ isbn |title |author |sales
6
+ ###########################################################################
7
+ 978111111111 |Book Number One |me |10
8
+ 978222222222 |Two is better than one |you |267
9
+ 978333333333 |Three Blind Mice |John Howard |1
10
+ 978444444444 |The number 4 |George Bush |1829
11
+ ###########################################################################
@@ -0,0 +1,8 @@
1
+ require "test/unit"
2
+ require "lib/reports/sales"
3
+
4
+ class TestSales < Test::Unit::TestCase
5
+ def test_flunk
6
+ flunk "Write your real tests here or in any test/test_* file"
7
+ end
8
+ end
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fileutils'
4
+ include FileUtils
5
+
6
+ def format_class_name(string)
7
+ string.downcase.split("_").map { |s| s.capitalize }.join
8
+ end
9
+
10
+ unless ARGV.length > 1
11
+ puts "usage: build [command] [options]"
12
+ exit
13
+ end
14
+
15
+ class_name = format_class_name(ARGV[1])
16
+
17
+ exit if File.exist? "lib/reports/#{ARGV[1]}.rb"
18
+ if ARGV[0].eql? "report"
19
+ File.open("lib/reports.rb", "a") { |f|
20
+ f.puts("require \"lib/reports/#{ARGV[1]}\"")
21
+ }
22
+ REP = <<EOR
23
+ require "lib/init"
24
+ class #{class_name} < Ruport::Report
25
+
26
+ def prepare
27
+
28
+ end
29
+
30
+ def generate
31
+
32
+ end
33
+
34
+ def cleanup
35
+
36
+ end
37
+
38
+ end
39
+
40
+ if __FILE__ == $0
41
+ #{class_name}.run { |res| puts res.results }
42
+ end
43
+ EOR
44
+
45
+ TEST = <<EOR
46
+ require "test/unit"
47
+ require "lib/reports/#{ARGV[1]}"
48
+
49
+ class Test#{class_name} < Test::Unit::TestCase
50
+ def test_flunk
51
+ flunk "Write your real tests here or in any test/test_* file"
52
+ end
53
+ end
54
+ EOR
55
+ puts "report file: lib/reports/#{ARGV[1]}.rb"
56
+ File.open("lib/reports/#{ARGV[1]}.rb", "w") { |f| f << REP }
57
+ puts "test file: test/test_#{ARGV[1]}.rb"
58
+ puts "class name: #{class_name}"
59
+ File.open("test/test_#{ARGV[1]}.rb","w") { |f| f << TEST }
60
+ else
61
+ puts "Incorrect usage."
62
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "lib/init"
4
+
5
+ puts Ruport::Query.new(ARGF.read).result
data/lib/ruport.rb CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  module Ruport
14
14
 
15
- VERSION = "0.8.0"
15
+ VERSION = "0.8.1"
16
16
 
17
17
  # This method is Ruport's logging and error interface. It can generate
18
18
  # warnings or raise fatal errors, logging +message+ to the file defined by
@@ -43,7 +43,7 @@ module Ruport::Data
43
43
  def groups
44
44
  #r_tags = map { |r| r.tags }.flatten.uniq
45
45
  r_tags = group_names_intern
46
- tables_hash = Hash.new { |h,k| h[k] = [].to_table(column_names) }
46
+ tables_hash = Hash.new { |h,k| h[k] = Table(column_names) }
47
47
  r_tags.each { |t|
48
48
  tables_hash[t.gsub(/^grp_/,"")] = sub_table { |r| r.tags.include? t }}
49
49
  r = Record.new tables_hash, :attributes => group_names
@@ -35,14 +35,14 @@ module Ruport::Data
35
35
  # b.c #=> 3
36
36
  #
37
37
  # c = Record.new {"a" => 1, "c" => 3, "b" => 2}, :attributes => %w[a b c]
38
- # b[1] #=> 2
39
- # b['a'] #=> 1
40
- # b.c #=> 3
41
- #
42
- # c = Record.new { "a" => 1, "c" => 3, "b" => 2 }
43
- # b[1] #=> ? (without attributes, you cannot rely on order)
44
- # b['a'] #=> 1
45
- # b.c #=> 3
38
+ # c[1] #=> 2
39
+ # c['a'] #=> 1
40
+ # c.c #=> 3
41
+ #
42
+ # d = Record.new { "a" => 1, "c" => 3, "b" => 2 }
43
+ # d[1] #=> ? (without attributes, you cannot rely on order)
44
+ # d['a'] #=> 1
45
+ # d.c #=> 3
46
46
  #
47
47
  def initialize(data,options={})
48
48
  data = data.dup
@@ -47,8 +47,7 @@ module Ruport::Data
47
47
  # of its source (a database, manual arrays, ActiveRecord, CSVs, etc.).
48
48
  #
49
49
  # Table is intended to be used as the data store for structured, tabular
50
- # data - Ruport::Data::Set is an alternate data store intended for less
51
- # structured data.
50
+ # data.
52
51
  #
53
52
  # Once your data is in a Ruport::Data::Table object, it can be manipulated
54
53
  # to suit your needs, then used to build a report.
@@ -98,7 +97,7 @@ module Ruport::Data
98
97
  #
99
98
  # Example:
100
99
  #
101
- # table = Table.new :data => [1,2,3], [3,4,5],
100
+ # table = Table.new :data => [[1,2,3], [3,4,5]],
102
101
  # :column_names => %w[a b c]
103
102
  #
104
103
  # table.column_names = %w[e f g]
@@ -126,10 +125,10 @@ module Ruport::Data
126
125
  #
127
126
  # Example:
128
127
  #
129
- # one = Table.new :data => [1,2], [3,4],
128
+ # one = Table.new :data => [[1,2], [3,4]],
130
129
  # :column_names => %w[a b]
131
130
  #
132
- # two = Table.new :data => [1,2], [3,4],
131
+ # two = Table.new :data => [[1,2], [3,4]],
133
132
  # :column_names => %w[a b]
134
133
  #
135
134
  # one.eql?(two) #=> true
@@ -145,7 +144,7 @@ module Ruport::Data
145
144
  #
146
145
  # Example:
147
146
  #
148
- # data = Table.new :data => [1,2], [3,4],
147
+ # data = Table.new :data => [[1,2], [3,4]],
149
148
  # :column_names => %w[a b]
150
149
  # data << [8,9]
151
150
  # data << { :a => 4, :b => 5}
@@ -160,8 +159,12 @@ module Ruport::Data
160
159
  raise ArgumentError unless @column_names
161
160
  arr = @column_names.map { |k| other[k] }
162
161
  @data << record_class.new(arr, :attributes => @column_names)
163
- when record_class
164
- self << other.to_h
162
+ when record_class
163
+ if column_names.empty?
164
+ self << other.to_a
165
+ else
166
+ self << other.to_h
167
+ end
165
168
  @data.last.tags = other.tags.dup
166
169
  else
167
170
  raise ArgumentError
@@ -198,7 +201,7 @@ module Ruport::Data
198
201
  #
199
202
  # Example:
200
203
  #
201
- # one = Table.new :data => [1,2], [3,4],
204
+ # one = Table.new :data => [[1,2], [3,4]],
202
205
  # :column_names => %w[a b]
203
206
  #
204
207
  # two = one.reorder!([1,0])
@@ -239,14 +242,14 @@ module Ruport::Data
239
242
  #
240
243
  # data = Table("a","b") { |t| t << [1,2] << [3,4] }
241
244
  #
242
- # #basic usage, column full of 1's
245
+ # # basic usage, column full of 1's
243
246
  # data.add_column 'new_column', :default => 1
244
247
  #
245
- # #new empty column before new_column
248
+ # # new empty column before new_column
246
249
  # data.add_column 'new_col2', :before => 'new_column'
247
250
  #
248
251
  # # new column placed just after column a
249
- # data.add_column 'new_col3', :position => 1
252
+ # data.add_column 'new_col3', :position => 1
250
253
  #
251
254
  # # new column built via a block, added at the end of the table
252
255
  # data.add_column("new_col4") { |r| r.a + r.b }
@@ -498,7 +501,7 @@ module Ruport::Data
498
501
  #
499
502
  # Example:
500
503
  #
501
- # one = Table.new :data => [1,2], [3,4],
504
+ # one = Table.new :data => [[1,2], [3,4]],
502
505
  # :column_names => %w[a b]
503
506
  # two = one.dup
504
507
  #
@@ -513,7 +516,7 @@ module Ruport::Data
513
516
  #
514
517
  # Example:
515
518
  #
516
- # data = Table.new :data => [1,2], [3,4],
519
+ # data = Table.new :data => [[1,2], [3,4]],
517
520
  # :column_names => %w[a b]
518
521
  # puts data.to_s
519
522
  #
@@ -24,7 +24,7 @@ class TestGroupable < Test::Unit::TestCase
24
24
  [[1,2],[3,4],[5,6]].to_table(%w[a b]) ],
25
25
  :attributes => ["foo","bar"] )
26
26
  assert_equal expected, a.groups
27
- end
27
+ end
28
28
 
29
29
  def test_create_group
30
30
  a = [[1,2,3],[4,5,6],[7,8,9]].to_table(%w[a b c])
@@ -39,6 +39,18 @@ class TestGroupable < Test::Unit::TestCase
39
39
  assert_equal([[1,2,3],[7,8,9]].to_table(%w[a b c]), a.group(:starts_odd))
40
40
  assert_equal([[4,5,6]].to_table(%w[a b c]), a.group("starts_even"))
41
41
 
42
- end
42
+ end
43
+
44
+ #--BUG TRAPS-------------------------------------------------------------
45
+
46
+ #Ticket #155
47
+ def test_ensure_grouping_works_with_nameless_tables
48
+ a = [[1,2],[3,4],[5,6]].to_table
49
+ a.create_group("foo") { true }
50
+ a[1].tag("grp_bar")
51
+ assert_nothing_raised { a.groups }
52
+ assert_equal a, a.group("foo")
53
+ assert_equal [a[1]].to_table, a.group("bar")
54
+ end
43
55
 
44
56
  end
data/test/test_table.rb CHANGED
@@ -13,7 +13,9 @@ end
13
13
 
14
14
  class TestTable < Test::Unit::TestCase
15
15
  def test_constructors
16
+
16
17
  table = Ruport::Data::Table.new
18
+
17
19
  table2 = Ruport::Data::Table.new :column_names => %w[a b c]
18
20
  table3 = Ruport::Data::Table.new :data => [[1,2,3]]
19
21
  table4 = Ruport::Data::Table.new :column_names => %w[col1 col2 col3],
@@ -457,6 +459,28 @@ class TestTable < Test::Unit::TestCase
457
459
  assert_equal Set.new([:bar]), b[1].tags
458
460
  end
459
461
 
462
+ def test_ensure_serializable
463
+ a = [].to_table
464
+ assert_nothing_raised { a.to_yaml }
465
+ a = Table(%w[first_name last_name],:record_class => Person) { |t|
466
+ t << %w[joe loop]
467
+ }
468
+ assert_equal "joe loop", a[0].name
469
+ assert_nothing_raised { a.to_yaml }
470
+ end
471
+
472
+ def test_ensure_subtable_works_with_unnamed_tables
473
+ a = [[1,2,3],[4,5,6]].to_table
474
+ b = a.sub_table { |r| (r[0] % 2).zero? }
475
+ assert_equal [[4,5,6]].to_table, b
476
+ end
477
+
478
+ def test_ensure_appending_records_works_with_unnamed_tables
479
+ a = [[1,2,3],[4,5,6]].to_table
480
+ a << Ruport::Data::Record.new([7,8,9])
481
+ assert_equal [[1,2,3],[4,5,6],[7,8,9]].to_table,a
482
+ end
483
+
460
484
  end
461
485
 
462
486
  class TestTableKernelHack < Test::Unit::TestCase
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.1
3
3
  specification_version: 1
4
4
  name: ruport
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.8.0
7
- date: 2007-02-03 00:00:00 -05:00
6
+ version: 0.8.1
7
+ date: 2007-02-08 00:00:00 -05:00
8
8
  summary: A generalized Ruby report generation and templating engine.
9
9
  require_paths:
10
10
  - lib
@@ -29,85 +29,126 @@ post_install_message:
29
29
  authors:
30
30
  - Gregory Brown
31
31
  files:
32
+ - examples/centered_pdf_text_box.rb
33
+ - examples/invoice.rb
32
34
  - examples/invoice_report.rb
33
- - examples/RWEmerson.jpg
34
35
  - examples/line_plotter.rb
35
- - examples/centered_pdf_text_box.rb
36
36
  - examples/pdf_complex_report.rb
37
- - examples/invoice.rb
38
37
  - examples/pdf_table_with_title.rb
38
+ - examples/rope_examples
39
+ - examples/RWEmerson.jpg
40
+ - examples/rope_examples/itunes
41
+ - examples/rope_examples/sales_report
42
+ - examples/rope_examples/itunes/config
43
+ - examples/rope_examples/itunes/data
44
+ - examples/rope_examples/itunes/lib
45
+ - examples/rope_examples/itunes/log
46
+ - examples/rope_examples/itunes/output
47
+ - examples/rope_examples/itunes/Rakefile
48
+ - examples/rope_examples/itunes/README
49
+ - examples/rope_examples/itunes/sql
50
+ - examples/rope_examples/itunes/templates
51
+ - examples/rope_examples/itunes/test
52
+ - examples/rope_examples/itunes/util
53
+ - examples/rope_examples/itunes/config/ruport_config.rb
54
+ - examples/rope_examples/itunes/data/mix.txt
55
+ - examples/rope_examples/itunes/lib/helpers.rb
56
+ - examples/rope_examples/itunes/lib/init.rb
57
+ - examples/rope_examples/itunes/lib/reports
58
+ - examples/rope_examples/itunes/lib/reports.rb
59
+ - examples/rope_examples/itunes/lib/reports/playlist.rb
60
+ - examples/rope_examples/itunes/log/ruport.log
61
+ - examples/rope_examples/itunes/test/test_playlist.rb
62
+ - examples/rope_examples/itunes/util/build
63
+ - examples/rope_examples/itunes/util/sql_exec
64
+ - examples/rope_examples/sales_report/config
65
+ - examples/rope_examples/sales_report/data
66
+ - examples/rope_examples/sales_report/lib
67
+ - examples/rope_examples/sales_report/log
68
+ - examples/rope_examples/sales_report/output
69
+ - examples/rope_examples/sales_report/Rakefile
70
+ - examples/rope_examples/sales_report/README
71
+ - examples/rope_examples/sales_report/sql
72
+ - examples/rope_examples/sales_report/templates
73
+ - examples/rope_examples/sales_report/test
74
+ - examples/rope_examples/sales_report/util
75
+ - examples/rope_examples/sales_report/config/ruport_config.rb
76
+ - examples/rope_examples/sales_report/lib/helpers.rb
77
+ - examples/rope_examples/sales_report/lib/init.rb
78
+ - examples/rope_examples/sales_report/lib/reports
79
+ - examples/rope_examples/sales_report/lib/reports.rb
80
+ - examples/rope_examples/sales_report/lib/reports/sales.rb
81
+ - examples/rope_examples/sales_report/log/ruport.log
82
+ - examples/rope_examples/sales_report/output/books.pdf
83
+ - examples/rope_examples/sales_report/output/books.txt
84
+ - examples/rope_examples/sales_report/test/test_sales.rb
85
+ - examples/rope_examples/sales_report/util/build
86
+ - examples/rope_examples/sales_report/util/sql_exec
39
87
  - lib/ruport
40
88
  - lib/ruport.rb
41
89
  - lib/uport.rb
42
- - lib/ruport.rb.rej
43
- - lib/ruport.rb~
44
- - lib/ruport/format
45
- - lib/ruport/query
46
- - lib/ruport/renderer
90
+ - lib/ruport/attempt.rb
91
+ - lib/ruport/config.rb
47
92
  - lib/ruport/data
48
- - lib/ruport/report
93
+ - lib/ruport/data.rb
94
+ - lib/ruport/format
95
+ - lib/ruport/format.rb
96
+ - lib/ruport/generator.rb
49
97
  - lib/ruport/layout
50
98
  - lib/ruport/layout.rb
51
- - lib/ruport/attempt.rb
52
- - lib/ruport/generator.rb
53
- - lib/ruport/format.rb
99
+ - lib/ruport/mailer.rb
100
+ - lib/ruport/query
54
101
  - lib/ruport/query.rb
55
- - lib/ruport/data.rb
56
- - lib/ruport/system_extensions.rb
57
- - lib/ruport/config.rb
102
+ - lib/ruport/renderer
58
103
  - lib/ruport/renderer.rb
59
- - lib/ruport/mailer.rb
104
+ - lib/ruport/report
60
105
  - lib/ruport/report.rb
61
- - lib/ruport/format/plugin.rb
106
+ - lib/ruport/system_extensions.rb
107
+ - lib/ruport/data/groupable.rb
108
+ - lib/ruport/data/record.rb
109
+ - lib/ruport/data/table.rb
110
+ - lib/ruport/data/taggable.rb
111
+ - lib/ruport/format/csv.rb
112
+ - lib/ruport/format/html.rb
62
113
  - lib/ruport/format/latex.rb
63
- - lib/ruport/format/latex.rb~
114
+ - lib/ruport/format/pdf.rb
115
+ - lib/ruport/format/plugin.rb
64
116
  - lib/ruport/format/svg.rb
65
- - lib/ruport/format/xml.rb
66
- - lib/ruport/format/html.rb
67
117
  - lib/ruport/format/text.rb
68
- - lib/ruport/format/pdf.rb
69
- - lib/ruport/format/csv.rb
70
- - lib/ruport/format/latex.rb.rej
71
- - lib/ruport/format/pdf.rb~
72
- - lib/ruport/format/pdf.rb.rej
118
+ - lib/ruport/format/xml.rb
119
+ - lib/ruport/layout/component.rb
73
120
  - lib/ruport/query/sql_split.rb
74
121
  - lib/ruport/renderer/graph.rb
75
122
  - lib/ruport/renderer/table.rb
76
- - lib/ruport/data/record.rb
77
- - lib/ruport/data/groupable.rb
78
- - lib/ruport/data/taggable.rb
79
- - lib/ruport/data/table.rb
80
123
  - lib/ruport/report/graph.rb
81
- - lib/ruport/layout/component.rb
124
+ - test/_test_database.rb
82
125
  - test/samples
83
- - test/test_groupable.rb
84
- - test/test_record.rb
126
+ - test/test_config.rb
85
127
  - test/test_format_text.rb
86
- - test/test_table.rb
87
- - test/test_ruport.rb
88
128
  - test/test_graph_renderer.rb
89
- - test/test_table_renderer.rb
90
- - test/_test_database.rb
129
+ - test/test_groupable.rb
130
+ - test/test_mailer.rb
91
131
  - test/test_query.rb
92
- - test/test_config.rb
93
- - test/test_taggable.rb
132
+ - test/test_record.rb
94
133
  - test/test_renderer.rb
95
- - test/test_mailer.rb
96
- - test/test_sql_split.rb
97
134
  - test/test_report.rb
98
- - test/unit.log
99
- - test/samples/query_test.sql
100
- - test/samples/test.yaml
101
- - test/samples/erb_test.sql
135
+ - test/test_ruport.rb
136
+ - test/test_sql_split.rb
137
+ - test/test_table.rb
138
+ - test/test_table_renderer.rb
139
+ - test/test_taggable.rb
140
+ - test/samples/addressbook.csv
102
141
  - test/samples/data.csv
103
- - test/samples/foo.rtxt
104
142
  - test/samples/data.tsv
105
- - test/samples/stonecodeblog.sql
106
- - test/samples/ruport_test.sql
107
- - test/samples/addressbook.csv
108
143
  - test/samples/dates.csv
109
144
  - test/samples/document.xml
145
+ - test/samples/erb_test.sql
146
+ - test/samples/foo.rtxt
147
+ - test/samples/query_test.sql
148
+ - test/samples/ruport_test.sql
149
+ - test/samples/stonecodeblog.sql
110
150
  - test/samples/test.sql
151
+ - test/samples/test.yaml
111
152
  - bin/rope
112
153
  - Rakefile
113
154
  - setup.rb
@@ -116,20 +157,20 @@ files:
116
157
  - TODO
117
158
  - AUTHORS
118
159
  test_files:
119
- - test/test_groupable.rb
120
- - test/test_record.rb
160
+ - test/test_config.rb
121
161
  - test/test_format_text.rb
122
- - test/test_table.rb
123
- - test/test_ruport.rb
124
162
  - test/test_graph_renderer.rb
125
- - test/test_table_renderer.rb
163
+ - test/test_groupable.rb
164
+ - test/test_mailer.rb
126
165
  - test/test_query.rb
127
- - test/test_config.rb
128
- - test/test_taggable.rb
166
+ - test/test_record.rb
129
167
  - test/test_renderer.rb
130
- - test/test_mailer.rb
131
- - test/test_sql_split.rb
132
168
  - test/test_report.rb
169
+ - test/test_ruport.rb
170
+ - test/test_sql_split.rb
171
+ - test/test_table.rb
172
+ - test/test_table_renderer.rb
173
+ - test/test_taggable.rb
133
174
  rdoc_options:
134
175
  - --title
135
176
  - Ruport Documentation
@@ -164,7 +205,7 @@ dependencies:
164
205
  requirements:
165
206
  - - ">="
166
207
  - !ruby/object:Gem::Version
167
- version: 3.0.4
208
+ version: 3.0.3
168
209
  version:
169
210
  - !ruby/object:Gem::Dependency
170
211
  name: pdf-writer