thinreports 0.9.1 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/test.yml +39 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +59 -2
  5. data/Dockerfile +12 -0
  6. data/Gemfile +7 -4
  7. data/README.md +44 -22
  8. data/Rakefile +14 -31
  9. data/lib/thinreports.rb +16 -15
  10. data/lib/thinreports/config.rb +2 -24
  11. data/lib/thinreports/core/errors.rb +6 -17
  12. data/lib/thinreports/core/format/base.rb +62 -61
  13. data/lib/thinreports/core/shape.rb +10 -12
  14. data/lib/thinreports/core/shape/base.rb +3 -12
  15. data/lib/thinreports/core/shape/base/interface.rb +34 -32
  16. data/lib/thinreports/core/shape/base/internal.rb +45 -43
  17. data/lib/thinreports/core/shape/basic.rb +12 -12
  18. data/lib/thinreports/core/shape/basic/block_format.rb +8 -6
  19. data/lib/thinreports/core/shape/basic/block_interface.rb +24 -22
  20. data/lib/thinreports/core/shape/basic/block_internal.rb +28 -26
  21. data/lib/thinreports/core/shape/basic/format.rb +11 -9
  22. data/lib/thinreports/core/shape/basic/interface.rb +79 -77
  23. data/lib/thinreports/core/shape/basic/internal.rb +17 -14
  24. data/lib/thinreports/core/shape/image_block.rb +9 -9
  25. data/lib/thinreports/core/shape/image_block/format.rb +7 -5
  26. data/lib/thinreports/core/shape/image_block/interface.rb +15 -13
  27. data/lib/thinreports/core/shape/image_block/internal.rb +10 -8
  28. data/lib/thinreports/core/shape/list.rb +13 -13
  29. data/lib/thinreports/core/shape/list/format.rb +83 -77
  30. data/lib/thinreports/core/shape/list/manager.rb +179 -176
  31. data/lib/thinreports/core/shape/list/page.rb +91 -93
  32. data/lib/thinreports/core/shape/list/page_state.rb +42 -40
  33. data/lib/thinreports/core/shape/list/section_format.rb +28 -26
  34. data/lib/thinreports/core/shape/list/section_interface.rb +42 -40
  35. data/lib/thinreports/core/shape/list/section_internal.rb +21 -19
  36. data/lib/thinreports/core/shape/manager.rb +4 -13
  37. data/lib/thinreports/core/shape/manager/format.rb +21 -19
  38. data/lib/thinreports/core/shape/manager/internal.rb +87 -84
  39. data/lib/thinreports/core/shape/manager/target.rb +93 -95
  40. data/lib/thinreports/core/shape/page_number.rb +9 -9
  41. data/lib/thinreports/core/shape/page_number/format.rb +20 -18
  42. data/lib/thinreports/core/shape/page_number/interface.rb +20 -18
  43. data/lib/thinreports/core/shape/page_number/internal.rb +46 -44
  44. data/lib/thinreports/core/shape/style.rb +5 -14
  45. data/lib/thinreports/core/shape/style/base.rb +121 -120
  46. data/lib/thinreports/core/shape/style/basic.rb +12 -10
  47. data/lib/thinreports/core/shape/style/graphic.rb +35 -33
  48. data/lib/thinreports/core/shape/style/text.rb +113 -107
  49. data/lib/thinreports/core/shape/text.rb +9 -9
  50. data/lib/thinreports/core/shape/text/format.rb +10 -9
  51. data/lib/thinreports/core/shape/text/interface.rb +13 -11
  52. data/lib/thinreports/core/shape/text/internal.rb +14 -12
  53. data/lib/thinreports/core/shape/text_block.rb +10 -10
  54. data/lib/thinreports/core/shape/text_block/format.rb +35 -33
  55. data/lib/thinreports/core/shape/text_block/formatter.rb +26 -24
  56. data/lib/thinreports/core/shape/text_block/formatter/basic.rb +25 -25
  57. data/lib/thinreports/core/shape/text_block/formatter/datetime.rb +15 -12
  58. data/lib/thinreports/core/shape/text_block/formatter/number.rb +52 -34
  59. data/lib/thinreports/core/shape/text_block/formatter/padding.rb +17 -14
  60. data/lib/thinreports/core/shape/text_block/interface.rb +25 -23
  61. data/lib/thinreports/core/shape/text_block/internal.rb +66 -68
  62. data/lib/thinreports/core/utils.rb +7 -3
  63. data/lib/thinreports/generator/pdf.rb +24 -25
  64. data/lib/thinreports/generator/pdf/document.rb +109 -110
  65. data/lib/thinreports/generator/pdf/document/draw_shape.rb +57 -51
  66. data/lib/thinreports/generator/pdf/document/draw_template_items.rb +50 -47
  67. data/lib/thinreports/generator/pdf/document/font.rb +67 -58
  68. data/lib/thinreports/generator/pdf/document/graphics.rb +32 -33
  69. data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +121 -121
  70. data/lib/thinreports/generator/pdf/document/graphics/basic.rb +112 -114
  71. data/lib/thinreports/generator/pdf/document/graphics/image.rb +58 -150
  72. data/lib/thinreports/generator/pdf/document/graphics/text.rb +149 -137
  73. data/lib/thinreports/generator/pdf/document/page.rb +60 -64
  74. data/lib/thinreports/generator/pdf/document/parse_color.rb +37 -37
  75. data/lib/thinreports/generator/pdf/drawer/base.rb +41 -41
  76. data/lib/thinreports/generator/pdf/drawer/list.rb +56 -54
  77. data/lib/thinreports/generator/pdf/drawer/list_section.rb +42 -40
  78. data/lib/thinreports/generator/pdf/drawer/page.rb +101 -96
  79. data/lib/thinreports/generator/pdf/prawn_ext.rb +4 -30
  80. data/lib/thinreports/generator/pdf/prawn_ext/calc_image_dimensions.rb +32 -0
  81. data/lib/thinreports/generator/pdf/prawn_ext/width_of.rb +35 -0
  82. data/lib/thinreports/layout.rb +5 -7
  83. data/lib/thinreports/layout/base.rb +5 -9
  84. data/lib/thinreports/layout/format.rb +17 -13
  85. data/lib/thinreports/layout/legacy_schema.rb +17 -13
  86. data/lib/thinreports/layout/version.rb +22 -25
  87. data/lib/thinreports/report.rb +4 -6
  88. data/lib/thinreports/report/base.rb +24 -51
  89. data/lib/thinreports/report/internal.rb +13 -15
  90. data/lib/thinreports/report/page.rb +5 -11
  91. data/lib/thinreports/version.rb +2 -2
  92. data/thinreports.gemspec +10 -19
  93. metadata +13 -288
  94. data/.travis.yml +0 -19
  95. data/examples/character_spacing/character_spacing.rb +0 -8
  96. data/examples/character_spacing/character_spacing.tlf +0 -293
  97. data/examples/dynamic_image/dynamic_image.rb +0 -31
  98. data/examples/dynamic_image/dynamic_image.tlf +0 -661
  99. data/examples/dynamic_image/img200x100.png +0 -0
  100. data/examples/dynamic_image/img50x50.png +0 -0
  101. data/examples/dynamic_style/dynamic_style.rb +0 -150
  102. data/examples/dynamic_style/dynamic_style.tlf +0 -1835
  103. data/examples/dynamic_style/dynamic_style_in_list.tlf +0 -344
  104. data/examples/dynamic_style/image.png +0 -0
  105. data/examples/eudc/eudc.rb +0 -20
  106. data/examples/eudc/eudc.tlf +0 -180
  107. data/examples/eudc/eudc.ttf +0 -0
  108. data/examples/helper.rb +0 -50
  109. data/examples/hidden_shapes/hidden_shapes.rb +0 -9
  110. data/examples/hidden_shapes/hidden_shapes.tlf +0 -449
  111. data/examples/list_events/list_events.rb +0 -32
  112. data/examples/list_events/list_events.tlf +0 -361
  113. data/examples/list_manual_generation/list_manual_generation.rb +0 -22
  114. data/examples/list_manual_generation/list_manual_generation.tlf +0 -132
  115. data/examples/list_page_number/list_page_number.rb +0 -17
  116. data/examples/list_page_number/list_page_number.tlf +0 -254
  117. data/examples/page_number/page_number.rb +0 -33
  118. data/examples/page_number/page_number.tlf +0 -215
  119. data/examples/palleted_png/palleted_png.png +0 -0
  120. data/examples/palleted_png/palleted_png.rb +0 -11
  121. data/examples/palleted_png/palleted_png.tlf +0 -47
  122. data/examples/password_setting/password_setting.rb +0 -10
  123. data/examples/password_setting/password_setting.tlf +0 -45
  124. data/examples/report_callbacks/report_callbacks.rb +0 -14
  125. data/examples/report_callbacks/report_callbacks.tlf +0 -147
  126. data/examples/single_line_tblock/single_line_tblock.rb +0 -13
  127. data/examples/single_line_tblock/single_line_tblock.tlf +0 -170
  128. data/examples/tblock_overflow/tblock_overflow.rb +0 -20
  129. data/examples/tblock_overflow/tblock_overflow.tlf +0 -538
  130. data/examples/tblock_styles/font_size.tlf +0 -383
  131. data/examples/tblock_styles/tblock_styles.rb +0 -43
  132. data/examples/tblock_styles/tblock_styles.tlf +0 -889
  133. data/examples/text_align/text_align.rb +0 -8
  134. data/examples/text_align/text_align.tlf +0 -241
  135. data/examples/typeB_page_size/B4_ISO.tlf +0 -45
  136. data/examples/typeB_page_size/B4_JIS.tlf +0 -45
  137. data/examples/typeB_page_size/typeB_page_size.rb +0 -17
  138. data/examples/word_wrap/word_wrap.rb +0 -26
  139. data/examples/word_wrap/word_wrap.tlf +0 -297
  140. data/lib/thinreports/generator.rb +0 -29
  141. data/lib/thinreports/generator/base.rb +0 -40
  142. data/lib/thinreports/generator/configuration.rb +0 -31
  143. data/lib/thinreports/report/events.rb +0 -32
  144. data/test/data/font.ttf +0 -0
  145. data/test/data/image_normal.jpg +0 -0
  146. data/test/data/image_normal.png +0 -0
  147. data/test/data/image_normal_jpg_noext +0 -0
  148. data/test/data/image_normal_png_noext +0 -0
  149. data/test/data/image_pallete_based.png +0 -0
  150. data/test/data/legacy_layout/all-items.tlf +0 -1
  151. data/test/schema_helper.rb +0 -121
  152. data/test/test_helper.rb +0 -42
  153. data/test/tmp/.gitkeep +0 -0
  154. data/test/unit/core/format/test_base.rb +0 -152
  155. data/test/unit/core/shape/base/test_internal.rb +0 -87
  156. data/test/unit/core/shape/basic/test_block_format.rb +0 -23
  157. data/test/unit/core/shape/basic/test_block_interface.rb +0 -29
  158. data/test/unit/core/shape/basic/test_block_internal.rb +0 -55
  159. data/test/unit/core/shape/basic/test_format.rb +0 -37
  160. data/test/unit/core/shape/basic/test_interface.rb +0 -108
  161. data/test/unit/core/shape/basic/test_internal.rb +0 -55
  162. data/test/unit/core/shape/image_block/test_interface.rb +0 -24
  163. data/test/unit/core/shape/image_block/test_internal.rb +0 -31
  164. data/test/unit/core/shape/list/test_format.rb +0 -111
  165. data/test/unit/core/shape/list/test_manager.rb +0 -67
  166. data/test/unit/core/shape/list/test_page.rb +0 -82
  167. data/test/unit/core/shape/list/test_page_state.rb +0 -31
  168. data/test/unit/core/shape/list/test_section_format.rb +0 -36
  169. data/test/unit/core/shape/list/test_section_interface.rb +0 -75
  170. data/test/unit/core/shape/list/test_section_internal.rb +0 -50
  171. data/test/unit/core/shape/manager/test_format.rb +0 -38
  172. data/test/unit/core/shape/manager/test_internal.rb +0 -132
  173. data/test/unit/core/shape/manager/test_target.rb +0 -140
  174. data/test/unit/core/shape/page_number/test_format.rb +0 -55
  175. data/test/unit/core/shape/page_number/test_interface.rb +0 -33
  176. data/test/unit/core/shape/page_number/test_internal.rb +0 -81
  177. data/test/unit/core/shape/styles/test_base.rb +0 -191
  178. data/test/unit/core/shape/styles/test_basic.rb +0 -24
  179. data/test/unit/core/shape/styles/test_graphic.rb +0 -50
  180. data/test/unit/core/shape/styles/test_text.rb +0 -97
  181. data/test/unit/core/shape/text/test_format.rb +0 -44
  182. data/test/unit/core/shape/text/test_internal.rb +0 -20
  183. data/test/unit/core/shape/text_block/formatter/test_basic.rb +0 -24
  184. data/test/unit/core/shape/text_block/formatter/test_datetime.rb +0 -49
  185. data/test/unit/core/shape/text_block/formatter/test_number.rb +0 -76
  186. data/test/unit/core/shape/text_block/formatter/test_padding.rb +0 -77
  187. data/test/unit/core/shape/text_block/test_format.rb +0 -169
  188. data/test/unit/core/shape/text_block/test_formatter.rb +0 -28
  189. data/test/unit/core/shape/text_block/test_interface.rb +0 -63
  190. data/test/unit/core/shape/text_block/test_internal.rb +0 -128
  191. data/test/unit/core/test_shape.rb +0 -52
  192. data/test/unit/core/test_utils.rb +0 -68
  193. data/test/unit/generator/pdf/document/graphics/test_attributes.rb +0 -135
  194. data/test/unit/generator/pdf/document/graphics/test_basic.rb +0 -45
  195. data/test/unit/generator/pdf/document/graphics/test_image.rb +0 -150
  196. data/test/unit/generator/pdf/document/graphics/test_text.rb +0 -171
  197. data/test/unit/generator/pdf/document/test_font.rb +0 -84
  198. data/test/unit/generator/pdf/document/test_graphics.rb +0 -42
  199. data/test/unit/generator/pdf/document/test_page.rb +0 -122
  200. data/test/unit/generator/pdf/document/test_parse_color.rb +0 -30
  201. data/test/unit/generator/pdf/test_document.rb +0 -20
  202. data/test/unit/generator/test_base.rb +0 -40
  203. data/test/unit/generator/test_configuration.rb +0 -21
  204. data/test/unit/generator/test_pdf.rb +0 -24
  205. data/test/unit/layout/test_base.rb +0 -41
  206. data/test/unit/layout/test_format.rb +0 -100
  207. data/test/unit/layout/test_legacy_schema.rb +0 -574
  208. data/test/unit/layout/test_version.rb +0 -95
  209. data/test/unit/report/test_base.rb +0 -262
  210. data/test/unit/report/test_internal.rb +0 -206
  211. data/test/unit/test_config.rb +0 -51
  212. data/test/unit/test_layout.rb +0 -12
  213. data/test/unit/test_report.rb +0 -18
@@ -1,29 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Thinreports
4
-
5
- module Generator
6
- # @param [Symbol] type
7
- # @param report (see Thinreports::Generator::Base#initialize)
8
- # @param options (see Thinreports::Generator::Base#initialize)
9
- def self.new(type, report, options = {})
10
- generator = registry[type]
11
-
12
- raise Thinreports::Errors::UnknownGeneratorType.new(type) unless generator
13
-
14
- generator.new(report, options)
15
- end
16
-
17
- def self.register(type, generator)
18
- registry[type] = generator
19
- end
20
-
21
- def self.registry
22
- @generators ||= {}
23
- end
24
- end
25
- end
26
-
27
- require 'thinreports/generator/configuration'
28
- require 'thinreports/generator/base'
29
- require 'thinreports/generator/pdf'
@@ -1,40 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Thinreports
4
- module Generator
5
-
6
- # @abstract
7
- class Base
8
- # @return [Thinreports::Report::Base]
9
- attr_reader :report
10
-
11
- # @return [Hash]
12
- attr_reader :options
13
-
14
- def self.inherited(g)
15
- Generator.register(g.name.split('::').last.downcase.to_sym, g);
16
- end
17
-
18
- # @param [Thinreports::Report::Base] report
19
- # @param [Hash] options
20
- def initialize(report, options = {})
21
- report.finalize
22
-
23
- @report = report.internal
24
- @options = options || {}
25
- end
26
-
27
- # @param [String, nil] filename
28
- # @return [String, nil]
29
- # @abstract
30
- def generate
31
- raise NotImplementedError
32
- end
33
-
34
- def default_layout
35
- report.default_layout
36
- end
37
- end
38
-
39
- end
40
- end
@@ -1,31 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Thinreports
4
- module Generator
5
-
6
- # @deprecated This class will be removed in the next major version.
7
- class Configuration
8
- # @return [Symbol]
9
- attr_reader :default
10
-
11
- def initialize
12
- @default = :pdf
13
- end
14
-
15
- # @return [Thinreports::Generator::PDF::Configuration]
16
- def pdf
17
- @pdf ||= PDF::Configuration.new
18
- end
19
-
20
- # @param [Symbol] type
21
- # @return [void]
22
- def default=(type)
23
- unless Generator.registry.key?(type)
24
- raise Thinreports::Errors::UnknownGeneratorType.new(type)
25
- end
26
- @default = type
27
- end
28
- end
29
-
30
- end
31
- end
@@ -1,32 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Thinreports
4
- module Report
5
-
6
- class Events < Core::Events
7
- def initialize
8
- super(:page_create,
9
- :generate)
10
- end
11
-
12
- class Event < Thinreports::Core::Events::Event
13
- # @return [Thinreports::Report::Page, nil]
14
- attr_reader :page
15
-
16
- # @return [Array<Thinreports::Report::Page>]
17
- attr_reader :pages
18
-
19
- # @return [Thinreports::Report::Base]
20
- alias_method :report, :target
21
-
22
- def initialize(type, target, page = nil, pages = nil)
23
- super(type, target)
24
-
25
- @page = page
26
- @pages = pages
27
- end
28
- end
29
- end
30
-
31
- end
32
- end
Binary file
Binary file
Binary file
@@ -1 +0,0 @@
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":[]}}
@@ -1,121 +0,0 @@
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
@@ -1,42 +0,0 @@
1
- # coding: utf-8
2
-
3
- gem 'minitest' # for 1.9.3
4
- require 'minitest/autorun'
5
- require 'minitest/spec'
6
- require 'minitest/unit'
7
- require 'mocha/mini_test'
8
-
9
- require 'digest/sha1'
10
- require 'pathname'
11
- require 'chunky_png'
12
- require 'thinreports'
13
-
14
- require 'schema_helper'
15
-
16
- module Thinreports::TestHelper
17
- ROOT = Pathname.new(File.expand_path('..', __FILE__))
18
-
19
- include Thinreports::SchemaHelper
20
-
21
- def assert_deprecated(&block)
22
- _out, err = capture_io { block.call }
23
- assert err.to_s.include?('[DEPRECATION]')
24
- end
25
-
26
- def data_file(*paths)
27
- ROOT.join('data', *paths).to_s
28
- end
29
-
30
- def read_data_file(*paths)
31
- File.read(data_file(*paths))
32
- end
33
-
34
- def temp_path
35
- ROOT.join('tmp')
36
- end
37
-
38
- def teardown
39
- super
40
- FileUtils.rm Dir.glob(temp_path.join('*'))
41
- end
42
- end
File without changes
@@ -1,152 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test_helper'
4
-
5
- class Thinreports::Core::Format::BaseTest < Minitest::Test
6
- TEST_FORMAT_CONFIG = {
7
- 'c1' => 'c1',
8
- 'c2' => {
9
- 'c2_1' => 'c2_1'
10
- },
11
- 'c3' => {
12
- 'c3_1' => {
13
- 'c3_1_1' => 'c3_1_1',
14
- 'c3_1_2' => 'c3_1_2'
15
- }
16
- },
17
- 'c4' => 'c4',
18
- 'c5' => 'c5',
19
- 'c6' => 9999,
20
- 'c7' => true,
21
- 'c8' => false,
22
- 'c9' => {
23
- 'c9_1' => true,
24
- 'c9_2' => false
25
- },
26
- 'c10' => 'c10',
27
- 'c11' => {
28
- 'c11_1' => 'c11_1'
29
- },
30
- 'c20' => 'c20',
31
- 'c21' => 'c21'
32
- }
33
-
34
- class TestFormat < Thinreports::Core::Format::Base
35
- # For testing
36
- attr_reader :config
37
-
38
- # Basic methods
39
- config_reader :c1
40
- config_reader c2_1: %w( c2 c2_1 ),
41
- c3_1_1: %w( c3 c3_1 c3_1_1 )
42
- config_reader :c4, :c5
43
- config_reader 'c6'
44
-
45
- # Alias methods
46
- config_reader c1_alias: %w( c1 ),
47
- c2_1_alias: %w( c2 c2_1 )
48
-
49
- # Invalid methods
50
- config_reader c3_invalid: %w( c3 c3_1 not_exist_key )
51
-
52
- # Customized methods
53
- config_reader c2_1_customized: %w( c2 c2_1 ) do |val|
54
- "Customized #{val}"
55
- end
56
-
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
-
62
- # Writer methods
63
- config_writer :c10
64
- config_writer c10_alias: %w( c10 )
65
- config_writer c11_1: %w( c11 c11_1 )
66
- # Writer for not exist config on default
67
- config_writer c11_2: %w( c11 c11_2 )
68
-
69
- # Accessor methods
70
- config_accessor :c20
71
- config_accessor :c21 do |val|
72
- "Customized #{val}"
73
- end
74
- end
75
-
76
- def setup
77
- @format = TestFormat.new(TEST_FORMAT_CONFIG)
78
- end
79
-
80
- def test_definition_of_all_config_methods
81
- methods = [:c1, :c2_1, :c3_1_1, :c4, :c5, :c6,
82
- :c1_alias, :c2_1_alias,
83
- :c3_invalid,
84
- :c2_1_customized,
85
- :c7?, :c8?, :c9_1?, :c9_2?,
86
- :c10=, :c10_alias=, :c11_1=, :c11_2=,
87
- :c20, :c20=, :c21, :c21=]
88
- assert methods.all? {|m| TestFormat.method_defined?(m) }
89
- end
90
-
91
- def test_readers
92
- # Basic
93
- assert_equal @format.c1, 'c1'
94
- assert_equal @format.c2_1, 'c2_1'
95
- assert_equal @format.c3_1_1, 'c3_1_1'
96
- assert_equal @format.c4, 'c4'
97
- assert_equal @format.c5, 'c5'
98
- assert_equal @format.c6, 9999
99
- # Alias
100
- assert_equal @format.c1_alias, @format.c1
101
- assert_equal @format.c2_1_alias, @format.c2_1
102
- # Invalid location
103
- assert_nil @format.c3_invalid
104
- # Customized
105
- assert_equal @format.c2_1_customized, 'Customized c2_1'
106
- end
107
-
108
- def test_checkers
109
- assert_equal @format.c7?, true
110
- assert_equal @format.c8?, false
111
- assert_equal @format.c9_1?, true
112
- assert_equal @format.c9_2?, false
113
- end
114
-
115
- def test_reader_cannot_write_value
116
- assert_raises NoMethodError do
117
- @format.c1 = 'write'
118
- end
119
- # Alias method
120
- assert_raises NoMethodError do
121
- @format.c1_alias = 'write'
122
- end
123
- end
124
-
125
- def test_writers
126
- config = @format.config
127
-
128
- @format.c10 = 'c1_changed'
129
- assert_equal config['c10'], 'c1_changed'
130
-
131
- @format.c10_alias = 'c10_changed_by_alias'
132
- assert_equal config['c10'], 'c10_changed_by_alias'
133
-
134
- @format.c11_1 = 'c11_1_changed'
135
- assert_equal config['c11']['c11_1'], 'c11_1_changed'
136
-
137
- @format.c11_2 = 'c11_2_created'
138
- assert_equal config['c11']['c11_2'], 'c11_2_created'
139
- end
140
-
141
- def test_accessors
142
- @format.c20 = 'c20_changed'
143
- assert_equal @format.c20, 'c20_changed'
144
-
145
- @format.c21 = 'c21_changed'
146
- assert_equal @format.c21, 'Customized c21_changed'
147
- end
148
-
149
- def test_attributes
150
- assert_same @format.config, @format.attributes
151
- end
152
- end