odf-report 0.5.1 → 0.5.2
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.
- checksums.yaml +5 -13
- data/.gitignore +1 -0
- data/.rspec +4 -0
- data/README.textile +6 -8
- data/Rakefile +8 -0
- data/lib/odf-report.rb +0 -1
- data/lib/odf-report/field.rb +64 -32
- data/lib/odf-report/file.rb +2 -2
- data/lib/odf-report/nested.rb +31 -3
- data/lib/odf-report/parser/default.rb +5 -4
- data/lib/odf-report/report.rb +10 -34
- data/lib/odf-report/section.rb +21 -57
- data/lib/odf-report/table.rb +12 -36
- data/lib/odf-report/text.rb +1 -1
- data/lib/odf-report/version.rb +1 -1
- data/odf-report.gemspec +4 -1
- data/spec/fields_spec.rb +77 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/specs.odt +0 -0
- data/spec/tables_spec.rb +39 -0
- data/test/fields_inside_text_test.rb +38 -0
- data/test/nested_tables_test.rb +43 -0
- data/test/sections_test.rb +44 -0
- data/test/sub_sections_test.rb +58 -0
- data/test/table_headers_test.rb +41 -0
- data/test/tables_test.rb +67 -0
- data/test/{piriapolis.jpg → templates/piriapolis.jpg} +0 -0
- data/test/{rails.png → templates/rails.png} +0 -0
- data/test/templates/test_sub_sections.odt +0 -0
- data/test/templates/test_text.odt +0 -0
- data/test/text_test.rb +56 -0
- metadata +87 -36
- data/lib/odf-report/fields.rb +0 -40
- data/test/test_fields_inside_text.rb +0 -37
- data/test/test_nested_tables.rb +0 -39
- data/test/test_sections.rb +0 -39
- data/test/test_sub_sections.rb +0 -57
- data/test/test_table_headers.rb +0 -39
- data/test/test_tables.rb +0 -62
- data/test/test_text.rb +0 -48
data/lib/odf-report/table.rb
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
module ODFReport
|
2
2
|
|
3
3
|
class Table
|
4
|
-
include
|
5
|
-
|
6
|
-
attr_accessor :fields, :rows, :name, :collection_field, :data, :header, :parent, :tables
|
4
|
+
include Nested
|
7
5
|
|
8
6
|
def initialize(opts)
|
9
7
|
@name = opts[:name]
|
10
8
|
@collection_field = opts[:collection_field]
|
11
9
|
@collection = opts[:collection]
|
12
|
-
@parent = opts[:parent]
|
13
10
|
|
14
11
|
@fields = []
|
12
|
+
@texts = []
|
15
13
|
@tables = []
|
16
14
|
|
17
15
|
@template_rows = []
|
@@ -19,49 +17,31 @@ class Table
|
|
19
17
|
@skip_if_empty = opts[:skip_if_empty] || false
|
20
18
|
end
|
21
19
|
|
22
|
-
def
|
23
|
-
opts = {:name => name, :data_field => data_field}
|
24
|
-
field = Field.new(opts, &block)
|
25
|
-
@fields << field
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def add_table(table_name, collection_field, opts={}, &block)
|
30
|
-
opts.merge!(:name => table_name, :collection_field => collection_field, :parent => self)
|
31
|
-
tab = Table.new(opts)
|
32
|
-
@tables << tab
|
20
|
+
def replace!(doc, row = nil)
|
33
21
|
|
34
|
-
|
35
|
-
end
|
22
|
+
return unless table = find_table_node(doc)
|
36
23
|
|
37
|
-
|
38
|
-
@collection = get_collection_from_item(row, @collection_field) if row
|
39
|
-
end
|
24
|
+
@template_rows = table.xpath("table:table-row")
|
40
25
|
|
41
|
-
|
26
|
+
@header = table.xpath("table:table-header-rows").empty? ? @header : false
|
42
27
|
|
43
|
-
return unless table = find_table_node(doc)
|
44
28
|
|
45
|
-
|
29
|
+
@collection = get_collection_from_item(row, @collection_field) if row
|
46
30
|
|
47
|
-
if
|
31
|
+
if @skip_if_empty && @collection.empty?
|
48
32
|
table.remove
|
49
33
|
return
|
50
34
|
end
|
51
35
|
|
52
|
-
@template_rows = table.xpath("table:table-row")
|
53
|
-
|
54
|
-
@header = table.xpath("table:table-header-rows").empty? ? @header : false
|
55
|
-
|
56
36
|
@collection.each do |data_item|
|
57
37
|
|
58
38
|
new_node = get_next_row
|
59
39
|
|
60
|
-
|
40
|
+
@tables.each { |t| t.replace!(new_node, data_item) }
|
41
|
+
|
42
|
+
@texts.each { |t| t.replace!(new_node, data_item) }
|
61
43
|
|
62
|
-
@
|
63
|
-
t.replace!(new_node, data_item)
|
64
|
-
end
|
44
|
+
@fields.each { |f| f.replace!(new_node, data_item) }
|
65
45
|
|
66
46
|
table.add_child(new_node)
|
67
47
|
|
@@ -91,10 +71,6 @@ private
|
|
91
71
|
@header ? 1 : 0
|
92
72
|
end
|
93
73
|
|
94
|
-
def reset
|
95
|
-
@row_cursor = get_start_node
|
96
|
-
end
|
97
|
-
|
98
74
|
def template_length
|
99
75
|
@tl ||= @template_rows.size
|
100
76
|
end
|
data/lib/odf-report/text.rb
CHANGED
data/lib/odf-report/version.rb
CHANGED
data/odf-report.gemspec
CHANGED
@@ -21,8 +21,11 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
s.add_development_dependency "bundler", "~> 1.6"
|
23
23
|
s.add_development_dependency "rake"
|
24
|
+
s.add_development_dependency "rspec", "~> 3.0.0"
|
25
|
+
s.add_development_dependency "faker"
|
26
|
+
s.add_development_dependency "launchy"
|
24
27
|
|
25
|
-
s.add_runtime_dependency('rubyzip', "~> 1.
|
28
|
+
s.add_runtime_dependency('rubyzip', "~> 1.2.0")
|
26
29
|
s.add_runtime_dependency('nokogiri', ">= 1.5.0")
|
27
30
|
|
28
31
|
end
|
data/spec/fields_spec.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
RSpec.describe "Fields" do
|
2
|
+
|
3
|
+
before(:context) do
|
4
|
+
|
5
|
+
@field_01 = Faker::Company.name
|
6
|
+
@field_02 = Faker::Name.name
|
7
|
+
|
8
|
+
@itens_01 = Item.get_list(3)
|
9
|
+
|
10
|
+
report = ODFReport::Report.new("spec/specs.odt") do |r|
|
11
|
+
|
12
|
+
r.add_field(:field_01, @field_01)
|
13
|
+
r.add_field(:field_02, @field_02)
|
14
|
+
|
15
|
+
r.add_table('TABLE_01', @itens_01) do |t|
|
16
|
+
t.add_column(:column_01, :id)
|
17
|
+
t.add_column(:column_02, :name)
|
18
|
+
end
|
19
|
+
|
20
|
+
r.add_section('SECTION_01', @itens_01) do |t|
|
21
|
+
t.add_field(:s01_field_01, :id)
|
22
|
+
t.add_field(:s01_field_02, :name)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
report.generate("spec/result/specs.odt")
|
28
|
+
|
29
|
+
@data = Inspector.new("spec/result/specs.odt")
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
it "simple fields replacement" do
|
35
|
+
|
36
|
+
expect(@data.text).not_to match(/\[FIELD_01\]/)
|
37
|
+
expect(@data.text).not_to match(/\[FIELD_02\]/)
|
38
|
+
|
39
|
+
expect(@data.text).to match @field_01
|
40
|
+
expect(@data.text).to match @field_02
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
it "table columns replacement" do
|
45
|
+
|
46
|
+
table = @data.xml.xpath(".//table:table[@table:name='TABLE_01']").to_s
|
47
|
+
|
48
|
+
@itens_01.each do |item|
|
49
|
+
|
50
|
+
expect(table).not_to match(/\[COLUMN_01\]/)
|
51
|
+
expect(table).not_to match(/\[COLUMN_02\]/)
|
52
|
+
expect(table).to match(/\[COLUMN_03\]/)
|
53
|
+
|
54
|
+
expect(table).to match(item.id)
|
55
|
+
expect(table).to match(item.name)
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
it "section fields replacement" do
|
62
|
+
|
63
|
+
expect(@data.text).not_to match(/\[S01_FIELD_01\]/)
|
64
|
+
expect(@data.text).not_to match(/\[S01_FIELD_02\]/)
|
65
|
+
|
66
|
+
@itens_01.each_with_index do |item, idx|
|
67
|
+
|
68
|
+
section = @data.xml.xpath(".//text:section[@text:name='SECTION_01_#{idx+1}']").to_s
|
69
|
+
|
70
|
+
expect(section).to match(item.id)
|
71
|
+
expect(section).to match(item.name)
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require './lib/odf-report'
|
2
|
+
require 'faker'
|
3
|
+
|
4
|
+
I18n.enforce_available_locales = false
|
5
|
+
|
6
|
+
class Item
|
7
|
+
attr_accessor :id, :name, :subs
|
8
|
+
def initialize(_id, _name, _subs=[])
|
9
|
+
@name = _name
|
10
|
+
@id = _id
|
11
|
+
@subs = _subs
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get_list(quant = 3)
|
15
|
+
r = []
|
16
|
+
(1..quant).each do |i|
|
17
|
+
r << Item.new(Faker::Number.number(10), Faker::Name.name)
|
18
|
+
end
|
19
|
+
r
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class Inspector
|
25
|
+
|
26
|
+
def initialize(file)
|
27
|
+
@content = nil
|
28
|
+
Zip::File.open(file) do |f|
|
29
|
+
@content = f.get_entry('content.xml').get_input_stream.read
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def xml
|
34
|
+
@xml ||= Nokogiri::XML(@content)
|
35
|
+
end
|
36
|
+
|
37
|
+
def text
|
38
|
+
@text ||= xml.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
44
|
+
RSpec.configure do |config|
|
45
|
+
end
|
data/spec/specs.odt
ADDED
Binary file
|
data/spec/tables_spec.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
RSpec.describe "Tables" do
|
2
|
+
|
3
|
+
before(:context) do
|
4
|
+
|
5
|
+
report = ODFReport::Report.new("spec/specs.odt") do |r|
|
6
|
+
|
7
|
+
r.add_table('TABLE_02', []) do |t|
|
8
|
+
t.add_column(:column_01, :id)
|
9
|
+
t.add_column(:column_02, :name)
|
10
|
+
end
|
11
|
+
|
12
|
+
r.add_table('TABLE_03', [], skip_if_empty: true) do |t|
|
13
|
+
t.add_column(:column_01, :id)
|
14
|
+
t.add_column(:column_02, :name)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
report.generate("spec/result/specs.odt")
|
20
|
+
|
21
|
+
@data = Inspector.new("spec/result/specs.odt")
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with Empty collection" do
|
26
|
+
|
27
|
+
it "should not remove table" do
|
28
|
+
table2 = @data.xml.xpath(".//table:table[@table:name='TABLE_02']")
|
29
|
+
expect(table2).not_to be_empty
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should remove table if required" do
|
33
|
+
table3 = @data.xml.xpath(".//table:table[@table:name='TABLE_03']")
|
34
|
+
expect(table3).to be_empty
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
require './lib/odf-report'
|
3
|
+
require 'faker'
|
4
|
+
|
5
|
+
|
6
|
+
@html = <<-HTML
|
7
|
+
<p>Uniquely promote installed base total linkage via emerging deliverables com <strong>[EVENTO_TEXTO_CARTA]</strong>, unleash cross-media collaboration <strong>[FUNCAO]</strong> [EVENTO_NOME].</p>
|
8
|
+
|
9
|
+
<p>Progressively fashion diverse portals nº <strong>[NUMERO_SECAO]</strong> do local <strong>[NOME_LOCAL]</strong>, situado na <strong>[ENDERECO_LOCAL]</strong> methodologies </p>
|
10
|
+
|
11
|
+
<p>Assertively orchestrate market positioning bandwidth rather than fully researched total linkage. Interactively architect granular e-markets via clicks-and-mortar ROI. Uniquely aggregate compelling.</p>
|
12
|
+
|
13
|
+
<p>Compellingly facilitate functionalized interfaces before wireless models. Compellingly morph parallel systems whereas combinado com o artigo 63, § 2º da Lei nº 9.504/97, abaixo mencionados:</p>
|
14
|
+
|
15
|
+
<p style="margin-left:1.76cm;"><em>Art. 120 - § 1º Compellingly envisioneer high standards in niches without best-of-breed leadership. Phosfluorescently unleash go forward methodologies after bricks-and-clicks niches. Authoritatively. </em></p>
|
16
|
+
|
17
|
+
<p style="margin-left:1.76cm;"><em>Art. 63 - [...] § 2º Enthusiastically parallel task user friendly functionalities whereas exceptional leadership. </em></p>
|
18
|
+
|
19
|
+
<p>Credibly enable multifunctional strategic theme areas and premium communities.</p>
|
20
|
+
|
21
|
+
HTML
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
report = ODFReport::Report.new("test/templates/test_fields_inside_text.odt") do |r|
|
26
|
+
|
27
|
+
r.add_text(:body, @html)
|
28
|
+
|
29
|
+
r.add_field('EVENTO_TEXTO_CARTA', Faker::Lorem.sentence)
|
30
|
+
r.add_field('FUNCAO', Faker::Lorem.word)
|
31
|
+
r.add_field('EVENTO_NOME', Faker::Company.name)
|
32
|
+
|
33
|
+
r.add_field('NUMERO_SECAO', Faker::Number.number(3))
|
34
|
+
r.add_field('NOME_LOCAL', Faker::Company.name)
|
35
|
+
r.add_field('ENDERECO_LOCAL', Faker::Address.street_address)
|
36
|
+
end
|
37
|
+
|
38
|
+
report.generate("test/result/test_fields_inside_text.odt")
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
require './lib/odf-report'
|
3
|
+
require 'faker'
|
4
|
+
require 'launchy'
|
5
|
+
|
6
|
+
|
7
|
+
class Item
|
8
|
+
attr_accessor :name, :sid, :children
|
9
|
+
def initialize(_name, _sid, _children=[])
|
10
|
+
@name=_name
|
11
|
+
@sid=_sid
|
12
|
+
@children=_children
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
@items = []
|
17
|
+
@items << Item.new("LOST", '007', %w(sawyer juliet hurley locke jack freckles))
|
18
|
+
@items << Item.new("ALIAS", '302', %w(sidney sloane jack michael marshal))
|
19
|
+
@items << Item.new("GREY'S ANATOMY", '220', %w(meredith christina izzie alex george))
|
20
|
+
@items << Item.new("BREAKING BAD", '556', %w(pollos gus mike heisenberg))
|
21
|
+
|
22
|
+
|
23
|
+
report = ODFReport::Report.new("test/templates/test_nested_tables.odt") do |r|
|
24
|
+
|
25
|
+
r.add_field("TAG_01", Time.now)
|
26
|
+
r.add_field("TAG_02", "TAG-2 -> New tag")
|
27
|
+
|
28
|
+
r.add_table("TABLE_MAIN", @items) do |s|
|
29
|
+
|
30
|
+
s.add_column('NAME') { |i| i.name }
|
31
|
+
|
32
|
+
s.add_column('SID', :sid)
|
33
|
+
|
34
|
+
s.add_table('TABLE_S1', :children, :header=>true) do |t|
|
35
|
+
t.add_column('NAME1') { |item| "-> #{item}" }
|
36
|
+
t.add_column('INV') { |item| item.to_s.reverse.upcase }
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
report.generate("test/result/test_nested_tables.odt")
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require './lib/odf-report'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'faker'
|
4
|
+
require 'launchy'
|
5
|
+
|
6
|
+
|
7
|
+
class Item
|
8
|
+
attr_accessor :name, :sid, :children
|
9
|
+
def initialize(_name, _sid, _children=[])
|
10
|
+
@name=_name
|
11
|
+
@sid=_sid
|
12
|
+
@children=_children
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
@items = []
|
18
|
+
@items << Item.new("LOST", '007', %w(sawyer juliet hurley locke jack freckles))
|
19
|
+
@items << Item.new("ALIAS", '302', %w(sidney sloane jack michael marshal))
|
20
|
+
@items << Item.new("GREY'S ANATOMY", '220', %w(meredith christina izzie alex george))
|
21
|
+
@items << Item.new("BREAKING BAD", '556', %w(pollos gus mike heisenberg))
|
22
|
+
|
23
|
+
|
24
|
+
report = ODFReport::Report.new("test/templates/test_sections.odt") do |r|
|
25
|
+
|
26
|
+
r.add_field("TAG_01", Time.now)
|
27
|
+
r.add_field("TAG_02", "TAG-2 -> New tag")
|
28
|
+
|
29
|
+
r.add_section("SECTION_01", @items) do |s|
|
30
|
+
|
31
|
+
s.add_field('NAME') { |i| i.name }
|
32
|
+
|
33
|
+
s.add_field('SID', :sid)
|
34
|
+
|
35
|
+
s.add_table('TABLE_S1', :children, :header=>true) do |t|
|
36
|
+
t.add_column('NAME1') { |item| "-> #{item}" }
|
37
|
+
t.add_column('INV') { |item| item.to_s.reverse.upcase }
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
report.generate("test/result/test_sections.odt")
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require './lib/odf-report'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'faker'
|
4
|
+
require 'launchy'
|
5
|
+
|
6
|
+
|
7
|
+
class Item
|
8
|
+
attr_accessor :name, :sid, :children, :subs
|
9
|
+
def initialize(_name, _sid, _children=[], _subs=[])
|
10
|
+
@name=_name
|
11
|
+
@sid=_sid
|
12
|
+
@children=_children
|
13
|
+
@subs=_subs
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
subs1 = []
|
20
|
+
subs1 << Item.new("SAWYER", 1, %w(Your bones don't break))
|
21
|
+
subs1 << Item.new("HURLEY", 2, %w(Your cells react to bacteria and viruses))
|
22
|
+
subs1 << Item.new("LOCKE", 3, %W(Do you see any Teletubbies in here))
|
23
|
+
|
24
|
+
subs2 = []
|
25
|
+
subs2 << Item.new("SLOANE", 21, %w(Praesent hendrerit lectus sit amet))
|
26
|
+
subs2 << Item.new("JACK", 22, %w(Donec nec est eget dolor laoreet))
|
27
|
+
subs2 << Item.new("MICHAEL", 23, %W(Integer elementum massa at nulla placerat varius))
|
28
|
+
|
29
|
+
@items = []
|
30
|
+
@items << Item.new("LOST", '007', [], subs1)
|
31
|
+
@items << Item.new("GREY'S ANATOMY", '220', nil)
|
32
|
+
@items << Item.new("ALIAS", '302', nil, subs2)
|
33
|
+
@items << Item.new("BREAKING BAD", '556', [])
|
34
|
+
|
35
|
+
|
36
|
+
report = ODFReport::Report.new("test/templates/test_sub_sections.odt") do |r|
|
37
|
+
|
38
|
+
r.add_field("TAG_01", Time.now)
|
39
|
+
r.add_field("TAG_02", "TAG-2 -> New tag")
|
40
|
+
|
41
|
+
r.add_section("SECTION_01", @items) do |s|
|
42
|
+
|
43
|
+
s.add_field('NAME') { |i| i.name }
|
44
|
+
|
45
|
+
s.add_field('SID', :sid)
|
46
|
+
|
47
|
+
s.add_section('SUB_01', :subs) do |r|
|
48
|
+
r.add_field("FIRST_NAME", :name)
|
49
|
+
r.add_table('IPSUM_TABLE', :children, :header => true) do |t|
|
50
|
+
t.add_column('IPSUM_ITEM') { |i| i }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
report.generate("test/result/test_sub_sections.odt")
|