Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
# AI Coding Agent Instructions for openapi-parser

## Project Overview

**openapi-parser** is a Java-based OpenAPI 3.0.x & 3.1 parser and validator with pluggable YAML/JSON converters and document readers. It's organized as a multi-module Gradle project supporting both OpenAPI 3.0 and 3.1 specifications with separate versioned APIs.

## Key Architecture

### Core Modules (from [settings.gradle.kts](settings.gradle.kts))
- **openapi-parser** - Main parser module (depends on json-schema-validator, io-interfaces)
- **json-schema-validator** - JSON Schema validation for OpenAPI documents
- **io-interfaces** - Plugin interfaces: `Reader` (document loading), `Converter` (YAML/JSON parsing), `Writer`
- **io-jackson** & **io-snakeyaml** - Pluggable converter implementations
- **memory-protocol** - In-memory resource handling
- **openapi-parser-bom** & **json-schema-validator-bom** - Bill of Materials (dependency management)

### Data Flow
1. `DocumentLoader` loads document by URI using pluggable `Reader` + `Converter`
2. `OpenApiParser.parse()` detects version (3.0 vs 3.1) by reading "openapi" field
3. `Resolver` resolves `$ref` references (uses Draft4 for 3.0, Draft202012 for 3.1)
4. Version-specific result returned: `OpenApiResult30` or `OpenApiResult31`
5. User calls `result.getModel(OpenApi.class)` to get navigable model tree

### Plugin Architecture
All I/O abstraction via interfaces in [io-interfaces](io-interfaces/):
- Implement `Reader` for custom document loading (default: `UriReader`)
- Implement `Converter` to support new YAML/JSON parsers (default: Jackson & SnakeYAML)
- Implement `Writer` to output documents (JSON/YAML writers available)

## Build & Test Workflow

### Gradle Commands
```bash
# Build with coverage (default)
./gradlew build

# Run specific module tests
./gradlew :openapi-parser:test
./gradlew :json-schema-validator:test

# Check dependency versions for updates
./gradlew dependencyUpdates

# View coverage reports
./gradlew jacocoLogAggregatedCoverage

# Check specific dependency
./gradlew dependencyInsight --dependency org.slf4j:slf4j-api --configuration testRuntimeClasspath
```

### Test Framework
- **JUnit 5** (Jupiter) for test execution
- **Kotest** (StringSpec style) with table-driven tests (`kotest-table`)
- **MockK** for mocking in Kotlin tests
- Kotlin test files use `Spec` suffix (e.g., `OpenApiParserSpec.kt`)

### Convention Plugins (buildSrc)
Three apply to all modules:
- **openapiparser.library** - JVM toolchain (Java 11 build, 17 test), Checker Framework (null safety), JaCoCo (coverage)
- **openapiparser.test** - JUnit 5, Kotest, MockK setup
- **openapiparser.publish** - Maven Central publishing

## Project Conventions & Patterns

### Version Management
- Detected via `openapi` field in YAML/JSON: `3.0.x` → `OpenApiResult30`, `3.1.x` → `OpenApiResult31`
- Separate model packages: `io.openapiparser.model.v30.*` vs `io.openapiparser.model.v31.*`
- Use generic `OpenApiResult` interface in public APIs, cast to version-specific when needed

### Error Handling
- `ParserException` - wraps parsing failures with document URI for context
- `ConverterException` - YAML/JSON conversion failures
- `UnknownVersionException` - unsupported OpenAPI versions

### Testing Patterns (examples from [OpenApiParserSpec.kt](openapi-parser/src/test/kotlin/io/openapiparser/OpenApiParserSpec.kt), [ApiBuilder.kt](openapi-parser/src/test/kotlin/io/openapiparser/support/ApiBuilder.kt))
- Use `ApiBuilder` test utility: fluent API to build parsers with inline YAML
- `buildParser()` → `parser.parse(URI)` → `result.getModel(OpenApi.class)`
- Test resources in `src/test/resources/` organized by feature (e.g., `bundle-ref-schema/`)
- Table-driven tests with Kotest for multiple cases

### Null Safety
- Checker Framework annotations: `@Nullable`, `@NonNull` on methods returning/accepting potentially null values
- Use `nonNull()` helper (from jsonschema support) for assertions in critical paths
- Default values: missing optional properties return false/empty collection per OpenAPI spec

## Integration Points & Dependencies

### Key External Libraries
- **Jackson 2.20** (jackson-bom) - JSON/YAML parsing (io-jackson module)
- **SnakeYAML 2.5** - Alternative YAML parser (io-snakeyaml module)
- **jsonpath 2.9** - Document traversal (optional, for overlay features)
- **SLF4J 2.0.17** + Logback 1.5.18 - Logging

### JSON Schema Validator Integration
- Embedded JSON Schema validator for OpenAPI validation
- Supports multiple JSON Schema drafts (Draft 4, Draft 6, Draft 7, Draft 202012)
- Test suites in [json-schema-validator/src/test/resources/suites/](json-schema-validator/src/test/resources/suites/)

### Overlay & Bundling (Experimental)
- `OverlayParser` handles Overlay 1.0 specifications
- `OpenApiBundler` combines multi-file references into single document
- `OverlayApplier` applies overlay transformations using JSONPath

## Documentation & References

- [Main README](README.adoc) - overview, usage examples (current 2023.3 API)
- [openapi-parser README](openapi-parser/README.adoc) - detailed API usage with code examples
- Module READMEs - specific implementation details
- Published on Maven Central: `io.openapiprocessor:openapi-parser:*`

## Common Development Tasks

**Adding a new OpenAPI feature**: Add to model classes, update converters in json-schema-validator
**Adding yaml/json parser**: Implement `Converter` interface in new module (see io-jackson/jackson pattern)
**Adding custom document loading**: Implement `Reader` interface, pass to `DocumentLoader`
**Testing multi-file OpenAPI**: Use `DocumentStore` to preload documents, pass to parser
**Performance**: Resolver caches $refs; reuse `DocumentLoader` across parses when possible
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add Copilot and AI agent instructions for openapi-parser by 1stmu33 · Pull Request #212 · openapi-processor/openapi-parser · GitHub
Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
# AI Coding Agent Instructions for openapi-parser

## Project Overview

**openapi-parser** is a Java-based OpenAPI 3.0.x & 3.1 parser and validator with pluggable YAML/JSON converters and document readers. It's organized as a multi-module Gradle project supporting both OpenAPI 3.0 and 3.1 specifications with separate versioned APIs.

## Key Architecture

### Core Modules (from [settings.gradle.kts](settings.gradle.kts))
- **openapi-parser** - Main parser module (depends on json-schema-validator, io-interfaces)
- **json-schema-validator** - JSON Schema validation for OpenAPI documents
- **io-interfaces** - Plugin interfaces: `Reader` (document loading), `Converter` (YAML/JSON parsing), `Writer`
- **io-jackson** & **io-snakeyaml** - Pluggable converter implementations
- **memory-protocol** - In-memory resource handling
- **openapi-parser-bom** & **json-schema-validator-bom** - Bill of Materials (dependency management)

### Data Flow
1. `DocumentLoader` loads document by URI using pluggable `Reader` + `Converter`
2. `OpenApiParser.parse()` detects version (3.0 vs 3.1) by reading "openapi" field
3. `Resolver` resolves `$ref` references (uses Draft4 for 3.0, Draft202012 for 3.1)
4. Version-specific result returned: `OpenApiResult30` or `OpenApiResult31`
5. User calls `result.getModel(OpenApi.class)` to get navigable model tree

### Plugin Architecture
All I/O abstraction via interfaces in [io-interfaces](io-interfaces/):
- Implement `Reader` for custom document loading (default: `UriReader`)
- Implement `Converter` to support new YAML/JSON parsers (default: Jackson & SnakeYAML)
- Implement `Writer` to output documents (JSON/YAML writers available)

## Build & Test Workflow

### Gradle Commands
```bash
# Build with coverage (default)
./gradlew build

# Run specific module tests
./gradlew :openapi-parser:test
./gradlew :json-schema-validator:test

# Check dependency versions for updates
./gradlew dependencyUpdates

# View coverage reports
./gradlew jacocoLogAggregatedCoverage

# Check specific dependency
./gradlew dependencyInsight --dependency org.slf4j:slf4j-api --configuration testRuntimeClasspath
```

### Test Framework
- **JUnit 5** (Jupiter) for test execution
- **Kotest** (StringSpec style) with table-driven tests (`kotest-table`)
- **MockK** for mocking in Kotlin tests
- Kotlin test files use `Spec` suffix (e.g., `OpenApiParserSpec.kt`)

### Convention Plugins (buildSrc)
Three apply to all modules:
- **openapiparser.library** - JVM toolchain (Java 11 build, 17 test), Checker Framework (null safety), JaCoCo (coverage)
- **openapiparser.test** - JUnit 5, Kotest, MockK setup
- **openapiparser.publish** - Maven Central publishing

## Project Conventions & Patterns

### Version Management
- Detected via `openapi` field in YAML/JSON: `3.0.x` → `OpenApiResult30`, `3.1.x` → `OpenApiResult31`
- Separate model packages: `io.openapiparser.model.v30.*` vs `io.openapiparser.model.v31.*`
- Use generic `OpenApiResult` interface in public APIs, cast to version-specific when needed

### Error Handling
- `ParserException` - wraps parsing failures with document URI for context
- `ConverterException` - YAML/JSON conversion failures
- `UnknownVersionException` - unsupported OpenAPI versions

### Testing Patterns (examples from [OpenApiParserSpec.kt](openapi-parser/src/test/kotlin/io/openapiparser/OpenApiParserSpec.kt), [ApiBuilder.kt](openapi-parser/src/test/kotlin/io/openapiparser/support/ApiBuilder.kt))
- Use `ApiBuilder` test utility: fluent API to build parsers with inline YAML
- `buildParser()` → `parser.parse(URI)` → `result.getModel(OpenApi.class)`
- Test resources in `src/test/resources/` organized by feature (e.g., `bundle-ref-schema/`)
- Table-driven tests with Kotest for multiple cases

### Null Safety
- Checker Framework annotations: `@Nullable`, `@NonNull` on methods returning/accepting potentially null values
- Use `nonNull()` helper (from jsonschema support) for assertions in critical paths
- Default values: missing optional properties return false/empty collection per OpenAPI spec

## Integration Points & Dependencies

### Key External Libraries
- **Jackson 2.20** (jackson-bom) - JSON/YAML parsing (io-jackson module)
- **SnakeYAML 2.5** - Alternative YAML parser (io-snakeyaml module)
- **jsonpath 2.9** - Document traversal (optional, for overlay features)
- **SLF4J 2.0.17** + Logback 1.5.18 - Logging

### JSON Schema Validator Integration
- Embedded JSON Schema validator for OpenAPI validation
- Supports multiple JSON Schema drafts (Draft 4, Draft 6, Draft 7, Draft 202012)
- Test suites in [json-schema-validator/src/test/resources/suites/](json-schema-validator/src/test/resources/suites/)

### Overlay & Bundling (Experimental)
- `OverlayParser` handles Overlay 1.0 specifications
- `OpenApiBundler` combines multi-file references into single document
- `OverlayApplier` applies overlay transformations using JSONPath

## Documentation & References

- [Main README](README.adoc) - overview, usage examples (current 2023.3 API)
- [openapi-parser README](openapi-parser/README.adoc) - detailed API usage with code examples
- Module READMEs - specific implementation details
- Published on Maven Central: `io.openapiprocessor:openapi-parser:*`

## Common Development Tasks

**Adding a new OpenAPI feature**: Add to model classes, update converters in json-schema-validator
**Adding yaml/json parser**: Implement `Converter` interface in new module (see io-jackson/jackson pattern)
**Adding custom document loading**: Implement `Reader` interface, pass to `DocumentLoader`
**Testing multi-file OpenAPI**: Use `DocumentStore` to preload documents, pass to parser
**Performance**: Resolver caches $refs; reuse `DocumentLoader` across parses when possible
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Copilot and AI agent instructions for openapi-parser by 1stmu33 · Pull Request #212 · openapi-processor/openapi-parser · GitHub
Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
# AI Coding Agent Instructions for openapi-parser

## Project Overview

**openapi-parser** is a Java-based OpenAPI 3.0.x & 3.1 parser and validator with pluggable YAML/JSON converters and document readers. It's organized as a multi-module Gradle project supporting both OpenAPI 3.0 and 3.1 specifications with separate versioned APIs.

## Key Architecture

### Core Modules (from [settings.gradle.kts](settings.gradle.kts))
- **openapi-parser** - Main parser module (depends on json-schema-validator, io-interfaces)
- **json-schema-validator** - JSON Schema validation for OpenAPI documents
- **io-interfaces** - Plugin interfaces: `Reader` (document loading), `Converter` (YAML/JSON parsing), `Writer`
- **io-jackson** & **io-snakeyaml** - Pluggable converter implementations
- **memory-protocol** - In-memory resource handling
- **openapi-parser-bom** & **json-schema-validator-bom** - Bill of Materials (dependency management)

### Data Flow
1. `DocumentLoader` loads document by URI using pluggable `Reader` + `Converter`
2. `OpenApiParser.parse()` detects version (3.0 vs 3.1) by reading "openapi" field
3. `Resolver` resolves `$ref` references (uses Draft4 for 3.0, Draft202012 for 3.1)
4. Version-specific result returned: `OpenApiResult30` or `OpenApiResult31`
5. User calls `result.getModel(OpenApi.class)` to get navigable model tree

### Plugin Architecture
All I/O abstraction via interfaces in [io-interfaces](io-interfaces/):
- Implement `Reader` for custom document loading (default: `UriReader`)
- Implement `Converter` to support new YAML/JSON parsers (default: Jackson & SnakeYAML)
- Implement `Writer` to output documents (JSON/YAML writers available)

## Build & Test Workflow

### Gradle Commands
```bash
# Build with coverage (default)
./gradlew build

# Run specific module tests
./gradlew :openapi-parser:test
./gradlew :json-schema-validator:test

# Check dependency versions for updates
./gradlew dependencyUpdates

# View coverage reports
./gradlew jacocoLogAggregatedCoverage

# Check specific dependency
./gradlew dependencyInsight --dependency org.slf4j:slf4j-api --configuration testRuntimeClasspath
```

### Test Framework
- **JUnit 5** (Jupiter) for test execution
- **Kotest** (StringSpec style) with table-driven tests (`kotest-table`)
- **MockK** for mocking in Kotlin tests
- Kotlin test files use `Spec` suffix (e.g., `OpenApiParserSpec.kt`)

### Convention Plugins (buildSrc)
Three apply to all modules:
- **openapiparser.library** - JVM toolchain (Java 11 build, 17 test), Checker Framework (null safety), JaCoCo (coverage)
- **openapiparser.test** - JUnit 5, Kotest, MockK setup
- **openapiparser.publish** - Maven Central publishing

## Project Conventions & Patterns

### Version Management
- Detected via `openapi` field in YAML/JSON: `3.0.x` → `OpenApiResult30`, `3.1.x` → `OpenApiResult31`
- Separate model packages: `io.openapiparser.model.v30.*` vs `io.openapiparser.model.v31.*`
- Use generic `OpenApiResult` interface in public APIs, cast to version-specific when needed

### Error Handling
- `ParserException` - wraps parsing failures with document URI for context
- `ConverterException` - YAML/JSON conversion failures
- `UnknownVersionException` - unsupported OpenAPI versions

### Testing Patterns (examples from [OpenApiParserSpec.kt](openapi-parser/src/test/kotlin/io/openapiparser/OpenApiParserSpec.kt), [ApiBuilder.kt](openapi-parser/src/test/kotlin/io/openapiparser/support/ApiBuilder.kt))
- Use `ApiBuilder` test utility: fluent API to build parsers with inline YAML
- `buildParser()` → `parser.parse(URI)` → `result.getModel(OpenApi.class)`
- Test resources in `src/test/resources/` organized by feature (e.g., `bundle-ref-schema/`)
- Table-driven tests with Kotest for multiple cases

### Null Safety
- Checker Framework annotations: `@Nullable`, `@NonNull` on methods returning/accepting potentially null values
- Use `nonNull()` helper (from jsonschema support) for assertions in critical paths
- Default values: missing optional properties return false/empty collection per OpenAPI spec

## Integration Points & Dependencies

### Key External Libraries
- **Jackson 2.20** (jackson-bom) - JSON/YAML parsing (io-jackson module)
- **SnakeYAML 2.5** - Alternative YAML parser (io-snakeyaml module)
- **jsonpath 2.9** - Document traversal (optional, for overlay features)
- **SLF4J 2.0.17** + Logback 1.5.18 - Logging

### JSON Schema Validator Integration
- Embedded JSON Schema validator for OpenAPI validation
- Supports multiple JSON Schema drafts (Draft 4, Draft 6, Draft 7, Draft 202012)
- Test suites in [json-schema-validator/src/test/resources/suites/](json-schema-validator/src/test/resources/suites/)

### Overlay & Bundling (Experimental)
- `OverlayParser` handles Overlay 1.0 specifications
- `OpenApiBundler` combines multi-file references into single document
- `OverlayApplier` applies overlay transformations using JSONPath

## Documentation & References

- [Main README](README.adoc) - overview, usage examples (current 2023.3 API)
- [openapi-parser README](openapi-parser/README.adoc) - detailed API usage with code examples
- Module READMEs - specific implementation details
- Published on Maven Central: `io.openapiprocessor:openapi-parser:*`

## Common Development Tasks

**Adding a new OpenAPI feature**: Add to model classes, update converters in json-schema-validator
**Adding yaml/json parser**: Implement `Converter` interface in new module (see io-jackson/jackson pattern)
**Adding custom document loading**: Implement `Reader` interface, pass to `DocumentLoader`
**Testing multi-file OpenAPI**: Use `DocumentStore` to preload documents, pass to parser
**Performance**: Resolver caches $refs; reuse `DocumentLoader` across parses when possible
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Copilot and AI agent instructions for openapi-parser by 1stmu33 · Pull Request #212 · openapi-processor/openapi-parser · GitHub
Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
# AI Coding Agent Instructions for openapi-parser

## Project Overview

**openapi-parser** is a Java-based OpenAPI 3.0.x & 3.1 parser and validator with pluggable YAML/JSON converters and document readers. It's organized as a multi-module Gradle project supporting both OpenAPI 3.0 and 3.1 specifications with separate versioned APIs.

## Key Architecture

### Core Modules (from [settings.gradle.kts](settings.gradle.kts))
- **openapi-parser** - Main parser module (depends on json-schema-validator, io-interfaces)
- **json-schema-validator** - JSON Schema validation for OpenAPI documents
- **io-interfaces** - Plugin interfaces: `Reader` (document loading), `Converter` (YAML/JSON parsing), `Writer`
- **io-jackson** & **io-snakeyaml** - Pluggable converter implementations
- **memory-protocol** - In-memory resource handling
- **openapi-parser-bom** & **json-schema-validator-bom** - Bill of Materials (dependency management)

### Data Flow
1. `DocumentLoader` loads document by URI using pluggable `Reader` + `Converter`
2. `OpenApiParser.parse()` detects version (3.0 vs 3.1) by reading "openapi" field
3. `Resolver` resolves `$ref` references (uses Draft4 for 3.0, Draft202012 for 3.1)
4. Version-specific result returned: `OpenApiResult30` or `OpenApiResult31`
5. User calls `result.getModel(OpenApi.class)` to get navigable model tree

### Plugin Architecture
All I/O abstraction via interfaces in [io-interfaces](io-interfaces/):
- Implement `Reader` for custom document loading (default: `UriReader`)
- Implement `Converter` to support new YAML/JSON parsers (default: Jackson & SnakeYAML)
- Implement `Writer` to output documents (JSON/YAML writers available)

## Build & Test Workflow

### Gradle Commands
```bash
# Build with coverage (default)
./gradlew build

# Run specific module tests
./gradlew :openapi-parser:test
./gradlew :json-schema-validator:test

# Check dependency versions for updates
./gradlew dependencyUpdates

# View coverage reports
./gradlew jacocoLogAggregatedCoverage

# Check specific dependency
./gradlew dependencyInsight --dependency org.slf4j:slf4j-api --configuration testRuntimeClasspath
```

### Test Framework
- **JUnit 5** (Jupiter) for test execution
- **Kotest** (StringSpec style) with table-driven tests (`kotest-table`)
- **MockK** for mocking in Kotlin tests
- Kotlin test files use `Spec` suffix (e.g., `OpenApiParserSpec.kt`)

### Convention Plugins (buildSrc)
Three apply to all modules:
- **openapiparser.library** - JVM toolchain (Java 11 build, 17 test), Checker Framework (null safety), JaCoCo (coverage)
- **openapiparser.test** - JUnit 5, Kotest, MockK setup
- **openapiparser.publish** - Maven Central publishing

## Project Conventions & Patterns

### Version Management
- Detected via `openapi` field in YAML/JSON: `3.0.x` → `OpenApiResult30`, `3.1.x` → `OpenApiResult31`
- Separate model packages: `io.openapiparser.model.v30.*` vs `io.openapiparser.model.v31.*`
- Use generic `OpenApiResult` interface in public APIs, cast to version-specific when needed

### Error Handling
- `ParserException` - wraps parsing failures with document URI for context
- `ConverterException` - YAML/JSON conversion failures
- `UnknownVersionException` - unsupported OpenAPI versions

### Testing Patterns (examples from [OpenApiParserSpec.kt](openapi-parser/src/test/kotlin/io/openapiparser/OpenApiParserSpec.kt), [ApiBuilder.kt](openapi-parser/src/test/kotlin/io/openapiparser/support/ApiBuilder.kt))
- Use `ApiBuilder` test utility: fluent API to build parsers with inline YAML
- `buildParser()` → `parser.parse(URI)` → `result.getModel(OpenApi.class)`
- Test resources in `src/test/resources/` organized by feature (e.g., `bundle-ref-schema/`)
- Table-driven tests with Kotest for multiple cases

### Null Safety
- Checker Framework annotations: `@Nullable`, `@NonNull` on methods returning/accepting potentially null values
- Use `nonNull()` helper (from jsonschema support) for assertions in critical paths
- Default values: missing optional properties return false/empty collection per OpenAPI spec

## Integration Points & Dependencies

### Key External Libraries
- **Jackson 2.20** (jackson-bom) - JSON/YAML parsing (io-jackson module)
- **SnakeYAML 2.5** - Alternative YAML parser (io-snakeyaml module)
- **jsonpath 2.9** - Document traversal (optional, for overlay features)
- **SLF4J 2.0.17** + Logback 1.5.18 - Logging

### JSON Schema Validator Integration
- Embedded JSON Schema validator for OpenAPI validation
- Supports multiple JSON Schema drafts (Draft 4, Draft 6, Draft 7, Draft 202012)
- Test suites in [json-schema-validator/src/test/resources/suites/](json-schema-validator/src/test/resources/suites/)

### Overlay & Bundling (Experimental)
- `OverlayParser` handles Overlay 1.0 specifications
- `OpenApiBundler` combines multi-file references into single document
- `OverlayApplier` applies overlay transformations using JSONPath

## Documentation & References

- [Main README](README.adoc) - overview, usage examples (current 2023.3 API)
- [openapi-parser README](openapi-parser/README.adoc) - detailed API usage with code examples
- Module READMEs - specific implementation details
- Published on Maven Central: `io.openapiprocessor:openapi-parser:*`

## Common Development Tasks

**Adding a new OpenAPI feature**: Add to model classes, update converters in json-schema-validator
**Adding yaml/json parser**: Implement `Converter` interface in new module (see io-jackson/jackson pattern)
**Adding custom document loading**: Implement `Reader` interface, pass to `DocumentLoader`
**Testing multi-file OpenAPI**: Use `DocumentStore` to preload documents, pass to parser
**Performance**: Resolver caches $refs; reuse `DocumentLoader` across parses when possible
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add Copilot and AI agent instructions for openapi-parser by 1stmu33 · Pull Request #212 · openapi-processor/openapi-parser · GitHub
Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
# AI Coding Agent Instructions for openapi-parser

## Project Overview

**openapi-parser** is a Java-based OpenAPI 3.0.x & 3.1 parser and validator with pluggable YAML/JSON converters and document readers. It's organized as a multi-module Gradle project supporting both OpenAPI 3.0 and 3.1 specifications with separate versioned APIs.

## Key Architecture

### Core Modules (from [settings.gradle.kts](settings.gradle.kts))
- **openapi-parser** - Main parser module (depends on json-schema-validator, io-interfaces)
- **json-schema-validator** - JSON Schema validation for OpenAPI documents
- **io-interfaces** - Plugin interfaces: `Reader` (document loading), `Converter` (YAML/JSON parsing), `Writer`
- **io-jackson** & **io-snakeyaml** - Pluggable converter implementations
- **memory-protocol** - In-memory resource handling
- **openapi-parser-bom** & **json-schema-validator-bom** - Bill of Materials (dependency management)

### Data Flow
1. `DocumentLoader` loads document by URI using pluggable `Reader` + `Converter`
2. `OpenApiParser.parse()` detects version (3.0 vs 3.1) by reading "openapi" field
3. `Resolver` resolves `$ref` references (uses Draft4 for 3.0, Draft202012 for 3.1)
4. Version-specific result returned: `OpenApiResult30` or `OpenApiResult31`
5. User calls `result.getModel(OpenApi.class)` to get navigable model tree

### Plugin Architecture
All I/O abstraction via interfaces in [io-interfaces](io-interfaces/):
- Implement `Reader` for custom document loading (default: `UriReader`)
- Implement `Converter` to support new YAML/JSON parsers (default: Jackson & SnakeYAML)
- Implement `Writer` to output documents (JSON/YAML writers available)

## Build & Test Workflow

### Gradle Commands
```bash
# Build with coverage (default)
./gradlew build

# Run specific module tests
./gradlew :openapi-parser:test
./gradlew :json-schema-validator:test

# Check dependency versions for updates
./gradlew dependencyUpdates

# View coverage reports
./gradlew jacocoLogAggregatedCoverage

# Check specific dependency
./gradlew dependencyInsight --dependency org.slf4j:slf4j-api --configuration testRuntimeClasspath
```

### Test Framework
- **JUnit 5** (Jupiter) for test execution
- **Kotest** (StringSpec style) with table-driven tests (`kotest-table`)
- **MockK** for mocking in Kotlin tests
- Kotlin test files use `Spec` suffix (e.g., `OpenApiParserSpec.kt`)

### Convention Plugins (buildSrc)
Three apply to all modules:
- **openapiparser.library** - JVM toolchain (Java 11 build, 17 test), Checker Framework (null safety), JaCoCo (coverage)
- **openapiparser.test** - JUnit 5, Kotest, MockK setup
- **openapiparser.publish** - Maven Central publishing

## Project Conventions & Patterns

### Version Management
- Detected via `openapi` field in YAML/JSON: `3.0.x` → `OpenApiResult30`, `3.1.x` → `OpenApiResult31`
- Separate model packages: `io.openapiparser.model.v30.*` vs `io.openapiparser.model.v31.*`
- Use generic `OpenApiResult` interface in public APIs, cast to version-specific when needed

### Error Handling
- `ParserException` - wraps parsing failures with document URI for context
- `ConverterException` - YAML/JSON conversion failures
- `UnknownVersionException` - unsupported OpenAPI versions

### Testing Patterns (examples from [OpenApiParserSpec.kt](openapi-parser/src/test/kotlin/io/openapiparser/OpenApiParserSpec.kt), [ApiBuilder.kt](openapi-parser/src/test/kotlin/io/openapiparser/support/ApiBuilder.kt))
- Use `ApiBuilder` test utility: fluent API to build parsers with inline YAML
- `buildParser()` → `parser.parse(URI)` → `result.getModel(OpenApi.class)`
- Test resources in `src/test/resources/` organized by feature (e.g., `bundle-ref-schema/`)
- Table-driven tests with Kotest for multiple cases

### Null Safety
- Checker Framework annotations: `@Nullable`, `@NonNull` on methods returning/accepting potentially null values
- Use `nonNull()` helper (from jsonschema support) for assertions in critical paths
- Default values: missing optional properties return false/empty collection per OpenAPI spec

## Integration Points & Dependencies

### Key External Libraries
- **Jackson 2.20** (jackson-bom) - JSON/YAML parsing (io-jackson module)
- **SnakeYAML 2.5** - Alternative YAML parser (io-snakeyaml module)
- **jsonpath 2.9** - Document traversal (optional, for overlay features)
- **SLF4J 2.0.17** + Logback 1.5.18 - Logging

### JSON Schema Validator Integration
- Embedded JSON Schema validator for OpenAPI validation
- Supports multiple JSON Schema drafts (Draft 4, Draft 6, Draft 7, Draft 202012)
- Test suites in [json-schema-validator/src/test/resources/suites/](json-schema-validator/src/test/resources/suites/)

### Overlay & Bundling (Experimental)
- `OverlayParser` handles Overlay 1.0 specifications
- `OpenApiBundler` combines multi-file references into single document
- `OverlayApplier` applies overlay transformations using JSONPath

## Documentation & References

- [Main README](README.adoc) - overview, usage examples (current 2023.3 API)
- [openapi-parser README](openapi-parser/README.adoc) - detailed API usage with code examples
- Module READMEs - specific implementation details
- Published on Maven Central: `io.openapiprocessor:openapi-parser:*`

## Common Development Tasks

**Adding a new OpenAPI feature**: Add to model classes, update converters in json-schema-validator
**Adding yaml/json parser**: Implement `Converter` interface in new module (see io-jackson/jackson pattern)
**Adding custom document loading**: Implement `Reader` interface, pass to `DocumentLoader`
**Testing multi-file OpenAPI**: Use `DocumentStore` to preload documents, pass to parser
**Performance**: Resolver caches $refs; reuse `DocumentLoader` across parses when possible
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Copilot and AI agent instructions for openapi-parser by 1stmu33 · Pull Request #212 · openapi-processor/openapi-parser · GitHub
Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
# AI Coding Agent Instructions for openapi-parser

## Project Overview

**openapi-parser** is a Java-based OpenAPI 3.0.x & 3.1 parser and validator with pluggable YAML/JSON converters and document readers. It's organized as a multi-module Gradle project supporting both OpenAPI 3.0 and 3.1 specifications with separate versioned APIs.

## Key Architecture

### Core Modules (from [settings.gradle.kts](settings.gradle.kts))
- **openapi-parser** - Main parser module (depends on json-schema-validator, io-interfaces)
- **json-schema-validator** - JSON Schema validation for OpenAPI documents
- **io-interfaces** - Plugin interfaces: `Reader` (document loading), `Converter` (YAML/JSON parsing), `Writer`
- **io-jackson** & **io-snakeyaml** - Pluggable converter implementations
- **memory-protocol** - In-memory resource handling
- **openapi-parser-bom** & **json-schema-validator-bom** - Bill of Materials (dependency management)

### Data Flow
1. `DocumentLoader` loads document by URI using pluggable `Reader` + `Converter`
2. `OpenApiParser.parse()` detects version (3.0 vs 3.1) by reading "openapi" field
3. `Resolver` resolves `$ref` references (uses Draft4 for 3.0, Draft202012 for 3.1)
4. Version-specific result returned: `OpenApiResult30` or `OpenApiResult31`
5. User calls `result.getModel(OpenApi.class)` to get navigable model tree

### Plugin Architecture
All I/O abstraction via interfaces in [io-interfaces](io-interfaces/):
- Implement `Reader` for custom document loading (default: `UriReader`)
- Implement `Converter` to support new YAML/JSON parsers (default: Jackson & SnakeYAML)
- Implement `Writer` to output documents (JSON/YAML writers available)

## Build & Test Workflow

### Gradle Commands
```bash
# Build with coverage (default)
./gradlew build

# Run specific module tests
./gradlew :openapi-parser:test
./gradlew :json-schema-validator:test

# Check dependency versions for updates
./gradlew dependencyUpdates

# View coverage reports
./gradlew jacocoLogAggregatedCoverage

# Check specific dependency
./gradlew dependencyInsight --dependency org.slf4j:slf4j-api --configuration testRuntimeClasspath
```

### Test Framework
- **JUnit 5** (Jupiter) for test execution
- **Kotest** (StringSpec style) with table-driven tests (`kotest-table`)
- **MockK** for mocking in Kotlin tests
- Kotlin test files use `Spec` suffix (e.g., `OpenApiParserSpec.kt`)

### Convention Plugins (buildSrc)
Three apply to all modules:
- **openapiparser.library** - JVM toolchain (Java 11 build, 17 test), Checker Framework (null safety), JaCoCo (coverage)
- **openapiparser.test** - JUnit 5, Kotest, MockK setup
- **openapiparser.publish** - Maven Central publishing

## Project Conventions & Patterns

### Version Management
- Detected via `openapi` field in YAML/JSON: `3.0.x` → `OpenApiResult30`, `3.1.x` → `OpenApiResult31`
- Separate model packages: `io.openapiparser.model.v30.*` vs `io.openapiparser.model.v31.*`
- Use generic `OpenApiResult` interface in public APIs, cast to version-specific when needed

### Error Handling
- `ParserException` - wraps parsing failures with document URI for context
- `ConverterException` - YAML/JSON conversion failures
- `UnknownVersionException` - unsupported OpenAPI versions

### Testing Patterns (examples from [OpenApiParserSpec.kt](openapi-parser/src/test/kotlin/io/openapiparser/OpenApiParserSpec.kt), [ApiBuilder.kt](openapi-parser/src/test/kotlin/io/openapiparser/support/ApiBuilder.kt))
- Use `ApiBuilder` test utility: fluent API to build parsers with inline YAML
- `buildParser()` → `parser.parse(URI)` → `result.getModel(OpenApi.class)`
- Test resources in `src/test/resources/` organized by feature (e.g., `bundle-ref-schema/`)
- Table-driven tests with Kotest for multiple cases

### Null Safety
- Checker Framework annotations: `@Nullable`, `@NonNull` on methods returning/accepting potentially null values
- Use `nonNull()` helper (from jsonschema support) for assertions in critical paths
- Default values: missing optional properties return false/empty collection per OpenAPI spec

## Integration Points & Dependencies

### Key External Libraries
- **Jackson 2.20** (jackson-bom) - JSON/YAML parsing (io-jackson module)
- **SnakeYAML 2.5** - Alternative YAML parser (io-snakeyaml module)
- **jsonpath 2.9** - Document traversal (optional, for overlay features)
- **SLF4J 2.0.17** + Logback 1.5.18 - Logging

### JSON Schema Validator Integration
- Embedded JSON Schema validator for OpenAPI validation
- Supports multiple JSON Schema drafts (Draft 4, Draft 6, Draft 7, Draft 202012)
- Test suites in [json-schema-validator/src/test/resources/suites/](json-schema-validator/src/test/resources/suites/)

### Overlay & Bundling (Experimental)
- `OverlayParser` handles Overlay 1.0 specifications
- `OpenApiBundler` combines multi-file references into single document
- `OverlayApplier` applies overlay transformations using JSONPath

## Documentation & References

- [Main README](README.adoc) - overview, usage examples (current 2023.3 API)
- [openapi-parser README](openapi-parser/README.adoc) - detailed API usage with code examples
- Module READMEs - specific implementation details
- Published on Maven Central: `io.openapiprocessor:openapi-parser:*`

## Common Development Tasks

**Adding a new OpenAPI feature**: Add to model classes, update converters in json-schema-validator
**Adding yaml/json parser**: Implement `Converter` interface in new module (see io-jackson/jackson pattern)
**Adding custom document loading**: Implement `Reader` interface, pass to `DocumentLoader`
**Testing multi-file OpenAPI**: Use `DocumentStore` to preload documents, pass to parser
**Performance**: Resolver caches $refs; reuse `DocumentLoader` across parses when possible
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Add Copilot and AI agent instructions for openapi-parser by 1stmu33 · Pull Request #212 · openapi-processor/openapi-parser · GitHub
Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions .github/copilot-instructions.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
# AI Coding Agent Instructions for openapi-parser

## Project Overview

**openapi-parser** is a Java-based OpenAPI 3.0.x & 3.1 parser and validator with pluggable YAML/JSON converters and document readers. It's organized as a multi-module Gradle project supporting both OpenAPI 3.0 and 3.1 specifications with separate versioned APIs.

## Key Architecture

### Core Modules (from [settings.gradle.kts](settings.gradle.kts))
- **openapi-parser** - Main parser module (depends on json-schema-validator, io-interfaces)
- **json-schema-validator** - JSON Schema validation for OpenAPI documents
- **io-interfaces** - Plugin interfaces: `Reader` (document loading), `Converter` (YAML/JSON parsing), `Writer`
- **io-jackson** & **io-snakeyaml** - Pluggable converter implementations
- **memory-protocol** - In-memory resource handling
- **openapi-parser-bom** & **json-schema-validator-bom** - Bill of Materials (dependency management)

### Data Flow
1. `DocumentLoader` loads document by URI using pluggable `Reader` + `Converter`
2. `OpenApiParser.parse()` detects version (3.0 vs 3.1) by reading "openapi" field
3. `Resolver` resolves `$ref` references (uses Draft4 for 3.0, Draft202012 for 3.1)
4. Version-specific result returned: `OpenApiResult30` or `OpenApiResult31`
5. User calls `result.getModel(OpenApi.class)` to get navigable model tree

### Plugin Architecture
All I/O abstraction via interfaces in [io-interfaces](io-interfaces/):
- Implement `Reader` for custom document loading (default: `UriReader`)
- Implement `Converter` to support new YAML/JSON parsers (default: Jackson & SnakeYAML)
- Implement `Writer` to output documents (JSON/YAML writers available)

## Build & Test Workflow

### Gradle Commands
```bash
# Build with coverage (default)
./gradlew build

# Run specific module tests
./gradlew :openapi-parser:test
./gradlew :json-schema-validator:test

# Check dependency versions for updates
./gradlew dependencyUpdates

# View coverage reports
./gradlew jacocoLogAggregatedCoverage

# Check specific dependency
./gradlew dependencyInsight --dependency org.slf4j:slf4j-api --configuration testRuntimeClasspath
```

### Test Framework
- **JUnit 5** (Jupiter) for test execution
- **Kotest** (StringSpec style) with table-driven tests (`kotest-table`)
- **MockK** for mocking in Kotlin tests
- Kotlin test files use `Spec` suffix (e.g., `OpenApiParserSpec.kt`)

### Convention Plugins (buildSrc)
Three apply to all modules:
- **openapiparser.library** - JVM toolchain (Java 11 build, 17 test), Checker Framework (null safety), JaCoCo (coverage)
- **openapiparser.test** - JUnit 5, Kotest, MockK setup
- **openapiparser.publish** - Maven Central publishing

## Project Conventions & Patterns

### Version Management
- Detected via `openapi` field in YAML/JSON: `3.0.x` → `OpenApiResult30`, `3.1.x` → `OpenApiResult31`
- Separate model packages: `io.openapiparser.model.v30.*` vs `io.openapiparser.model.v31.*`
- Use generic `OpenApiResult` interface in public APIs, cast to version-specific when needed

### Error Handling
- `ParserException` - wraps parsing failures with document URI for context
- `ConverterException` - YAML/JSON conversion failures
- `UnknownVersionException` - unsupported OpenAPI versions

### Testing Patterns (examples from [OpenApiParserSpec.kt](openapi-parser/src/test/kotlin/io/openapiparser/OpenApiParserSpec.kt), [ApiBuilder.kt](openapi-parser/src/test/kotlin/io/openapiparser/support/ApiBuilder.kt))
- Use `ApiBuilder` test utility: fluent API to build parsers with inline YAML
- `buildParser()` → `parser.parse(URI)` → `result.getModel(OpenApi.class)`
- Test resources in `src/test/resources/` organized by feature (e.g., `bundle-ref-schema/`)
- Table-driven tests with Kotest for multiple cases

### Null Safety
- Checker Framework annotations: `@Nullable`, `@NonNull` on methods returning/accepting potentially null values
- Use `nonNull()` helper (from jsonschema support) for assertions in critical paths
- Default values: missing optional properties return false/empty collection per OpenAPI spec

## Integration Points & Dependencies

### Key External Libraries
- **Jackson 2.20** (jackson-bom) - JSON/YAML parsing (io-jackson module)
- **SnakeYAML 2.5** - Alternative YAML parser (io-snakeyaml module)
- **jsonpath 2.9** - Document traversal (optional, for overlay features)
- **SLF4J 2.0.17** + Logback 1.5.18 - Logging

### JSON Schema Validator Integration
- Embedded JSON Schema validator for OpenAPI validation
- Supports multiple JSON Schema drafts (Draft 4, Draft 6, Draft 7, Draft 202012)
- Test suites in [json-schema-validator/src/test/resources/suites/](json-schema-validator/src/test/resources/suites/)

### Overlay & Bundling (Experimental)
- `OverlayParser` handles Overlay 1.0 specifications
- `OpenApiBundler` combines multi-file references into single document
- `OverlayApplier` applies overlay transformations using JSONPath

## Documentation & References

- [Main README](README.adoc) - overview, usage examples (current 2023.3 API)
- [openapi-parser README](openapi-parser/README.adoc) - detailed API usage with code examples
- Module READMEs - specific implementation details
- Published on Maven Central: `io.openapiprocessor:openapi-parser:*`

## Common Development Tasks

**Adding a new OpenAPI feature**: Add to model classes, update converters in json-schema-validator
**Adding yaml/json parser**: Implement `Converter` interface in new module (see io-jackson/jackson pattern)
**Adding custom document loading**: Implement `Reader` interface, pass to `DocumentLoader`
**Testing multi-file OpenAPI**: Use `DocumentStore` to preload documents, pass to parser
**Performance**: Resolver caches $refs; reuse `DocumentLoader` across parses when possible