taurus 0.1.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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +8 -0
- data/CHANGELOG.md +518 -0
- data/CLAUDE.md +104 -0
- data/LICENSE.md +33 -0
- data/README.adoc +1529 -0
- data/Rakefile +7 -0
- data/TODO.impl/01-architecture.md +217 -0
- data/TODO.impl/02-ffi-declarations.md +236 -0
- data/TODO.impl/03-document-node-element-nodeset.md +382 -0
- data/TODO.impl/04-sax-parser.md +203 -0
- data/TODO.impl/05-serialize-c14n-memory-specs-css.md +276 -0
- data/benchmark/README.md +168 -0
- data/benchmark/taurus_vs_nokogiri.rb +105 -0
- data/docs/ARCHITECTURE.adoc +559 -0
- data/docs/BUILD.md +395 -0
- data/docs/ERROR_MESSAGES.md +458 -0
- data/docs/FFI_ARCHITECTURE.md +439 -0
- data/docs/FUTURE_VISION.md +303 -0
- data/docs/GITHUB_ACTIONS.md +293 -0
- data/docs/OPTIMIZATIONS_IMPLEMENTED.adoc +459 -0
- data/docs/PERFORMANCE.adoc +668 -0
- data/docs/PERFORMANCE.md +448 -0
- data/docs/RELEASE_NOTES_v1.0.0.md +515 -0
- data/docs/XPATH_SPEC_COMPLIANCE.md +298 -0
- data/docs/completion/taurus.bash +86 -0
- data/docs/completion/taurus.zsh +74 -0
- data/docs/man/taurus-format.1 +227 -0
- data/docs/man/taurus-parse.1 +178 -0
- data/docs/man/taurus-xpath.1 +312 -0
- data/docs/man/taurus.1 +160 -0
- data/docs/v0.9.0_PERFORMANCE_IMPROVEMENTS.md +217 -0
- data/docs/v0.9.0_RELEASE_SUMMARY.md +281 -0
- data/docs/v1.0.0_CONTINUATION_PLAN.md +172 -0
- data/docs/v1.0.0_CONTINUATION_PROMPT.md +382 -0
- data/docs/v1.0.0_SESSION_6_CONTINUATION.md +434 -0
- data/docs/v1.0.0_SESSION_6_PROMPT.md +231 -0
- data/docs/v1.0.0_STATUS_TRACKER.md +224 -0
- data/docs/v1.1.0_CONTINUATION_PLAN.md +299 -0
- data/docs/v1.1.0_FINAL_CONTINUATION_PLAN.md +201 -0
- data/docs/v1.1.0_SESSION_3_PROMPT.md +223 -0
- data/docs/v1.1.0_STATUS_TRACKER.md +355 -0
- data/docs/xml-performance.adoc +115 -0
- data/docs/xpath-performance.adoc +379 -0
- data/lib/taurus/version.rb +5 -0
- data/lib/taurus/xml/attr.rb +43 -0
- data/lib/taurus/xml/c14n.rb +23 -0
- data/lib/taurus/xml/cdata.rb +16 -0
- data/lib/taurus/xml/comment.rb +16 -0
- data/lib/taurus/xml/css_to_xpath.rb +177 -0
- data/lib/taurus/xml/doc_type.rb +54 -0
- data/lib/taurus/xml/document.rb +202 -0
- data/lib/taurus/xml/document_fragment.rb +42 -0
- data/lib/taurus/xml/element.rb +278 -0
- data/lib/taurus/xml/ffi.rb +420 -0
- data/lib/taurus/xml/namespace.rb +43 -0
- data/lib/taurus/xml/node.rb +221 -0
- data/lib/taurus/xml/node_set.rb +143 -0
- data/lib/taurus/xml/parse_options.rb +19 -0
- data/lib/taurus/xml/processing_instruction.rb +26 -0
- data/lib/taurus/xml/sax/document.rb +45 -0
- data/lib/taurus/xml/sax/parser.rb +148 -0
- data/lib/taurus/xml/sax.rb +12 -0
- data/lib/taurus/xml/searchable.rb +93 -0
- data/lib/taurus/xml/text.rb +16 -0
- data/lib/taurus/xml.rb +29 -0
- data/lib/taurus.rb +7 -0
- data/taurus.gemspec +42 -0
- metadata +157 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
# Future Vision: Taurus Beyond v0.4.0
|
|
2
|
+
|
|
3
|
+
**Created**: 2025-01-29
|
|
4
|
+
**Status**: Planning Document
|
|
5
|
+
**Context**: Long-term vision from TODO.libtaurus.md
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
This document captures the long-term architectural vision for Taurus, including transformation into libtaurus (a reusable C library) and enhanced features. This represents work beyond v0.4.0 and likely v0.5.0+.
|
|
10
|
+
|
|
11
|
+
## Vision: libtaurus - Reusable C Library
|
|
12
|
+
|
|
13
|
+
### Goal
|
|
14
|
+
|
|
15
|
+
Refactor Taurus into **libtaurus**, a standalone C library that can be:
|
|
16
|
+
- Linked into other C/C++ projects
|
|
17
|
+
- Used by the Taurus CLI (written in C)
|
|
18
|
+
- Wrapped by the Ruby gem (taurus)
|
|
19
|
+
- Integrated into any language with C FFI
|
|
20
|
+
|
|
21
|
+
### Architecture
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
┌─────────────────────────────────────────┐
|
|
25
|
+
│ Language Bindings │
|
|
26
|
+
│ ┌──────────┐ ┌──────────┐ ┌────────┐│
|
|
27
|
+
│ │ Ruby │ │ Python │ │ Node ││
|
|
28
|
+
│ │ Gem │ │ Package │ │ Module││
|
|
29
|
+
│ └──────────┘ └──────────┘ └────────┘│
|
|
30
|
+
└─────────────────────────────────────────┘
|
|
31
|
+
│
|
|
32
|
+
▼
|
|
33
|
+
┌─────────────────────────────────────────┐
|
|
34
|
+
│ libtaurus.so │
|
|
35
|
+
│ (Core C Library + API) │
|
|
36
|
+
│ ┌─────────────────────────────────────┐│
|
|
37
|
+
│ │ XML Parser (SAX/StAX/DOM) ││
|
|
38
|
+
│ │ XPath 1.0 Engine ││
|
|
39
|
+
│ │ XML Namespaces 1.0 ││
|
|
40
|
+
│ │ Pretty Printing ││
|
|
41
|
+
│ │ Memory Management ││
|
|
42
|
+
│ └─────────────────────────────────────┘│
|
|
43
|
+
└─────────────────────────────────────────┘
|
|
44
|
+
│
|
|
45
|
+
▼
|
|
46
|
+
┌─────────────────────────────────────────┐
|
|
47
|
+
│ CLI Applications │
|
|
48
|
+
│ ┌──────────┐ ┌──────────┐ │
|
|
49
|
+
│ │ taurus │ │ Custom │ │
|
|
50
|
+
│ │ CLI │ │ Tools │ │
|
|
51
|
+
│ └──────────┘ └──────────┘ │
|
|
52
|
+
└─────────────────────────────────────────┘
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Components
|
|
56
|
+
|
|
57
|
+
#### 1. libtaurus (Core C Library)
|
|
58
|
+
- **Pure C implementation** with clean API
|
|
59
|
+
- **Zero dependencies** (no libxml2)
|
|
60
|
+
- **Thread-safe** operations
|
|
61
|
+
- **Memory efficient** with configurable allocators
|
|
62
|
+
- **Cross-platform** (Linux, macOS, Windows, BSD)
|
|
63
|
+
- **CMake build system**
|
|
64
|
+
|
|
65
|
+
**Features**:
|
|
66
|
+
- XML parsing (SAX, StAX, DOM modes)
|
|
67
|
+
- XPath 1.0 evaluation
|
|
68
|
+
- XML Namespaces 1.0
|
|
69
|
+
- XML pretty-printing
|
|
70
|
+
- Error handling with detailed messages
|
|
71
|
+
- Memory management with custom allocators
|
|
72
|
+
|
|
73
|
+
**API Design**:
|
|
74
|
+
```c
|
|
75
|
+
// Core parsing
|
|
76
|
+
taurus_document_t* taurus_parse_string(const char* xml, size_t len, taurus_options_t* opts);
|
|
77
|
+
taurus_document_t* taurus_parse_file(const char* filename, taurus_options_t* opts);
|
|
78
|
+
|
|
79
|
+
// XPath evaluation
|
|
80
|
+
taurus_nodeset_t* taurus_xpath_eval(taurus_document_t* doc, const char* expr);
|
|
81
|
+
|
|
82
|
+
// Pretty printing
|
|
83
|
+
char* taurus_format_xml(taurus_document_t* doc, taurus_format_options_t* opts);
|
|
84
|
+
|
|
85
|
+
// Memory management
|
|
86
|
+
void taurus_document_free(taurus_document_t* doc);
|
|
87
|
+
void taurus_nodeset_free(taurus_nodeset_t* nodeset);
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### 2. Taurus CLI (C Application)
|
|
91
|
+
- **Standalone binary** linking libtaurus
|
|
92
|
+
- **xmllint-compatible** commands and options
|
|
93
|
+
- **Fast startup** (C binary, no Ruby overhead)
|
|
94
|
+
- **Shell-friendly** with proper exit codes
|
|
95
|
+
|
|
96
|
+
**Commands** (inspired by xmllint):
|
|
97
|
+
```bash
|
|
98
|
+
# XPath queries
|
|
99
|
+
taurus --xpath "//book[@price > 20]" document.xml
|
|
100
|
+
|
|
101
|
+
# Pretty printing
|
|
102
|
+
taurus --format --indent 2 document.xml
|
|
103
|
+
taurus --format --compact document.xml
|
|
104
|
+
|
|
105
|
+
# Validation
|
|
106
|
+
taurus --validate document.xml
|
|
107
|
+
|
|
108
|
+
# Schema validation (future)
|
|
109
|
+
taurus --schema schema.xsd document.xml
|
|
110
|
+
|
|
111
|
+
# Debugging
|
|
112
|
+
taurus --debug --xpath "//item" document.xml
|
|
113
|
+
taurus --timing document.xml
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### 3. Ruby Gem (High-Level Interface)
|
|
117
|
+
- **Thin wrapper** around libtaurus
|
|
118
|
+
- **Ruby-friendly** API with blocks and iterators
|
|
119
|
+
- **Current API preserved** for backward
|
|
120
|
+
|
|
121
|
+
compatibility
|
|
122
|
+
- **Performance** close to direct C usage
|
|
123
|
+
|
|
124
|
+
**Implementation**:
|
|
125
|
+
```ruby
|
|
126
|
+
# Current approach (stays the same externally)
|
|
127
|
+
doc = Taurus.parse(xml)
|
|
128
|
+
results = doc.xpath('//book')
|
|
129
|
+
|
|
130
|
+
# Internally backed by libtaurus C library
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Parsing Modes
|
|
134
|
+
|
|
135
|
+
#### SAX (Event-Driven)
|
|
136
|
+
- **Memory efficient**: Stream processing
|
|
137
|
+
- **Fast**: No DOM construction
|
|
138
|
+
- **Use case**: Large documents, extraction
|
|
139
|
+
|
|
140
|
+
```c
|
|
141
|
+
taurus_sax_parse(xml, &callbacks, user_data);
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
#### StAX (Pull Parsing)
|
|
145
|
+
- **Control**: Application pulls events
|
|
146
|
+
- **Flexible**: Skip unwanted sections
|
|
147
|
+
- **Use case**: Selective parsing
|
|
148
|
+
|
|
149
|
+
```c
|
|
150
|
+
taurus_reader_t* reader = taurus_reader_new(xml);
|
|
151
|
+
while (taurus_reader_read(reader)) {
|
|
152
|
+
// Process events
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
#### DOM (Tree Construction)
|
|
157
|
+
- **Convenient**: Full tree in memory
|
|
158
|
+
- **XPath**: Enables complex queries
|
|
159
|
+
- **Use case**: Current Taurus behavior
|
|
160
|
+
|
|
161
|
+
```c
|
|
162
|
+
taurus_document_t* doc = taurus_parse_string(xml, len, NULL);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### XML Pretty Printing
|
|
166
|
+
|
|
167
|
+
**Features**:
|
|
168
|
+
- Configurable indentation (spaces/tabs)
|
|
169
|
+
- Line wrapping at specified column
|
|
170
|
+
- Attribute formatting (inline/separate lines)
|
|
171
|
+
- Whitespace normalization
|
|
172
|
+
- Compact mode (remove all whitespace)
|
|
173
|
+
|
|
174
|
+
**Options**:
|
|
175
|
+
```c
|
|
176
|
+
typedef struct {
|
|
177
|
+
int indent_size; // 2, 4, etc.
|
|
178
|
+
bool use_tabs; // tabs vs spaces
|
|
179
|
+
int wrap_column; // 80, 120, etc.
|
|
180
|
+
bool compact; // remove whitespace
|
|
181
|
+
bool sort_attributes; // alphabetical
|
|
182
|
+
} taurus_format_options_t;
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Implementation Roadmap
|
|
186
|
+
|
|
187
|
+
### Phase 1: API Stabilization (v0.4.0-v0.5.0)
|
|
188
|
+
- Complete current Ruby API
|
|
189
|
+
- Ensure comprehensive test coverage
|
|
190
|
+
- Document all behaviors
|
|
191
|
+
- Establish API contracts
|
|
192
|
+
|
|
193
|
+
### Phase 2: C API Design (v0.6.0)
|
|
194
|
+
- Design libtaurus C API
|
|
195
|
+
- Create header files
|
|
196
|
+
- Document API conventions
|
|
197
|
+
- Plan memory management
|
|
198
|
+
|
|
199
|
+
### Phase 3: Refactoring (v0.7.0)
|
|
200
|
+
- Extract C code into libtaurus
|
|
201
|
+
- Maintain Ruby bindings
|
|
202
|
+
- Separate concerns cleanly
|
|
203
|
+
- Add C unit tests
|
|
204
|
+
|
|
205
|
+
### Phase 4: Multi-Mode Parsing (v0.8.0)
|
|
206
|
+
- Implement SAX parsing
|
|
207
|
+
- Implement StAX parsing
|
|
208
|
+
- Keep DOM mode (current)
|
|
209
|
+
- Add mode selection API
|
|
210
|
+
|
|
211
|
+
### Phase 5: CLI Implementation (v0.9.0)
|
|
212
|
+
- Build C CLI using libtaurus
|
|
213
|
+
- Implement xmllint-compatible commands
|
|
214
|
+
- Add taurus-specific features
|
|
215
|
+
- Document CLI usage
|
|
216
|
+
|
|
217
|
+
### Phase 6: Pretty Printing (v0.9.0)
|
|
218
|
+
- Implement formatting engine
|
|
219
|
+
- Add configuration options
|
|
220
|
+
- Support various styles
|
|
221
|
+
- Integrate with CLI
|
|
222
|
+
|
|
223
|
+
### Phase 7: CMake Build (v0.10.0)
|
|
224
|
+
- Create CMake build system
|
|
225
|
+
- Support cross-compilation
|
|
226
|
+
- Generate pkg-config files
|
|
227
|
+
- Build shared/static libraries
|
|
228
|
+
|
|
229
|
+
### Phase 8: Language Bindings (v1.0.0+)
|
|
230
|
+
- Python bindings
|
|
231
|
+
- Node.js bindings
|
|
232
|
+
- Other language bindings
|
|
233
|
+
- Consistent API across languages
|
|
234
|
+
|
|
235
|
+
## Technical Considerations
|
|
236
|
+
|
|
237
|
+
### Memory Management
|
|
238
|
+
- **Allocator API**: Allow custom allocators
|
|
239
|
+
- **Reference Counting**: For shared resources
|
|
240
|
+
- **Pool Allocators**: For high-frequency allocations
|
|
241
|
+
- **Leak Detection**: Built-in debugging support
|
|
242
|
+
|
|
243
|
+
### Thread Safety
|
|
244
|
+
- **Immutable Documents**: Safe to share
|
|
245
|
+
- **Context Isolation**: Per-thread contexts
|
|
246
|
+
- **Lock-Free Reads**: Where possible
|
|
247
|
+
- **Documented Guarantees**: Clear thread-safety docs
|
|
248
|
+
|
|
249
|
+
### Error Handling
|
|
250
|
+
- **Error Codes**: Standard C approach
|
|
251
|
+
- **Error Context**: Detailed error information
|
|
252
|
+
- **Recovery**: Graceful error handling
|
|
253
|
+
- **Logging**: Configurable logging levels
|
|
254
|
+
|
|
255
|
+
### Performance
|
|
256
|
+
- **Zero-Copy**: Where possible
|
|
257
|
+
- **SIMD**: Continue optimizations
|
|
258
|
+
- **Memory Pools**: Reduce allocations
|
|
259
|
+
- **Lazy Evaluation**: Defer expensive operations
|
|
260
|
+
|
|
261
|
+
## Benefits
|
|
262
|
+
|
|
263
|
+
### For C/C++ Projects
|
|
264
|
+
- **Direct Integration**: No Ruby dependency
|
|
265
|
+
- **Fast Performance**: Native C speed
|
|
266
|
+
- **Small Footprint**: Minimal binary size
|
|
267
|
+
- **Standard API**: Familiar C patterns
|
|
268
|
+
|
|
269
|
+
### For Other Languages
|
|
270
|
+
- **Easy Bindings**: Standard C FFI
|
|
271
|
+
- **Consistent Behavior**: Same core library
|
|
272
|
+
- **Native Performance**: No interpretation overhead
|
|
273
|
+
- **Wide Compatibility**: Works everywhere
|
|
274
|
+
|
|
275
|
+
### For Taurus Users
|
|
276
|
+
- **Faster CLI**: C binary startup
|
|
277
|
+
- **More Modes**: SAX/StAX options
|
|
278
|
+
- **Better Tools**: Enhanced CLI features
|
|
279
|
+
- **Same API**: Backward compatible
|
|
280
|
+
|
|
281
|
+
## Migration Path
|
|
282
|
+
|
|
283
|
+
1. **v0.4.0**: Complete documentation
|
|
284
|
+
2. **v0.5.0**: Namespace prefixes, API finalization
|
|
285
|
+
3. **v0.6.0**: Design and prototype libtaurus API
|
|
286
|
+
4. **v0.7.0**: Refactor to libtaurus + Ruby bindings
|
|
287
|
+
5. **v0.8.0**: Add SAX/StAX modes
|
|
288
|
+
6. **v0.9.0**: C CLI + pretty printing
|
|
289
|
+
7. **v1.0.0**: Stable libtaurus release
|
|
290
|
+
|
|
291
|
+
## Timeline
|
|
292
|
+
|
|
293
|
+
- **Near-term (2025)**: v0.4.0-v0.5.0 (Ruby focus)
|
|
294
|
+
- **Mid-term (2026)**: v0.6.0-v0.8.0 (libtaurus extraction)
|
|
295
|
+
- **Long-term (2027+)**: v0.9.0-v1.0.0 (Multi-language, stable)
|
|
296
|
+
|
|
297
|
+
## Conclusion
|
|
298
|
+
|
|
299
|
+
This vision transforms Taurus from a Ruby gem into a universal XML processing library usable from any language. The core libtaurus library would provide fast, reliable XML processing while maintaining backward compatibility with the current Ruby API.
|
|
300
|
+
|
|
301
|
+
**Key Principle**: Evolution, not revolution. Each step maintains compatibility while adding new capabilities.
|
|
302
|
+
|
|
303
|
+
**Next Review**: After v0.5.0 completion (2025 Q2)
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
# GitHub Actions CI/CD Setup
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Taurus uses GitHub Actions for continuous integration, testing, and automated releases across multiple platforms and Ruby versions.
|
|
6
|
+
|
|
7
|
+
## Workflows
|
|
8
|
+
|
|
9
|
+
### 1. CI/CD Workflow (`.github/workflows/main.yml`)
|
|
10
|
+
|
|
11
|
+
**Triggers:**
|
|
12
|
+
- Push to `main` branch
|
|
13
|
+
- Pull requests
|
|
14
|
+
- Manual dispatch
|
|
15
|
+
|
|
16
|
+
**Features:**
|
|
17
|
+
- Multi-platform testing (Ubuntu x64/ARM64, macOS Intel/Apple Silicon)
|
|
18
|
+
- Multiple Ruby versions (3.0, 3.1, 3.2, 3.3, 3.4)
|
|
19
|
+
- Matrix-based configuration from `matrix.json`
|
|
20
|
+
- C extension compilation
|
|
21
|
+
- Ruby (RSpec) and C (Google Test) unit tests
|
|
22
|
+
- Performance benchmarks
|
|
23
|
+
- RuboCop linting
|
|
24
|
+
- Artifact collection
|
|
25
|
+
|
|
26
|
+
**Jobs:**
|
|
27
|
+
1. `load-matrix` - Loads platform/Ruby combinations from matrix.json
|
|
28
|
+
2. `test` - Runs full test suite on all matrix configurations
|
|
29
|
+
3. `benchmark` - Performance benchmarks on Ubuntu and macOS
|
|
30
|
+
4. `lint` - Code quality checks with RuboCop
|
|
31
|
+
5. `all-checks` - Verifies all tests passed
|
|
32
|
+
|
|
33
|
+
### 2. Release Workflow (`.github/workflows/release.yml`)
|
|
34
|
+
|
|
35
|
+
**Triggers:**
|
|
36
|
+
- Push of version tags (`v*`)
|
|
37
|
+
- Manual dispatch with version input
|
|
38
|
+
|
|
39
|
+
**Features:**
|
|
40
|
+
- Cross-platform native gem building
|
|
41
|
+
- Automated GitHub releases
|
|
42
|
+
- RubyGems.org publication
|
|
43
|
+
- Installation verification
|
|
44
|
+
|
|
45
|
+
**Jobs:**
|
|
46
|
+
1. `build-native-gems` - Builds native gems for:
|
|
47
|
+
- x86_64-linux (Ubuntu 20.04+)
|
|
48
|
+
- x86_64-darwin (Intel Macs)
|
|
49
|
+
- arm64-darwin (Apple Silicon)
|
|
50
|
+
|
|
51
|
+
2. `build-source-gem` - Builds source gem for other platforms
|
|
52
|
+
|
|
53
|
+
3. `create-release` - Creates GitHub release with:
|
|
54
|
+
- All gem files
|
|
55
|
+
- SHA256 checksums
|
|
56
|
+
- Release notes
|
|
57
|
+
|
|
58
|
+
4. `publish-rubygems` - Publishes to RubyGems.org
|
|
59
|
+
|
|
60
|
+
5. `verify-release` - Tests installation from RubyGems on multiple platforms
|
|
61
|
+
|
|
62
|
+
## Matrix Configuration
|
|
63
|
+
|
|
64
|
+
The `matrix.json` file defines all platform/Ruby combinations for testing:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
[
|
|
68
|
+
{
|
|
69
|
+
"runner": "ubuntu-22.04",
|
|
70
|
+
"os": "ubuntu",
|
|
71
|
+
"arch": "x64",
|
|
72
|
+
"ruby": "3.3",
|
|
73
|
+
"name": "ubuntu-22-ruby-3.3"
|
|
74
|
+
},
|
|
75
|
+
...
|
|
76
|
+
]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Supported Platforms:**
|
|
80
|
+
- Ubuntu 22.04 (x64, ARM64)
|
|
81
|
+
- macOS 13 (Intel)
|
|
82
|
+
- macOS latest (Apple Silicon)
|
|
83
|
+
|
|
84
|
+
**Ruby Versions:**
|
|
85
|
+
- 3.0, 3.1, 3.2, 3.3, 3.4
|
|
86
|
+
|
|
87
|
+
## Setup Requirements
|
|
88
|
+
|
|
89
|
+
### For CI/CD
|
|
90
|
+
|
|
91
|
+
No additional setup required - workflows run automatically on push/PR.
|
|
92
|
+
|
|
93
|
+
### For Releases
|
|
94
|
+
|
|
95
|
+
Required GitHub secrets:
|
|
96
|
+
- `RUBYGEMS_API_KEY` - API key for publishing to RubyGems.org
|
|
97
|
+
|
|
98
|
+
**To set up:**
|
|
99
|
+
1. Get API key from https://rubygems.org/profile/edit
|
|
100
|
+
2. Go to repository Settings → Secrets and variables → Actions
|
|
101
|
+
3. Add new secret named `RUBYGEMS_API_KEY`
|
|
102
|
+
|
|
103
|
+
## Creating a Release
|
|
104
|
+
|
|
105
|
+
### Automatic (Recommended)
|
|
106
|
+
|
|
107
|
+
1. Update version in `lib/taurus/version.rb`
|
|
108
|
+
2. Update `CHANGELOG.md`
|
|
109
|
+
3. Commit changes: `git commit -m "chore: bump version to X.Y.Z"`
|
|
110
|
+
4. Create and push tag:
|
|
111
|
+
```bash
|
|
112
|
+
git tag v0.1.0
|
|
113
|
+
git push origin v0.1.0
|
|
114
|
+
```
|
|
115
|
+
5. GitHub Actions automatically:
|
|
116
|
+
- Builds native gems
|
|
117
|
+
- Creates GitHub release
|
|
118
|
+
- Publishes to RubyGems
|
|
119
|
+
- Verifies installation
|
|
120
|
+
|
|
121
|
+
### Manual Dispatch
|
|
122
|
+
|
|
123
|
+
1. Go to Actions → Release workflow
|
|
124
|
+
2. Click "Run workflow"
|
|
125
|
+
3. Enter version (e.g., `0.1.0`)
|
|
126
|
+
4. Click "Run workflow"
|
|
127
|
+
|
|
128
|
+
## Artifacts
|
|
129
|
+
|
|
130
|
+
### Test Artifacts
|
|
131
|
+
|
|
132
|
+
Each test run produces:
|
|
133
|
+
- Compiled native extensions (`.so`/`.bundle` files)
|
|
134
|
+
- SHA256 checksums
|
|
135
|
+
- Retention: 30 days
|
|
136
|
+
|
|
137
|
+
### Release Artifacts
|
|
138
|
+
|
|
139
|
+
Each release includes:
|
|
140
|
+
- Source gem (all platforms)
|
|
141
|
+
- Native gems (Linux x64, macOS x64, macOS ARM64)
|
|
142
|
+
- Combined SHA256 checksums
|
|
143
|
+
- Retention: Permanent (GitHub release)
|
|
144
|
+
|
|
145
|
+
## Monitoring
|
|
146
|
+
|
|
147
|
+
### Build Status
|
|
148
|
+
|
|
149
|
+
Check build status:
|
|
150
|
+
- Badge on README.md
|
|
151
|
+
- Actions tab in GitHub repository
|
|
152
|
+
- Email notifications (if configured)
|
|
153
|
+
|
|
154
|
+
### Performance Tracking
|
|
155
|
+
|
|
156
|
+
Benchmark artifacts available for:
|
|
157
|
+
- Ubuntu latest
|
|
158
|
+
- macOS latest
|
|
159
|
+
|
|
160
|
+
Download from Actions → Workflow run → Artifacts
|
|
161
|
+
|
|
162
|
+
## Troubleshooting
|
|
163
|
+
|
|
164
|
+
### Build Failures
|
|
165
|
+
|
|
166
|
+
**C Extension Won't Compile:**
|
|
167
|
+
```bash
|
|
168
|
+
# Local reproduction:
|
|
169
|
+
bundle exec rake clean
|
|
170
|
+
bundle exec rake compile
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Test Failures:**
|
|
174
|
+
```bash
|
|
175
|
+
# Run tests locally:
|
|
176
|
+
bundle exec rake spec # Ruby tests
|
|
177
|
+
bundle exec rake test_c # C tests
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Cross-compilation Issues:**
|
|
181
|
+
- Check rake-compiler-dock is latest version
|
|
182
|
+
- Verify extconf.rb lists all source files
|
|
183
|
+
- Check for platform-specific #ifdef code
|
|
184
|
+
|
|
185
|
+
### Release Failures
|
|
186
|
+
|
|
187
|
+
**Native Gem Build Fails:**
|
|
188
|
+
- Check rake-compiler-dock logs
|
|
189
|
+
- Verify source files compile on target platform
|
|
190
|
+
- Test locally with Docker:
|
|
191
|
+
```bash
|
|
192
|
+
bundle exec rake-compiler-dock bash
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**RubyGems Publication Fails:**
|
|
196
|
+
- Verify `RUBYGEMS_API_KEY` secret is set
|
|
197
|
+
- Check gem name isn't already taken
|
|
198
|
+
- Ensure version number is unique
|
|
199
|
+
|
|
200
|
+
**Verification Fails:**
|
|
201
|
+
- Wait longer (gem indexing lag)
|
|
202
|
+
- Check if gem published successfully
|
|
203
|
+
- Verify gem installs manually:
|
|
204
|
+
```bash
|
|
205
|
+
gem install taurus -v X.Y.Z
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Best Practices
|
|
209
|
+
|
|
210
|
+
### Before Merging PRs
|
|
211
|
+
|
|
212
|
+
- Ensure all tests pass
|
|
213
|
+
- Check benchmark results for regressions
|
|
214
|
+
- Review RuboCop warnings
|
|
215
|
+
- Test on multiple platforms if changing C code
|
|
216
|
+
|
|
217
|
+
### Before Releasing
|
|
218
|
+
|
|
219
|
+
1. Run full test suite locally
|
|
220
|
+
2. Update CHANGELOG.md
|
|
221
|
+
3. Bump version number
|
|
222
|
+
4. Test installation from local gem:
|
|
223
|
+
```bash
|
|
224
|
+
gem build taurus.gemspec
|
|
225
|
+
gem install taurus-X.Y.Z.gem
|
|
226
|
+
```
|
|
227
|
+
5. Create tag and push
|
|
228
|
+
|
|
229
|
+
### Maintaining Matrix
|
|
230
|
+
|
|
231
|
+
When adding platforms:
|
|
232
|
+
1. Add to `matrix.json`
|
|
233
|
+
2. Test locally if possible
|
|
234
|
+
3. Monitor first CI run
|
|
235
|
+
4. Update documentation
|
|
236
|
+
|
|
237
|
+
When deprecating Ruby:
|
|
238
|
+
1. Remove from `matrix.json`
|
|
239
|
+
2. Update README.md
|
|
240
|
+
3. Update gemspec `required_ruby_version`
|
|
241
|
+
|
|
242
|
+
## Performance Considerations
|
|
243
|
+
|
|
244
|
+
### CI Speed
|
|
245
|
+
|
|
246
|
+
Average runtime:
|
|
247
|
+
- Test job: 5-10 minutes per platform
|
|
248
|
+
- Benchmark: 10-15 minutes per platform
|
|
249
|
+
- Total (parallel): ~15-20 minutes
|
|
250
|
+
|
|
251
|
+
### Release Speed
|
|
252
|
+
|
|
253
|
+
Average runtime:
|
|
254
|
+
- Build gems: ~10 minutes (parallel)
|
|
255
|
+
- Create release: ~2 minutes
|
|
256
|
+
- Publish: ~5 minutes
|
|
257
|
+
- Verify: ~10 minutes
|
|
258
|
+
- Total: ~30 minutes
|
|
259
|
+
|
|
260
|
+
## Future Enhancements
|
|
261
|
+
|
|
262
|
+
### Planned
|
|
263
|
+
|
|
264
|
+
- Windows support (MSYS2/MinGW)
|
|
265
|
+
- Additional ARM64 platforms
|
|
266
|
+
- Performance trend tracking
|
|
267
|
+
- Code coverage reporting
|
|
268
|
+
- Security scanning (Dependabot, CodeQL)
|
|
269
|
+
|
|
270
|
+
### Under Consideration
|
|
271
|
+
|
|
272
|
+
- Nightly builds with latest Ruby
|
|
273
|
+
- Cross-Ruby compatibility matrix
|
|
274
|
+
- Memory profiling in CI
|
|
275
|
+
- Benchmark comparison vs. Nokogiri/Ox
|
|
276
|
+
|
|
277
|
+
## Resources
|
|
278
|
+
|
|
279
|
+
- [GitHub Actions Documentation](https://docs.github.com/en/actions)
|
|
280
|
+
- [ruby/setup-ruby Action](https://github.com/ruby/setup-ruby)
|
|
281
|
+
- [rake-compiler Documentation](https://github.com/rake-compiler/rake-compiler)
|
|
282
|
+
- [RubyGems API Documentation](https://guides.rubygems.org/rubygems-org-api/)
|
|
283
|
+
|
|
284
|
+
## Support
|
|
285
|
+
|
|
286
|
+
For CI/CD issues:
|
|
287
|
+
1. Check Actions logs
|
|
288
|
+
2. Search existing GitHub issues
|
|
289
|
+
3. Create new issue with:
|
|
290
|
+
- Workflow run URL
|
|
291
|
+
- Platform/Ruby version
|
|
292
|
+
- Error messages
|
|
293
|
+
- Steps to reproduce
|