openapi_enum_patch 1.3.0
openapi_enum_patch: ^1.3.0 copied to clipboard
Prepare an OpenAPI export for codegen, name the integer enums swagger_parser produces, generate the enum files it skips, and audit the enums that still need names.
Changelog #
1.3.0 #
- Enum member names are now read from the export itself. OpenAPI has nowhere
to put them, but most exporters write them into a vendor extension anyway, and
patchnow reads all three spellings:x-enum-varnames(openapi-generator, drf-spectacular),x-enumNames/x-enum-names(NSwag and the .NET exporters) andx-ms-enum(AutoRest, Azure). An export that carries them needs noenum_overrides.yamlentry at all, and the audit stops asking for one.- The list forms are zipped against
enum, so a truncated or partly blank list names the values it reaches and the audit asks for the rest.x-ms-enumpairs each name with its value, so its order does not matter. - An override outranks the export value by value, so a project can rename only the members it disagrees with.
- The audit reports how many enums took their names this way, and
AuditReport.schemaNamedexposes the count. NewEnumEntry.schemaNamesandEnumEntry.isSchemaNamed.
- The list forms are zipped against
- New
DUPLICATE NAMESaudit issue (a newAuditIssuevalue, so an exhaustiveswitchover it in your own code needs one more case): two values resolving to one Dart member name previously emitted an enum that did not compile, with no warning. They are now emitted asname$1/name$2and reported, with the shared identifier named in the report. Checked for string enums too, where a schema declaring bothDraftanddraftfolds them onto one member without any override involved. - Fixed: a string enum value containing
$emitted'USD$', which Dart reads as the start of an interpolation and refuses to compile.$is now escaped along with newlines, carriage returns and tabs. - Fixed: an override or schema-declared name that was not already a legal
Dart identifier emitted a file the analyser rejected. Characters Dart does not
allow now become
_(in progress→in_progress) and a leading digit gets a$in front of it (2fa→$2fa), alongside the existing reserved-word suffix. - A command now loads only the config it actually reads, so a malformed
enum_overrides.yamlno longer fails anormalizeorreorganizerun that never looks at it — and its parse error is reported with the same wording from every command. - The version
--versionprints moved topackageVersionin the library, with a test holding it topubspec.yaml, so a release cannot ship the previous number. - The audit's closing line now says "fully named" rather than "fully overridden", since the names no longer have to come from an override.
- Internals: the four copies of read-schema-decode-rewrite in
EnumPatchercollapsed onto one helper, andResolvedMembersis now the single place that decides what a member is called — the auditor asks it rather than reimplementing the rules.
1.2.1 #
- Shorten the pubspec description to the 60–180 characters pub.flutter-io.cn scores, so the package no longer loses its "valid pubspec.yaml" points.
1.2.0 #
- New
preparecommand: rewrites an export into a shape a generator can make usable code out of, beforenormalizeruns. Four opt-in passes, each idempotent, driven by a newschema_prep.yaml:rename_schemas— exporters that inline their nested models name the resulting component after a hash of its shape (e36568fca95941d68bfb36b27ea0de7e), which generates a class nobody can read or import on purpose. Only the project knows what each one means, so the names come from config; every$refis rewritten with them, and two entries may share a target so an exporter's duplicate shapes collapse onto one component.hoist_enums— the same enum written inline on several properties generates one anonymousEnum0,Enum1, … per occurrence. Each occurrence whose values match becomes a$refto a single named component.json_only_requests— one request body declared under JSON, form-encoded and multipart makes the generator pick multipart, turning a plain POST into a per-field part list with no request model. The exact duplicates of the JSON schema are dropped; a media type declaring its own schema is left alone.strip_response_envelopes— where the transport already strips a{code, message, data, is_success}wrapper, the response is pointed at its payload$refso the client deserialises what actually reaches it. A schema qualifies only when every property it declares is a known envelope field, so a real model is never mistaken for a wrapper.
- Passes can be limited with
tags:; the component passes then only touch the components those operations reach, so a schema shared with an unimplemented route is never rewritten on its behalf. preparereports the hash-named components still in scope that it was given no name for, so the next run can name them instead of shipping the hash.- New
--prep/-poption (defaults toschema_prep.yaml; a missing file is not an error). NewSchemaPreparer,PreparationResult,SchemaPrep,SchemaPrepsandEnumPatcher.prepareSchemas, all exported. audit --strictnow exits non-zero when the audit is not clean, as its help text always said. Previously--strictwas honoured bypatchonly, so the read-only CI gate silently passed.- README rewritten around the pipeline: the seven stages in order and what each
one touches, the
scripts/generate_api.shrunner to copy, what a run prints (first run and second), where the three config files live and which command reads which, and how to gate CI onaudit --strictplus a clean tree.
1.1.0 #
- Schemas may now be YAML as well as JSON. Every command reads both, and a
project can mix the two — the format comes from the file extension
(
.yaml/.yml/.json), falling back to sniffing the content for anything else. normalizewrites each schema back in the format it read it in, so a YAML schema stays YAML. Multi-line strings are re-emitted as|-blocks and sequences keep the indentation OpenAPI exporters use, so the rewrite stays a small diff. Comments are not preserved.- New
SchemaCodec,SchemaFormatandYamlEncoder, all exported.RegistryBuilder.decodetakes an optionalformat, and there is abuildFromYamlbesidebuildFromJson. SchemaFormatExceptionmoved fromregistry_builder.darttoschema/schema_codec.dart. No change if you import the package's single public library.- Fixed
--versionreporting0.2.0.
1.0.0 #
First stable release. The API has settled across the normalize, patch,
audit and reorganize commands, so the package now commits to semantic
versioning — no breaking changes without a 2.0.0.
- Breaking: the SDK constraint is now
^3.13.0. Verified against Dart 3.13.0 and Flutter 3.47.0. - Reformatted the whole package with the Dart 3.7+ formatter ("tall style"). Formatting only — no behaviour changes.
- Bumped
args,meta,path,yaml,lintsandtestto current.
0.2.0 #
- Added the
reorganizecommand: groups the flat modelsswagger_parseremits into per-namespace folders, routes enums into anenums/subfolder, and strips the now-redundant namespace prefix from type names — rewriting every relative import,partdirective, model URI and type reference across your sources. Cross-service name collisions keep their prefix so the result still compiles. Idempotent. - Namespace groups are derived from the schema keys via
RegistryBuilder.namespacePrefixes, so nothing has to be hard-coded; passgroupstoreorganizeModelsto override. - Breaking: the
--configand--overridesdefaults are nowswagger_parser.yamlandenum_overrides.yamlat the project root, instead of paths under aswagger_tools/folder. Pass-c/-oif your files live elsewhere.
0.1.0 #
Initial release.
patchcommand — synthesises the enum filesswagger_parserskips for query-parameter-only enums, and appliesenum_overrides.yamlto the rest.normalizecommand — rewrites{version}path templates to a concrete version and qualifies barecomponents.schemasnames with a namespace prefix, rewriting every matching$ref. Both passes are idempotent.auditcommand — reports integer enums with no override, overrides that do not name every value, and overrides naming values the schema dropped.--strictmakes a non-clean audit exit non-zero, for CI.- Library API —
RegistryBuilder,EnumAuditor,SchemaNormalizer,EnumPatcher— with anEnumEmitterinterface for non-dart_mappableback-ends. - Emitted compute helpers use the
dart_mappablemapper API (XMapper.fromValue,toValue()), which works whenenums_to_json: false.