-
-
Notifications
You must be signed in to change notification settings - Fork 186
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
docs: new core data model #530
docs: new core data model #530
Conversation
Kudos, SonarCloud Quality Gate passed! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good job @jonaslagoni! I like the approach of having that abstract model so we can support for any kind of input 👍
I dropped some comments. Might keep reviewing later!
@derberg have you ever encountered a PR that can go around the restriction of one peer-review? It says I can merge, but @magicmatatjahu has not approved it anywhere 😅 Is the settings changed? |
@jonaslagoni but it is not against master but some |
Right 🤦 I don't have those permissions though 😛 |
I decided to rename Hopefully, this makes much more sense 🤞 Please have a look @smoya @voxpelli @magicmatatjahu |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice job @jonaslagoni 🎉 👏 ! It LGTM, however i'm not an owner 👐
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One comment to the docs.
I have also another question related to the development of new approach. Do you wanna make it in main branch but in separate folder to have current logic and new one and in some time switch to new or do you prefer new branch (like next
)?
</p> | ||
|
||
|
||
## The Constrained Meta Model |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understand idea about that but maybe we should call it as Language Meta Model
and then call JavaEnumModel
etc... I think that it will produce some confusion because in some languages it will be exactly constraint model, because some languages don't support enums/unions etc but some allow more freedom than others. What do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Or maybe just Language Model
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The idea is that all outputs should by some means support all MetaModels in one capacity or another.
For example for unions, if they are not supported like in TS string | number
we can always render them as any
or create wrapper classes class unionT { stringProp: string, numberProp: string }
. It all comes down to the output it's possibilities, as well as what the user defines through options.
The constrained variant only refers to the values within the models, i.e. property name/type, model name and type, enum values, and keys, that ensure they are properly formatted in correct syntax.
So to me language meta model makes less sense I think 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and ok this is more generic, so 👌🏼 then, thanks for explanation! However I wonder if we really need to call this Constrained Meta
. Maybe if we have a Meta Model which is "basic" then Data Model might be a better name for it, as the "final" version for the language?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Constrained, refers to the process the meta models go through, i.e. the contrainer (TypeScriptConstrained
, etc).
What would you change the naming of the process and model name to, to make it consistant? 🤔
Can you try elaborate a bit more why you think constrain
does not encapsulate correctly what it does?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The name may be but I am a man who thinks differently. To me constraint means that something is limited but in a validation/parsing way (probably too much JSON Scheme, hah 😄 ) and not in a language constraint way. I'm also not a fan of Java jargon to call it like LanguageConstrainedMetaModel
, so ConstrainedMetaModel
is ok but I'd prefer without Meta -> ConstrainedModel
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Haha, okay yea, I see 😄 Is there a way we need to highlight this difference in the docs?
Regarding ConstrainedModel
, the "problem" is that the constrained model, is of type meta model as it inherits the class 😅 Think that will create more confusion, even though it is a long name 🤔
What if we keept it for now, and once we are ready to merge from next
to master
we can evaluate it then if it makes sense or not?
My initial idea was to use Mostly it will be the same code just with MetaModel and ConstrainedMetaModel instead. |
Ok 👌🏼 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
Kudos, SonarCloud Quality Gate passed! |
🎉 This PR is included in version 0.39.9-next.1 🎉 The release is available on: Your semantic-release bot 📦🚀 |
## [1.0.0](v0.59.9...v1.0.0) (2023-01-23) ### Upgrade Steps You can find the migration details here: https://github.com/asyncapi/modelina/blob/master/docs/migration.md Dont hesitate to reach out if you need help migrating to version 1. ### Breaking Changes There is no specific PR that contains the breaking changes but is part of multiple PRs. See the migration part above. ### New Features * feat: add Rust Generator (#818) * feat: add Kotlin model generator (#1074) * feat: add Python generator (#863) * feat: add jsonbinpack preset for TypeScript (#854) * feat: add support for AsyncAPI 2.5 (#893) * feat: add support for oneOf and anyOf as UnionModel (#899) * feat: integrate new AsyncAPI parser version (#925) * feat: add C# Newtonsoft preset (#970) * feat: add access to entire property object in constrainer (#985) * feat: add precise csharp enum type (#1047) * feat: add dependency manager (#1063) ### Bug Fixes * fix: unwrapping dictionaries not working in marshaling preset (#855) * fix: import path of helpers in DartRenderer (#794) * fix: modelina cannot be used in website environments (#843) * fix: duplicate dependencies being rendered (#842) * fix: inner references not being found (#844) * fix: root level references are not handled for JSON Schema (#829) * fix: wrong typescript number type used for integers (#902) * fix: merging CommonModel properties should not carry over properties to other models (#917) * fix: duplicate and self dependencies should not be rendered (#903) * fix: python generates unusable class for empty properties (#901) * fix: javascript should not split out enums (#926) * fix: typescript marshaling preset not caring about external models (#927) * fix: typescript rendering wrong array type when union (#928) * fix: java dictionary constrainer gives unusable integer type for map value (#929) * fix: remove unintended characters for typescript marshaling preset (#935) * fix: enable processor options to be passed processors (#920) * fix: references are getting incorrect model names (#951) * fix: enum generator for Java should use strict types for it's values (#944) * fix: implicit python import error (#981) * fix: rust compile errors on enum members containing digits (#994) * fix: add `exec` as a reserved keyword for Python (#1000) * fix: c# newtonsoft preset syntax errors (#1004) * fix: rust enum renderer only working for JSON Schema inputs (#1001) * fix: dependencies are rendered twice (#1002) * fix: rust impl new fn for Boxed values (#1013) * fix: solving blackbox tests problems (#905) * fix: structs missing pub keyword in RustGenerator (#1021) * fix: reserved keywords in Rust should be case-sensitive (#1031) * fix: pattern properties not being accounted for (#1006) * fix: csharp generator does not render optional types for optional properties (#1051) * fix: polymorphic / union models rendered with index in enum member name (#1056) * fix: add Jackson annotations at the field level (#1059) * fix: improve integration with old AsyncAPI parser (#1050) * fix: add Java constraints annotations at the field level (#1067) * fix: java generator could generate illegal package names (#1084) ### Other Changes * docs: new core data model (#530) * refactor: introduce new core models (#655) * refactor: add CommonModel conversion to MetaModel (#677) * refactor: add TypeScript constrainer (#683) * refactor: add JavaScript constrainer (#693) * refactor: add Go constrainer (#695) * refactor: add splitter (#676) * refactor: add C# constrainer (#696) * refactor: add Java constrainer (#694) * refactor: simplified constraints and type mapping (#725) * refactor: convert CSharp to new constraint setup (#735) * refactor: convert Go to new constraint setup (#732) * refactor: convert TS to new constraint setup (#736) * refactor: convert JS to new constraint setup (#741) * refactor: add object property model (#758) * chore: refactored model setup to support generators (#766) * chore: refactored input processors (#767) * chore: refactored TypeScript and generator implementation (#765) * chore: refactored Java to new core model (#769) * chore: refactored Go generator (#771) * chore: refactored CSharp generator (#770) * chore: refactored JavaScript generator (#773) * chore: refactored dart generator (#778) * chore: fix build errors (#779) * chore: fix file generator tests (#782) * chore: add test and fix constrain implementation (#781) * chore: fix wrongful import (#783) * refactor: switch interpretation of pattern properties (#791) * refactor: fix constrain helpers and add test (#792) * chore: convert to any model from common model (#793) * chore: remove old post interpreter and fix tests (#795) * chore: fix TypeHelpers tests (#802) * chore: fix generator and renderer tests (#803) * chore: remove unnecessary common model test (#798) * chore: remove name helpers (#801) * chore: fix tests for OutputModel (#800) * chore: give constrained properties access to the raw property (#799) * chore: fix enum model conversion (#797) * chore: fix contains property check failing (#810) * chore: removed unused property and fix general tests (#809) * chore: refactor dart generators and test (#796) * chore: rewrite java generator tests (#804) * chore: rewrite TypeScript generator tests (#806) * chore: rewrite CSharp generator tests (#807) * chore: rewrite javascript generator tests (#805) * fix: remaining test and implementation issues (#824) * docs: move banner location (#865) * docs: update language documentation (#862) * docs: add migration guidelines (#860) * docs: update input processing documentation (#859) * docs: update constraint documentation (#858) * chore: remove unused functions (#849) * docs: update usage documentation (#857) * docs: update preset documentation (#861) * refactor: simplified example tests (#868) * chore: add a template for new generators (#850) * docs: remove duplicate dart output (#892) * test: update snapshot for failing test (#907) * chore: add a new example for json-schema-draft4-from-object (#897) * chore: add a new example for JSON schema draft 6 (#933) * ci: use @swc/jest to speedup tests (#938) * ci: fix broken release pipeline (#956) * docs: add contribution guidelines for processors (#950) * chore: add missing test dependency for docker (#992) * docs: add contributing guidelines for presets (#990) * docs: improve readme with use-cases and examples (#1034) * chore: add missing blackbox scripts (#1046) * docs: add versioning and maintenance section (#991) * test: update snapshots (#1064) * docs: fix the wrong link to constraint example (#1065) * test: added example to generate all models within the same file (#1054) * chore: added prettier config (#838) * chore: format code (#1088) Co-authored-by: Kenneth Aasan <k.aasan@sportradar.com>, Co-authored-by: Leigh Johnson <hi@leighjohnson.me>, Co-authored-by: Maciej Urbańczyk <urbanczyk.maciej.95@gmail.com>, Co-authored-by: Nitin Tejuja <95347924+nitintejuja@users.noreply.github.com>, Co-authored-by: Amit Kumar Sharma <ksamit1110@gmail.com>, Co-authored-by: artur-ciocanu <artur.ciocanu@gmail.com>, Co-authored-by: Andrey Zaytsev <zaytsevand@outlook.com>, Co-authored-by: Zbigniew Malcherczyk <zmalcherczyk@gmail.com>, Co-authored-by: Yushi OMOTE <yushiomote@gmail.com>, Co-authored-by: Alejandra Quetzalli <alejandra.quetzalli@postman.com>, Co-authored-by: Artur Ciocanu <ciocanu@adobe.com>, Co-authored-by: Julian R <mail@julianrapp.de>, Co-authored-by: Anay Sarkar <53341181+anaysarkar7@users.noreply.github.com>, Co-authored-by: Louis Xhaferi <louis.xhaferi@gmx.de>, Co-authored-by: Akshat Nema <76521428+akshatnema@users.noreply.github.com>
## [1.0.0](v0.59.9...v1.0.0) (2023-01-23) ### Upgrade Steps You can find the migration details here: https://github.com/asyncapi/modelina/blob/master/docs/migration.md Dont hesitate to reach out if you need help migrating to version 1. ### Breaking Changes There is no specific PR that contains the breaking changes but is part of multiple PRs. See the migration part above. ### New Features * feat: add Rust Generator (#818) * feat: add Kotlin model generator (#1074) * feat: add Python generator (#863) * feat: add jsonbinpack preset for TypeScript (#854) * feat: add support for AsyncAPI 2.5 (#893) * feat: add support for oneOf and anyOf as UnionModel (#899) * feat: integrate new AsyncAPI parser version (#925) * feat: add C# Newtonsoft preset (#970) * feat: add access to entire property object in constrainer (#985) * feat: add precise csharp enum type (#1047) * feat: add dependency manager (#1063) ### Bug Fixes * fix: unwrapping dictionaries not working in marshaling preset (#855) * fix: import path of helpers in DartRenderer (#794) * fix: modelina cannot be used in website environments (#843) * fix: duplicate dependencies being rendered (#842) * fix: inner references not being found (#844) * fix: root level references are not handled for JSON Schema (#829) * fix: wrong typescript number type used for integers (#902) * fix: merging CommonModel properties should not carry over properties to other models (#917) * fix: duplicate and self dependencies should not be rendered (#903) * fix: python generates unusable class for empty properties (#901) * fix: javascript should not split out enums (#926) * fix: typescript marshaling preset not caring about external models (#927) * fix: typescript rendering wrong array type when union (#928) * fix: java dictionary constrainer gives unusable integer type for map value (#929) * fix: remove unintended characters for typescript marshaling preset (#935) * fix: enable processor options to be passed processors (#920) * fix: references are getting incorrect model names (#951) * fix: enum generator for Java should use strict types for it's values (#944) * fix: implicit python import error (#981) * fix: rust compile errors on enum members containing digits (#994) * fix: add `exec` as a reserved keyword for Python (#1000) * fix: c# newtonsoft preset syntax errors (#1004) * fix: rust enum renderer only working for JSON Schema inputs (#1001) * fix: dependencies are rendered twice (#1002) * fix: rust impl new fn for Boxed values (#1013) * fix: solving blackbox tests problems (#905) * fix: structs missing pub keyword in RustGenerator (#1021) * fix: reserved keywords in Rust should be case-sensitive (#1031) * fix: pattern properties not being accounted for (#1006) * fix: csharp generator does not render optional types for optional properties (#1051) * fix: polymorphic / union models rendered with index in enum member name (#1056) * fix: add Jackson annotations at the field level (#1059) * fix: improve integration with old AsyncAPI parser (#1050) * fix: add Java constraints annotations at the field level (#1067) * fix: java generator could generate illegal package names (#1084) ### Other Changes * docs: new core data model (#530) * refactor: introduce new core models (#655) * refactor: add CommonModel conversion to MetaModel (#677) * refactor: add TypeScript constrainer (#683) * refactor: add JavaScript constrainer (#693) * refactor: add Go constrainer (#695) * refactor: add splitter (#676) * refactor: add C# constrainer (#696) * refactor: add Java constrainer (#694) * refactor: simplified constraints and type mapping (#725) * refactor: convert CSharp to new constraint setup (#735) * refactor: convert Go to new constraint setup (#732) * refactor: convert TS to new constraint setup (#736) * refactor: convert JS to new constraint setup (#741) * refactor: add object property model (#758) * chore: refactored model setup to support generators (#766) * chore: refactored input processors (#767) * chore: refactored TypeScript and generator implementation (#765) * chore: refactored Java to new core model (#769) * chore: refactored Go generator (#771) * chore: refactored CSharp generator (#770) * chore: refactored JavaScript generator (#773) * chore: refactored dart generator (#778) * chore: fix build errors (#779) * chore: fix file generator tests (#782) * chore: add test and fix constrain implementation (#781) * chore: fix wrongful import (#783) * refactor: switch interpretation of pattern properties (#791) * refactor: fix constrain helpers and add test (#792) * chore: convert to any model from common model (#793) * chore: remove old post interpreter and fix tests (#795) * chore: fix TypeHelpers tests (#802) * chore: fix generator and renderer tests (#803) * chore: remove unnecessary common model test (#798) * chore: remove name helpers (#801) * chore: fix tests for OutputModel (#800) * chore: give constrained properties access to the raw property (#799) * chore: fix enum model conversion (#797) * chore: fix contains property check failing (#810) * chore: removed unused property and fix general tests (#809) * chore: refactor dart generators and test (#796) * chore: rewrite java generator tests (#804) * chore: rewrite TypeScript generator tests (#806) * chore: rewrite CSharp generator tests (#807) * chore: rewrite javascript generator tests (#805) * fix: remaining test and implementation issues (#824) * docs: move banner location (#865) * docs: update language documentation (#862) * docs: add migration guidelines (#860) * docs: update input processing documentation (#859) * docs: update constraint documentation (#858) * chore: remove unused functions (#849) * docs: update usage documentation (#857) * docs: update preset documentation (#861) * refactor: simplified example tests (#868) * chore: add a template for new generators (#850) * docs: remove duplicate dart output (#892) * test: update snapshot for failing test (#907) * chore: add a new example for json-schema-draft4-from-object (#897) * chore: add a new example for JSON schema draft 6 (#933) * ci: use @swc/jest to speedup tests (#938) * ci: fix broken release pipeline (#956) * docs: add contribution guidelines for processors (#950) * chore: add missing test dependency for docker (#992) * docs: add contributing guidelines for presets (#990) * docs: improve readme with use-cases and examples (#1034) * chore: add missing blackbox scripts (#1046) * docs: add versioning and maintenance section (#991) * test: update snapshots (#1064) * docs: fix the wrong link to constraint example (#1065) * test: added example to generate all models within the same file (#1054) * chore: added prettier config (#838) * chore: format code (#1088) Co-authored-by: Kenneth Aasan <k.aasan@sportradar.com> Co-authored-by: Leigh Johnson <hi@leighjohnson.me> Co-authored-by: Maciej Urbańczyk <urbanczyk.maciej.95@gmail.com> Co-authored-by: Nitin Tejuja <95347924+nitintejuja@users.noreply.github.com> Co-authored-by: Amit Kumar Sharma <ksamit1110@gmail.com> Co-authored-by: artur-ciocanu <artur.ciocanu@gmail.com> Co-authored-by: Andrey Zaytsev <zaytsevand@outlook.com> Co-authored-by: Zbigniew Malcherczyk <zmalcherczyk@gmail.com> Co-authored-by: Yushi OMOTE <yushiomote@gmail.com> Co-authored-by: Alejandra Quetzalli <alejandra.quetzalli@postman.com> Co-authored-by: Artur Ciocanu <ciocanu@adobe.com> Co-authored-by: Julian R <mail@julianrapp.de> Co-authored-by: Anay Sarkar <53341181+anaysarkar7@users.noreply.github.com> Co-authored-by: Louis Xhaferi <louis.xhaferi@gmx.de> Co-authored-by: Akshat Nema <76521428+akshatnema@users.noreply.github.com>
The why
These are the issues that are triggering the change, that simply just shows the problems with the current CommonModel structure. We need a more precise structure to solve and prevent these issues from keep popping up:
The following issues highlight the need for better UX:
The rewards
The code changes
So with these changes, how does it simplify the generators and presets?
For the examples below, I only focus on TypeScript but keep in mind these changes are relevant for each generator and preset.
Rendering of properties
Old implementation can be found here.
New simplified implementation becomes straight forward because
patternProperties
andadditionalProperties
are already resolved directly as ObjectModel properties using the newDictionaryModel
.Serialization preset
Old implementation can be found here.
New simplified implementation for de/serialization functionality make use of the
DictionaryModel
andserializationType: 'unwrap' | 'normal'
to support this behavior:Referenced model's type
Old implementation can be found here.
New implementation makes it easier to access the
referencedModel
directly through the new ConstrainedReferencedModel.Figuring out a property's type
Old implementation can be found here.
Because we are dealing with a constrained data model, we can get the type as is:
And we will remove this function and use the type as is.
Accessing the model type externally
Because Modelina is expected to work with AsyncAPI generator templates we need a way to access the payload type. Similar to `Figuring out a property's type`.
Before, we had to use a bunch of internal functions to access it, and in some cases it was impossible. Now it is as easy as accessing the
type
property for the model.Probably need to provide an extra external function to simplify this even more such as:
But you get the idea 😄