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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +105 -0
- data/CLAUDE.md +173 -0
- data/Gemfile +2 -3
- data/README.adoc +456 -179
- data/Rakefile +100 -0
- data/TODO.roadmap/00-architecture.md +139 -0
- data/TODO.roadmap/01-autoload-migration.md +39 -0
- data/TODO.roadmap/02-isolate-dormant-code.md +51 -0
- data/TODO.roadmap/03-domain-model.md +66 -0
- data/TODO.roadmap/04-lexer.md +40 -0
- data/TODO.roadmap/05-parser.md +43 -0
- data/TODO.roadmap/06-graphics-state.md +45 -0
- data/TODO.roadmap/07-matrix-and-color.md +37 -0
- data/TODO.roadmap/08-svg-builder.md +51 -0
- data/TODO.roadmap/09-renderer.md +52 -0
- data/TODO.roadmap/10-visitor.md +58 -0
- data/TODO.roadmap/11-operator-coverage.md +103 -0
- data/TODO.roadmap/12-svg-domain.md +62 -0
- data/TODO.roadmap/13-translation-handlers.md +69 -0
- data/TODO.roadmap/14-ps-serializer.md +49 -0
- data/TODO.roadmap/15-cli-and-public-api.md +47 -0
- data/TODO.roadmap/16-specs.md +84 -0
- data/TODO.roadmap/17-docs-sync.md +47 -0
- data/TODO.roadmap/18-performance-and-determinism.md +47 -0
- data/TODO.roadmap/19-error-model.md +45 -0
- data/TODO.roadmap/20-font-and-text.md +46 -0
- data/TODO.roadmap/21-images.md +45 -0
- data/TODO.roadmap/22-forms-and-resources.md +25 -0
- data/TODO.roadmap/23-level2-level3.md +52 -0
- data/TODO.roadmap/24-ci-and-release.md +42 -0
- data/TODO.roadmap/README.md +77 -0
- data/docs/.gitignore +29 -0
- data/docs/CHANGELOG.md +114 -0
- data/docs/COMPLETE_DOCUMENTATION_STATUS.md +376 -0
- data/docs/DEPLOYMENT.md +456 -0
- data/docs/DEPLOYMENT_INSTRUCTIONS.md +229 -0
- data/docs/DOCUMENTATION_PLAN.md +425 -0
- data/docs/FINAL_SUMMARY.md +657 -0
- data/docs/Gemfile +15 -0
- data/docs/README.md +327 -0
- data/docs/_config.yml +99 -0
- data/docs/advanced-topics.adoc +370 -0
- data/docs/api-reference/colors.adoc +705 -0
- data/docs/api-reference/converter.adoc +699 -0
- data/docs/api-reference/execution-context.adoc +1210 -0
- data/docs/api-reference/graphics-state.adoc +1070 -0
- data/docs/api-reference/interpreter.adoc +810 -0
- data/docs/api-reference/matrix.adoc +1179 -0
- data/docs/api-reference/path-builder.adoc +1284 -0
- data/docs/api-reference/postsvg-module.adoc +388 -0
- data/docs/api-reference/svg-generator.adoc +891 -0
- data/docs/api-reference/tokenizer.adoc +925 -0
- data/docs/api-reference.adoc +221 -0
- data/docs/architecture/command-registry.adoc +1191 -0
- data/docs/architecture/conversion-pipeline.adoc +746 -0
- data/docs/architecture/design-decisions.adoc +999 -0
- data/docs/architecture/generator-stage.adoc +1115 -0
- data/docs/architecture/graphics-state-model.adoc +1089 -0
- data/docs/architecture/interpreter-stage.adoc +1125 -0
- data/docs/architecture/parser-stage.adoc +1051 -0
- data/docs/architecture.adoc +354 -0
- data/docs/cli-reference/batch-command.adoc +616 -0
- data/docs/cli-reference/check-command.adoc +677 -0
- data/docs/cli-reference/cli-options.adoc +802 -0
- data/docs/cli-reference/convert-command.adoc +462 -0
- data/docs/cli-reference/version-command.adoc +296 -0
- data/docs/cli-reference.adoc +317 -0
- data/docs/concepts/conversion-pipeline.adoc +903 -0
- data/docs/concepts/coordinate-systems.adoc +836 -0
- data/docs/concepts/graphics-state.adoc +861 -0
- data/docs/concepts/path-operations.adoc +1076 -0
- data/docs/concepts/postscript-language.adoc +859 -0
- data/docs/concepts/svg-generation.adoc +937 -0
- data/docs/concepts.adoc +198 -0
- data/docs/contributing.adoc +443 -0
- data/docs/development.adoc +420 -0
- data/docs/faq.adoc +493 -0
- data/docs/getting-started/basic-usage.adoc +538 -0
- data/docs/getting-started/common-workflows.adoc +577 -0
- data/docs/getting-started/first-conversion.adoc +492 -0
- data/docs/getting-started/installation.adoc +534 -0
- data/docs/getting-started.adoc +94 -0
- data/docs/index.adoc +248 -0
- data/docs/optimization.adoc +196 -0
- data/docs/ps2svg_compatibility.adoc +149 -0
- data/docs/quick-reference.adoc +453 -0
- data/docs/sitemap.adoc +337 -0
- data/docs/troubleshooting.adoc +486 -0
- data/docs/validation.adoc +772 -0
- data/exe/postsvg +1 -0
- data/lib/postsvg/cli.rb +104 -57
- data/lib/postsvg/color.rb +132 -0
- data/lib/postsvg/errors.rb +68 -3
- data/lib/postsvg/format_number.rb +22 -0
- data/lib/postsvg/graphics_context.rb +80 -0
- data/lib/postsvg/graphics_stack.rb +43 -0
- data/lib/postsvg/model/literals/array.rb +41 -0
- data/lib/postsvg/model/literals/dictionary.rb +34 -0
- data/lib/postsvg/model/literals/hex.rb +37 -0
- data/lib/postsvg/model/literals/name.rb +40 -0
- data/lib/postsvg/model/literals/number.rb +36 -0
- data/lib/postsvg/model/literals/procedure.rb +41 -0
- data/lib/postsvg/model/literals/string.rb +30 -0
- data/lib/postsvg/model/literals.rb +19 -0
- data/lib/postsvg/model/operator.rb +58 -0
- data/lib/postsvg/model/operators/arithmetic.rb +264 -0
- data/lib/postsvg/model/operators/boolean.rb +182 -0
- data/lib/postsvg/model/operators/color.rb +74 -0
- data/lib/postsvg/model/operators/container.rb +186 -0
- data/lib/postsvg/model/operators/control_flow.rb +119 -0
- data/lib/postsvg/model/operators/device.rb +21 -0
- data/lib/postsvg/model/operators/dictionary.rb +118 -0
- data/lib/postsvg/model/operators/font.rb +121 -0
- data/lib/postsvg/model/operators/graphics_state.rb +84 -0
- data/lib/postsvg/model/operators/painting.rb +29 -0
- data/lib/postsvg/model/operators/path.rb +169 -0
- data/lib/postsvg/model/operators/stack.rb +72 -0
- data/lib/postsvg/model/operators/transformations.rb +103 -0
- data/lib/postsvg/model/operators.rb +89 -0
- data/lib/postsvg/model/program.rb +68 -0
- data/lib/postsvg/model/token.rb +43 -0
- data/lib/postsvg/model.rb +17 -0
- data/lib/postsvg/options.rb +29 -0
- data/lib/postsvg/renderer.rb +85 -0
- data/lib/postsvg/serializer.rb +325 -0
- data/lib/postsvg/source/ast_builder.rb +308 -0
- data/lib/postsvg/source/lexer.rb +322 -0
- data/lib/postsvg/source/operand_stack.rb +55 -0
- data/lib/postsvg/source.rb +21 -0
- data/lib/postsvg/svg/attribute_parser.rb +45 -0
- data/lib/postsvg/svg/clip_path_registry.rb +44 -0
- data/lib/postsvg/svg/document.rb +22 -0
- data/lib/postsvg/svg/element.rb +84 -0
- data/lib/postsvg/svg/elements/circle.rb +36 -0
- data/lib/postsvg/svg/elements/clip_path.rb +26 -0
- data/lib/postsvg/svg/elements/defs.rb +24 -0
- data/lib/postsvg/svg/elements/ellipse.rb +38 -0
- data/lib/postsvg/svg/elements/group.rb +37 -0
- data/lib/postsvg/svg/elements/image.rb +35 -0
- data/lib/postsvg/svg/elements/line.rb +36 -0
- data/lib/postsvg/svg/elements/path.rb +32 -0
- data/lib/postsvg/svg/elements/polygon.rb +12 -0
- data/lib/postsvg/svg/elements/polyline.rb +32 -0
- data/lib/postsvg/svg/elements/rect.rb +44 -0
- data/lib/postsvg/svg/elements/svg.rb +39 -0
- data/lib/postsvg/svg/elements/text.rb +42 -0
- data/lib/postsvg/svg/elements.rb +31 -0
- data/lib/postsvg/svg/paint.rb +34 -0
- data/lib/postsvg/svg/parser.rb +39 -0
- data/lib/postsvg/svg/path_data/command.rb +27 -0
- data/lib/postsvg/svg/path_data/parser.rb +82 -0
- data/lib/postsvg/svg/path_data.rb +17 -0
- data/lib/postsvg/svg/stroke.rb +31 -0
- data/lib/postsvg/svg/transform_list.rb +59 -0
- data/lib/postsvg/svg.rb +22 -0
- data/lib/postsvg/svg_builder.rb +249 -0
- data/lib/postsvg/translation/arc_converter.rb +86 -0
- data/lib/postsvg/translation/bounding_box.rb +59 -0
- data/lib/postsvg/translation/context.rb +34 -0
- data/lib/postsvg/translation/handler_registry.rb +38 -0
- data/lib/postsvg/translation/handlers/circle_handler.rb +28 -0
- data/lib/postsvg/translation/handlers/clip_path_handler.rb +13 -0
- data/lib/postsvg/translation/handlers/defs_handler.rb +15 -0
- data/lib/postsvg/translation/handlers/ellipse_handler.rb +31 -0
- data/lib/postsvg/translation/handlers/group_handler.rb +21 -0
- data/lib/postsvg/translation/handlers/image_handler.rb +20 -0
- data/lib/postsvg/translation/handlers/line_handler.rb +23 -0
- data/lib/postsvg/translation/handlers/open_handler.rb +18 -0
- data/lib/postsvg/translation/handlers/path_handler.rb +356 -0
- data/lib/postsvg/translation/handlers/polygon_handler.rb +33 -0
- data/lib/postsvg/translation/handlers/polyline_handler.rb +31 -0
- data/lib/postsvg/translation/handlers/rect_handler.rb +27 -0
- data/lib/postsvg/translation/handlers/shared.rb +110 -0
- data/lib/postsvg/translation/handlers/svg_handler.rb +25 -0
- data/lib/postsvg/translation/handlers/text_handler.rb +56 -0
- data/lib/postsvg/translation/handlers.rb +25 -0
- data/lib/postsvg/translation/ps_renderer.rb +105 -0
- data/lib/postsvg/translation/record_emitter.rb +35 -0
- data/lib/postsvg/translation.rb +17 -0
- data/lib/postsvg/version.rb +1 -1
- data/lib/postsvg/visitors/ps_visitor/arithmetic.rb +125 -0
- data/lib/postsvg/visitors/ps_visitor/boolean.rb +105 -0
- data/lib/postsvg/visitors/ps_visitor/color.rb +53 -0
- data/lib/postsvg/visitors/ps_visitor/common.rb +66 -0
- data/lib/postsvg/visitors/ps_visitor/container.rb +164 -0
- data/lib/postsvg/visitors/ps_visitor/control_flow.rb +110 -0
- data/lib/postsvg/visitors/ps_visitor/device.rb +20 -0
- data/lib/postsvg/visitors/ps_visitor/dictionary.rb +89 -0
- data/lib/postsvg/visitors/ps_visitor/font.rb +93 -0
- data/lib/postsvg/visitors/ps_visitor/graphics_state.rb +55 -0
- data/lib/postsvg/visitors/ps_visitor/painting.rb +90 -0
- data/lib/postsvg/visitors/ps_visitor/path.rb +112 -0
- data/lib/postsvg/visitors/ps_visitor/stack.rb +47 -0
- data/lib/postsvg/visitors/ps_visitor/transformations.rb +101 -0
- data/lib/postsvg/visitors/ps_visitor.rb +208 -0
- data/lib/postsvg/visitors.rb +9 -0
- data/lib/postsvg.rb +93 -59
- data/lychee.toml +86 -0
- metadata +216 -11
- 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]
|