Skip to content

fix: ODCS to .proto, problem with array of objects#1012

Merged
jschoedl merged 17 commits intodatacontract:mainfrom
Schokuroff:fix/proto-exporter
Apr 13, 2026
Merged

fix: ODCS to .proto, problem with array of objects#1012
jschoedl merged 17 commits intodatacontract:mainfrom
Schokuroff:fix/proto-exporter

Conversation

@Schokuroff
Copy link
Copy Markdown
Contributor

@Schokuroff Schokuroff commented Jan 12, 2026

  • Tests pass
  • ruff format
  • README.md updated (if relevant)
  •  CHANGELOG.md entry added

@Schokuroff
Copy link
Copy Markdown
Contributor Author

schema:
- name: FsaRegister
  logicalType: object
  properties:
  - name: fsa_room
    logicalType: array
    items:
      name: FsaRoom
      logicalType: object
      properties:
      - name: rooms_count
        logicalType: integer
      - name: category_type
        logicalType: string
  - name: simple_array_int
    logicalType: array
    items:
      logicalType: integer
  - name: simple_int
    logicalType: integer
  - name: simple_obj
    logicalType: object
    properties:
    - name: rooms_count
      logicalType: integer
    - name: category_type
      logicalType: string

to

syntax = "proto3";

package example;

message FsaRegister {
message FsaRoom {
    int32 rooms_count = 1;
    string category_type = 2;
  }

message SimpleObj {
    int32 rooms_count = 1;
    string category_type = 2;
  }

  repeated FsaRoom fsa_room = 1;
  repeated int32 simple_array_int = 2;
  int32 simple_int = 3;
  SimpleObj simple_obj = 4;
}

@Schokuroff
Copy link
Copy Markdown
Contributor Author

Sorry, I think I forgot to do the ruff and tests, I'll add them now.

@Schokuroff Schokuroff changed the title fix export array of objects fix: ODCS to .proto, problem with array of objects Jan 12, 2026
@Schokuroff
Copy link
Copy Markdown
Contributor Author

@jochenchrist
wow, looks like all checks have passed, can we merge it?

@Schokuroff
Copy link
Copy Markdown
Contributor Author

I have done ruff check localy, but failed with "uv run pytest", oracle idk...

uv run pytest
========================================================= test session starts =========================================================
platform darwin -- Python 3.11.8, pytest-9.0.2, pluggy-1.6.0
rootdir: /Users/nshokurov/Documents/datacontract/datacontract-cli
configfile: pyproject.toml
plugins: anyio-4.12.1, xdist-3.8.0, typeguard-4.4.4
collected 261 items / 5 errors

=============================================================== ERRORS ================================================================
_____________________________________________ ERROR collecting tests/test_test_oracle.py ______________________________________________
.venv/lib/python3.11/site-packages/urllib3/connectionpool.py:787: in urlopen

@Schokuroff
Copy link
Copy Markdown
Contributor Author

@jochenchrist sooo, lets merge?

@Schokuroff
Copy link
Copy Markdown
Contributor Author

@jochenchrist hello! lets merge it?

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the Protobuf exporter to better handle ODCS schemas—specifically arrays of objects—by generating nested message definitions and updating the expected .proto output accordingly.

Changes:

  • Extend the Protobuf export test fixture to include an array-of-objects field (users) and a non-required field (geo_description).
  • Refactor Protobuf type/message naming and nested message generation logic to support arrays of objects.
  • Add support for emitting optional fields for required: false properties.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
tests/test_export_protobuf.py Adds coverage for arrays of objects and required: falseoptional output in generated Protobuf.
datacontract/export/protobuf_exporter.py Refactors Protobuf generation to create nested messages (including for arrays of objects) and emit optional for non-required fields.
Comments suppressed due to low confidence (1)

datacontract/export/protobuf_exporter.py:22

  • _get_config_value is typed as returning Optional[str], but cp.value can be a non-string (e.g., dict for enumValues, as used by _get_enum_values). This type mismatch can hide bugs in type checking; consider widening the return type (e.g., Optional[Any]) or making it generic.
def _get_config_value(prop: SchemaProperty, key: str) -> Optional[str]:
    """Get a custom property value from customProperties."""
    if prop.customProperties is None:
        return None
    for cp in prop.customProperties:
        if cp.property == key:
            return cp.value
    return None

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Schokuroff and others added 4 commits April 11, 2026 13:54
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@Schokuroff
Copy link
Copy Markdown
Contributor Author

@jschoedl hi, looks like I fix it,
what do you think about merge conflict? what would we choose? main or fix/proto-exporter?

Schokuroff and others added 2 commits April 11, 2026 21:40
…roto-exporter

# Conflicts:
#	datacontract/export/protobuf_exporter.py
jschoedl and others added 2 commits April 13, 2026 11:10
…f exporter

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@jschoedl jschoedl merged commit 2dc840f into datacontract:main Apr 13, 2026
6 checks passed
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.

4 participants