postsvg 0.1.0 → 0.3.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 (201) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +105 -0
  3. data/CLAUDE.md +173 -0
  4. data/Gemfile +2 -3
  5. data/README.adoc +456 -179
  6. data/Rakefile +100 -0
  7. data/TODO.roadmap/00-architecture.md +139 -0
  8. data/TODO.roadmap/01-autoload-migration.md +39 -0
  9. data/TODO.roadmap/02-isolate-dormant-code.md +51 -0
  10. data/TODO.roadmap/03-domain-model.md +66 -0
  11. data/TODO.roadmap/04-lexer.md +40 -0
  12. data/TODO.roadmap/05-parser.md +43 -0
  13. data/TODO.roadmap/06-graphics-state.md +45 -0
  14. data/TODO.roadmap/07-matrix-and-color.md +37 -0
  15. data/TODO.roadmap/08-svg-builder.md +51 -0
  16. data/TODO.roadmap/09-renderer.md +52 -0
  17. data/TODO.roadmap/10-visitor.md +58 -0
  18. data/TODO.roadmap/11-operator-coverage.md +103 -0
  19. data/TODO.roadmap/12-svg-domain.md +62 -0
  20. data/TODO.roadmap/13-translation-handlers.md +69 -0
  21. data/TODO.roadmap/14-ps-serializer.md +49 -0
  22. data/TODO.roadmap/15-cli-and-public-api.md +47 -0
  23. data/TODO.roadmap/16-specs.md +84 -0
  24. data/TODO.roadmap/17-docs-sync.md +47 -0
  25. data/TODO.roadmap/18-performance-and-determinism.md +47 -0
  26. data/TODO.roadmap/19-error-model.md +45 -0
  27. data/TODO.roadmap/20-font-and-text.md +46 -0
  28. data/TODO.roadmap/21-images.md +45 -0
  29. data/TODO.roadmap/22-forms-and-resources.md +25 -0
  30. data/TODO.roadmap/23-level2-level3.md +52 -0
  31. data/TODO.roadmap/24-ci-and-release.md +42 -0
  32. data/TODO.roadmap/README.md +77 -0
  33. data/docs/.gitignore +29 -0
  34. data/docs/CHANGELOG.md +114 -0
  35. data/docs/COMPLETE_DOCUMENTATION_STATUS.md +376 -0
  36. data/docs/DEPLOYMENT.md +456 -0
  37. data/docs/DEPLOYMENT_INSTRUCTIONS.md +229 -0
  38. data/docs/DOCUMENTATION_PLAN.md +425 -0
  39. data/docs/FINAL_SUMMARY.md +657 -0
  40. data/docs/Gemfile +15 -0
  41. data/docs/README.md +327 -0
  42. data/docs/_config.yml +99 -0
  43. data/docs/advanced-topics.adoc +370 -0
  44. data/docs/api-reference/colors.adoc +705 -0
  45. data/docs/api-reference/converter.adoc +699 -0
  46. data/docs/api-reference/execution-context.adoc +1210 -0
  47. data/docs/api-reference/graphics-state.adoc +1070 -0
  48. data/docs/api-reference/interpreter.adoc +810 -0
  49. data/docs/api-reference/matrix.adoc +1179 -0
  50. data/docs/api-reference/path-builder.adoc +1284 -0
  51. data/docs/api-reference/postsvg-module.adoc +388 -0
  52. data/docs/api-reference/svg-generator.adoc +891 -0
  53. data/docs/api-reference/tokenizer.adoc +925 -0
  54. data/docs/api-reference.adoc +221 -0
  55. data/docs/architecture/command-registry.adoc +1191 -0
  56. data/docs/architecture/conversion-pipeline.adoc +746 -0
  57. data/docs/architecture/design-decisions.adoc +999 -0
  58. data/docs/architecture/generator-stage.adoc +1115 -0
  59. data/docs/architecture/graphics-state-model.adoc +1089 -0
  60. data/docs/architecture/interpreter-stage.adoc +1125 -0
  61. data/docs/architecture/parser-stage.adoc +1051 -0
  62. data/docs/architecture.adoc +354 -0
  63. data/docs/cli-reference/batch-command.adoc +616 -0
  64. data/docs/cli-reference/check-command.adoc +677 -0
  65. data/docs/cli-reference/cli-options.adoc +802 -0
  66. data/docs/cli-reference/convert-command.adoc +462 -0
  67. data/docs/cli-reference/version-command.adoc +296 -0
  68. data/docs/cli-reference.adoc +317 -0
  69. data/docs/concepts/conversion-pipeline.adoc +903 -0
  70. data/docs/concepts/coordinate-systems.adoc +836 -0
  71. data/docs/concepts/graphics-state.adoc +861 -0
  72. data/docs/concepts/path-operations.adoc +1076 -0
  73. data/docs/concepts/postscript-language.adoc +859 -0
  74. data/docs/concepts/svg-generation.adoc +937 -0
  75. data/docs/concepts.adoc +198 -0
  76. data/docs/contributing.adoc +443 -0
  77. data/docs/development.adoc +420 -0
  78. data/docs/faq.adoc +493 -0
  79. data/docs/getting-started/basic-usage.adoc +538 -0
  80. data/docs/getting-started/common-workflows.adoc +577 -0
  81. data/docs/getting-started/first-conversion.adoc +492 -0
  82. data/docs/getting-started/installation.adoc +534 -0
  83. data/docs/getting-started.adoc +94 -0
  84. data/docs/index.adoc +248 -0
  85. data/docs/optimization.adoc +196 -0
  86. data/docs/ps2svg_compatibility.adoc +149 -0
  87. data/docs/quick-reference.adoc +453 -0
  88. data/docs/sitemap.adoc +337 -0
  89. data/docs/troubleshooting.adoc +486 -0
  90. data/docs/validation.adoc +772 -0
  91. data/exe/postsvg +1 -0
  92. data/lib/postsvg/cli.rb +104 -57
  93. data/lib/postsvg/color.rb +132 -0
  94. data/lib/postsvg/errors.rb +68 -3
  95. data/lib/postsvg/format_number.rb +22 -0
  96. data/lib/postsvg/graphics_context.rb +80 -0
  97. data/lib/postsvg/graphics_stack.rb +43 -0
  98. data/lib/postsvg/model/literals/array.rb +41 -0
  99. data/lib/postsvg/model/literals/dictionary.rb +34 -0
  100. data/lib/postsvg/model/literals/hex.rb +37 -0
  101. data/lib/postsvg/model/literals/name.rb +40 -0
  102. data/lib/postsvg/model/literals/number.rb +36 -0
  103. data/lib/postsvg/model/literals/procedure.rb +41 -0
  104. data/lib/postsvg/model/literals/string.rb +30 -0
  105. data/lib/postsvg/model/literals.rb +19 -0
  106. data/lib/postsvg/model/operator.rb +58 -0
  107. data/lib/postsvg/model/operators/arithmetic.rb +264 -0
  108. data/lib/postsvg/model/operators/boolean.rb +182 -0
  109. data/lib/postsvg/model/operators/color.rb +74 -0
  110. data/lib/postsvg/model/operators/container.rb +186 -0
  111. data/lib/postsvg/model/operators/control_flow.rb +119 -0
  112. data/lib/postsvg/model/operators/device.rb +21 -0
  113. data/lib/postsvg/model/operators/dictionary.rb +118 -0
  114. data/lib/postsvg/model/operators/font.rb +121 -0
  115. data/lib/postsvg/model/operators/graphics_state.rb +84 -0
  116. data/lib/postsvg/model/operators/painting.rb +29 -0
  117. data/lib/postsvg/model/operators/path.rb +169 -0
  118. data/lib/postsvg/model/operators/stack.rb +72 -0
  119. data/lib/postsvg/model/operators/transformations.rb +103 -0
  120. data/lib/postsvg/model/operators.rb +89 -0
  121. data/lib/postsvg/model/program.rb +68 -0
  122. data/lib/postsvg/model/token.rb +43 -0
  123. data/lib/postsvg/model.rb +17 -0
  124. data/lib/postsvg/options.rb +29 -0
  125. data/lib/postsvg/renderer.rb +85 -0
  126. data/lib/postsvg/serializer.rb +325 -0
  127. data/lib/postsvg/source/ast_builder.rb +308 -0
  128. data/lib/postsvg/source/lexer.rb +322 -0
  129. data/lib/postsvg/source/operand_stack.rb +55 -0
  130. data/lib/postsvg/source.rb +21 -0
  131. data/lib/postsvg/svg/attribute_parser.rb +45 -0
  132. data/lib/postsvg/svg/clip_path_registry.rb +44 -0
  133. data/lib/postsvg/svg/document.rb +22 -0
  134. data/lib/postsvg/svg/element.rb +84 -0
  135. data/lib/postsvg/svg/elements/circle.rb +36 -0
  136. data/lib/postsvg/svg/elements/clip_path.rb +26 -0
  137. data/lib/postsvg/svg/elements/defs.rb +24 -0
  138. data/lib/postsvg/svg/elements/ellipse.rb +38 -0
  139. data/lib/postsvg/svg/elements/group.rb +37 -0
  140. data/lib/postsvg/svg/elements/image.rb +35 -0
  141. data/lib/postsvg/svg/elements/line.rb +36 -0
  142. data/lib/postsvg/svg/elements/path.rb +32 -0
  143. data/lib/postsvg/svg/elements/polygon.rb +12 -0
  144. data/lib/postsvg/svg/elements/polyline.rb +32 -0
  145. data/lib/postsvg/svg/elements/rect.rb +44 -0
  146. data/lib/postsvg/svg/elements/svg.rb +39 -0
  147. data/lib/postsvg/svg/elements/text.rb +42 -0
  148. data/lib/postsvg/svg/elements.rb +31 -0
  149. data/lib/postsvg/svg/paint.rb +34 -0
  150. data/lib/postsvg/svg/parser.rb +39 -0
  151. data/lib/postsvg/svg/path_data/command.rb +27 -0
  152. data/lib/postsvg/svg/path_data/parser.rb +82 -0
  153. data/lib/postsvg/svg/path_data.rb +17 -0
  154. data/lib/postsvg/svg/stroke.rb +31 -0
  155. data/lib/postsvg/svg/transform_list.rb +59 -0
  156. data/lib/postsvg/svg.rb +22 -0
  157. data/lib/postsvg/svg_builder.rb +249 -0
  158. data/lib/postsvg/translation/arc_converter.rb +86 -0
  159. data/lib/postsvg/translation/bounding_box.rb +59 -0
  160. data/lib/postsvg/translation/context.rb +34 -0
  161. data/lib/postsvg/translation/handler_registry.rb +38 -0
  162. data/lib/postsvg/translation/handlers/circle_handler.rb +28 -0
  163. data/lib/postsvg/translation/handlers/clip_path_handler.rb +13 -0
  164. data/lib/postsvg/translation/handlers/defs_handler.rb +15 -0
  165. data/lib/postsvg/translation/handlers/ellipse_handler.rb +31 -0
  166. data/lib/postsvg/translation/handlers/group_handler.rb +21 -0
  167. data/lib/postsvg/translation/handlers/image_handler.rb +20 -0
  168. data/lib/postsvg/translation/handlers/line_handler.rb +23 -0
  169. data/lib/postsvg/translation/handlers/open_handler.rb +18 -0
  170. data/lib/postsvg/translation/handlers/path_handler.rb +356 -0
  171. data/lib/postsvg/translation/handlers/polygon_handler.rb +33 -0
  172. data/lib/postsvg/translation/handlers/polyline_handler.rb +31 -0
  173. data/lib/postsvg/translation/handlers/rect_handler.rb +27 -0
  174. data/lib/postsvg/translation/handlers/shared.rb +110 -0
  175. data/lib/postsvg/translation/handlers/svg_handler.rb +25 -0
  176. data/lib/postsvg/translation/handlers/text_handler.rb +56 -0
  177. data/lib/postsvg/translation/handlers.rb +25 -0
  178. data/lib/postsvg/translation/ps_renderer.rb +105 -0
  179. data/lib/postsvg/translation/record_emitter.rb +35 -0
  180. data/lib/postsvg/translation.rb +17 -0
  181. data/lib/postsvg/version.rb +1 -1
  182. data/lib/postsvg/visitors/ps_visitor/arithmetic.rb +125 -0
  183. data/lib/postsvg/visitors/ps_visitor/boolean.rb +105 -0
  184. data/lib/postsvg/visitors/ps_visitor/color.rb +53 -0
  185. data/lib/postsvg/visitors/ps_visitor/common.rb +66 -0
  186. data/lib/postsvg/visitors/ps_visitor/container.rb +164 -0
  187. data/lib/postsvg/visitors/ps_visitor/control_flow.rb +110 -0
  188. data/lib/postsvg/visitors/ps_visitor/device.rb +20 -0
  189. data/lib/postsvg/visitors/ps_visitor/dictionary.rb +89 -0
  190. data/lib/postsvg/visitors/ps_visitor/font.rb +93 -0
  191. data/lib/postsvg/visitors/ps_visitor/graphics_state.rb +55 -0
  192. data/lib/postsvg/visitors/ps_visitor/painting.rb +90 -0
  193. data/lib/postsvg/visitors/ps_visitor/path.rb +112 -0
  194. data/lib/postsvg/visitors/ps_visitor/stack.rb +47 -0
  195. data/lib/postsvg/visitors/ps_visitor/transformations.rb +101 -0
  196. data/lib/postsvg/visitors/ps_visitor.rb +208 -0
  197. data/lib/postsvg/visitors.rb +9 -0
  198. data/lib/postsvg.rb +93 -59
  199. data/lychee.toml +86 -0
  200. metadata +216 -11
  201. data/postsvg.gemspec +0 -38
@@ -0,0 +1,420 @@
1
+ = Development Guide
2
+ :page-nav_order: 8
3
+
4
+ == Purpose
5
+
6
+ This guide helps developers contribute to Postsvg, set up the development environment, run tests, and understand the development workflow.
7
+
8
+ == References
9
+
10
+ * link:index.adoc[Documentation Home]
11
+ * link:architecture.adoc[Architecture Documentation]
12
+ * link:contributing.adoc[Contributing Guide]
13
+ * link:https://github.com/metanorma/postsvg[GitHub Repository]
14
+
15
+ == Concepts
16
+
17
+ **Development Environment**:: Local setup with Ruby, dependencies, and development tools.
18
+
19
+ **Testing Framework**:: RSpec test suite with unit and integration tests.
20
+
21
+ **Code Style**:: RuboCop configuration and Ruby style guidelines.
22
+
23
+ **Contribution Workflow**:: Fork, branch, commit, test, and pull request process.
24
+
25
+ == Development Topics
26
+
27
+ link:development/setup.adoc[**Development Setup**]::
28
+ Install dependencies, configure your development environment, and verify the installation.
29
+
30
+ link:development/testing.adoc[**Testing Guide**]::
31
+ Run tests, write new tests, and maintain test coverage.
32
+
33
+ link:development/adding-operators.adoc[**Adding PostScript Operators**]::
34
+ Step-by-step guide to implementing new PostScript operator support.
35
+
36
+ link:development/code-style.adoc[**Code Style Guidelines**]::
37
+ RuboCop configuration, naming conventions, and Ruby best practices.
38
+
39
+ link:development/architecture-guidelines.adoc[**Architecture Guidelines**]::
40
+ Design patterns, separation of concerns, and architectural principles.
41
+
42
+ link:development/release-process.adoc[**Release Process**]::
43
+ Version bumping, changelog updates, and publishing to RubyGems.
44
+
45
+ == Quick Start
46
+
47
+ === Clone and Setup
48
+
49
+ [source,sh]
50
+ ----
51
+ # Clone repository
52
+ git clone https://github.com/metanorma/postsvg.git
53
+ cd postsvg
54
+
55
+ # Install dependencies
56
+ bundle install
57
+
58
+ # Run tests
59
+ bundle exec rspec
60
+
61
+ # Run linter
62
+ bundle exec rubocop
63
+
64
+ # Run all checks
65
+ bundle exec rake
66
+ ----
67
+
68
+ === Development Workflow
69
+
70
+ [source,sh]
71
+ ----
72
+ # 1. Create feature branch
73
+ git checkout -b feature/my-new-operator
74
+
75
+ # 2. Make changes
76
+ # ... edit files ...
77
+
78
+ # 3. Run tests
79
+ bundle exec rspec
80
+
81
+ # 4. Check code style
82
+ bundle exec rubocop -A
83
+
84
+ # 5. Commit changes
85
+ git add .
86
+ git commit -m "feat(operators): add my-new-operator support"
87
+
88
+ # 6. Push and create PR
89
+ git push origin feature/my-new-operator
90
+ ----
91
+
92
+ == Running Tests
93
+
94
+ === Full Test Suite
95
+
96
+ [source,sh]
97
+ ----
98
+ # Run all tests
99
+ bundle exec rspec
100
+
101
+ # Run with documentation format
102
+ bundle exec rspec --format documentation
103
+
104
+ # Run specific test file
105
+ bundle exec rspec spec/postsvg/converter_spec.rb
106
+
107
+ # Run specific test
108
+ bundle exec rspec spec/postsvg/converter_spec.rb:10
109
+ ----
110
+
111
+ === Core Tests Only
112
+
113
+ [source,sh]
114
+ ----
115
+ # Run only core tests (fast)
116
+ bundle exec rspec spec/postsvg/execution_context_spec.rb \
117
+ spec/postsvg/integration_spec.rb
118
+ ----
119
+
120
+ === Test Coverage
121
+
122
+ [source,sh]
123
+ ----
124
+ # Generate coverage report
125
+ COVERAGE=true bundle exec rspec
126
+
127
+ # View coverage report
128
+ open coverage/index.html
129
+ ----
130
+
131
+ ## Code Style
132
+
133
+ Postsvg follows the Ruby Style Guide with RuboCop enforcement:
134
+
135
+ [source,sh]
136
+ ----
137
+ # Check code style
138
+ bundle exec rubocop
139
+
140
+ # Auto-fix issues
141
+ bundle exec rubocop -A
142
+
143
+ # Auto-generate config for new cops
144
+ bundle exec rubocop -A --auto-gen-config
145
+ ----
146
+
147
+ **Key Style Rules:**
148
+ * 2 spaces for indentation (no tabs)
149
+ * Maximum line length: 80 characters
150
+ * Use snake_case for methods and variables
151
+ * Use CamelCase for classes and modules
152
+ * Prefer `attr_reader`/`attr_accessor` over instance variables
153
+
154
+ == Adding a New PostScript Operator
155
+
156
+ .Implementing the `arc` operator
157
+ [example]
158
+ ====
159
+ **1. Create operator file:**
160
+
161
+ [source,ruby]
162
+ ----
163
+ # lib/postsvg/commands/path/arc.rb
164
+ module Postsvg
165
+ module Commands
166
+ module Path
167
+ class Arc < Base
168
+ def execute(context)
169
+ # Pop arguments from stack
170
+ angle2 = context.pop_number
171
+ angle1 = context.pop_number
172
+ radius = context.pop_number
173
+ y_center = context.pop_number
174
+ x_center = context.pop_number
175
+
176
+ # Implement arc drawing
177
+ context.graphics_state.arc(
178
+ x_center, y_center, radius,
179
+ angle1, angle2
180
+ )
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+ ----
187
+
188
+ **2. Register operator:**
189
+
190
+ [source,ruby]
191
+ ----
192
+ # lib/postsvg/commands/registry.rb
193
+ module Postsvg
194
+ module Commands
195
+ module Registry
196
+ def self.register_path_commands
197
+ # ... existing commands ...
198
+ register('arc', Path::Arc.new)
199
+ end
200
+ end
201
+ end
202
+ end
203
+ ----
204
+
205
+ **3. Write tests:**
206
+
207
+ [source,ruby]
208
+ ----
209
+ # spec/postsvg/commands/path/arc_spec.rb
210
+ require 'spec_helper'
211
+
212
+ RSpec.describe Postsvg::Commands::Path::Arc do
213
+ let(:context) { Postsvg::ExecutionContext.new }
214
+ let(:command) { described_class.new }
215
+
216
+ it 'draws an arc' do
217
+ context.push(100) # x_center
218
+ context.push(100) # y_center
219
+ context.push(50) # radius
220
+ context.push(0) # angle1
221
+ context.push(90) # angle2
222
+
223
+ command.execute(context)
224
+
225
+ expect(context.graphics_state.current_path).not_to be_empty
226
+ end
227
+ end
228
+ ----
229
+
230
+ **4. Document operator:**
231
+
232
+ Add to `docs/postscript/operators/path-construction.adoc`
233
+ ====
234
+
235
+ == Project Structure
236
+
237
+ [source]
238
+ ----
239
+ postsvg/
240
+ ├── lib/
241
+ │ ├── postsvg.rb # Main module
242
+ │ └── postsvg/
243
+ │ ├── cli.rb # CLI implementation
244
+ │ ├── converter.rb # Converter class
245
+ │ ├── interpreter.rb # Interpreter class
246
+ │ ├── tokenizer.rb # Tokenizer class
247
+ │ ├── execution_context.rb # Execution context
248
+ │ ├── graphics_state.rb # Graphics state
249
+ │ ├── svg_generator.rb # SVG generator
250
+ │ ├── path_builder.rb # Path builder
251
+ │ ├── matrix.rb # Matrix operations
252
+ │ ├── colors.rb # Color utilities
253
+ │ ├── errors.rb # Error classes
254
+ │ └── commands/ # PostScript operators
255
+ │ ├── registry.rb # Command registry
256
+ │ ├── base.rb # Base command class
257
+ │ ├── path/ # Path commands
258
+ │ ├── painting/ # Painting commands
259
+ │ ├── graphics_state/ # State commands
260
+ │ ├── transformation/ # Transform commands
261
+ │ ├── stack/ # Stack commands
262
+ │ ├── arithmetic/ # Math commands
263
+ │ ├── control/ # Control flow
264
+ │ └── dictionary/ # Dictionary commands
265
+ ├── spec/ # Test files
266
+ ├── docs/ # Documentation
267
+ ├── exe/ # Executable
268
+ └── Gemfile # Dependencies
269
+ ----
270
+
271
+ == Development Dependencies
272
+
273
+ [source,ruby]
274
+ ----
275
+ # Gemfile (development dependencies)
276
+ group :development, :test do
277
+ gem 'rspec' # Testing framework
278
+ gem 'rubocop' # Code linter
279
+ gem 'rake' # Task runner
280
+ gem 'pry' # Debugging (optional)
281
+ gem 'simplecov' # Code coverage (optional)
282
+ end
283
+ ----
284
+
285
+ == Debugging Tips
286
+
287
+ === Using Pry
288
+
289
+ [source,ruby]
290
+ ----
291
+ require 'pry'
292
+
293
+ def problematic_method
294
+ # ... code ...
295
+ binding.pry # Debugger will stop here
296
+ # ... more code ...
297
+ end
298
+ ----
299
+
300
+ === Verbose Output
301
+
302
+ [source,ruby]
303
+ ----
304
+ # Add debug output
305
+ def execute(context)
306
+ puts "Stack: #{context.stack.inspect}"
307
+ # ... execution ...
308
+ puts "Result: #{result.inspect}"
309
+ end
310
+ ----
311
+
312
+ === Test Isolation
313
+
314
+ [source,ruby]
315
+ ----
316
+ # Run single test with focus
317
+ RSpec.describe 'MyFeature', :focus do
318
+ it 'works' do
319
+ # ...
320
+ end
321
+ end
322
+ ----
323
+
324
+ == Commit Message Guidelines
325
+
326
+ Follow Conventional Commits:
327
+
328
+ [source]
329
+ ----
330
+ <type>(<scope>): <subject>
331
+
332
+ <body>
333
+
334
+ <footer>
335
+ ----
336
+
337
+ **Types:**
338
+ * `feat`: New feature
339
+ * `fix`: Bug fix
340
+ * `docs`: Documentation changes
341
+ * `style`: Code style changes (formatting)
342
+ * `refactor`: Code refactoring
343
+ * `test`: Adding or updating tests
344
+ * `chore`: Maintenance tasks
345
+
346
+ .Example commit messages
347
+ [example]
348
+ ====
349
+ [source]
350
+ ----
351
+ feat(operators): add arc command support
352
+
353
+ Implements the PostScript arc operator for drawing
354
+ circular arcs. Includes coordinate transformation
355
+ and proper SVG path generation.
356
+
357
+ Closes #123
358
+ ----
359
+
360
+ [source]
361
+ ----
362
+ fix(converter): handle missing BoundingBox gracefully
363
+
364
+ Previously crashed when BoundingBox comment was missing.
365
+ Now falls back to default dimensions.
366
+
367
+ Fixes #456
368
+ ----
369
+ ====
370
+
371
+ == Pull Request Process
372
+
373
+ 1. **Fork and Branch**
374
+ [source,sh]
375
+ ----
376
+ git checkout -b feature/my-feature
377
+ ----
378
+
379
+ 2. **Make Changes**
380
+ - Write code
381
+ - Add tests
382
+ - Update documentation
383
+
384
+ 3. **Test Locally**
385
+ [source,sh]
386
+ ----
387
+ bundle exec rake
388
+ ----
389
+
390
+ 4. **Commit**
391
+ [source,sh]
392
+ ----
393
+ git commit -m "feat: add new feature"
394
+ ----
395
+
396
+ 5. **Push**
397
+ [source,sh]
398
+ ----
399
+ git push origin feature/my-feature
400
+ ----
401
+
402
+ 6. **Create PR**
403
+ - Describe changes
404
+ - Link related issues
405
+ - Request review
406
+
407
+ == Next Steps
408
+
409
+ * Read link:contributing.adoc[Contributing Guide] for detailed contribution guidelines
410
+ * Review link:architecture.adoc[Architecture] to understand the codebase
411
+ * Check link:development/testing.adoc[Testing Guide] for test best practices
412
+ * See link:development/adding-operators.adoc[Adding Operators] for implementation details
413
+
414
+ == Bibliography
415
+
416
+ * link:development/setup.adoc[Development Setup Guide]
417
+ * link:development/testing.adoc[Testing Documentation]
418
+ * link:https://rspec.info/[RSpec Documentation]
419
+ * link:https://rubocop.org/[RuboCop Documentation]
420
+ * link:https://www.conventionalcommits.org/[Conventional Commits]