thinreports 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CONTRIBUTING.md +2 -0
  3. data/.travis.yml +3 -3
  4. data/CHANGELOG.md +98 -1
  5. data/README.md +0 -9
  6. data/Rakefile +1 -2
  7. data/examples/character_spacing/character_spacing.tlf +293 -1
  8. data/examples/dynamic_image/dynamic_image.tlf +661 -1
  9. data/examples/dynamic_style/dynamic_style.rb +4 -4
  10. data/examples/dynamic_style/dynamic_style.tlf +1835 -1
  11. data/examples/dynamic_style/dynamic_style_in_list.tlf +344 -1
  12. data/examples/eudc/eudc.tlf +180 -1
  13. data/examples/hidden_shapes/hidden_shapes.tlf +449 -1
  14. data/examples/list_events/list_events.rb +1 -28
  15. data/examples/list_events/list_events.tlf +361 -0
  16. data/examples/list_manual_generation/list_manual_generation.tlf +132 -1
  17. data/examples/list_page_number/list_page_number.tlf +254 -1
  18. data/examples/page_number/page_number.tlf +215 -1
  19. data/examples/palleted_png/palleted_png.rb +2 -0
  20. data/examples/palleted_png/palleted_png.tlf +47 -1
  21. data/examples/password_setting/password_setting.tlf +45 -1
  22. data/examples/report_callbacks/report_callbacks.rb +1 -18
  23. data/examples/report_callbacks/report_callbacks.tlf +147 -1
  24. data/examples/single_line_tblock/single_line_tblock.tlf +170 -1
  25. data/examples/tblock_overflow/tblock_overflow.tlf +538 -1
  26. data/examples/tblock_styles/font_size.tlf +383 -1
  27. data/examples/tblock_styles/tblock_styles.tlf +889 -1
  28. data/examples/text_align/text_align.tlf +241 -1
  29. data/examples/typeB_page_size/B4_ISO.tlf +45 -1
  30. data/examples/typeB_page_size/B4_JIS.tlf +45 -1
  31. data/examples/word_wrap/word_wrap.tlf +297 -1
  32. data/lib/thinreports.rb +0 -1
  33. data/lib/thinreports/config.rb +3 -0
  34. data/lib/thinreports/core/errors.rb +0 -3
  35. data/lib/thinreports/core/format/base.rb +4 -4
  36. data/lib/thinreports/core/shape.rb +1 -9
  37. data/lib/thinreports/core/shape/basic.rb +3 -3
  38. data/lib/thinreports/core/shape/basic/block_format.rb +1 -1
  39. data/lib/thinreports/core/shape/basic/format.rb +2 -14
  40. data/lib/thinreports/core/shape/basic/internal.rb +2 -2
  41. data/lib/thinreports/core/shape/image_block.rb +3 -3
  42. data/lib/thinreports/core/shape/image_block/format.rb +0 -2
  43. data/lib/thinreports/core/shape/image_block/internal.rb +1 -1
  44. data/lib/thinreports/core/shape/list.rb +3 -7
  45. data/lib/thinreports/core/shape/list/format.rb +37 -24
  46. data/lib/thinreports/core/shape/list/manager.rb +1 -36
  47. data/lib/thinreports/core/shape/list/page.rb +0 -15
  48. data/lib/thinreports/core/shape/list/page_state.rb +1 -1
  49. data/lib/thinreports/core/shape/list/section_format.rb +14 -12
  50. data/lib/thinreports/core/shape/list/section_internal.rb +4 -7
  51. data/lib/thinreports/core/shape/manager/format.rb +0 -2
  52. data/lib/thinreports/core/shape/manager/internal.rb +1 -1
  53. data/lib/thinreports/core/shape/page_number.rb +1 -1
  54. data/lib/thinreports/core/shape/page_number/format.rb +9 -6
  55. data/lib/thinreports/core/shape/page_number/interface.rb +1 -1
  56. data/lib/thinreports/core/shape/page_number/internal.rb +2 -6
  57. data/lib/thinreports/core/shape/style/base.rb +11 -13
  58. data/lib/thinreports/core/shape/style/basic.rb +4 -4
  59. data/lib/thinreports/core/shape/style/graphic.rb +4 -10
  60. data/lib/thinreports/core/shape/style/text.rb +36 -69
  61. data/lib/thinreports/core/shape/text.rb +3 -3
  62. data/lib/thinreports/core/shape/text/format.rb +3 -13
  63. data/lib/thinreports/core/shape/text/internal.rb +2 -2
  64. data/lib/thinreports/core/shape/text_block.rb +3 -3
  65. data/lib/thinreports/core/shape/text_block/format.rb +9 -6
  66. data/lib/thinreports/core/shape/text_block/interface.rb +7 -7
  67. data/lib/thinreports/core/shape/text_block/internal.rb +1 -1
  68. data/lib/thinreports/generator/pdf.rb +0 -1
  69. data/lib/thinreports/generator/pdf/document.rb +2 -2
  70. data/lib/thinreports/generator/pdf/document/draw_shape.rb +25 -51
  71. data/lib/thinreports/generator/pdf/document/draw_template_items.rb +66 -0
  72. data/lib/thinreports/generator/pdf/document/font.rb +3 -8
  73. data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +97 -77
  74. data/lib/thinreports/generator/pdf/document/graphics/basic.rb +18 -13
  75. data/lib/thinreports/generator/pdf/document/graphics/image.rb +17 -12
  76. data/lib/thinreports/generator/pdf/document/page.rb +1 -1
  77. data/lib/thinreports/generator/pdf/drawer/list.rb +5 -1
  78. data/lib/thinreports/generator/pdf/drawer/list_section.rb +1 -4
  79. data/lib/thinreports/generator/pdf/drawer/page.rb +9 -9
  80. data/lib/thinreports/layout.rb +3 -3
  81. data/lib/thinreports/layout/base.rb +0 -16
  82. data/lib/thinreports/layout/format.rb +38 -57
  83. data/lib/thinreports/layout/legacy_schema.rb +354 -0
  84. data/lib/thinreports/layout/version.rb +1 -1
  85. data/lib/thinreports/report.rb +0 -1
  86. data/lib/thinreports/report/base.rb +3 -17
  87. data/lib/thinreports/report/internal.rb +13 -55
  88. data/lib/thinreports/report/page.rb +1 -1
  89. data/lib/thinreports/version.rb +1 -1
  90. data/test/data/legacy_layout/all-items.tlf +1 -0
  91. data/test/schema_helper.rb +121 -0
  92. data/test/test_helper.rb +13 -50
  93. data/test/unit/core/format/test_base.rb +35 -31
  94. data/test/unit/core/shape/base/test_internal.rb +1 -1
  95. data/test/unit/core/shape/basic/test_block_format.rb +23 -0
  96. data/test/unit/core/shape/basic/{test_basic_interface.rb → test_block_interface.rb} +1 -1
  97. data/test/unit/core/shape/basic/{test_basic_internal.rb → test_block_internal.rb} +4 -7
  98. data/test/unit/core/shape/basic/test_format.rb +25 -47
  99. data/test/unit/core/shape/basic/test_interface.rb +5 -5
  100. data/test/unit/core/shape/basic/test_internal.rb +6 -11
  101. data/test/unit/core/shape/image_block/test_interface.rb +5 -5
  102. data/test/unit/core/shape/image_block/test_internal.rb +2 -2
  103. data/test/unit/core/shape/list/test_format.rb +86 -44
  104. data/test/unit/core/shape/list/test_manager.rb +10 -65
  105. data/test/unit/core/shape/list/test_page.rb +10 -61
  106. data/test/unit/core/shape/list/test_page_state.rb +1 -1
  107. data/test/unit/core/shape/list/test_section_format.rb +19 -28
  108. data/test/unit/core/shape/list/test_section_interface.rb +14 -6
  109. data/test/unit/core/shape/list/test_section_internal.rb +17 -23
  110. data/test/unit/core/shape/manager/test_format.rb +1 -1
  111. data/test/unit/core/shape/manager/test_internal.rb +59 -98
  112. data/test/unit/core/shape/manager/test_target.rb +21 -30
  113. data/test/unit/core/shape/page_number/test_format.rb +34 -52
  114. data/test/unit/core/shape/page_number/test_interface.rb +1 -1
  115. data/test/unit/core/shape/page_number/test_internal.rb +2 -2
  116. data/test/unit/core/shape/styles/test_base.rb +16 -41
  117. data/test/unit/core/shape/styles/test_basic.rb +7 -7
  118. data/test/unit/core/shape/styles/test_graphic.rb +27 -32
  119. data/test/unit/core/shape/styles/test_text.rb +68 -311
  120. data/test/unit/core/shape/text/test_format.rb +30 -59
  121. data/test/unit/core/shape/text/test_internal.rb +5 -5
  122. data/test/unit/core/shape/text_block/formatter/test_datetime.rb +13 -13
  123. data/test/unit/core/shape/text_block/test_format.rb +145 -146
  124. data/test/unit/core/shape/text_block/test_interface.rb +9 -9
  125. data/test/unit/core/shape/text_block/test_internal.rb +9 -9
  126. data/test/unit/core/test_shape.rb +19 -31
  127. data/test/unit/generator/pdf/document/graphics/test_attributes.rb +112 -122
  128. data/test/unit/generator/pdf/document/graphics/test_basic.rb +45 -0
  129. data/test/unit/generator/pdf/document/graphics/test_image.rb +5 -5
  130. data/test/unit/generator/pdf/document/test_font.rb +4 -10
  131. data/test/unit/generator/pdf/document/test_page.rb +13 -11
  132. data/test/unit/generator/pdf/document/test_parse_color.rb +5 -5
  133. data/test/unit/generator/test_base.rb +5 -5
  134. data/test/unit/generator/test_configuration.rb +4 -8
  135. data/test/unit/generator/test_pdf.rb +3 -2
  136. data/test/unit/layout/test_base.rb +16 -22
  137. data/test/unit/layout/test_format.rb +66 -86
  138. data/test/unit/layout/test_legacy_schema.rb +587 -0
  139. data/test/unit/layout/test_version.rb +20 -20
  140. data/test/unit/report/test_base.rb +32 -45
  141. data/test/unit/report/test_internal.rb +43 -99
  142. data/test/unit/test_config.rb +4 -2
  143. data/test/unit/test_layout.rb +1 -1
  144. metadata +20 -48
  145. data/examples/list_events/list_events_0_7_7.tlf +0 -1
  146. data/examples/list_events/list_events_0_8.tlf +0 -1
  147. data/lib/thinreports/core/events.rb +0 -69
  148. data/lib/thinreports/core/format/builder.rb +0 -62
  149. data/lib/thinreports/core/shape/list/configuration.rb +0 -54
  150. data/lib/thinreports/core/shape/list/events.rb +0 -47
  151. data/lib/thinreports/core/shape/list/store.rb +0 -33
  152. data/lib/thinreports/generator/pdf/configuration.rb +0 -33
  153. data/lib/thinreports/generator/pdf/document/parse_svg.rb +0 -104
  154. data/lib/thinreports/layout/configuration.rb +0 -29
  155. data/test/data/layout_block.tlf +0 -1
  156. data/test/data/layout_list.tlf +0 -1
  157. data/test/data/layout_list_noheader.tlf +0 -1
  158. data/test/data/layout_text1.tlf +0 -1
  159. data/test/data/layout_text2.tlf +0 -1
  160. data/test/unit/core/format/test_builder.rb +0 -109
  161. data/test/unit/core/shape/basic/test_basic_format.rb +0 -30
  162. data/test/unit/core/shape/image_block/test_format.rb +0 -58
  163. data/test/unit/core/shape/list/test_configuration.rb +0 -69
  164. data/test/unit/core/shape/list/test_events.rb +0 -36
  165. data/test/unit/core/shape/list/test_store.rb +0 -41
  166. data/test/unit/core/test_events.rb +0 -93
  167. data/test/unit/generator/pdf/document/test_draw_shape.rb +0 -44
  168. data/test/unit/generator/pdf/test_configuration.rb +0 -31
  169. data/test/unit/layout/test_configuration.rb +0 -21
  170. data/test/unit/report/test_events.rb +0 -22
@@ -4,7 +4,7 @@ module Thinreports
4
4
  module Layout
5
5
 
6
6
  module Version
7
- REQUIRED_RULES = ['>= 0.7.7.0', '< 1.0.0']
7
+ REQUIRED_RULES = ['>= 0.8.0', '< 1.0.0']
8
8
 
9
9
  # @param [String] version
10
10
  # @return [Boolean]
@@ -23,5 +23,4 @@ end
23
23
 
24
24
  require 'thinreports/report/base'
25
25
  require 'thinreports/report/internal'
26
- require 'thinreports/report/events'
27
26
  require 'thinreports/report/page'
@@ -108,14 +108,12 @@ module Thinreports
108
108
  # @param [Hash] options
109
109
  # @option options [Boolean] :default (true)
110
110
  # @option options [Symbol] :id (nil)
111
- # @yield [config]
112
- # @yieldparam [Thinreports::Layout::Configuration] config
113
111
  # @example
114
112
  # report.use_layout '/path/to/default_layout.tlf' # Default layout
115
113
  # report.use_layout '/path/to/default_layout.tlf', default: true
116
114
  # report.use_layout '/path/to/other_layout', id: :other_layout
117
- def use_layout(layout, options = {}, &block)
118
- internal.register_layout(layout, options, &block)
115
+ def use_layout(layout, options = {})
116
+ internal.register_layout(layout, options)
119
117
  end
120
118
 
121
119
  # @example
@@ -142,7 +140,7 @@ module Thinreports
142
140
 
143
141
  raise Thinreports::Errors::NoRegisteredLayoutFound unless layout
144
142
 
145
- page = internal.add_page(layout.new_page(self, options))
143
+ page = internal.add_page(Report::Page.new(self, layout, options))
146
144
  call_block_in(page, &block)
147
145
  end
148
146
 
@@ -191,18 +189,6 @@ module Thinreports
191
189
  page.list(id, &block)
192
190
  end
193
191
 
194
- # @return [Thinreports::Report::Events]
195
- # @deprecated
196
- # `Report::Base#events` will be removed in the next major version.
197
- # Please use #on_page_create callbacks instead.
198
- # See also https://github.com/thinreports/thinreports-generator/blob/master/examples/report_callbacks/report_callbacks.rb.
199
- def events
200
- warn '[DEPRECATION] `Report::Base#events` will be removed in the next major version. ' +
201
- 'Please use #on_page_create callbacks instead. ' +
202
- 'See also https://github.com/thinreports/thinreports-generator/blob/master/examples/report_callbacks/report_callbacks.rb.'
203
- internal.events
204
- end
205
-
206
192
  def_delegators :internal, :finalize, :finalized?
207
193
  end
208
194
 
@@ -9,7 +9,6 @@ module Thinreports
9
9
  attr_reader :page_count
10
10
  attr_reader :default_layout
11
11
  attr_reader :layout_registry
12
- attr_reader :events
13
12
 
14
13
  attr_accessor :page_create_handler
15
14
 
@@ -17,8 +16,7 @@ module Thinreports
17
16
  # @param options (see Thinreports::Report::Base#initialize)
18
17
  def initialize(report, options)
19
18
  @report = report
20
- # Default layout
21
- @default_layout = prepare_layout(options[:layout])
19
+ @default_layout = options[:layout] ? init_layout(options[:layout]) : nil
22
20
 
23
21
  @layout_registry = {}
24
22
  @finalized = false
@@ -27,24 +25,20 @@ module Thinreports
27
25
  @page_count = 0
28
26
 
29
27
  @page_create_handler = nil
30
-
31
- @events = Report::Events.new
32
28
  end
33
29
 
34
30
  # @see Thinreports::Report::Base#use_layout
35
- def register_layout(layout, options = {}, &block)
36
- layout =
37
- if options.empty? || options[:default]
38
- @default_layout = init_layout(layout)
39
- else
40
- id = options[:id].to_sym
31
+ def register_layout(layout, options = {})
32
+ if options.empty? || options[:default]
33
+ @default_layout = init_layout(layout)
34
+ else
35
+ id = options[:id].to_sym
41
36
 
42
- if layout_registry.key?(id)
43
- raise ArgumentError, "Id :#{id} is already in use."
44
- end
45
- layout_registry[id] = init_layout(layout, id)
37
+ if layout_registry.key?(id)
38
+ raise ArgumentError, "Id :#{id} is already in use."
46
39
  end
47
- layout.config(&block)
40
+ layout_registry[id] = init_layout(layout, id)
41
+ end
48
42
  end
49
43
 
50
44
  def add_page(new_page)
@@ -61,23 +55,6 @@ module Thinreports
61
55
  unless finalized?
62
56
  finalize_current_page
63
57
  @finalized = true
64
-
65
- # [DEPRECATION] You can do the same implements as the :generate Event
66
- # with the following code:
67
- #
68
- # report = Thinreports::Report.new layout: 'foo.tlf'
69
- # report.start_new_page do |page|
70
- # page.item(:price).value = 100000
71
- # end
72
- #
73
- # report.pages.each do |page|
74
- # page[:title] = 'Common Title'
75
- # end
76
- #
77
- # report.generate filename: 'foo.pdf'
78
- #
79
- events.dispatch(Report::Events::Event.new(:generate,
80
- @report, nil, pages))
81
58
  end
82
59
  end
83
60
 
@@ -93,10 +70,11 @@ module Thinreports
93
70
  when Symbol
94
71
  layout_registry[id_or_filename]
95
72
  when String
96
- prepare_layout(id_or_filename)
73
+ init_layout(id_or_filename)
97
74
  else
98
75
  raise ArgumentError, 'Invalid argument for layout.'
99
76
  end
77
+
100
78
  @default_layout = layout unless @default_layout
101
79
  layout
102
80
  end
@@ -111,13 +89,7 @@ module Thinreports
111
89
  new_page.no = @page_count
112
90
  end
113
91
 
114
- unless new_page.blank?
115
- # [DEPRECATION] Please use #on_page_create callback instead.
116
- events.dispatch(Report::Events::Event.new(:page_create,
117
- @report,
118
- new_page))
119
- @page_create_handler.call(new_page) if @page_create_handler
120
- end
92
+ @page_create_handler.call(new_page) if !new_page.blank? && @page_create_handler
121
93
  @page = new_page
122
94
  end
123
95
 
@@ -126,20 +98,6 @@ module Thinreports
126
98
  page.finalize(options) unless page.nil? || page.blank?
127
99
  end
128
100
 
129
- def prepare_layout(layout)
130
- return nil if layout.nil?
131
-
132
- case layout
133
- when String
134
- init_layout(layout)
135
- # @note Currently not used. Since 0.6.0?
136
- when Thinreports::Layout::Base
137
- layout
138
- else
139
- raise ArgumentError, 'Invalid argument for layout.'
140
- end
141
- end
142
-
143
101
  def init_layout(filename, id = nil)
144
102
  Thinreports::Layout.new(filename, id: id)
145
103
  end
@@ -72,7 +72,7 @@ module Thinreports
72
72
  new_shape = shape.copy(new_page)
73
73
  new_page.manager.shapes[id] = new_shape
74
74
 
75
- if new_shape.internal.type_of?(:list)
75
+ if new_shape.internal.type_of?(Core::Shape::List::TYPE_NAME)
76
76
  new_page.manager.lists[id] = new_shape
77
77
  end
78
78
  end
@@ -1,5 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Thinreports
4
- VERSION = '0.8.2'
4
+ VERSION = '0.9.0'
5
5
  end
@@ -0,0 +1 @@
1
+ {"version":"0.8.2","config":{"title":"Report Title","option":{},"page":{"paper-type":"A4","orientation":"portrait","margin-top":"20","margin-bottom":"30","margin-left":"40","margin-right":"50"}},"svg":"<svg width=\"595.2\" height=\"841.8\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"none\" viewBox=\"0 0 595.2 841.8\"><g class=\"canvas\"><rect stroke=\"#000000\" stroke-width=\"1\" fill=\"#FFFFFF\" fill-opacity=\"1\" class=\"s-rect\" x-display=\"true\" x-stroke-type=\"solid\" stroke-dasharray=\"none\" x-id=\"\" rx=\"0\" ry=\"0\" id=\"goog_852326033\" width=\"102.6\" height=\"42\" x=\"40\" y=\"20\"/><ellipse stroke=\"#000000\" stroke-width=\"1\" fill=\"#FFFFFF\" fill-opacity=\"1\" class=\"s-ellipse\" x-display=\"true\" x-stroke-type=\"solid\" stroke-dasharray=\"none\" x-id=\"\" id=\"goog_852326034\" rx=\"37.5\" ry=\"22.5\" cx=\"209.1\" cy=\"42.5\"/><line stroke=\"#000000\" stroke-width=\"1\" fill=\"none\" class=\"s-line\" x-display=\"true\" x-stroke-type=\"solid\" stroke-dasharray=\"none\" x-id=\"\" id=\"goog_852326035\" x1=\"287.6\" x2=\"349.6\" y1=\"20\" y2=\"61\"/><g class=\"s-text\" stroke-width=\"0\" fill=\"#000000\" fill-opacity=\"1\" kerning=\"auto\" letter-spacing=\"normal\" x-display=\"true\" x-id=\"\" id=\"goog_852326036\" font-size=\"18\" font-family=\"Courier New\" font-weight=\"normal\" font-style=\"normal\" text-anchor=\"start\" text-decoration=\"none\" x-width=\"114.6\" x-height=\"31\" x-left=\"40\" x-top=\"92\"><rect class=\"s-text-box\" stroke=\"none\" fill=\"#000000\" fill-opacity=\"0.001\" width=\"114.6\" height=\"31\" x=\"40\" y=\"92\"/><text class=\"s-text-l0\" xml:space=\"preserve\" stroke=\"none\" fill=\"inherit\" fill-opacity=\"1\" text-decoration=\"none\" x=\"40\" y=\"107\">text</text></g><image image-rendering=\"optimizeQuality\" preserveAspectRatio=\"none\" class=\"s-image\" x-display=\"true\" x-id=\"\" id=\"goog_852326037\" x=\"166.6\" y=\"90\" x-natural-width=\"1966\" x-natural-height=\"375\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"data:image/png;base64,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\" width=\"259\" height=\"49.2\"/><!--SHAPE{\"type\":\"s-tblock\",\"id\":\"text\",\"display\":\"true\",\"desc\":null,\"multiple\":\"false\",\"valign\":\"\",\"line-height\":\"\",\"line-height-ratio\":\"\",\"box\":{\"x\":40,\"y\":160,\"width\":107.6,\"height\":20.5},\"format\":{\"base\":\"\",\"type\":\"\"},\"value\":\"\",\"ref-id\":\"\",\"overflow\":\"\",\"word-wrap\":\"break-word\",\"svg\":{\"tag\":\"text\",\"attrs\":{\"x\":40,\"y\":175,\"xml:space\":\"preserve\",\"kerning\":\"auto\",\"letter-spacing\":\"normal\",\"id\":\"goog_852326038\",\"fill\":\"#000000\",\"fill-opacity\":\"1\",\"font-size\":\"18\",\"font-family\":\"Courier New\",\"font-weight\":\"normal\",\"font-style\":\"normal\",\"text-anchor\":\"start\",\"text-decoration\":\"none\"}}}SHAPE--><!--LAYOUT<g xmlns=\"http://www.w3.org/2000/svg\" class=\"s-tblock\" x-format-type=\"\" x-value=\"\" x-format-base=\"\" x-ref-id=\"\" kerning=\"auto\" letter-spacing=\"normal\" x-display=\"true\" x-multiple=\"false\" id=\"goog_852326038\" x-id=\"text\" fill=\"#000000\" fill-opacity=\"1\" font-size=\"18\" font-family=\"Courier New\" font-weight=\"normal\" font-style=\"normal\" text-anchor=\"start\" text-decoration=\"none\" x-width=\"107.6\" x-height=\"20.5\" x-left=\"40\" x-top=\"160\"><rect class=\"s-tblock-box\" stroke=\"none\" fill=\"#0096fd\" fill-opacity=\"0.2\" width=\"107.6\" height=\"20.5\" x=\"40\" y=\"160\"/><text class=\"s-tblock-id\" font-size=\"10.5\" font-family=\"Helvetica\" font-weight=\"normal\" font-style=\"normal\" text-decoration=\"none\" text-anchor=\"start\" kerning=\"auto\" stroke=\"none\" fill=\"#0096fd\" fill-opacity=\"1\" x=\"44\" y=\"171\">text</text></g>LAYOUT--><!--SHAPE{\"type\":\"s-iblock\",\"id\":\"image\",\"display\":\"true\",\"desc\":null,\"box\":{\"x\":171.6,\"y\":161,\"width\":177,\"height\":73},\"position-x\":\"left\",\"position-y\":\"top\",\"svg\":{\"tag\":\"image\",\"attrs\":{\"x\":171.6,\"y\":161,\"width\":177,\"height\":73}}}SHAPE--><!--LAYOUT<g xmlns=\"http://www.w3.org/2000/svg\" class=\"s-iblock\" x-display=\"true\" id=\"goog_852326039\" x-id=\"image\" x-width=\"177\" x-height=\"73\" x-left=\"171.6\" x-top=\"161\"><rect class=\"s-iblock-box\" stroke=\"none\" fill=\"#0096fd\" fill-opacity=\"0.2\" width=\"177\" height=\"73\" x=\"171.6\" y=\"161\"/><image width=\"16\" height=\"16\" class=\"s-iblock-mark\" opacity=\"0.5\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"assets/icons/x-image-mark.svg\" display=\"inline\" x=\"251.60000000000002\" y=\"189\"/><text class=\"s-iblock-id\" font-size=\"10.5\" font-family=\"Helvetica\" font-weight=\"normal\" font-style=\"normal\" text-decoration=\"none\" text-anchor=\"start\" kerning=\"auto\" stroke=\"none\" fill=\"#0096fd\" fill-opacity=\"1\" x=\"175.6\" y=\"172\">image</text></g>LAYOUT--><!--SHAPE{\"type\":\"s-pageno\",\"id\":\"\",\"display\":\"true\",\"desc\":null,\"box\":{\"x\":375.6,\"y\":160,\"width\":128,\"height\":20.5},\"target\":\"\",\"format\":\"{page}\",\"overflow\":\"\",\"svg\":{\"tag\":\"text\",\"attrs\":{\"x\":439.6,\"y\":175,\"kerning\":\"auto\",\"letter-spacing\":\"normal\",\"id\":\"goog_852326040\",\"fill\":\"#000000\",\"fill-opacity\":\"1\",\"font-size\":\"18\",\"font-family\":\"Courier New\",\"font-weight\":\"normal\",\"font-style\":\"normal\",\"text-anchor\":\"middle\",\"text-decoration\":\"none\"}}}SHAPE--><!--LAYOUT<g xmlns=\"http://www.w3.org/2000/svg\" class=\"s-pageno\" kerning=\"auto\" letter-spacing=\"normal\" x-display=\"true\" x-format=\"{page}\" id=\"goog_852326040\" fill=\"#000000\" fill-opacity=\"1\" font-size=\"18\" font-family=\"Courier New\" font-weight=\"normal\" font-style=\"normal\" text-anchor=\"middle\" text-decoration=\"none\" x-width=\"128\" x-height=\"20.5\" x-left=\"375.6\" x-top=\"160\" x-id=\"\"><rect class=\"s-pageno-box\" stroke=\"none\" fill=\"#0096fd\" fill-opacity=\"0.2\" width=\"128\" height=\"20.5\" x=\"375.6\" y=\"160\"/><text kerning=\"auto\" font-size=\"10\" font-family=\"Helvetica\" text-anchor=\"middle\" stroke=\"none\" fill=\"#0096fd\" fill-opacity=\"1\" y=\"171\" x=\"439.6\">{page}</text></g>LAYOUT--><!--SHAPE{\"type\":\"s-list\",\"id\":\"default\",\"display\":\"true\",\"desc\":null,\"footer\":{\"height\":28.2,\"svg\":{\"tag\":\"g\",\"content\":\"\"},\"translate\":{\"x\":0,\"y\":-65.79999999999995}},\"footer-enabled\":\"true\",\"page-footer\":{\"height\":28.2,\"svg\":{\"tag\":\"g\",\"content\":\"\"},\"translate\":{\"x\":0,\"y\":-37.599999999999966}},\"page-footer-enabled\":\"true\",\"detail\":{\"height\":37.6,\"svg\":{\"tag\":\"g\",\"content\":\"\"},\"translate\":{\"x\":0,\"y\":0}},\"header\":{\"height\":37.6,\"svg\":{\"tag\":\"g\",\"content\":\"<rect xmlns=\\\"http://www.w3.org/2000/svg\\\" stroke=\\\"#000000\\\" stroke-width=\\\"1\\\" fill=\\\"#FFFFFF\\\" fill-opacity=\\\"1\\\" class=\\\"s-rect\\\" x-display=\\\"true\\\" x-stroke-type=\\\"solid\\\" stroke-dasharray=\\\"none\\\" x-id=\\\"\\\" rx=\\\"0\\\" ry=\\\"0\\\" id=\\\"goog_852326042\\\" width=\\\"85.6\\\" height=\\\"18\\\" x=\\\"40\\\" y=\\\"265\\\"/>\"},\"translate\":{\"x\":0,\"y\":0}},\"header-enabled\":\"true\",\"svg\":{\"tag\":\"g\",\"attrs\":{}},\"content-height\":150.4,\"page-break\":\"true\"}SHAPE--><!--LAYOUT<g xmlns=\"http://www.w3.org/2000/svg\" class=\"s-list\" x-id=\"default\" x-header-enabled=\"true\" x-page-footer-enabled=\"true\" x-footer-enabled=\"true\" x-changing-page=\"true\" x-display=\"true\" id=\"goog_852326041\" width=\"365.6\" height=\"188\" x=\"40\" y=\"256\"><g class=\"s-list-header\" transform=\"translate(0,0) rotate(0 0 0)\" x-top=\"256\" x-height=\"37.6\"><rect stroke=\"#000000\" stroke-width=\"1\" fill=\"#FFFFFF\" fill-opacity=\"1\" class=\"s-rect\" x-display=\"true\" x-stroke-type=\"solid\" stroke-dasharray=\"none\" x-id=\"\" rx=\"0\" ry=\"0\" id=\"goog_852326042\" width=\"85.6\" height=\"18\" x=\"40\" y=\"265\"/></g><g class=\"s-list-detail\" transform=\"translate(0,0) rotate(0 0 0)\" x-top=\"293.6\" x-height=\"37.6\"/><g class=\"s-list-page-footer\" transform=\"translate(0,0) rotate(0 0 0)\" x-top=\"331.2\" x-height=\"28.2\"/><g class=\"s-list-footer\" transform=\"translate(0,0) rotate(0 0 0)\" x-top=\"359.4\" x-height=\"28.2\"/><text class=\"s-list-id\" font-size=\"10\" font-family=\"Helvetica\" font-weight=\"normal\" font-style=\"normal\" text-anchor=\"start\" stroke=\"none\" fill=\"#0096fd\" fill-opacity=\"1\" x=\"44\" y=\"268\">default</text><rect stroke-dasharray=\"2\" stroke=\"#0096fd\" stroke-width=\"0.5\" fill=\"#FFFFFF\" fill-opacity=\"0\" class=\"s-list-face\" width=\"365.6\" height=\"188\" x=\"40\" y=\"256\"/></g>LAYOUT--></g></svg>","state":{"layout-guide":[]}}
@@ -0,0 +1,121 @@
1
+ module Thinreports
2
+ module SchemaHelper
3
+ BASIC_SCHEMA_JSON = <<-EOF
4
+ {
5
+ "version": "%{version}",
6
+ "title": "Report Title",
7
+ "report": {
8
+ "paper-type": "A4",
9
+ "width": 100.0,
10
+ "height": 200.0,
11
+ "orientation": "landscape",
12
+ "margin": [100.0, 200.0, 300.0, 999.9]
13
+ },
14
+ "state": {
15
+ "layout-guides": [
16
+ { "type": "x", "position": 0.1 }
17
+ ]
18
+ },
19
+ "items": [
20
+ { "type": "rect", "id": "rect_with_id", "display": true },
21
+ { "type": "text-block", "id": "text_block", "x": 100.0, "y": 100.0, "value": "", "display": true },
22
+ { "type": "text-block", "id": "text_block_referenced", "x": 100.0, "y": 100.0, "value": "", "display": true, "reference-id": "text_block" },
23
+ { "type": "text-block", "id": "text_block_hidden", "x": 100.0, "y": 100.0, "value": "default value", "display": false },
24
+ { "type": "image-block", "id": "image_block", "x": 200.0, "y": 200.0, "width": 150.0, "height": 150.0, "value": "", "display": true },
25
+ {
26
+ "type": "list",
27
+ "id": "default",
28
+ "x": 1.0,
29
+ "y": 2.0,
30
+ "display": true,
31
+ "width": 200.0,
32
+ "content-height": 300,
33
+ "auto-page-break": true,
34
+ "header": {
35
+ "enabled": true,
36
+ "height": 10.0,
37
+ "items": []
38
+ },
39
+ "detail": {
40
+ "height": 70.0,
41
+ "items": [
42
+ { "type": "text-block", "id": "name", "value": "" }
43
+ ]
44
+ },
45
+ "page-footer": {
46
+ "enabled": true,
47
+ "items": [],
48
+ "height": 30.0
49
+ },
50
+ "footer": {
51
+ "enabled": true,
52
+ "items": [],
53
+ "height": 40.0
54
+ }
55
+ }
56
+ ]
57
+ }
58
+ EOF
59
+
60
+ LIST_NO_HEADER_SCHEMA_JSON = <<-EOF
61
+ {
62
+ "version": "%{version}",
63
+ "title": "Report Title",
64
+ "report": {
65
+ "paper-type": "A4",
66
+ "width": 100.0,
67
+ "height": 200.0,
68
+ "orientation": "landscape",
69
+ "margin": [100.0, 200.0, 300.0, 999.9]
70
+ },
71
+ "state": {
72
+ "layout-guides": []
73
+ },
74
+ "items": [
75
+ {
76
+ "type": "list",
77
+ "id": "default",
78
+ "x": 1.0,
79
+ "y": 2.0,
80
+ "display": true,
81
+ "header": {
82
+ "enabled": false,
83
+ "height": 10.0,
84
+ "items": []
85
+ },
86
+ "width": 200.0,
87
+ "content-height": 300,
88
+ "auto-page-break": true,
89
+ "detail": {
90
+ "height": 20.0,
91
+ "items": [
92
+ { "type": "text-block", "id": "name", "value": "" }
93
+ ]
94
+ },
95
+ "page-footer": {
96
+ "enabled": true,
97
+ "items": [],
98
+ "height": 30.0
99
+ },
100
+ "footer": {
101
+ "enabled": true,
102
+ "items": [],
103
+ "height": 40.0
104
+ }
105
+ }
106
+ ]
107
+ }
108
+ EOF
109
+
110
+ def layout_file(options = {})
111
+ # FIXME: '0.9.0' -> Thinreports::VERSION
112
+ version = options[:version] || '0.9.0'
113
+ schema_json = options[:schema] || BASIC_SCHEMA_JSON
114
+
115
+ Tempfile.open %w( test-thinreports-layout .tlf ) do |file|
116
+ file.puts (schema_json % { version: version })
117
+ file
118
+ end
119
+ end
120
+ end
121
+ end
data/test/test_helper.rb CHANGED
@@ -11,69 +11,32 @@ require 'pathname'
11
11
  require 'chunky_png'
12
12
  require 'thinreports'
13
13
 
14
+ require 'schema_helper'
15
+
14
16
  module Thinreports::TestHelper
15
17
  ROOT = Pathname.new(File.expand_path('..', __FILE__))
16
18
 
17
- def setup
18
- Thinreports::TestHelper.disable_stderr
19
- end
20
-
21
- def teardown
22
- super
23
- clear_temp_files
24
- end
25
-
26
- def new_report(file, &block)
27
- report = Thinreports::Report.new layout: data_file(file)
28
- block.call(report) if block_given?
29
- report
30
- end
31
-
32
- def new_layout(file)
33
- Thinreports::Layout.new(data_file(file))
34
- end
35
-
36
- def new_layout_format(file)
37
- Thinreports::Layout::Format.build(data_file(file))
38
- end
39
-
40
- def clear_temp_files
41
- FileUtils.rm Dir.glob(temp_path.join('*'))
42
- end
43
-
44
- def clean_whitespaces(s)
45
- s.gsub(/^\s*|\n\s*/, '')
46
- end
19
+ include Thinreports::SchemaHelper
47
20
 
48
- def data_file(filename)
49
- ROOT.join('data', filename).to_s
21
+ def assert_deprecated(&block)
22
+ _out, err = capture_io { block.call }
23
+ assert err.to_s.include?('[DEPRECATION]')
50
24
  end
51
25
 
52
- def read_data_file(filename)
53
- File.read(data_file(filename))
26
+ def data_file(*paths)
27
+ ROOT.join('data', *paths).to_s
54
28
  end
55
29
 
56
- def temp_file(extname = 'pdf')
57
- filename = (('a'..'z').to_a + (0..9).to_a).shuffle[0, 8].join + ".#{extname}"
58
- temp_path.join(filename).to_s
30
+ def read_data_file(*paths)
31
+ File.read(data_file(*paths))
59
32
  end
60
33
 
61
34
  def temp_path
62
35
  ROOT.join('tmp')
63
36
  end
64
37
 
65
- @@original_stderr = nil
66
-
67
- def self.disable_stderr
68
- unless $stdout.is_a? StringIO
69
- @@original_stderr = $stderr
70
- $stderr = StringIO.new
71
- end
72
- end
73
-
74
- def self.enable_stderr
75
- $stderr = @@original_stderr
38
+ def teardown
39
+ super
40
+ FileUtils.rm Dir.glob(temp_path.join('*'))
76
41
  end
77
42
  end
78
-
79
- Minitest.after_run { Thinreports::TestHelper.enable_stderr }
@@ -14,58 +14,58 @@ class Thinreports::Core::Format::BaseTest < Minitest::Test
14
14
  'c3_1_2' => 'c3_1_2'
15
15
  }
16
16
  },
17
- 'c4' => 'c4',
17
+ 'c4' => 'c4',
18
18
  'c5' => 'c5',
19
19
  'c6' => 9999,
20
- 'c7' => 'true',
21
- 'c8' => 'false',
20
+ 'c7' => true,
21
+ 'c8' => false,
22
22
  'c9' => {
23
- 'c9_1' => 'true',
24
- 'c9_2' => 'false'
23
+ 'c9_1' => true,
24
+ 'c9_2' => false
25
25
  },
26
- 'c10' => 'c10',
26
+ 'c10' => 'c10',
27
27
  'c11' => {
28
28
  'c11_1' => 'c11_1'
29
29
  },
30
30
  'c20' => 'c20',
31
31
  'c21' => 'c21'
32
32
  }
33
-
33
+
34
34
  class TestFormat < Thinreports::Core::Format::Base
35
35
  # For testing
36
36
  attr_reader :config
37
-
37
+
38
38
  # Basic methods
39
39
  config_reader :c1
40
- config_reader c2_1: %w( c2 c2_1 ),
40
+ config_reader c2_1: %w( c2 c2_1 ),
41
41
  c3_1_1: %w( c3 c3_1 c3_1_1 )
42
42
  config_reader :c4, :c5
43
43
  config_reader 'c6'
44
-
44
+
45
45
  # Alias methods
46
46
  config_reader c1_alias: %w( c1 ),
47
47
  c2_1_alias: %w( c2 c2_1 )
48
-
48
+
49
49
  # Invalid methods
50
- config_reader c3_invalid: %w( c3 c3_1 not_exist_key )
51
-
50
+ config_reader c3_invalid: %w( c3 c3_1 not_exist_key )
51
+
52
52
  # Customized methods
53
53
  config_reader c2_1_customized: %w( c2 c2_1 ) do |val|
54
54
  "Customized #{val}"
55
55
  end
56
-
56
+
57
57
  # Checker methods
58
- config_checker 'true', :c7, :c8
59
- config_checker 'true', c9_1: %w( c9 c9_1 ),
60
- c9_2: %w( c9 c9_2 )
61
-
58
+ config_checker true, :c7, :c8
59
+ config_checker true, c9_1: %w( c9 c9_1 ),
60
+ c9_2: %w( c9 c9_2 )
61
+
62
62
  # Writer methods
63
63
  config_writer :c10
64
64
  config_writer c10_alias: %w( c10 )
65
65
  config_writer c11_1: %w( c11 c11_1 )
66
66
  # Writer for not exist config on default
67
67
  config_writer c11_2: %w( c11 c11_2 )
68
-
68
+
69
69
  # Accessor methods
70
70
  config_accessor :c20
71
71
  config_accessor :c21 do |val|
@@ -76,7 +76,7 @@ class Thinreports::Core::Format::BaseTest < Minitest::Test
76
76
  def setup
77
77
  @format = TestFormat.new(TEST_FORMAT_CONFIG)
78
78
  end
79
-
79
+
80
80
  def test_definition_of_all_config_methods
81
81
  methods = [:c1, :c2_1, :c3_1_1, :c4, :c5, :c6,
82
82
  :c1_alias, :c2_1_alias,
@@ -87,7 +87,7 @@ class Thinreports::Core::Format::BaseTest < Minitest::Test
87
87
  :c20, :c20=, :c21, :c21=]
88
88
  assert methods.all? {|m| TestFormat.method_defined?(m) }
89
89
  end
90
-
90
+
91
91
  def test_readers
92
92
  # Basic
93
93
  assert_equal @format.c1, 'c1'
@@ -104,14 +104,14 @@ class Thinreports::Core::Format::BaseTest < Minitest::Test
104
104
  # Customized
105
105
  assert_equal @format.c2_1_customized, 'Customized c2_1'
106
106
  end
107
-
107
+
108
108
  def test_checkers
109
109
  assert_equal @format.c7?, true
110
110
  assert_equal @format.c8?, false
111
111
  assert_equal @format.c9_1?, true
112
112
  assert_equal @format.c9_2?, false
113
113
  end
114
-
114
+
115
115
  def test_reader_cannot_write_value
116
116
  assert_raises NoMethodError do
117
117
  @format.c1 = 'write'
@@ -121,28 +121,32 @@ class Thinreports::Core::Format::BaseTest < Minitest::Test
121
121
  @format.c1_alias = 'write'
122
122
  end
123
123
  end
124
-
124
+
125
125
  def test_writers
126
126
  config = @format.config
127
-
127
+
128
128
  @format.c10 = 'c1_changed'
129
129
  assert_equal config['c10'], 'c1_changed'
130
-
130
+
131
131
  @format.c10_alias = 'c10_changed_by_alias'
132
132
  assert_equal config['c10'], 'c10_changed_by_alias'
133
-
133
+
134
134
  @format.c11_1 = 'c11_1_changed'
135
135
  assert_equal config['c11']['c11_1'], 'c11_1_changed'
136
-
136
+
137
137
  @format.c11_2 = 'c11_2_created'
138
138
  assert_equal config['c11']['c11_2'], 'c11_2_created'
139
139
  end
140
-
140
+
141
141
  def test_accessors
142
142
  @format.c20 = 'c20_changed'
143
143
  assert_equal @format.c20, 'c20_changed'
144
-
144
+
145
145
  @format.c21 = 'c21_changed'
146
146
  assert_equal @format.c21, 'Customized c21_changed'
147
147
  end
148
- end
148
+
149
+ def test_attributes
150
+ assert_same @format.config, @format.attributes
151
+ end
152
+ end