Skip to content

Group JSON ingestion schema state - #1281

Closed
jwils wants to merge 1 commit into
mainfrom
joshuaw/json-ingestion-state-container
Closed

Group JSON ingestion schema state#1281
jwils wants to merge 1 commit into
mainfrom
joshuaw/json-ingestion-state-container

Conversation

@jwils

@jwils jwils commented Jun 30, 2026

Copy link
Copy Markdown
Collaborator

Why

Keep JSON ingestion-specific schema definition state off the shared SchemaDefinition::State surface. This follows up on #1259 by grouping the extension state behind one accessor.

What

  • Add JSONIngestionState and attach it via State#json_ingestion_state
  • Move JSON schema config and deprecated-element registries into the contained state
  • Update typed helpers, specs, doctests, and schema test support to use the contained state

Risk Assessment

Low — internal schema-definition state refactor; public DSL behavior remains unchanged.

References

Validation:

  • script/lint --fix
  • script/spellcheck -w
  • script/type_check
  • RUBYOPT=--disable-frozen-string-literal bundle exec rake site:doctest
  • bundle exec rspec elasticgraph-json_ingestion/spec/unit/elastic_graph/json_ingestion/schema_definition/deprecated_element_spec.rb elasticgraph-json_ingestion/spec/unit/elastic_graph/json_ingestion/schema_definition/json_schema_spec.rb elasticgraph-json_ingestion/spec/unit/elastic_graph/json_ingestion/schema_definition/indexing/json_schema_with_metadata_spec.rb
  • script/run_gem_specs elasticgraph-json_ingestion
  • Not fully run locally: script/run_gem_specs elasticgraph-schema_definition and script/quick_build; local datastore boot is blocked because Docker is not running (~/.docker/run/docker.sock is unavailable).
  • Attempted RUBYOPT=--disable-frozen-string-literal bundle exec rake site:validate; the CI-relevant doctest failure is fixed, but local execution later stops in site:npm_install with an npm dependency resolution issue.

Base automatically changed from joshuaw/json-ingestion-deprecated-apis to main June 30, 2026 22:16
@jwils
jwils force-pushed the joshuaw/json-ingestion-state-container branch 2 times, most recently from c443df8 to d660189 Compare June 30, 2026 23:14
@jwils
jwils force-pushed the joshuaw/json-ingestion-state-container branch from d660189 to ee70fc0 Compare July 1, 2026 18:16
jwils added a commit that referenced this pull request Jul 8, 2026
Fills in the `elasticgraph-proto_ingestion` gem with the Protocol Buffers
schema artifact generation logic.

Running `schema_artifacts:dump` emits:

- `schema.proto` — the generated Protobuf schema for the indexed types
- `proto_field_numbers.yaml` — a sidecar that reserves field numbers and enum
  value numbers so they stay wire-stable as the schema evolves (including
  across field renames, and reserving removed values so numbers are not reused)

Capabilities:

- Maps built-in ElasticGraph scalars to proto types, with `protobuf` to
  configure custom scalars.
- Generates messages for object/interface/union types and enums (with a
  zero-valued `*_UNSPECIFIED` entry), escaping proto reserved words and
  wrapping lists of lists so the output stays valid.

The extension's schema definition state lives on a ProtoIngestionState
container exposed via a single `proto_ingestion_state` reader, mirroring
the JSONIngestionState approach from #1281.

The generator emits `proto3` by default and can emit `proto2` via
`syntax: :proto2` (which labels every field `optional`/`repeated`). Arbitrary
file-level headers (e.g. `option` declarations) can be injected verbatim via
`headers:`, so language-specific options can be set without baking any
particular convention into the gem.
jwils added a commit that referenced this pull request Jul 8, 2026
Fills in the `elasticgraph-proto_ingestion` gem with the core Protocol
Buffers schema generation logic. Running `schema_artifacts:dump` emits a
`proto3` `schema.proto` artifact covering the schema's indexed types.

Capabilities:

- Maps built-in ElasticGraph scalars to proto types, with `protobuf` to
  configure custom scalars (resolved via `type_ref.with_reverted_override`
  so built-in scalars renamed with `type_name_overrides` keep working).
- Generates messages for object/interface/union types and enums (with a
  zero-valued `*_UNSPECIFIED` entry), escaping proto reserved words and
  wrapping lists of lists so the output stays valid.
- `schema.proto` uses the public GraphQL field names, and validates proto
  package names (each dot-separated segment must be a valid identifier).

Field and enum value numbers are assigned sequentially in definition order;
keeping them wire-stable across schema evolution comes in a stacked
follow-up that adds a `proto_field_numbers.yaml` sidecar artifact.

The extension's schema definition state lives on a ProtoIngestionState
container exposed via a single `proto_ingestion_state` reader, mirroring
the JSONIngestionState approach from #1281.
@jwils jwils closed this Jul 9, 2026
jwils added a commit that referenced this pull request Jul 11, 2026
Fills in the `elasticgraph-proto_ingestion` gem with the core Protocol
Buffers schema generation logic. Running `schema_artifacts:dump` emits a
`proto3` `schema.proto` artifact covering the schema's indexed types.

Capabilities:

- Maps built-in ElasticGraph scalars to proto types, with `protobuf` to
  configure custom scalars (resolved via `type_ref.with_reverted_override`
  so built-in scalars renamed with `type_name_overrides` keep working).
- Generates messages for object/interface/union types and enums (with a
  zero-valued `*_UNSPECIFIED` entry), escaping proto reserved words and
  wrapping lists of lists so the output stays valid.
- `schema.proto` uses the public GraphQL field names, and validates proto
  package names (each dot-separated segment must be a valid identifier).

Field and enum value numbers are assigned sequentially in definition order;
keeping them wire-stable across schema evolution comes in a stacked
follow-up that adds a `proto_field_numbers.yaml` sidecar artifact.

The extension's schema definition state lives on a ProtoIngestionState
container exposed via a single `proto_ingestion_state` reader, mirroring
the JSONIngestionState approach from #1281.
jwils added a commit that referenced this pull request Jul 11, 2026
Fills in the `elasticgraph-proto_ingestion` gem with the core Protocol
Buffers schema generation logic. Running `schema_artifacts:dump` emits a
`proto3` `schema.proto` artifact covering the schema's indexed types.

Capabilities:

- Maps built-in ElasticGraph scalars to proto types, with `protobuf` to
  configure custom scalars (resolved via `type_ref.with_reverted_override`
  so built-in scalars renamed with `type_name_overrides` keep working).
- Generates messages for object/interface/union types and enums (with a
  zero-valued `*_UNSPECIFIED` entry), escaping proto reserved words and
  wrapping lists of lists so the output stays valid.
- `schema.proto` uses the public GraphQL field names, and validates proto
  package names (each dot-separated segment must be a valid identifier).

Field and enum value numbers are assigned sequentially in definition order;
keeping them wire-stable across schema evolution comes in a stacked
follow-up that adds a `proto_field_numbers.yaml` sidecar artifact.

The extension's schema definition state lives on a ProtoIngestionState
container exposed via a single `proto_ingestion_state` reader, mirroring
the JSONIngestionState approach from #1281.
jwils added a commit that referenced this pull request Jul 15, 2026
Fills in the `elasticgraph-proto_ingestion` gem with the core Protocol
Buffers schema generation logic. Running `schema_artifacts:dump` emits a
`proto3` `schema.proto` artifact covering the schema's indexed types.

Capabilities:

- Maps built-in ElasticGraph scalars to proto types, with `protobuf` to
  configure custom scalars (resolved via `type_ref.with_reverted_override`
  so built-in scalars renamed with `type_name_overrides` keep working).
- Generates messages for object/interface/union types and enums (with a
  zero-valued `*_UNSPECIFIED` entry), escaping proto reserved words and
  wrapping lists of lists so the output stays valid.
- `schema.proto` uses the public GraphQL field names, and validates proto
  package names (each dot-separated segment must be a valid identifier).

Field and enum value numbers are assigned sequentially in definition order;
keeping them wire-stable across schema evolution comes in a stacked
follow-up that adds a `proto_field_numbers.yaml` sidecar artifact.

The extension's schema definition state lives on a ProtoIngestionState
container exposed via a single `proto_ingestion_state` reader, mirroring
the JSONIngestionState approach from #1281.
jwils added a commit that referenced this pull request Jul 20, 2026
## Why
- continue the pluggable ingestion serializer proposal after pulling
JSON Schema into its own gem
- revive the earlier protobuf prototype from #1056 on top of the new
serializer extension points

## What
- fill in the `elasticgraph-proto_ingestion` extension gem with core
generation: `schema_artifacts:dump` emits a `proto3` `schema.proto`
covering the schema's indexed types
- map built-in ElasticGraph scalars to proto types, with `t.protobuf
type:` for custom scalars (resolved via
`type_ref.with_reverted_override` so built-ins renamed with
`type_name_overrides` keep working)
- generate messages for object/interface/union types and enums (with a
zero-valued `*_UNSPECIFIED` entry), escaping proto reserved words and
wrapping lists of lists so the output stays valid
- keep `schema.proto` on public GraphQL field names; validate proto
package names
- hold extension state on a `ProtoIngestionState` container behind a
single `proto_ingestion_state` reader (matching #1281)

Field and enum value numbers are assigned sequentially in definition
order in this PR; the stacked follow-up adds the
`proto_field_numbers.yaml` sidecar that keeps them wire-stable across
schema evolution.

## Stacked follow-ups
1. this PR — core `schema.proto` generation
2. wire-stable field/enum value numbers via a `proto_field_numbers.yaml`
sidecar
3. `syntax: :proto2` support and custom file-level `headers:`
4. #1286 — enum value sourcing from existing proto enums + external
proto type references

## Verification
- `script/run_gem_specs elasticgraph-proto_ingestion` (100% line +
branch coverage at this commit)
- `script/type_check`, `script/lint`, `script/spellcheck`
- `script/quick_build` green at the stack head (whose tree is identical
to the previously reviewed single-PR revision)

## References
- #1059
- #1056
- #1079

## Update — 2026-07-10
- The current stack is #1080#1304#1306#1305#1286.
- Proto extension state now uses a mutable Struct, and keyword
package-name segments are validated without being rewritten.
- Lists of lists now raise an actionable schema error instead of
generating wrapper messages; this supersedes the earlier wrapping note
above.
---

## Update — 2026-07-15
- Interface and union messages now wrap concrete subtype messages in a
`oneof`, matching the JSON Schema `oneOf` representation.
- Concrete subtype messages omit the redundant `__typename`
discriminator.
- Proto type rendering is now stateless: the generator selects the
reachable type graph up front, then each extended type renders itself
without mutating shared traversal state.
- No-block extension coverage now completes the definitions so the
fixture remains valid under CI GraphQL-schema validation.

---

## Update — 2026-07-19
- Replaced keyword suffixing with fully qualified local message and enum
references, preserving source type and field names while disambiguating
contextual protobuf words and built-in scalar names.
- Removed the now-unnecessary keyword collision tracking and verified a
generated schema containing contextual names with `protoc` 35.1.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant