odf-report 0.7.0 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/stale.yml +17 -0
- data/.github/workflows/gem-push.yml +40 -0
- data/CHANGELOG.md +68 -0
- data/README.md +16 -5
- data/lib/odf-report/data_source.rb +1 -0
- data/lib/odf-report/field.rb +3 -3
- data/lib/odf-report/image.rb +9 -4
- data/lib/odf-report/report.rb +1 -1
- data/lib/odf-report/section.rb +2 -2
- data/lib/odf-report/table.rb +2 -3
- data/lib/odf-report/template.rb +1 -1
- data/lib/odf-report/version.rb +1 -1
- data/spec/images_spec.rb +118 -39
- data/spec/sections_spec.rb +51 -0
- data/spec/spec_helper.rb +2 -4
- data/spec/templates/specs.odt +0 -0
- metadata +8 -4
- data/lib/odf-report/nested.rb +0 -67
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ff3d6495c26d851b5497d740ce9443d69957efa8b6f11e99c9287e68c339147
|
4
|
+
data.tar.gz: 3ffaee2475b15b556c8bdf7f1e15697442c9603e2c8dc09643887c0170effb2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6eff87a548135805364a1a214687e3b949975184b71bd0ea1796351110e4e142e02e6fda65a45bd039a4825e7bd58f435e2267a040a7ee69c1f8983a956331ce
|
7
|
+
data.tar.gz: 6638443f8259b7b2c8b1fcbee7efa83c935febacbf28141e2392dc2de4a1b67d31caea6726070fe85dfb7eeb1eefb23c39ee57527a8621694252b3a31130ced2
|
data/.github/stale.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# Number of days of inactivity before an issue becomes stale
|
2
|
+
daysUntilStale: 90
|
3
|
+
# Number of days of inactivity before a stale issue is closed
|
4
|
+
daysUntilClose: 21
|
5
|
+
# Issues with these labels will never be considered stale
|
6
|
+
exemptLabels:
|
7
|
+
- pinned
|
8
|
+
- security
|
9
|
+
# Label to use when marking an issue as stale
|
10
|
+
staleLabel: wontfix
|
11
|
+
# Comment to post when marking an issue as stale. Set to `false` to disable
|
12
|
+
markComment: >
|
13
|
+
This issue has been automatically marked as stale because it has not had
|
14
|
+
recent activity. It will be closed if no further activity occurs. Thank you
|
15
|
+
for your contributions.
|
16
|
+
# Comment to post when closing a stale issue. Set to `false` to disable
|
17
|
+
closeComment: false
|
@@ -0,0 +1,40 @@
|
|
1
|
+
name: Ruby Gem
|
2
|
+
|
3
|
+
on:
|
4
|
+
release:
|
5
|
+
types: [published]
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
build:
|
9
|
+
name: Build + Publish
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v2
|
14
|
+
- name: Set up Ruby 2.6
|
15
|
+
uses: actions/setup-ruby@v1
|
16
|
+
with:
|
17
|
+
version: 2.6.x
|
18
|
+
|
19
|
+
# - name: Publish to GPR
|
20
|
+
# run: |
|
21
|
+
# mkdir -p $HOME/.gem
|
22
|
+
# touch $HOME/.gem/credentials
|
23
|
+
# chmod 0600 $HOME/.gem/credentials
|
24
|
+
# printf -- "---\n:github: Bearer ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
25
|
+
# gem build *.gemspec
|
26
|
+
# gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
|
27
|
+
# env:
|
28
|
+
# GEM_HOST_API_KEY: ${{secrets.GPR_AUTH_TOKEN}}
|
29
|
+
# OWNER: username
|
30
|
+
|
31
|
+
- name: Publish to RubyGems
|
32
|
+
run: |
|
33
|
+
mkdir -p $HOME/.gem
|
34
|
+
touch $HOME/.gem/credentials
|
35
|
+
chmod 0600 $HOME/.gem/credentials
|
36
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
37
|
+
gem build *.gemspec
|
38
|
+
gem push *.gem
|
39
|
+
env:
|
40
|
+
GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
6
|
+
|
7
|
+
## Unreleased
|
8
|
+
|
9
|
+
### Breaking Changes
|
10
|
+
|
11
|
+
- None
|
12
|
+
|
13
|
+
### Added
|
14
|
+
|
15
|
+
- None
|
16
|
+
|
17
|
+
### Fixed
|
18
|
+
|
19
|
+
- None
|
20
|
+
|
21
|
+
## 0.7.3
|
22
|
+
|
23
|
+
### Fixed
|
24
|
+
- newer versions (> 1.3.0) of Nokogiri where presenting "Nokogiri::CSS::SyntaxError: unexpected '|'" #120
|
25
|
+
- prevent unnecessary memory expensive operations with missing placeholders #117
|
26
|
+
|
27
|
+
## 0.7.2
|
28
|
+
|
29
|
+
### Fixed
|
30
|
+
|
31
|
+
- files being recognized as "broken file" in Microsoft Word
|
32
|
+
|
33
|
+
|
34
|
+
## 0.7.1
|
35
|
+
|
36
|
+
### Added
|
37
|
+
|
38
|
+
- remove image if path is null
|
39
|
+
- remove section if collection is empty/null
|
40
|
+
|
41
|
+
|
42
|
+
## 0.7.0
|
43
|
+
|
44
|
+
### Added
|
45
|
+
|
46
|
+
- allow nested images inside tables and sections
|
47
|
+
- allow sections inside tables
|
48
|
+
|
49
|
+
### Dependencies
|
50
|
+
|
51
|
+
- rubyzip >= 1.3.0 (was ~> 1.2.0)
|
52
|
+
|
53
|
+
|
54
|
+
## 0.6.0
|
55
|
+
|
56
|
+
### Breaking Changes
|
57
|
+
|
58
|
+
- `ODFReport::File` renamed to `ODFReport::Template`
|
59
|
+
- `ODFReport::Report` constructor signature changed
|
60
|
+
|
61
|
+
### Dependencies
|
62
|
+
|
63
|
+
- rubyzip ~> 1.2.0 (was ~> 1.1.0)
|
64
|
+
|
65
|
+
|
66
|
+
## Earlier Versions
|
67
|
+
|
68
|
+
- No docs yet. Contributions welcome!
|
data/README.md
CHANGED
@@ -3,11 +3,6 @@
|
|
3
3
|
|
4
4
|
Gem for generating .odt files by making strings, images, tables and sections replacements in a previously created .odt file.
|
5
5
|
|
6
|
-
### NEW
|
7
|
-
|
8
|
-
* allow nested images inside tables and sections
|
9
|
-
* allow sections inside tables
|
10
|
-
|
11
6
|
## INSTALL
|
12
7
|
|
13
8
|
In your Gemfile
|
@@ -223,3 +218,19 @@ report = ODFReport::Report.new(io: @template.attachment.read) do |r|
|
|
223
218
|
**rubyzip**: manipulating the contents of the odt file, since it's actually a zip file.
|
224
219
|
**nokogiri**: parsing and manipulating the document xml files.
|
225
220
|
**mime-types**: identify images mime types
|
221
|
+
|
222
|
+
#### TROUBLESHOOTING
|
223
|
+
|
224
|
+
##### Placeholder not replaced
|
225
|
+
|
226
|
+
If your placeholder is not being replaced, the problem might come from OpenOffice/LibreOffice which, when a placeholder is edited, add some markup that prevents odf-report from identifying the placeholder.
|
227
|
+
|
228
|
+
The golden rule is: NEVER edit the placeholders. If you want to change one, delete it an write again, including the []
|
229
|
+
Example: if you have, say, [USER] in your template and you want to change to [USERNAME], you should not edit and type NAME.
|
230
|
+
Delete the PLACEHOLDER [USER] and type [USERNAME].
|
231
|
+
|
232
|
+
##### Word found unreadable content
|
233
|
+
|
234
|
+
- Symptom: You prepare your template file in eg. LibreOffice, and when you open the template in Word it says "Word found unreadable content"
|
235
|
+
- Solution: Open your template in LibreOffice, save as `.docx`, quit LibreOffice. Open the `.docx` in LibreOffice, save as `.odt`.
|
236
|
+
- Hypothesis: Word does not support all ODT features. Saving as `.docx` removes those features of the document.
|
data/lib/odf-report/field.rb
CHANGED
data/lib/odf-report/image.rb
CHANGED
@@ -19,10 +19,15 @@ module ODFReport
|
|
19
19
|
|
20
20
|
file = @data_source.value
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
if file
|
23
|
+
image.attribute('href').content = File.join(IMAGE_DIR_NAME, File.basename(file))
|
24
|
+
frame.attribute('name').content = SecureRandom.uuid
|
25
|
+
|
26
|
+
@files << file
|
27
|
+
else
|
28
|
+
frame.remove
|
29
|
+
end
|
30
|
+
|
26
31
|
end
|
27
32
|
|
28
33
|
def self.include_image_file(zip_file, image_file)
|
data/lib/odf-report/report.rb
CHANGED
data/lib/odf-report/section.rb
CHANGED
@@ -26,11 +26,11 @@ module ODFReport
|
|
26
26
|
private
|
27
27
|
|
28
28
|
def find_section_node(doc)
|
29
|
-
@section_node = doc.
|
29
|
+
@section_node = doc.at_xpath("//text:section[@text:name='#{@name}']")
|
30
30
|
end
|
31
31
|
|
32
32
|
def deep_clone(node)
|
33
|
-
Nokogiri::XML(wrap_with_ns(node)).
|
33
|
+
Nokogiri::XML(wrap_with_ns(node)).at_xpath("//text:section")
|
34
34
|
.tap { |n| n.attribute('name').content = SecureRandom.uuid }
|
35
35
|
|
36
36
|
end
|
data/lib/odf-report/table.rb
CHANGED
@@ -60,7 +60,6 @@ module ODFReport
|
|
60
60
|
end
|
61
61
|
|
62
62
|
return deep_clone(ret)
|
63
|
-
# return ret.dup
|
64
63
|
end
|
65
64
|
|
66
65
|
def get_start_node
|
@@ -72,11 +71,11 @@ module ODFReport
|
|
72
71
|
end
|
73
72
|
|
74
73
|
def find_table_node(doc)
|
75
|
-
doc.
|
74
|
+
doc.at_xpath("//table:table[@table:name='#{@name}']")
|
76
75
|
end
|
77
76
|
|
78
77
|
def deep_clone(node)
|
79
|
-
Nokogiri::XML(wrap_with_ns(node)).
|
78
|
+
Nokogiri::XML(wrap_with_ns(node)).at_xpath("//table:table-row")
|
80
79
|
end
|
81
80
|
|
82
81
|
end
|
data/lib/odf-report/template.rb
CHANGED
data/lib/odf-report/version.rb
CHANGED
data/spec/images_spec.rb
CHANGED
@@ -1,77 +1,156 @@
|
|
1
1
|
RSpec.describe "Images" do
|
2
2
|
|
3
|
-
|
3
|
+
context('Adding Images') do
|
4
4
|
|
5
|
-
|
6
|
-
@list << OpenStruct.new({ name: "IMG - [1, 1]", path: 'spec/images/image_1.jpg', path2: 'spec/images/image_1.jpg' })
|
7
|
-
@list << OpenStruct.new({ name: "IMG - [2, 1]", path: 'spec/images/image_2.jpg', path2: 'spec/images/image_1.jpg' })
|
8
|
-
@list << OpenStruct.new({ name: "IMG - [3, 2]", path: 'spec/images/image_3.jpg', path2: 'spec/images/image_2.jpg' })
|
9
|
-
@list << OpenStruct.new({ name: "IMG - [1, 3]", path: 'spec/images/image_1.jpg', path2: 'spec/images/image_3.jpg' })
|
10
|
-
@list << OpenStruct.new({ name: "IMG - [2, 2]", path: 'spec/images/image_2.jpg', path2: 'spec/images/image_2.jpg' })
|
5
|
+
before(:context) do
|
11
6
|
|
7
|
+
@list = []
|
8
|
+
@list << OpenStruct.new({ name: "IMG - [1, 1]", path: 'spec/images/image_1.jpg', path2: 'spec/images/image_1.jpg' })
|
9
|
+
@list << OpenStruct.new({ name: "IMG - [2, 1]", path: 'spec/images/image_2.jpg', path2: 'spec/images/image_1.jpg' })
|
10
|
+
@list << OpenStruct.new({ name: "IMG - [3, 2]", path: 'spec/images/image_3.jpg', path2: 'spec/images/image_2.jpg' })
|
11
|
+
@list << OpenStruct.new({ name: "IMG - [1, 3]", path: 'spec/images/image_1.jpg', path2: 'spec/images/image_3.jpg' })
|
12
|
+
@list << OpenStruct.new({ name: "IMG - [2, 2]", path: 'spec/images/image_2.jpg', path2: 'spec/images/image_2.jpg' })
|
12
13
|
|
13
|
-
report = ODFReport::Report.new("spec/templates/images.odt") do |r|
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
report = ODFReport::Report.new("spec/templates/images.odt") do |r|
|
16
|
+
|
17
|
+
r.add_image("IMAGE_01", 'spec/images/rails.png')
|
18
|
+
r.add_image("IMAGE_02", 'spec/images/piriapolis.jpg')
|
19
|
+
|
20
|
+
r.add_table('IMAGE_TABLE', @list) do |t|
|
21
|
+
t.add_column(:image_name, :name)
|
22
|
+
t.add_image('IMAGE_IN_TABLE_01', :path)
|
23
|
+
t.add_image('IMAGE_IN_TABLE_02', :path2)
|
24
|
+
end
|
25
|
+
|
26
|
+
r.add_section('SECTION', @list) do |t|
|
27
|
+
t.add_field(:image_name, :name)
|
28
|
+
t.add_image('IMAGE_IN_SECTION_01', :path2)
|
29
|
+
t.add_image('IMAGE_IN_SECTION_02', :path)
|
30
|
+
end
|
17
31
|
|
18
|
-
r.add_table('IMAGE_TABLE', @list) do |t|
|
19
|
-
t.add_column(:image_name, :name)
|
20
|
-
t.add_image('IMAGE_IN_TABLE_01', :path)
|
21
|
-
t.add_image('IMAGE_IN_TABLE_02', :path2)
|
22
32
|
end
|
23
33
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
34
|
+
report.generate("spec/result/images.odt")
|
35
|
+
|
36
|
+
@data = Inspector.new("spec/result/images.odt")
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
it "simple image replacement" do
|
42
|
+
|
43
|
+
images = @data.xml.xpath("//draw:image")
|
44
|
+
|
45
|
+
expect(images[0].attribute('href').value).to eq "Pictures/rails.png"
|
46
|
+
expect(images[1].attribute('href').value).to eq "Pictures/piriapolis.jpg"
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
it "table columns replacement" do
|
51
|
+
|
52
|
+
table = @data.xml.at_xpath(".//table:table[@table:name='IMAGE_TABLE']")
|
53
|
+
|
54
|
+
@list.each_with_index do |item, idx|
|
55
|
+
|
56
|
+
row = table.xpath(".//table:table-row[#{idx+1}]")
|
57
|
+
|
58
|
+
images = row.xpath(".//draw:image")
|
59
|
+
|
60
|
+
expect(File.basename(images[0].attribute('href').value)).to eq File.basename(item.path)
|
61
|
+
expect(File.basename(images[1].attribute('href').value)).to eq File.basename(item.path2)
|
62
|
+
|
28
63
|
end
|
29
64
|
|
30
65
|
end
|
31
66
|
|
32
|
-
|
67
|
+
it "section fields replacement" do
|
68
|
+
|
69
|
+
@list.each_with_index do |item, idx|
|
70
|
+
|
71
|
+
section = @data.xml.at_xpath(".//text:section[#{idx+1}]")
|
72
|
+
|
73
|
+
images = section.xpath(".//draw:image")
|
33
74
|
|
34
|
-
|
75
|
+
expect(File.basename(images[0].attribute('href').value)).to eq File.basename(item.path)
|
76
|
+
expect(File.basename(images[1].attribute('href').value)).to eq File.basename(item.path2)
|
35
77
|
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
36
81
|
end
|
37
82
|
|
83
|
+
context "Removing Images" do
|
38
84
|
|
39
|
-
|
85
|
+
before(:context) do
|
40
86
|
|
41
|
-
|
87
|
+
@list = []
|
88
|
+
@list << OpenStruct.new({ name: "IMG - both ok", path: 'spec/images/image_1.jpg', path2: 'spec/images/image_1.jpg' })
|
89
|
+
@list << OpenStruct.new({ name: "IMG - 1 ok", path: 'spec/images/image_2.jpg', path2: nil })
|
90
|
+
@list << OpenStruct.new({ name: "IMG - 2 ok", path: nil, path2: 'spec/images/image_3.jpg' })
|
91
|
+
# @list << OpenStruct.new({ name: "IMG - 2 invalid", path: nil, path2: 'spec/images/invalid.jpg' })
|
42
92
|
|
43
|
-
|
44
|
-
expect(images[1].attribute('href').value).to eq "Pictures/piriapolis.jpg"
|
93
|
+
report = ODFReport::Report.new("spec/templates/images.odt") do |r|
|
45
94
|
|
46
|
-
|
95
|
+
# r.add_image("IMAGE_01")
|
96
|
+
r.add_image("IMAGE_02", nil)
|
47
97
|
|
48
|
-
|
98
|
+
r.add_table('IMAGE_TABLE', @list) do |t|
|
99
|
+
t.add_column(:image_name, :name)
|
100
|
+
t.add_image('IMAGE_IN_TABLE_01', :path)
|
101
|
+
t.add_image('IMAGE_IN_TABLE_02', :path2)
|
102
|
+
end
|
49
103
|
|
50
|
-
|
104
|
+
r.add_section('SECTION', @list) do |t|
|
105
|
+
t.add_field(:image_name, :name)
|
106
|
+
t.add_image('IMAGE_IN_SECTION_01', :path2)
|
107
|
+
t.add_image('IMAGE_IN_SECTION_02', :path)
|
108
|
+
end
|
51
109
|
|
52
|
-
|
110
|
+
end
|
53
111
|
|
54
|
-
|
112
|
+
report.generate("spec/result/images.odt")
|
55
113
|
|
56
|
-
|
114
|
+
@data = Inspector.new("spec/result/images.odt")
|
57
115
|
|
58
|
-
|
59
|
-
expect(File.basename(images[1].attribute('href').value)).to eq File.basename(item.path2)
|
116
|
+
end
|
60
117
|
|
118
|
+
it "removes nil images in report" do
|
119
|
+
expect(@data.xml.at_xpath(".//draw:frame[@draw:name='IMAGE_01']")).to be
|
120
|
+
expect(@data.xml.at_xpath(".//draw:frame[@draw:name='IMAGE_02']")).to be_nil
|
61
121
|
end
|
62
122
|
|
63
|
-
|
123
|
+
it "removes nil images in tables" do
|
124
|
+
|
125
|
+
table = @data.xml.at_xpath(".//table:table[@table:name='IMAGE_TABLE']")
|
64
126
|
|
65
|
-
|
127
|
+
images = table.xpath(".//table:table-row[1]//draw:image")
|
128
|
+
expect(File.basename(images[0].attribute('href').value)).to eq File.basename(@list[0].path)
|
129
|
+
expect(File.basename(images[1].attribute('href').value)).to eq File.basename(@list[0].path2)
|
130
|
+
|
131
|
+
images = table.xpath(".//table:table-row[2]//draw:image")
|
132
|
+
expect(File.basename(images[0].attribute('href').value)).to eq File.basename(@list[1].path)
|
133
|
+
expect(images[1]).to be_nil
|
134
|
+
|
135
|
+
images = table.xpath(".//table:table-row[3]//draw:image")
|
136
|
+
expect(File.basename(images[0].attribute('href').value)).to eq File.basename(@list[2].path2)
|
137
|
+
expect(images[1]).to be_nil
|
138
|
+
|
139
|
+
end
|
66
140
|
|
67
|
-
|
141
|
+
it "removes nil images in sections " do
|
68
142
|
|
69
|
-
|
143
|
+
images = @data.xml.xpath(".//text:section[1]//draw:image")
|
144
|
+
expect(File.basename(images[0].attribute('href').value)).to eq File.basename(@list[0].path)
|
145
|
+
expect(File.basename(images[1].attribute('href').value)).to eq File.basename(@list[0].path2)
|
70
146
|
|
71
|
-
images =
|
147
|
+
images = @data.xml.xpath(".//text:section[2]//draw:image")
|
148
|
+
expect(File.basename(images[0].attribute('href').value)).to eq File.basename(@list[1].path)
|
149
|
+
expect(images[1]).to be_nil
|
72
150
|
|
73
|
-
|
74
|
-
expect(File.basename(images[
|
151
|
+
images = @data.xml.xpath(".//text:section[3]//draw:image")
|
152
|
+
expect(File.basename(images[0].attribute('href').value)).to eq File.basename(@list[2].path2)
|
153
|
+
expect(images[1]).to be_nil
|
75
154
|
|
76
155
|
end
|
77
156
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
RSpec.describe "Sections" do
|
2
|
+
|
3
|
+
before(:context) do
|
4
|
+
@itens = Item.get_list(3)
|
5
|
+
|
6
|
+
report = ODFReport::Report.new("spec/templates/specs.odt") do |r|
|
7
|
+
|
8
|
+
r.add_section('SECTION_01', @itens) do |t|
|
9
|
+
t.add_field(:s01_field_01, :id)
|
10
|
+
t.add_field(:s01_field_02, :name)
|
11
|
+
end
|
12
|
+
|
13
|
+
r.add_section('SECTION_02', []) do |t|
|
14
|
+
t.add_field(:s02_field_01, :id)
|
15
|
+
t.add_field(:s02_field_02, :name)
|
16
|
+
end
|
17
|
+
|
18
|
+
r.add_section('SECTION_03', nil) do |t|
|
19
|
+
t.add_field(:s03_field_01, :id)
|
20
|
+
t.add_field(:s03_field_02, :name)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
report.generate("spec/result/specs.odt")
|
26
|
+
|
27
|
+
@data = Inspector.new("spec/result/specs.odt")
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should render section with collection" do
|
32
|
+
@itens.each_with_index do |item, idx|
|
33
|
+
section = @data.xml.at_xpath(".//text:section[#{idx+1}]").to_s
|
34
|
+
|
35
|
+
expect(section).to match(item.id.to_s)
|
36
|
+
expect(section).to match(item.name)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should remove section with empty collection" do
|
41
|
+
section = @data.xml.at_xpath("//text:section[@text:name='SECTION_02']")
|
42
|
+
expect(section).to be_nil
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should remove section with nil collection" do
|
46
|
+
section = @data.xml.at_xpath("//text:section[@text:name='SECTION_03']")
|
47
|
+
expect(section).to be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -12,11 +12,9 @@ class Item
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.get_list(quant = 3)
|
15
|
-
|
16
|
-
|
17
|
-
r << Item.new(Faker::Number.number(digits: 10), Faker::Name.name)
|
15
|
+
(1..quant).map do |i|
|
16
|
+
Item.new(Faker::Number.number(digits: 10), Faker::Name.name)
|
18
17
|
end
|
19
|
-
r
|
20
18
|
end
|
21
19
|
|
22
20
|
end
|
data/spec/templates/specs.odt
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: odf-report
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sandro Duarte
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -130,8 +130,11 @@ executables:
|
|
130
130
|
extensions: []
|
131
131
|
extra_rdoc_files: []
|
132
132
|
files:
|
133
|
+
- ".github/stale.yml"
|
134
|
+
- ".github/workflows/gem-push.yml"
|
133
135
|
- ".gitignore"
|
134
136
|
- ".rspec"
|
137
|
+
- CHANGELOG.md
|
135
138
|
- Gemfile
|
136
139
|
- MIT-LICENSE
|
137
140
|
- Manifest
|
@@ -144,7 +147,6 @@ files:
|
|
144
147
|
- lib/odf-report/field.rb
|
145
148
|
- lib/odf-report/image.rb
|
146
149
|
- lib/odf-report/nestable.rb
|
147
|
-
- lib/odf-report/nested.rb
|
148
150
|
- lib/odf-report/parser/default.rb
|
149
151
|
- lib/odf-report/report.rb
|
150
152
|
- lib/odf-report/section.rb
|
@@ -161,6 +163,7 @@ files:
|
|
161
163
|
- spec/images/placeholder.jpg
|
162
164
|
- spec/images/rails.png
|
163
165
|
- spec/images_spec.rb
|
166
|
+
- spec/sections_spec.rb
|
164
167
|
- spec/spec_helper.rb
|
165
168
|
- spec/tables_spec.rb
|
166
169
|
- spec/template_spec.rb
|
@@ -208,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
211
|
- !ruby/object:Gem::Version
|
209
212
|
version: '0'
|
210
213
|
requirements: []
|
211
|
-
rubygems_version: 3.
|
214
|
+
rubygems_version: 3.2.32
|
212
215
|
signing_key:
|
213
216
|
specification_version: 4
|
214
217
|
summary: Generates ODF files, given a template (.odt) and data, replacing tags
|
@@ -221,6 +224,7 @@ test_files:
|
|
221
224
|
- spec/images/placeholder.jpg
|
222
225
|
- spec/images/rails.png
|
223
226
|
- spec/images_spec.rb
|
227
|
+
- spec/sections_spec.rb
|
224
228
|
- spec/spec_helper.rb
|
225
229
|
- spec/tables_spec.rb
|
226
230
|
- spec/template_spec.rb
|
data/lib/odf-report/nested.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
module ODFReport
|
2
|
-
|
3
|
-
module Nested
|
4
|
-
|
5
|
-
def add_field(name, data_field=nil, &block)
|
6
|
-
opts = {name: name, data_field: data_field}
|
7
|
-
@fields << Field.new(opts, &block)
|
8
|
-
|
9
|
-
end
|
10
|
-
alias_method :add_column, :add_field
|
11
|
-
|
12
|
-
def add_text(name, data_field=nil, &block)
|
13
|
-
opts = {name: name, data_field: data_field}
|
14
|
-
@texts << Text.new(opts, &block)
|
15
|
-
end
|
16
|
-
|
17
|
-
def add_image(name, data_field=nil, &block)
|
18
|
-
opts = {name: name, data_field: data_field}
|
19
|
-
@images << Image.new(opts, &block)
|
20
|
-
end
|
21
|
-
|
22
|
-
def add_table(table_name, collection_field, opts={})
|
23
|
-
opts.merge!(name: table_name, collection_field: collection_field)
|
24
|
-
tab = Table.new(opts)
|
25
|
-
@tables << tab
|
26
|
-
|
27
|
-
yield(tab)
|
28
|
-
end
|
29
|
-
|
30
|
-
def add_section(section_name, collection_field, opts={})
|
31
|
-
opts.merge!(name: section_name, collection_field: collection_field)
|
32
|
-
sec = Section.new(opts)
|
33
|
-
@sections << sec
|
34
|
-
|
35
|
-
yield(sec)
|
36
|
-
end
|
37
|
-
|
38
|
-
def all_images
|
39
|
-
(@images.map(&:files) + @sections.map(&:all_images) + @tables.map(&:all_images)).flatten
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_collection_from_item(item, collection_field)
|
43
|
-
|
44
|
-
return item[collection_field] if item.is_a?(Hash)
|
45
|
-
|
46
|
-
if collection_field.is_a?(Array)
|
47
|
-
tmp = item.dup
|
48
|
-
collection_field.each do |f|
|
49
|
-
if f.is_a?(Hash)
|
50
|
-
tmp = tmp.send(f.keys[0], f.values[0])
|
51
|
-
else
|
52
|
-
tmp = tmp.send(f)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
collection = tmp
|
56
|
-
elsif collection_field.is_a?(Hash)
|
57
|
-
collection = item.send(collection_field.keys[0], collection_field.values[0])
|
58
|
-
else
|
59
|
-
collection = item.send(collection_field)
|
60
|
-
end
|
61
|
-
|
62
|
-
return collection
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|