thinreports 0.6.0.pre3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. data/README.rdoc +37 -32
  2. data/doc/yardoc_templates/default/layout/html/footer.erb +1 -1
  3. data/lib/thinreports.rb +2 -1
  4. data/lib/thinreports/config.rb +21 -0
  5. data/lib/thinreports/core/errors.rb +14 -1
  6. data/lib/thinreports/core/format/builder.rb +6 -1
  7. data/lib/thinreports/core/page.rb +6 -6
  8. data/lib/thinreports/core/shape.rb +8 -9
  9. data/lib/thinreports/core/shape/base/internal.rb +6 -12
  10. data/lib/thinreports/core/shape/basic.rb +3 -0
  11. data/lib/thinreports/core/shape/basic/block_format.rb +12 -0
  12. data/lib/thinreports/core/shape/basic/block_interface.rb +25 -0
  13. data/lib/thinreports/core/shape/basic/block_internal.rb +33 -0
  14. data/lib/thinreports/core/shape/basic/interface.rb +37 -11
  15. data/lib/thinreports/core/shape/basic/internal.rb +3 -12
  16. data/lib/thinreports/core/shape/image_block.rb +15 -0
  17. data/lib/thinreports/core/shape/image_block/format.rb +13 -0
  18. data/lib/thinreports/core/shape/image_block/interface.rb +19 -0
  19. data/lib/thinreports/core/shape/image_block/internal.rb +16 -0
  20. data/lib/thinreports/core/shape/list/events.rb +19 -2
  21. data/lib/thinreports/core/shape/list/manager.rb +17 -4
  22. data/lib/thinreports/core/shape/list/page.rb +2 -2
  23. data/lib/thinreports/core/shape/list/page_state.rb +4 -0
  24. data/lib/thinreports/core/shape/list/section_internal.rb +4 -0
  25. data/lib/thinreports/core/shape/manager/format.rb +1 -1
  26. data/lib/thinreports/core/shape/manager/internal.rb +24 -11
  27. data/lib/thinreports/core/shape/manager/target.rb +2 -2
  28. data/lib/thinreports/core/shape/style.rb +15 -0
  29. data/lib/thinreports/core/shape/style/base.rb +149 -0
  30. data/lib/thinreports/core/shape/style/basic.rb +17 -0
  31. data/lib/thinreports/core/shape/style/graphic.rb +60 -0
  32. data/lib/thinreports/core/shape/style/text.rb +138 -0
  33. data/lib/thinreports/core/shape/text/internal.rb +4 -0
  34. data/lib/thinreports/core/shape/text_block.rb +16 -0
  35. data/lib/thinreports/core/shape/{tblock → text_block}/format.rb +3 -3
  36. data/lib/thinreports/core/shape/{tblock → text_block}/formatter.rb +7 -7
  37. data/lib/thinreports/core/shape/{tblock → text_block}/formatter/basic.rb +1 -1
  38. data/lib/thinreports/core/shape/{tblock → text_block}/formatter/datetime.rb +1 -1
  39. data/lib/thinreports/core/shape/{tblock → text_block}/formatter/number.rb +1 -1
  40. data/lib/thinreports/core/shape/{tblock → text_block}/formatter/padding.rb +10 -8
  41. data/lib/thinreports/core/shape/{tblock → text_block}/interface.rb +2 -21
  42. data/lib/thinreports/core/shape/{tblock → text_block}/internal.rb +16 -10
  43. data/lib/thinreports/core/utils.rb +0 -8
  44. data/lib/thinreports/generator.rb +2 -2
  45. data/lib/thinreports/generator/configuration.rb +30 -0
  46. data/lib/thinreports/generator/pdf.rb +13 -10
  47. data/lib/thinreports/generator/pdf/configuration.rb +28 -0
  48. data/lib/thinreports/generator/pdf/document.rb +16 -56
  49. data/lib/thinreports/generator/pdf/document/draw_shape.rb +35 -17
  50. data/lib/thinreports/generator/pdf/document/font.rb +25 -9
  51. data/lib/thinreports/generator/pdf/document/graphics.rb +1 -1
  52. data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +18 -4
  53. data/lib/thinreports/generator/pdf/document/graphics/basic.rb +1 -1
  54. data/lib/thinreports/generator/pdf/document/graphics/image.rb +18 -1
  55. data/lib/thinreports/generator/pdf/document/graphics/text.rb +29 -6
  56. data/lib/thinreports/generator/pdf/document/page.rb +70 -0
  57. data/lib/thinreports/generator/pdf/document/parse_color.rb +1 -1
  58. data/lib/thinreports/generator/pdf/document/parse_svg.rb +1 -1
  59. data/lib/thinreports/generator/pdf/drawer.rb +1 -1
  60. data/lib/thinreports/generator/pdf/drawer/base.rb +5 -7
  61. data/lib/thinreports/generator/pdf/drawer/list.rb +4 -4
  62. data/lib/thinreports/generator/pdf/drawer/list_section.rb +8 -3
  63. data/lib/thinreports/generator/pdf/drawer/page.rb +10 -3
  64. data/lib/thinreports/generator/pdf/prawn_ext.rb +16 -21
  65. data/lib/thinreports/layout/format.rb +2 -2
  66. data/lib/thinreports/layout/version.rb +2 -2
  67. data/lib/thinreports/report/base.rb +68 -31
  68. data/tasks/test.rake +48 -4
  69. data/test/benchmark/basic_estimate.tlf +1 -0
  70. data/test/benchmark/bench_basic_estimate.rb +95 -0
  71. data/test/case/character_spacing/character_spacing.rb +7 -0
  72. data/test/case/character_spacing/character_spacing.tlf +1 -0
  73. data/test/case/dynamic_image/dynamic_image.rb +41 -0
  74. data/test/case/dynamic_image/dynamic_image.tlf +1 -0
  75. data/test/case/dynamic_image/img200x100.png +0 -0
  76. data/test/case/dynamic_image/img50x50.png +0 -0
  77. data/test/case/dynamic_style/dynamic_style.rb +154 -0
  78. data/test/case/dynamic_style/dynamic_style.tlf +1 -0
  79. data/test/case/dynamic_style/dynamic_style_in_list.tlf +1 -0
  80. data/test/case/dynamic_style/image.png +0 -0
  81. data/test/case/eudc/eudc.rb +20 -0
  82. data/test/case/eudc/eudc.tlf +1 -0
  83. data/test/case/eudc/eudc.ttf +0 -0
  84. data/test/case/helper.rb +27 -0
  85. data/test/case/hidden_shapes/hidden_shapes.rb +13 -0
  86. data/test/case/hidden_shapes/hidden_shapes.tlf +1 -0
  87. data/test/case/list_events/list_events.rb +32 -0
  88. data/test/case/list_events/list_events.tlf +1 -0
  89. data/test/case/list_header_inheriting/list_header_inheriting.rb +19 -0
  90. data/test/case/list_header_inheriting/list_header_inheriting.tlf +1 -0
  91. data/test/case/list_manual_generation/list_manual_generation.rb +24 -0
  92. data/test/case/list_manual_generation/list_manual_generation.tlf +1 -0
  93. data/test/case/single_line_tblock/single_line_tblock.rb +15 -0
  94. data/test/case/single_line_tblock/single_line_tblock.tlf +1 -0
  95. data/test/case/tblock_styles/tblock_styles.rb +27 -0
  96. data/test/case/tblock_styles/tblock_styles.tlf +1 -0
  97. data/test/case/text_align/text_align.rb +9 -0
  98. data/test/case/text_align/text_align.tlf +1 -0
  99. data/test/unit/core/shape/base/test_internal.rb +65 -85
  100. data/test/unit/core/shape/basic/test_basic_format.rb +30 -0
  101. data/test/unit/core/shape/basic/test_basic_interface.rb +27 -0
  102. data/test/unit/core/shape/basic/test_basic_internal.rb +55 -0
  103. data/test/unit/core/shape/basic/test_interface.rb +84 -36
  104. data/test/unit/core/shape/basic/test_internal.rb +32 -24
  105. data/test/unit/core/shape/image_block/test_format.rb +58 -0
  106. data/test/unit/core/shape/image_block/test_interface.rb +23 -0
  107. data/test/unit/core/shape/image_block/test_internal.rb +28 -0
  108. data/test/unit/core/shape/list/test_events.rb +19 -11
  109. data/test/unit/core/shape/list/test_manager.rb +112 -0
  110. data/test/unit/core/shape/list/test_page.rb +57 -0
  111. data/test/unit/core/shape/list/test_section_format.rb +1 -1
  112. data/test/unit/core/shape/list/test_section_interface.rb +37 -30
  113. data/test/unit/core/shape/list/test_section_internal.rb +39 -14
  114. data/test/unit/core/shape/manager/test_format.rb +12 -18
  115. data/test/unit/core/shape/manager/test_internal.rb +127 -93
  116. data/test/unit/core/shape/manager/test_target.rb +63 -56
  117. data/test/unit/core/shape/styles/test_base.rb +219 -0
  118. data/test/unit/core/shape/styles/test_basic.rb +24 -0
  119. data/test/unit/core/shape/styles/test_graphic.rb +69 -0
  120. data/test/unit/core/shape/styles/test_text.rb +318 -0
  121. data/test/unit/core/shape/{tblock → text_block}/formatter/test_basic.rb +2 -2
  122. data/test/unit/core/shape/{tblock → text_block}/formatter/test_datetime.rb +2 -2
  123. data/test/unit/core/shape/{tblock → text_block}/formatter/test_number.rb +2 -2
  124. data/test/unit/core/shape/{tblock → text_block}/formatter/test_padding.rb +11 -6
  125. data/test/unit/core/shape/text_block/test_format.rb +160 -0
  126. data/test/unit/core/shape/{tblock → text_block}/test_formatter.rb +2 -2
  127. data/test/unit/core/shape/text_block/test_interface.rb +46 -0
  128. data/test/unit/core/shape/text_block/test_internal.rb +128 -0
  129. data/test/unit/core/test_shape.rb +31 -6
  130. data/test/unit/data/basic_layout1.tlf +1 -0
  131. data/test/unit/data/basic_layout2.tlf +1 -0
  132. data/test/unit/data/basic_list_layout.tlf +1 -0
  133. data/test/unit/generator/pdf/document/graphics/test_attributes.rb +81 -52
  134. data/test/unit/generator/pdf/document/graphics/test_text.rb +159 -0
  135. data/test/unit/generator/pdf/document/test_font.rb +21 -6
  136. data/test/unit/generator/pdf/document/test_graphics.rb +2 -2
  137. data/test/unit/generator/pdf/document/test_page.rb +95 -0
  138. data/test/unit/generator/pdf/document/test_parse_color.rb +2 -2
  139. data/test/unit/generator/pdf/test_configuration.rb +24 -0
  140. data/test/unit/generator/pdf/test_document.rb +28 -0
  141. data/test/unit/generator/test_configuration.rb +25 -0
  142. data/test/unit/generator/test_pdf.rb +19 -0
  143. data/test/unit/helper.rb +18 -0
  144. data/test/unit/layout/test_format.rb +24 -7
  145. data/test/unit/layout/test_version.rb +61 -27
  146. data/test/unit/report/test_base.rb +185 -89
  147. data/test/unit/test_config.rb +22 -0
  148. data/test/unit/test_report.rb +4 -4
  149. metadata +94 -43
  150. data/lib/thinreports/core/shape/tblock.rb +0 -16
  151. data/lib/thinreports/generator/pxd.rb +0 -75
  152. data/lib/thinreports/generator/pxd/helper.rb +0 -33
  153. data/lib/thinreports/generator/pxd/list_renderer.rb +0 -58
  154. data/lib/thinreports/generator/pxd/page_renderer.rb +0 -75
  155. data/tasks/clean.rake +0 -6
  156. data/test/unit/core/shape/tblock/test_format.rb +0 -125
  157. data/test/unit/core/shape/tblock/test_interface.rb +0 -40
  158. data/test/unit/core/shape/tblock/test_internal.rb +0 -139
@@ -1,75 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'erb'
4
-
5
- module ThinReports
6
- module Generator
7
-
8
- # @private
9
- class Pxd::PageRenderer
10
- include Pxd::Helper
11
-
12
- def initialize(format)
13
- @engine = ERB.new(read_layout(format))
14
- @manager = {}
15
- @lists = {}
16
- end
17
-
18
- # @param [ThinReports::Core::Shape::Manager::Internal] manager
19
- # @return [String]
20
- def render(manager)
21
- @manager = manager
22
- @engine.result(binding)
23
- end
24
-
25
- def render_shape(id)
26
- return '' unless shape = @manager.final_shape(id)
27
-
28
- shape = shape.internal
29
- case
30
- when shape.type_of?(:tblock)
31
- render_tblock(shape)
32
- when shape.type_of?(:list)
33
- render_list(shape)
34
- when shape.type_of?(:text)
35
- render_text(shape)
36
- else
37
- render_basic(shape)
38
- end
39
- end
40
- alias_method :r, :render_shape
41
-
42
- private
43
-
44
- def render_basic(shape)
45
- tag(shape.svg_tag, shape.attributes)
46
- end
47
-
48
- def render_text(shape)
49
- content_tag(shape.svg_tag, shape.svg_content,
50
- shape.attribute, :escape => false)
51
- end
52
-
53
- def render_tblock(shape)
54
- value = h(shape.real_value)
55
- value = if shape.multiple?
56
- value.gsub(/\r\n|\n/, '<tBreak/>')
57
- else
58
- value.gsub(/\r\n|\n/, ' ')
59
- end
60
- content_tag(shape.svg_tag, value, shape.attributes, :escape => false)
61
- end
62
-
63
- def render_list(shape)
64
- renderer = @lists[shape.id] ||= Pxd::ListRenderer.new
65
- renderer.render(shape)
66
- end
67
-
68
- def read_layout(format)
69
- format.layout.gsub(/ x\-[a-z\d\-]+?=".*?"/, '').
70
- gsub(/ class=".*?"/, '')
71
- end
72
- end
73
-
74
- end
75
- end
@@ -1,6 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'rake/clean'
4
-
5
- CLEAN.include(['doc/yardoc', '.yardoc'])
6
- CLOBBER.include([ 'pkg' ])
@@ -1,125 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test/unit/helper'
4
-
5
- class ThinReports::Core::Shape::Tblock::TestFormat < MiniTest::Unit::TestCase
6
- include ThinReports::TestHelpers
7
-
8
- TEST_TBLOCK_FORMAT = {
9
- "type" => "s-tblock",
10
- "id" => "block_1",
11
- "display" => "true",
12
- "multiple" => "false",
13
- "box" => {
14
- "x" => 100.0,
15
- "y" => 100.0,
16
- "width" => 100.0,
17
- "height" => 100.0
18
- },
19
- "format" => {
20
- "base" => "¥{value}",
21
- "type" => "number",
22
- "number" => {
23
- "delimiter" => ",",
24
- "precision" => 1
25
- }
26
- },
27
- "value" => "",
28
- "ref-id" => "",
29
- "svg" => {
30
- "tag" => "text",
31
- "attrs" => {
32
- "x" => 200.1,
33
- "y" => 65.6,
34
- "text-anchor" => "end",
35
- "xml:space" => "preserve",
36
- "fill" => "#000000",
37
- "fill-opacity" => "1",
38
- "font-size" => "12",
39
- "font-family" => "\uFF2D\uFF33 \u30B4\u30B7\u30C3\u30AF",
40
- "font-weight" => "bold",
41
- "font-style" => "normal",
42
- "text-decoration" => "none",
43
- "clip-path" => "url(#_svgdef_0)"
44
- }
45
- }
46
- }
47
-
48
- def test_build
49
- build_format
50
- rescue
51
- flunk exception_details(e, 'Building failed.')
52
- end
53
-
54
- def test_config_readers
55
- format = format(TEST_TBLOCK_FORMAT)
56
-
57
- assert_equal format.value, ''
58
- assert_equal format.ref_id, ''
59
- assert_equal format.format_base, '¥{value}'
60
- assert_equal format.format_type, 'number'
61
- assert_instance_of ::Hash, format.box
62
- assert_equal format.box['x'], 100.0
63
-
64
- # Methods reference to unknown value returns a nil value
65
- assert_nil format.format_datetime_format
66
- assert_nil format.format_padding_char
67
- assert_nil format.format_padding_dir
68
-
69
- # In face, #format_padding_length returns a nil value
70
- assert_equal format.format_padding_length, 0
71
-
72
- assert_equal format.format_padding_rdir?, false
73
- assert_equal format.has_format?, true
74
- assert_equal format.has_reference?, false
75
- assert_equal format.multiple?, false
76
- end
77
-
78
- def test_multiple?
79
- assert format('multiple' => 'true').multiple?
80
- refute format('multiple' => 'false').multiple?
81
- end
82
-
83
- def test_format_padding_rdir?
84
- data = {'format' => {'padding' => {'direction' => 'L'}}}
85
-
86
- refute format(data).format_padding_rdir?
87
-
88
- data['format']['padding']['direction'] = 'R'
89
- assert format(data).format_padding_rdir?
90
- end
91
-
92
- def test_format_padding_length
93
- data = {'format' => {'padding' => {'length' => '0'}}}
94
-
95
- assert_equal format(data).format_padding_length, 0
96
-
97
- data['format']['padding']['length'] = '10'
98
- assert_equal format(data).format_padding_length, 10
99
- end
100
-
101
- def test_has_format?
102
- data = {'format' => {'type' => ''}}
103
-
104
- refute format(data).has_format?
105
-
106
- data['format']['type'] = 'number'
107
- assert format(data).has_format?
108
-
109
- data['format']['type'] = 'unknown'
110
- refute format(data).has_format?
111
- end
112
-
113
- def test_has_reference?
114
- refute format('ref-id' => '').has_reference?
115
- assert format('ref-id' => 'ref_tblock_1').has_reference?
116
- end
117
-
118
- def build_format
119
- ThinReports::Core::Shape::Tblock::Format.build(TEST_TBLOCK_FORMAT)
120
- end
121
-
122
- def format(data)
123
- ThinReports::Core::Shape::Tblock::Format.new(data)
124
- end
125
- end
@@ -1,40 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test/unit/helper'
4
-
5
- class ThinReports::Core::Shape::Tblock::TestInterface < MiniTest::Unit::TestCase
6
- include ThinReports::TestHelpers
7
-
8
- Tblock = ThinReports::Core::Shape::Tblock
9
-
10
- def setup
11
- @interface = Tblock::Interface.new(flexmock('parent'), flexmock('format'))
12
- end
13
-
14
- def test_value_work_as_getter_when_receive_no_arguments
15
- flexmock(@interface.internal).should_receive(:read_value).
16
- and_return('value').once
17
-
18
- assert_equal @interface.value, 'value'
19
- end
20
-
21
- def test_value_work_as_setter_when_receive_an_just_one_argument
22
- flexmock(@interface.internal).should_receive(:write_value).once
23
-
24
- @interface.value('any value')
25
- end
26
-
27
- def test_value_raise_error_when_receive_more_than_two
28
- assert_raises ArgumentError do
29
- @interface.value('arg1', 'arg2')
30
- end
31
- end
32
-
33
- def test_set
34
- flexmock(@interface).
35
- should_receive(:value).once.
36
- should_receive(:styles).once
37
-
38
- @interface.set('value', :fill => 'red')
39
- end
40
- end
@@ -1,139 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test/unit/helper'
4
-
5
- class ThinReports::Core::Shape::Tblock::TestInternal < MiniTest::Unit::TestCase
6
- include ThinReports::TestHelpers
7
-
8
- Tblock = ThinReports::Core::Shape::Tblock
9
-
10
- def test_read_value_return_the_format_value
11
- format = flexmock('format')
12
- format.should_receive(:value => 'format value').times(2)
13
- format.should_receive(:has_reference? => false)
14
-
15
- internal = init_internal(format)
16
-
17
- assert_equal internal.read_value, 'format value'
18
- assert_equal internal.value, 'format value'
19
- end
20
-
21
- def test_read_value_return_the_value_of_referenced_shape
22
- format = flexmock('format')
23
- format.should_receive(:has_reference? => true)
24
- format.should_receive(:ref_id => 'dummy')
25
-
26
- internal = init_internal(format)
27
-
28
- assert_equal internal.read_value, 'referenced value'
29
- assert_equal internal.value, 'referenced value'
30
- end
31
-
32
- def test_read_value_return_the_value_stored_in_states
33
- format = flexmock('format')
34
- format.should_receive(:has_reference? => false)
35
-
36
- internal = init_internal(format)
37
- internal.states[:value] = 'any value'
38
-
39
- assert_equal internal.read_value, 'any value'
40
- assert_equal internal.value, 'any value'
41
- end
42
-
43
- def test_write_value
44
- format = flexmock('format')
45
- format.should_receive(:has_reference? => false)
46
-
47
- internal = init_internal(format)
48
- internal.write_value('value written')
49
-
50
- assert_equal internal.value, 'value written'
51
- end
52
-
53
- def test_write_value_show_warnings_when_has_reference
54
- format = flexmock('format')
55
- format.should_receive(:has_reference? => true,
56
- :ref_id => 'ref id',
57
- :id => 'id')
58
- out, err = capture_io do
59
- init_internal(format).write_value('value written')
60
- end
61
- assert_equal err.chomp, 'The set value is not reflected, ' +
62
- "Because 'id' refers to 'ref id'."
63
- end
64
-
65
- def test_real_value_return_the_formatted_value
66
- format = flexmock('format')
67
- format.should_receive(:has_format? => true,
68
- :multiple? => false)
69
-
70
- internal = init_internal(format)
71
- flexmock(internal, :read_value => 'dummy')
72
-
73
- assert_equal internal.real_value, 'formatted value'
74
- end
75
-
76
- def test_real_value_return_the_raw_value_when_has_not_format
77
- format = flexmock('format')
78
- format.should_receive(:has_format? => false,
79
- :multiple? => false)
80
-
81
- internal = init_internal(format)
82
- flexmock(internal, :read_value => 'raw value')
83
-
84
- assert_equal internal.real_value, 'raw value'
85
- end
86
-
87
- def test_real_value_return_the_raw_value_constantly_when_is_multiple
88
- format = flexmock('format')
89
- format.should_receive(:has_format? => true,
90
- :multiple? => true)
91
-
92
- internal = init_internal(format)
93
- flexmock(internal, :read_value => 'raw value')
94
-
95
- assert_equal internal.real_value, 'raw value'
96
- end
97
-
98
- def test_format_enabled
99
- internal = init_internal(flexmock('format'))
100
- internal.format_enabled(true)
101
-
102
- assert_equal internal.states[:format_enabled], true
103
- end
104
-
105
- def test_format_enabled?
106
- internal = init_internal(flexmock(:has_format? => true,
107
- :multiple? => false))
108
-
109
- assert_equal internal.format_enabled?, true
110
-
111
- internal.format_enabled(false)
112
-
113
- assert_equal internal.format_enabled?, false
114
-
115
- flexmock(internal.format, :multiple? => true)
116
- internal.format_enabled(true)
117
-
118
- assert_equal internal.format_enabled?, false
119
- end
120
-
121
- def test_type_of?
122
- assert_equal init_internal(flexmock('format')).type_of?(:tblock), true
123
- end
124
-
125
- def init_internal(format)
126
- parent = flexmock('parent')
127
- parent.should_receive(:item).
128
- and_return(flexmock(:value => 'referenced value'))
129
-
130
- formatter = flexmock('formatter')
131
- formatter.should_receive(:apply).
132
- and_return('formatted value')
133
-
134
- flexmock(Tblock::Internal).new_instances.should_receive(:formatter).
135
- and_return(formatter)
136
-
137
- Tblock::Internal.new(parent, format)
138
- end
139
- end