oxml_maker 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a34e4889ab877b4ffd10572cdf45d54cf1f860d1980e74fb20840190cd5b6f7
4
- data.tar.gz: 81315caa4bf153a02f3045e0248c87348a0c8f0eb3984fec30253c3fb0d92bd7
3
+ metadata.gz: 244909709648e421faeca989cd00ef0d58f3de0917b606c36581059781cee835
4
+ data.tar.gz: cabce2d33245226176e2df74efb63a6fc9ae67edbd0f3a660da01dc017dd0996
5
5
  SHA512:
6
- metadata.gz: 3f67753dcad5da06668f027ac73cb93f77bf64a587d1ec2c63c305fcfba3340bf8e978ebf7f40e143865411547ce95035a706b381a8ccd749bdb26b4549fe295
7
- data.tar.gz: 6b6cf09d9f221b644dc6308a6ae9503ebbb6e94e782367d1337af12bd9800e02733d5cca1e08906a82f70f1c3b5a82205d846170b0b03a91ec859de72a6a6b1d
6
+ metadata.gz: a3ce1886f3d9ef3a8d466e6979f505581bc6b211fd941b28b8bb975dec39f1c8eee90efc1a23919e64d9a9509ab9124644c0a887d9e4c2d182543978bcd1add1
7
+ data.tar.gz: b015b2ef222fe7c4485fd5be0d2c8751bbea8bd3eb98a4151a20910f64e352ce3ee3d26b5dfe44c2f63c406821eb8a92c9a94d5ff59288b21047d1d1940ec0ed
@@ -0,0 +1,5 @@
1
+ {
2
+ "recommendations": [
3
+ "redhat.vscode-xml"
4
+ ]
5
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "xml.format.enabled": true,
3
+ "xml.format.splitAttributes": "preserve",
4
+ "xml.format.joinCDATALines": false,
5
+ "xml.format.joinCommentLines": false,
6
+ "xml.format.joinContentLines": false,
7
+ "xml.format.spaceBeforeEmptyCloseTag": true,
8
+ "xml.format.splitAttributesIndentSize": 2,
9
+ "xml.format.maxLineWidth": 120,
10
+ "xml.format.preservedNewlines": 2,
11
+ "xml.preferences.includeSchemaLocation": "onValidationError",
12
+ "xml.validation.enabled": true,
13
+ "xml.validation.namespaces.enabled": "always",
14
+ "[xml]": {
15
+ "editor.formatOnSave": true,
16
+ "editor.insertSpaces": true,
17
+ "editor.tabSize": 2,
18
+ "editor.indentSize": 2,
19
+ "editor.wordWrap": "on",
20
+ "editor.defaultFormatter": "redhat.vscode-xml"
21
+ },
22
+ "files.associations": {
23
+ "*.xml": "xml"
24
+ },
25
+ "emmet.includeLanguages": {
26
+ "xml": "html"
27
+ }
28
+ }
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.3] - 2025-10-21
4
+
5
+ ### Added
6
+ - VS Code development environment configuration
7
+ - `.vscode/settings.json` with XML formatting rules and auto-format on save
8
+ - `.vscode/extensions.json` with recommended XML language support extensions
9
+ - Automatic test artifact cleanup functionality
10
+ - Enhanced development documentation in README
11
+
12
+ ### Enhanced
13
+ - XML template files properly formatted with consistent indentation
14
+ - Development workflow with automatic cleanup of `.docx` and `.zip` files
15
+ - Contributor onboarding experience with VS Code integration
16
+ - Documentation structure for better developer experience
17
+
18
+ ### Developer Experience
19
+ - Cross-platform XML formatting without additional gem dependencies
20
+ - Automatic cleanup of test artifacts from `lib/`, `public/`, and root directories
21
+ - Consistent 2-space indentation for XML files matching Ruby code style
22
+ - Real-time XML validation and IntelliSense support in VS Code
23
+
3
24
  ## [0.1.2] - 2025-10-21
4
25
 
5
26
  ### Added
data/README.md CHANGED
@@ -6,6 +6,7 @@ A Ruby gem for generating Microsoft Word DOCX files using OpenXML. Create profes
6
6
 
7
7
  - ✅ **Generate Valid DOCX Files**: Creates Microsoft Word-compatible documents
8
8
  - ✅ **Tables with Dynamic Data**: Populate tables from Ruby objects
9
+ - ✅ **Advanced Table Features**: Vertical cell merging (v_merge) and multi-line content (new_line)
9
10
  - ✅ **Paragraphs and Text**: Simple text content with proper XML structure
10
11
  - ✅ **Page Configuration**: Control page size, margins, headers/footers
11
12
  - ✅ **Rails Integration**: Automatically detects Rails environment for file placement
@@ -124,6 +125,46 @@ params = {
124
125
  }
125
126
  ```
126
127
 
128
+ ### Advanced Table Features
129
+
130
+ #### Vertical Cell Merging and Multi-line Content
131
+
132
+ ```ruby
133
+ # Advanced table with v_merge and new_line features
134
+ advanced_table = {
135
+ columns: [
136
+ { name: "Category", width: 1500 },
137
+ { name: "Items", width: 3000 }
138
+ ],
139
+ rows: [
140
+ {
141
+ cells: [
142
+ { value: :category, width: 1500, v_merge: true },
143
+ { value: :items, width: 3000, new_line: true }
144
+ ]
145
+ }
146
+ ],
147
+ data: {
148
+ 0 => [
149
+ OpenStruct.new(category: "Electronics", items: "iPhone, Samsung, Google"),
150
+ OpenStruct.new(category: "Electronics", items: "MacBook, ThinkPad, Dell"),
151
+ OpenStruct.new(category: "Books", items: "Fiction, Non-fiction, Science")
152
+ ]
153
+ },
154
+ font_size: 12
155
+ }
156
+
157
+ # v_merge: true - Merges cells with same values vertically
158
+ # new_line: true - Splits comma-separated values into separate lines
159
+ params = {
160
+ sections: [
161
+ { table: advanced_table }
162
+ ],
163
+ page_size: { width: 12240, height: 15840 },
164
+ page_margin: { top: 1440, right: 1440, bottom: 1440, left: 1440, header: 720, footer: 720, gutter: 0 }
165
+ }
166
+ ```
167
+
127
168
  ### Adding Paragraphs
128
169
 
129
170
  Simple text content with proper XML formatting:
@@ -150,131 +191,76 @@ The gem intelligently handles output location:
150
191
 
151
192
  ## Development
152
193
 
194
+ ### Setup
195
+
153
196
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
154
197
 
155
198
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
156
199
 
157
- ## Testing
200
+ ### 🔧 VS Code Setup for XML Development
158
201
 
159
- ### Test Framework
202
+ **Important for Contributors**: This project includes XML template files that benefit from proper formatting and validation.
160
203
 
161
- The gem uses **Minitest** as its testing framework, which is included in Ruby's standard library. The test structure follows Ruby conventions:
204
+ 📖 **See [DEVELOPMENT.md](DEVELOPMENT.md) for detailed contributor guidelines and XML formatting standards.**
162
205
 
163
- - `test/test_helper.rb` - Common setup and helper methods
164
- - `test/test_*.rb` - Individual test files for each class
165
- - Tests run with `bundle exec rake test`
206
+ #### Recommended VS Code Extensions
166
207
 
167
- ### Current Test Coverage
208
+ When you open this project in VS Code, you'll be prompted to install recommended extensions:
168
209
 
169
- - **63 tests, 274 assertions, 0 failures, 0 errors**
170
- - Unit tests for all classes (Document, Paragraph, Table)
171
- - Integration tests for complete workflows
172
- - ZIP functionality tests with rubyzip
173
- - Rails environment detection tests
174
- - Error handling and edge case tests
210
+ - **XML Language Support** (`redhat.vscode-xml`) - Provides XML formatting, validation, and IntelliSense
211
+ - **JSON Language Features** (`ms-vscode.vscode-json`) - Enhanced JSON editing for configuration files
175
212
 
176
- ### Test Files
213
+ #### Automatic Configuration
177
214
 
178
- 1. **test_oxml_maker.rb** - Tests for the main module
179
- 2. **test_paragraph.rb** - Tests for the Paragraph class
180
- 3. **test_table.rb** - Tests for the Table class
181
- 4. **test_document.rb** - Tests for the Document class
182
- 5. **test_integration.rb** - Integration tests combining multiple classes
183
- 6. **test_zip_functionality.rb** - ZIP creation and DOCX structure tests
184
- 7. **test_full_workflow_integration.rb** - Complete end-to-end workflow tests
215
+ The project includes `.vscode/settings.json` with pre-configured XML formatting rules:
185
216
 
186
- ### Running Tests
217
+ - **Auto-format on save** for XML files
218
+ - ✅ **2-space indentation** (consistent with Ruby code)
219
+ - ✅ **Line width limit** of 120 characters
220
+ - ✅ **XML validation** enabled
221
+ - ✅ **Attribute splitting** for better readability
187
222
 
188
- ```bash
189
- # Run all tests
190
- bundle exec rake test
191
-
192
- # Run a specific test file
193
- bundle exec ruby -Itest test/test_paragraph.rb
223
+ #### XML File Formatting
194
224
 
195
- # Run a specific test method
196
- bundle exec ruby -Itest test/test_paragraph.rb -n test_initialize_with_valid_hash
197
- ```
225
+ To format XML files manually:
226
+ 1. Open any `.xml` file in `lib/oxml_maker/docx/`
227
+ 2. Press `Shift+Alt+F` (or `Cmd+Shift+P` → "Format Document")
228
+ 3. Files will auto-format on save when configured
198
229
 
199
- ### Types of Tests
230
+ This ensures consistent XML formatting across all contributors without additional gem dependencies! 🎨
200
231
 
201
- #### 1. Unit Tests
202
- Test individual methods and classes in isolation:
232
+ ### 📁 Project Structure
203
233
 
204
- ```ruby
205
- def test_initialize_with_valid_hash
206
- data = { text: "Hello, World!" }
207
- paragraph = OxmlMaker::Paragraph.new(data)
208
-
209
- assert_equal data, paragraph.data
210
- end
211
234
  ```
212
-
213
- #### 2. Template/Output Tests
214
- Verify that XML output contains expected elements:
215
-
216
- ```ruby
217
- def test_template_includes_xml_declaration
218
- doc = OxmlMaker::Document.new(params: @sample_params)
219
- template = doc.template
220
-
221
- assert_includes template, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
222
- end
235
+ lib/oxml_maker/docx/ # XML template files - keep these formatted!
236
+ ├── [Content_Types].xml
237
+ ├── _rels/
238
+ └── word/
239
+ └── document.xml # Main document template
223
240
  ```
224
241
 
225
- #### 3. Integration Tests
226
- Test multiple classes working together:
227
-
228
- ```ruby
229
- def test_document_with_mixed_content
230
- params = {
231
- sections: [
232
- { paragraph: { text: "Document Title" } },
233
- { table: table_data }
234
- ],
235
- page_size: { width: 12240, height: 15840 }
236
- }
242
+ ### 🧹 Development Cleanup
237
243
 
238
- document = OxmlMaker::Document.new(params: params)
239
- xml = document.template
244
+ The project includes automatic cleanup of test artifacts:
240
245
 
241
- assert_includes xml, "<w:t>Document Title</w:t>"
242
- end
243
- ```
246
+ ```bash
247
+ # Run tests with automatic cleanup
248
+ bundle exec rake test_clean
244
249
 
245
- #### 4. ZIP Functionality Tests
246
- Verify DOCX file creation and structure:
250
+ # Manual cleanup of .docx and .zip files
251
+ bundle exec rake clean
247
252
 
248
- ```ruby
249
- def test_created_zip_is_valid_docx
250
- doc = OxmlMaker::Document.new(filename: "test.docx", params: @params)
251
- doc.create
252
-
253
- # Verify ZIP structure matches DOCX requirements
254
- Zip::File.open(@docx_path) do |zip|
255
- assert zip.find_entry("[Content_Types].xml"), "Should contain Content Types"
256
- assert zip.find_entry("_rels/.rels"), "Should contain relationships"
257
- assert zip.find_entry("word/document.xml"), "Should contain main document"
258
- end
259
- end
253
+ # Regular test run (includes automatic cleanup)
254
+ bundle exec rake test
260
255
  ```
261
256
 
262
- ### Testing Best Practices
263
-
264
- 1. **Use Setup and Teardown** for consistent test environments
265
- 2. **Test Edge Cases** including empty inputs, nil values, and special characters
266
- 3. **Use Descriptive Test Names** that explain what is being tested
267
- 4. **Test Both Success and Failure Paths** to ensure robust error handling
268
- 5. **Mock External Dependencies** when needed (Rails environment, file systems)
257
+ Test artifacts are automatically removed from:
258
+ - `lib/oxml_maker/` directory
259
+ - `public/` directory
260
+ - Root directory
269
261
 
270
- ### Common Assertions
262
+ This keeps your workspace clean during development! ✨
271
263
 
272
- - `assert_equal expected, actual` - Test equality
273
- - `assert_includes collection, item` - Test inclusion
274
- - `assert_raises(ExceptionClass) { code }` - Test exceptions
275
- - `assert condition` - Test truthiness
276
- - `refute condition` - Test falsiness
277
- - `assert_kind_of Class, object` - Test object type
278
264
 
279
265
  ## Why OxmlMaker is Different: The Ruby Object Revolution
280
266
 
@@ -426,6 +412,112 @@ document_params = {
426
412
 
427
413
  This isn't just a different API - it's a **fundamentally superior architecture** for modern Ruby applications.
428
414
 
415
+ ## Testing
416
+
417
+ ### Test Framework
418
+
419
+ The gem uses **Minitest** as its testing framework, which is included in Ruby's standard library. The test structure follows Ruby conventions:
420
+
421
+ - `test/test_helper.rb` - Common setup and helper methods
422
+ - `test/test_*.rb` - Individual test files for each class
423
+ - Tests run with `bundle exec rake test`
424
+
425
+ ### Current Test Coverage
426
+
427
+ - **67 tests, 344 assertions, 0 failures, 0 errors**
428
+ - Unit tests for all classes (Document, Paragraph, Table)
429
+ - Integration tests for complete workflows
430
+ - Advanced table feature tests (v_merge, new_line)
431
+ - ZIP functionality tests with rubyzip
432
+ - Rails environment detection tests
433
+ - Error handling and edge case tests
434
+
435
+ ### Test Files
436
+
437
+ 1. **test_oxml_maker.rb** - Tests for the main module
438
+ 2. **test_paragraph.rb** - Tests for the Paragraph class
439
+ 3. **test_table.rb** - Tests for the Table class
440
+ 4. **test_document.rb** - Tests for the Document class
441
+ 5. **test_integration.rb** - Integration tests combining multiple classes
442
+ 6. **test_zip_functionality.rb** - ZIP creation and DOCX structure tests
443
+ 7. **test_full_workflow_integration.rb** - Complete end-to-end workflow tests
444
+
445
+ ### Running Tests
446
+
447
+ ```bash
448
+ # Run all tests
449
+ bundle exec rake test
450
+
451
+ # Run a specific test file
452
+ bundle exec ruby -Itest test/test_paragraph.rb
453
+
454
+ # Run a specific test method
455
+ bundle exec ruby -Itest test/test_paragraph.rb -n test_initialize_with_valid_hash
456
+ ```
457
+
458
+ ### Types of Tests
459
+
460
+ #### 1. Unit Tests
461
+ Test individual methods and classes in isolation:
462
+
463
+ ```ruby
464
+ def test_initialize_with_valid_hash
465
+ data = { text: "Hello, World!" }
466
+ paragraph = OxmlMaker::Paragraph.new(data)
467
+
468
+ assert_equal data, paragraph.data
469
+ end
470
+ ```
471
+
472
+ #### 2. Template/Output Tests
473
+ Verify that XML output contains expected elements:
474
+
475
+ ```ruby
476
+ def test_template_includes_xml_declaration
477
+ doc = OxmlMaker::Document.new(params: @sample_params)
478
+ template = doc.template
479
+
480
+ assert_includes template, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
481
+ end
482
+ ```
483
+
484
+ #### 3. Integration Tests
485
+ Test multiple classes working together:
486
+
487
+ ```ruby
488
+ def test_document_with_mixed_content
489
+ params = {
490
+ sections: [
491
+ { paragraph: { text: "Document Title" } },
492
+ { table: table_data }
493
+ ],
494
+ page_size: { width: 12240, height: 15840 }
495
+ }
496
+
497
+ document = OxmlMaker::Document.new(params: params)
498
+ xml = document.template
499
+
500
+ assert_includes xml, "<w:t>Document Title</w:t>"
501
+ end
502
+ ```
503
+
504
+ #### 4. ZIP Functionality Tests
505
+ Verify DOCX file creation and structure:
506
+
507
+ ```ruby
508
+ def test_created_zip_is_valid_docx
509
+ doc = OxmlMaker::Document.new(filename: "test.docx", params: @params)
510
+ doc.create
511
+
512
+ # Verify ZIP structure matches DOCX requirements
513
+ Zip::File.open(@docx_path) do |zip|
514
+ assert zip.find_entry("[Content_Types].xml"), "Should contain Content Types"
515
+ assert zip.find_entry("_rels/.rels"), "Should contain relationships"
516
+ assert zip.find_entry("word/document.xml"), "Should contain main document"
517
+ end
518
+ end
519
+ ```
520
+
429
521
  ## Dependencies
430
522
 
431
523
  - **rubyzip (~> 3.2)** - For ZIP file creation and DOCX generation
@@ -434,7 +526,7 @@ This isn't just a different API - it's a **fundamentally superior architecture**
434
526
 
435
527
  ## Contributing
436
528
 
437
- Bug reports and pull requests are welcome on GitHub at https://github.com/mode-x/oxml_maker. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/mode-x/oxml_maker/blob/master/CODE_OF_CONDUCT.md).
529
+ Bug reports and pull requests are welcome on GitHub at https://github.com/airbearr/oxml_maker. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/airbearr/oxml_maker/blob/master/CODE_OF_CONDUCT.md).
438
530
 
439
531
  ## License
440
532
 
@@ -442,4 +534,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
442
534
 
443
535
  ## Code of Conduct
444
536
 
445
- Everyone interacting in the OxmlMaker project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/mode-x/oxml_maker/blob/master/CODE_OF_CONDUCT.md).
537
+ Everyone interacting in the OxmlMaker project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/airbearr/oxml_maker/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -9,4 +9,53 @@ require "rubocop/rake_task"
9
9
 
10
10
  RuboCop::RakeTask.new
11
11
 
12
+ # Cleanup tasks
13
+ desc "Clean up test artifacts (docx and zip files)"
14
+ task :clean do
15
+ require "fileutils"
16
+
17
+ puts "Cleaning up test artifacts..."
18
+
19
+ # Clean up public directory
20
+ public_dir = File.join(Dir.pwd, "public")
21
+ if Dir.exist?(public_dir)
22
+ docx_files = Dir.glob(File.join(public_dir, "*.docx"))
23
+ zip_files = Dir.glob(File.join(public_dir, "*.zip"))
24
+
25
+ docx_files.each { |f| FileUtils.rm_f(f) }
26
+ zip_files.each { |f| FileUtils.rm_f(f) }
27
+
28
+ removed_count = docx_files.length + zip_files.length
29
+ puts "Removed #{removed_count} files from public directory" if removed_count > 0
30
+ end
31
+
32
+ # Clean up lib/oxml_maker directory
33
+ lib_dir = File.join(Dir.pwd, "lib", "oxml_maker")
34
+ if Dir.exist?(lib_dir)
35
+ lib_docx_files = Dir.glob(File.join(lib_dir, "*.docx"))
36
+ lib_zip_files = Dir.glob(File.join(lib_dir, "*.zip"))
37
+
38
+ lib_docx_files.each { |f| FileUtils.rm_f(f) }
39
+ lib_zip_files.each { |f| FileUtils.rm_f(f) }
40
+
41
+ lib_removed_count = lib_docx_files.length + lib_zip_files.length
42
+ puts "Removed #{lib_removed_count} files from lib/oxml_maker directory" if lib_removed_count > 0
43
+ end
44
+
45
+ # Clean up root directory
46
+ root_docx = Dir.glob("*.docx")
47
+ root_zip = Dir.glob("*.zip")
48
+
49
+ root_docx.each { |f| FileUtils.rm_f(f) }
50
+ root_zip.each { |f| FileUtils.rm_f(f) }
51
+
52
+ root_removed = root_docx.length + root_zip.length
53
+ puts "Removed #{root_removed} files from root directory" if root_removed > 0
54
+
55
+ puts "Cleanup completed!"
56
+ end
57
+
58
+ desc "Run tests with automatic cleanup"
59
+ task test_clean: %i[clean test clean]
60
+
12
61
  task default: %i[test rubocop]
@@ -3,7 +3,7 @@
3
3
  <w:body>
4
4
  <w:p>
5
5
  <w:r>
6
- <w:t>Test Document Content</w:t>
6
+ <w:t>Document Title - Integration Test</w:t>
7
7
  </w:r>
8
8
  </w:p>
9
9
 
@@ -24,7 +24,8 @@
24
24
  <w:tblLook w:val="0600"/>
25
25
  </w:tblPr>
26
26
  <w:tblGrid>
27
- <w:gridCol w:w="2000"/>
27
+ <w:gridCol w:w="3000"/>
28
+ <w:gridCol w:w="2000"/>
28
29
  <w:gridCol w:w="1500"/>
29
30
  </w:tblGrid>
30
31
  <w:tr>
@@ -38,6 +39,27 @@
38
39
  <w:tblAlign w:val="center"/>
39
40
  </w:trPr>
40
41
  <w:tc>
42
+ <w:tcPr>
43
+ <w:tcW w:w="3000"/>
44
+ </w:tcPr>
45
+ <w:p>
46
+ <w:pPr>
47
+ <w:jc w:val="center"/>
48
+ <w:rPr>
49
+ <w:b/>
50
+ </w:rPr>
51
+ </w:pPr>
52
+ <w:r>
53
+ <w:rPr>
54
+ <w:b/>
55
+ <w:sz w:val="24"/>
56
+ </w:rPr>
57
+ <w:t>Product</w:t>
58
+ </w:r>
59
+ </w:p>
60
+ </w:tc>
61
+
62
+ <w:tc>
41
63
  <w:tcPr>
42
64
  <w:tcW w:w="2000"/>
43
65
  </w:tcPr>
@@ -51,9 +73,9 @@
51
73
  <w:r>
52
74
  <w:rPr>
53
75
  <w:b/>
54
- <w:sz w:val="22"/>
76
+ <w:sz w:val="24"/>
55
77
  </w:rPr>
56
- <w:t>Name</w:t>
78
+ <w:t>Price</w:t>
57
79
  </w:r>
58
80
  </w:p>
59
81
  </w:tc>
@@ -72,9 +94,9 @@
72
94
  <w:r>
73
95
  <w:rPr>
74
96
  <w:b/>
75
- <w:sz w:val="22"/>
97
+ <w:sz w:val="24"/>
76
98
  </w:rPr>
77
- <w:t>Value</w:t>
99
+ <w:t>Quantity</w:t>
78
100
  </w:r>
79
101
  </w:p>
80
102
  </w:tc>
@@ -82,6 +104,23 @@
82
104
  </w:tr>
83
105
  <w:tr>
84
106
  <w:tc>
107
+ <w:tcPr>
108
+ <w:tcW w:w='3000' w:type='dxa'/>
109
+
110
+ <w:vAlign w:val="center"/>
111
+ </w:tcPr>
112
+ <w:p>
113
+ <w:pPr>
114
+ <w:jc w:val='center'/>
115
+ </w:pPr>
116
+ <w:r>
117
+ <w:rPr><w:sz w:val='24'/></w:rPr>
118
+ <w:t>Widget A</w:t>
119
+ </w:r>
120
+ </w:p>
121
+ </w:tc>
122
+
123
+ <w:tc>
85
124
  <w:tcPr>
86
125
  <w:tcW w:w='2000' w:type='dxa'/>
87
126
 
@@ -92,8 +131,8 @@
92
131
  <w:jc w:val='center'/>
93
132
  </w:pPr>
94
133
  <w:r>
95
- <w:rPr><w:sz w:val='22'/></w:rPr>
96
- <w:t>Item 1</w:t>
134
+ <w:rPr><w:sz w:val='24'/></w:rPr>
135
+ <w:t>$10.99</w:t>
97
136
  </w:r>
98
137
  </w:p>
99
138
  </w:tc>
@@ -109,8 +148,8 @@
109
148
  <w:jc w:val='center'/>
110
149
  </w:pPr>
111
150
  <w:r>
112
- <w:rPr><w:sz w:val='22'/></w:rPr>
113
- <w:t>100</w:t>
151
+ <w:rPr><w:sz w:val='24'/></w:rPr>
152
+ <w:t>5</w:t>
114
153
  </w:r>
115
154
  </w:p>
116
155
  </w:tc>
@@ -119,6 +158,23 @@
119
158
 
120
159
  <w:tr>
121
160
  <w:tc>
161
+ <w:tcPr>
162
+ <w:tcW w:w='3000' w:type='dxa'/>
163
+
164
+ <w:vAlign w:val="center"/>
165
+ </w:tcPr>
166
+ <w:p>
167
+ <w:pPr>
168
+ <w:jc w:val='center'/>
169
+ </w:pPr>
170
+ <w:r>
171
+ <w:rPr><w:sz w:val='24'/></w:rPr>
172
+ <w:t>Gadget B</w:t>
173
+ </w:r>
174
+ </w:p>
175
+ </w:tc>
176
+
177
+ <w:tc>
122
178
  <w:tcPr>
123
179
  <w:tcW w:w='2000' w:type='dxa'/>
124
180
 
@@ -129,8 +185,8 @@
129
185
  <w:jc w:val='center'/>
130
186
  </w:pPr>
131
187
  <w:r>
132
- <w:rPr><w:sz w:val='22'/></w:rPr>
133
- <w:t>Item 2</w:t>
188
+ <w:rPr><w:sz w:val='24'/></w:rPr>
189
+ <w:t>$25.50</w:t>
134
190
  </w:r>
135
191
  </w:p>
136
192
  </w:tc>
@@ -146,8 +202,62 @@
146
202
  <w:jc w:val='center'/>
147
203
  </w:pPr>
148
204
  <w:r>
149
- <w:rPr><w:sz w:val='22'/></w:rPr>
150
- <w:t>200</w:t>
205
+ <w:rPr><w:sz w:val='24'/></w:rPr>
206
+ <w:t>3</w:t>
207
+ </w:r>
208
+ </w:p>
209
+ </w:tc>
210
+
211
+ </w:tr>
212
+
213
+ <w:tr>
214
+ <w:tc>
215
+ <w:tcPr>
216
+ <w:tcW w:w='3000' w:type='dxa'/>
217
+
218
+ <w:vAlign w:val="center"/>
219
+ </w:tcPr>
220
+ <w:p>
221
+ <w:pPr>
222
+ <w:jc w:val='center'/>
223
+ </w:pPr>
224
+ <w:r>
225
+ <w:rPr><w:sz w:val='24'/></w:rPr>
226
+ <w:t>Tool C</w:t>
227
+ </w:r>
228
+ </w:p>
229
+ </w:tc>
230
+
231
+ <w:tc>
232
+ <w:tcPr>
233
+ <w:tcW w:w='2000' w:type='dxa'/>
234
+
235
+ <w:vAlign w:val="center"/>
236
+ </w:tcPr>
237
+ <w:p>
238
+ <w:pPr>
239
+ <w:jc w:val='center'/>
240
+ </w:pPr>
241
+ <w:r>
242
+ <w:rPr><w:sz w:val='24'/></w:rPr>
243
+ <w:t>$45.00</w:t>
244
+ </w:r>
245
+ </w:p>
246
+ </w:tc>
247
+
248
+ <w:tc>
249
+ <w:tcPr>
250
+ <w:tcW w:w='1500' w:type='dxa'/>
251
+
252
+ <w:vAlign w:val="center"/>
253
+ </w:tcPr>
254
+ <w:p>
255
+ <w:pPr>
256
+ <w:jc w:val='center'/>
257
+ </w:pPr>
258
+ <w:r>
259
+ <w:rPr><w:sz w:val='24'/></w:rPr>
260
+ <w:t>1</w:t>
151
261
  </w:r>
152
262
  </w:p>
153
263
  </w:tc>
@@ -156,6 +266,12 @@
156
266
 
157
267
  </w:tbl>
158
268
 
269
+ <w:p>
270
+ <w:r>
271
+ <w:t>End of Report</w:t>
272
+ </w:r>
273
+ </w:p>
274
+
159
275
  <w:sectPr>
160
276
  <w:pgSz w:w='12240' w:h='15840'/>
161
277
  <w:pgMar w:top='1440' w:right='1440' w:bottom='1440' w:left='1440' w:header='720' w:footer='720' w:gutter='0'/>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OxmlMaker
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oxml_maker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - airbearr
@@ -33,6 +33,8 @@ extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
35
  - ".rubocop.yml"
36
+ - ".vscode/extensions.json"
37
+ - ".vscode/settings.json"
36
38
  - CHANGELOG.md
37
39
  - CODE_OF_CONDUCT.md
38
40
  - LICENSE.txt
@@ -47,14 +49,14 @@ files:
47
49
  - lib/oxml_maker/table.rb
48
50
  - lib/oxml_maker/version.rb
49
51
  - sig/oxml_maker.rbs
50
- homepage: https://github.com/mode-x/oxml_maker
52
+ homepage: https://github.com/airbearr/oxml_maker
51
53
  licenses:
52
54
  - MIT
53
55
  metadata:
54
56
  allowed_push_host: https://rubygems.org
55
- homepage_uri: https://github.com/mode-x/oxml_maker
56
- source_code_uri: https://github.com/mode-x/oxml_maker
57
- changelog_uri: https://github.com/mode-x/oxml_maker/blob/main/CHANGELOG.md
57
+ homepage_uri: https://github.com/airbearr/oxml_maker
58
+ source_code_uri: https://github.com/airbearr/oxml_maker
59
+ changelog_uri: https://github.com/airbearr/oxml_maker/blob/main/CHANGELOG.md
58
60
  rubygems_mfa_required: 'true'
59
61
  rdoc_options: []
60
62
  require_paths: