Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety - #10541

Closed
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator
Closed

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety#10541
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator

Conversation

@provokateurin

@provokateurinprovokateurin commented Oct 6, 2021

Copy link
Copy Markdown
Contributor

@jaumard@josh-burton@amondnet@sbu-WBT@kuhnroyal@agilob@ahmednfwela

I actually started working on this a few weeks ago, before any of the current PRs against the dart2 generator were made.
I'm unsure what to do now, but I want to put out my work, so that we can have a great dart2 generator.
Anyway I update the Dart version to the latest stable and thus implemented null-safety. I wasn't able to actually test the generated code yet, but there are no errors shown anymore (due to the project I'm generated a client for using oneOf).
I deleted the tests, because they didn't do anything at all and with null-safety there were errors because of uninitialized fields.

Related PRs:
#10532
#10536

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@agilob

Copy link
Copy Markdown
Contributor

This PR does more than adding null safety to dart generator, I think it should be split into a few smaller PRs. A few general comments:

  • I would go as far as dart 2.14, but something older, this might be too big change for some
  • ignore and remove all changes related to json_serializable, consider this generator gone. Ideally, [dart] json_serializable: remove experimental generator #10532 would be merged before this one
  • we tend to keep changes in dart-dio and dart-dio-next and dart in separate PRs
  • with removal of generated test files this is even more braking change, this risks deleting user developed tests

}
}
return null;
return DateTime(1970);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

user of this API can't distinguish between incorrect date and intentionally provided 1970


final String name;
final String value;
final String? value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

can query have name but no value? and for the line below, it has to be empty string not null string, as end user won't be able to distinguish intentional null string from no value. I think both fields should be not-null in this class

String message;
Exception innerException;
StackTrace stackTrace;
String? message;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

another design question, when does it make sense to raise ApiException without a message?


{{#native_serialization}}
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
static dynamic _deserialize(dynamic value, String targetType, {bool? growable}) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would it make sense to make growable false or true by default? this would avoid doing growable == true a few times below, consider it micro-optimisation. I would also make it false, since other dart apis use immutable structures


@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
String serialize(Object value) => value == null ? '' : json.encode(value);
String serialize(Object? value) => value == null ? '' : json.encode(value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does it ever make sense to serialise null object?

class HttpBasicAuth implements Authentication {
String username;
String password;
String? username;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making these not-null you will avoid defaulting to empty string below, another micro optimisation on our side

OAuth({this.accessToken});

String accessToken;
String? accessToken;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making this not-null you will avoid null check below. does it make sense to use OAuth without access token? Technically yes, but practically that's a sec vuln on endpoint to accept empty code

public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isBoolean;
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there really no other method for this already? Im really surprised this needs to be introduced as new code @wing328 ?

{{/isArray}}
{{/json_serializable}}
}
return Future<{{{returnType}}}>.value();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this was added recently to satisfy stricter linter config, so pls revert #10263

List<QueryParam> queryParams,
Object body,
Object? body,
Map<String, String> headerParams,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

headerParams and formParams are nullable in other openapi generators, so I would prefer to keep it this way for language agnostic users

}
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
targetType = match[1]; // ignore: parameter_assignments
targetType = match![1]!; // ignore: parameter_assignments

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

yea, that's better than my defauling to Object? 👍

@agilob

Copy link
Copy Markdown
Contributor

This branch was only passing tests because github actions have not kicked in and many tests didn't run...

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sorry, at our company we decided it is currently not worth enough to fix the requested stuff but also the still missing stuff. Other people can you pickup these changes if they want to. Maybe we will come back to this, but currently it's not our plan to do so in a timely manner.

@agilob

Copy link
Copy Markdown
Contributor

I've already rebased your branch and started fixing the above

@agilob

Copy link
Copy Markdown
Contributor

Can you close this PR pls?

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sure!

@agilob

Copy link
Copy Markdown
Contributor

#10637

Sign up for freeto 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.

2 participants

@provokateurin@agilob
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety - #10541

Closed
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator
Closed

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety#10541
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator

Conversation

@provokateurin

@provokateurinprovokateurin commented Oct 6, 2021

Copy link
Copy Markdown
Contributor

@jaumard@josh-burton@amondnet@sbu-WBT@kuhnroyal@agilob@ahmednfwela

I actually started working on this a few weeks ago, before any of the current PRs against the dart2 generator were made.
I'm unsure what to do now, but I want to put out my work, so that we can have a great dart2 generator.
Anyway I update the Dart version to the latest stable and thus implemented null-safety. I wasn't able to actually test the generated code yet, but there are no errors shown anymore (due to the project I'm generated a client for using oneOf).
I deleted the tests, because they didn't do anything at all and with null-safety there were errors because of uninitialized fields.

Related PRs:
#10532
#10536

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@agilob

Copy link
Copy Markdown
Contributor

This PR does more than adding null safety to dart generator, I think it should be split into a few smaller PRs. A few general comments:

  • I would go as far as dart 2.14, but something older, this might be too big change for some
  • ignore and remove all changes related to json_serializable, consider this generator gone. Ideally, [dart] json_serializable: remove experimental generator #10532 would be merged before this one
  • we tend to keep changes in dart-dio and dart-dio-next and dart in separate PRs
  • with removal of generated test files this is even more braking change, this risks deleting user developed tests

}
}
return null;
return DateTime(1970);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

user of this API can't distinguish between incorrect date and intentionally provided 1970


final String name;
final String value;
final String? value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

can query have name but no value? and for the line below, it has to be empty string not null string, as end user won't be able to distinguish intentional null string from no value. I think both fields should be not-null in this class

String message;
Exception innerException;
StackTrace stackTrace;
String? message;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

another design question, when does it make sense to raise ApiException without a message?


{{#native_serialization}}
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
static dynamic _deserialize(dynamic value, String targetType, {bool? growable}) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would it make sense to make growable false or true by default? this would avoid doing growable == true a few times below, consider it micro-optimisation. I would also make it false, since other dart apis use immutable structures


@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
String serialize(Object value) => value == null ? '' : json.encode(value);
String serialize(Object? value) => value == null ? '' : json.encode(value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does it ever make sense to serialise null object?

class HttpBasicAuth implements Authentication {
String username;
String password;
String? username;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making these not-null you will avoid defaulting to empty string below, another micro optimisation on our side

OAuth({this.accessToken});

String accessToken;
String? accessToken;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making this not-null you will avoid null check below. does it make sense to use OAuth without access token? Technically yes, but practically that's a sec vuln on endpoint to accept empty code

public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isBoolean;
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there really no other method for this already? Im really surprised this needs to be introduced as new code @wing328 ?

{{/isArray}}
{{/json_serializable}}
}
return Future<{{{returnType}}}>.value();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this was added recently to satisfy stricter linter config, so pls revert #10263

List<QueryParam> queryParams,
Object body,
Object? body,
Map<String, String> headerParams,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

headerParams and formParams are nullable in other openapi generators, so I would prefer to keep it this way for language agnostic users

}
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
targetType = match[1]; // ignore: parameter_assignments
targetType = match![1]!; // ignore: parameter_assignments

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

yea, that's better than my defauling to Object? 👍

@agilob

Copy link
Copy Markdown
Contributor

This branch was only passing tests because github actions have not kicked in and many tests didn't run...

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sorry, at our company we decided it is currently not worth enough to fix the requested stuff but also the still missing stuff. Other people can you pickup these changes if they want to. Maybe we will come back to this, but currently it's not our plan to do so in a timely manner.

@agilob

Copy link
Copy Markdown
Contributor

I've already rebased your branch and started fixing the above

@agilob

Copy link
Copy Markdown
Contributor

Can you close this PR pls?

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sure!

@agilob

Copy link
Copy Markdown
Contributor

#10637

Sign up for freeto 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.

2 participants

@provokateurin@agilob
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety - #10541

Closed
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator
Closed

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety#10541
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator

Conversation

@provokateurin

@provokateurinprovokateurin commented Oct 6, 2021

Copy link
Copy Markdown
Contributor

@jaumard@josh-burton@amondnet@sbu-WBT@kuhnroyal@agilob@ahmednfwela

I actually started working on this a few weeks ago, before any of the current PRs against the dart2 generator were made.
I'm unsure what to do now, but I want to put out my work, so that we can have a great dart2 generator.
Anyway I update the Dart version to the latest stable and thus implemented null-safety. I wasn't able to actually test the generated code yet, but there are no errors shown anymore (due to the project I'm generated a client for using oneOf).
I deleted the tests, because they didn't do anything at all and with null-safety there were errors because of uninitialized fields.

Related PRs:
#10532
#10536

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@agilob

Copy link
Copy Markdown
Contributor

This PR does more than adding null safety to dart generator, I think it should be split into a few smaller PRs. A few general comments:

  • I would go as far as dart 2.14, but something older, this might be too big change for some
  • ignore and remove all changes related to json_serializable, consider this generator gone. Ideally, [dart] json_serializable: remove experimental generator #10532 would be merged before this one
  • we tend to keep changes in dart-dio and dart-dio-next and dart in separate PRs
  • with removal of generated test files this is even more braking change, this risks deleting user developed tests

}
}
return null;
return DateTime(1970);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

user of this API can't distinguish between incorrect date and intentionally provided 1970


final String name;
final String value;
final String? value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

can query have name but no value? and for the line below, it has to be empty string not null string, as end user won't be able to distinguish intentional null string from no value. I think both fields should be not-null in this class

String message;
Exception innerException;
StackTrace stackTrace;
String? message;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

another design question, when does it make sense to raise ApiException without a message?


{{#native_serialization}}
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
static dynamic _deserialize(dynamic value, String targetType, {bool? growable}) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would it make sense to make growable false or true by default? this would avoid doing growable == true a few times below, consider it micro-optimisation. I would also make it false, since other dart apis use immutable structures


@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
String serialize(Object value) => value == null ? '' : json.encode(value);
String serialize(Object? value) => value == null ? '' : json.encode(value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does it ever make sense to serialise null object?

class HttpBasicAuth implements Authentication {
String username;
String password;
String? username;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making these not-null you will avoid defaulting to empty string below, another micro optimisation on our side

OAuth({this.accessToken});

String accessToken;
String? accessToken;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making this not-null you will avoid null check below. does it make sense to use OAuth without access token? Technically yes, but practically that's a sec vuln on endpoint to accept empty code

public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isBoolean;
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there really no other method for this already? Im really surprised this needs to be introduced as new code @wing328 ?

{{/isArray}}
{{/json_serializable}}
}
return Future<{{{returnType}}}>.value();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this was added recently to satisfy stricter linter config, so pls revert #10263

List<QueryParam> queryParams,
Object body,
Object? body,
Map<String, String> headerParams,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

headerParams and formParams are nullable in other openapi generators, so I would prefer to keep it this way for language agnostic users

}
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
targetType = match[1]; // ignore: parameter_assignments
targetType = match![1]!; // ignore: parameter_assignments

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

yea, that's better than my defauling to Object? 👍

@agilob

Copy link
Copy Markdown
Contributor

This branch was only passing tests because github actions have not kicked in and many tests didn't run...

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sorry, at our company we decided it is currently not worth enough to fix the requested stuff but also the still missing stuff. Other people can you pickup these changes if they want to. Maybe we will come back to this, but currently it's not our plan to do so in a timely manner.

@agilob

Copy link
Copy Markdown
Contributor

I've already rebased your branch and started fixing the above

@agilob

Copy link
Copy Markdown
Contributor

Can you close this PR pls?

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sure!

@agilob

Copy link
Copy Markdown
Contributor

#10637

Sign up for freeto 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.

2 participants

@provokateurin@agilob
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety - #10541

Closed
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator
Closed

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety#10541
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator

Conversation

@provokateurin

@provokateurinprovokateurin commented Oct 6, 2021

Copy link
Copy Markdown
Contributor

@jaumard@josh-burton@amondnet@sbu-WBT@kuhnroyal@agilob@ahmednfwela

I actually started working on this a few weeks ago, before any of the current PRs against the dart2 generator were made.
I'm unsure what to do now, but I want to put out my work, so that we can have a great dart2 generator.
Anyway I update the Dart version to the latest stable and thus implemented null-safety. I wasn't able to actually test the generated code yet, but there are no errors shown anymore (due to the project I'm generated a client for using oneOf).
I deleted the tests, because they didn't do anything at all and with null-safety there were errors because of uninitialized fields.

Related PRs:
#10532
#10536

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@agilob

Copy link
Copy Markdown
Contributor

This PR does more than adding null safety to dart generator, I think it should be split into a few smaller PRs. A few general comments:

  • I would go as far as dart 2.14, but something older, this might be too big change for some
  • ignore and remove all changes related to json_serializable, consider this generator gone. Ideally, [dart] json_serializable: remove experimental generator #10532 would be merged before this one
  • we tend to keep changes in dart-dio and dart-dio-next and dart in separate PRs
  • with removal of generated test files this is even more braking change, this risks deleting user developed tests

}
}
return null;
return DateTime(1970);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

user of this API can't distinguish between incorrect date and intentionally provided 1970


final String name;
final String value;
final String? value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

can query have name but no value? and for the line below, it has to be empty string not null string, as end user won't be able to distinguish intentional null string from no value. I think both fields should be not-null in this class

String message;
Exception innerException;
StackTrace stackTrace;
String? message;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

another design question, when does it make sense to raise ApiException without a message?


{{#native_serialization}}
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
static dynamic _deserialize(dynamic value, String targetType, {bool? growable}) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would it make sense to make growable false or true by default? this would avoid doing growable == true a few times below, consider it micro-optimisation. I would also make it false, since other dart apis use immutable structures


@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
String serialize(Object value) => value == null ? '' : json.encode(value);
String serialize(Object? value) => value == null ? '' : json.encode(value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does it ever make sense to serialise null object?

class HttpBasicAuth implements Authentication {
String username;
String password;
String? username;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making these not-null you will avoid defaulting to empty string below, another micro optimisation on our side

OAuth({this.accessToken});

String accessToken;
String? accessToken;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making this not-null you will avoid null check below. does it make sense to use OAuth without access token? Technically yes, but practically that's a sec vuln on endpoint to accept empty code

public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isBoolean;
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there really no other method for this already? Im really surprised this needs to be introduced as new code @wing328 ?

{{/isArray}}
{{/json_serializable}}
}
return Future<{{{returnType}}}>.value();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this was added recently to satisfy stricter linter config, so pls revert #10263

List<QueryParam> queryParams,
Object body,
Object? body,
Map<String, String> headerParams,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

headerParams and formParams are nullable in other openapi generators, so I would prefer to keep it this way for language agnostic users

}
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
targetType = match[1]; // ignore: parameter_assignments
targetType = match![1]!; // ignore: parameter_assignments

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

yea, that's better than my defauling to Object? 👍

@agilob

Copy link
Copy Markdown
Contributor

This branch was only passing tests because github actions have not kicked in and many tests didn't run...

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sorry, at our company we decided it is currently not worth enough to fix the requested stuff but also the still missing stuff. Other people can you pickup these changes if they want to. Maybe we will come back to this, but currently it's not our plan to do so in a timely manner.

@agilob

Copy link
Copy Markdown
Contributor

I've already rebased your branch and started fixing the above

@agilob

Copy link
Copy Markdown
Contributor

Can you close this PR pls?

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sure!

@agilob

Copy link
Copy Markdown
Contributor

#10637

Sign up for freeto 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.

2 participants

@provokateurin@agilob
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety - #10541

Closed
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator
Closed

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety#10541
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator

Conversation

@provokateurin

@provokateurinprovokateurin commented Oct 6, 2021

Copy link
Copy Markdown
Contributor

@jaumard@josh-burton@amondnet@sbu-WBT@kuhnroyal@agilob@ahmednfwela

I actually started working on this a few weeks ago, before any of the current PRs against the dart2 generator were made.
I'm unsure what to do now, but I want to put out my work, so that we can have a great dart2 generator.
Anyway I update the Dart version to the latest stable and thus implemented null-safety. I wasn't able to actually test the generated code yet, but there are no errors shown anymore (due to the project I'm generated a client for using oneOf).
I deleted the tests, because they didn't do anything at all and with null-safety there were errors because of uninitialized fields.

Related PRs:
#10532
#10536

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@agilob

Copy link
Copy Markdown
Contributor

This PR does more than adding null safety to dart generator, I think it should be split into a few smaller PRs. A few general comments:

  • I would go as far as dart 2.14, but something older, this might be too big change for some
  • ignore and remove all changes related to json_serializable, consider this generator gone. Ideally, [dart] json_serializable: remove experimental generator #10532 would be merged before this one
  • we tend to keep changes in dart-dio and dart-dio-next and dart in separate PRs
  • with removal of generated test files this is even more braking change, this risks deleting user developed tests

}
}
return null;
return DateTime(1970);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

user of this API can't distinguish between incorrect date and intentionally provided 1970


final String name;
final String value;
final String? value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

can query have name but no value? and for the line below, it has to be empty string not null string, as end user won't be able to distinguish intentional null string from no value. I think both fields should be not-null in this class

String message;
Exception innerException;
StackTrace stackTrace;
String? message;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

another design question, when does it make sense to raise ApiException without a message?


{{#native_serialization}}
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
static dynamic _deserialize(dynamic value, String targetType, {bool? growable}) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would it make sense to make growable false or true by default? this would avoid doing growable == true a few times below, consider it micro-optimisation. I would also make it false, since other dart apis use immutable structures


@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
String serialize(Object value) => value == null ? '' : json.encode(value);
String serialize(Object? value) => value == null ? '' : json.encode(value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does it ever make sense to serialise null object?

class HttpBasicAuth implements Authentication {
String username;
String password;
String? username;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making these not-null you will avoid defaulting to empty string below, another micro optimisation on our side

OAuth({this.accessToken});

String accessToken;
String? accessToken;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making this not-null you will avoid null check below. does it make sense to use OAuth without access token? Technically yes, but practically that's a sec vuln on endpoint to accept empty code

public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isBoolean;
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there really no other method for this already? Im really surprised this needs to be introduced as new code @wing328 ?

{{/isArray}}
{{/json_serializable}}
}
return Future<{{{returnType}}}>.value();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this was added recently to satisfy stricter linter config, so pls revert #10263

List<QueryParam> queryParams,
Object body,
Object? body,
Map<String, String> headerParams,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

headerParams and formParams are nullable in other openapi generators, so I would prefer to keep it this way for language agnostic users

}
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
targetType = match[1]; // ignore: parameter_assignments
targetType = match![1]!; // ignore: parameter_assignments

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

yea, that's better than my defauling to Object? 👍

@agilob

Copy link
Copy Markdown
Contributor

This branch was only passing tests because github actions have not kicked in and many tests didn't run...

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sorry, at our company we decided it is currently not worth enough to fix the requested stuff but also the still missing stuff. Other people can you pickup these changes if they want to. Maybe we will come back to this, but currently it's not our plan to do so in a timely manner.

@agilob

Copy link
Copy Markdown
Contributor

I've already rebased your branch and started fixing the above

@agilob

Copy link
Copy Markdown
Contributor

Can you close this PR pls?

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sure!

@agilob

Copy link
Copy Markdown
Contributor

#10637

Sign up for freeto 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.

2 participants

@provokateurin@agilob
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety - #10541

Closed
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator
Closed

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety#10541
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator

Conversation

@provokateurin

@provokateurinprovokateurin commented Oct 6, 2021

Copy link
Copy Markdown
Contributor

@jaumard@josh-burton@amondnet@sbu-WBT@kuhnroyal@agilob@ahmednfwela

I actually started working on this a few weeks ago, before any of the current PRs against the dart2 generator were made.
I'm unsure what to do now, but I want to put out my work, so that we can have a great dart2 generator.
Anyway I update the Dart version to the latest stable and thus implemented null-safety. I wasn't able to actually test the generated code yet, but there are no errors shown anymore (due to the project I'm generated a client for using oneOf).
I deleted the tests, because they didn't do anything at all and with null-safety there were errors because of uninitialized fields.

Related PRs:
#10532
#10536

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@agilob

Copy link
Copy Markdown
Contributor

This PR does more than adding null safety to dart generator, I think it should be split into a few smaller PRs. A few general comments:

  • I would go as far as dart 2.14, but something older, this might be too big change for some
  • ignore and remove all changes related to json_serializable, consider this generator gone. Ideally, [dart] json_serializable: remove experimental generator #10532 would be merged before this one
  • we tend to keep changes in dart-dio and dart-dio-next and dart in separate PRs
  • with removal of generated test files this is even more braking change, this risks deleting user developed tests

}
}
return null;
return DateTime(1970);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

user of this API can't distinguish between incorrect date and intentionally provided 1970


final String name;
final String value;
final String? value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

can query have name but no value? and for the line below, it has to be empty string not null string, as end user won't be able to distinguish intentional null string from no value. I think both fields should be not-null in this class

String message;
Exception innerException;
StackTrace stackTrace;
String? message;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

another design question, when does it make sense to raise ApiException without a message?


{{#native_serialization}}
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
static dynamic _deserialize(dynamic value, String targetType, {bool? growable}) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would it make sense to make growable false or true by default? this would avoid doing growable == true a few times below, consider it micro-optimisation. I would also make it false, since other dart apis use immutable structures


@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
String serialize(Object value) => value == null ? '' : json.encode(value);
String serialize(Object? value) => value == null ? '' : json.encode(value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does it ever make sense to serialise null object?

class HttpBasicAuth implements Authentication {
String username;
String password;
String? username;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making these not-null you will avoid defaulting to empty string below, another micro optimisation on our side

OAuth({this.accessToken});

String accessToken;
String? accessToken;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making this not-null you will avoid null check below. does it make sense to use OAuth without access token? Technically yes, but practically that's a sec vuln on endpoint to accept empty code

public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isBoolean;
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there really no other method for this already? Im really surprised this needs to be introduced as new code @wing328 ?

{{/isArray}}
{{/json_serializable}}
}
return Future<{{{returnType}}}>.value();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this was added recently to satisfy stricter linter config, so pls revert #10263

List<QueryParam> queryParams,
Object body,
Object? body,
Map<String, String> headerParams,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

headerParams and formParams are nullable in other openapi generators, so I would prefer to keep it this way for language agnostic users

}
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
targetType = match[1]; // ignore: parameter_assignments
targetType = match![1]!; // ignore: parameter_assignments

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

yea, that's better than my defauling to Object? 👍

@agilob

Copy link
Copy Markdown
Contributor

This branch was only passing tests because github actions have not kicked in and many tests didn't run...

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sorry, at our company we decided it is currently not worth enough to fix the requested stuff but also the still missing stuff. Other people can you pickup these changes if they want to. Maybe we will come back to this, but currently it's not our plan to do so in a timely manner.

@agilob

Copy link
Copy Markdown
Contributor

I've already rebased your branch and started fixing the above

@agilob

Copy link
Copy Markdown
Contributor

Can you close this PR pls?

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sure!

@agilob

Copy link
Copy Markdown
Contributor

#10637

Sign up for freeto 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.

2 participants

@provokateurin@agilob
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety - #10541

Closed
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator
Closed

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety#10541
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator

Conversation

@provokateurin

@provokateurinprovokateurin commented Oct 6, 2021

Copy link
Copy Markdown
Contributor

@jaumard@josh-burton@amondnet@sbu-WBT@kuhnroyal@agilob@ahmednfwela

I actually started working on this a few weeks ago, before any of the current PRs against the dart2 generator were made.
I'm unsure what to do now, but I want to put out my work, so that we can have a great dart2 generator.
Anyway I update the Dart version to the latest stable and thus implemented null-safety. I wasn't able to actually test the generated code yet, but there are no errors shown anymore (due to the project I'm generated a client for using oneOf).
I deleted the tests, because they didn't do anything at all and with null-safety there were errors because of uninitialized fields.

Related PRs:
#10532
#10536

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@agilob

Copy link
Copy Markdown
Contributor

This PR does more than adding null safety to dart generator, I think it should be split into a few smaller PRs. A few general comments:

  • I would go as far as dart 2.14, but something older, this might be too big change for some
  • ignore and remove all changes related to json_serializable, consider this generator gone. Ideally, [dart] json_serializable: remove experimental generator #10532 would be merged before this one
  • we tend to keep changes in dart-dio and dart-dio-next and dart in separate PRs
  • with removal of generated test files this is even more braking change, this risks deleting user developed tests

}
}
return null;
return DateTime(1970);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

user of this API can't distinguish between incorrect date and intentionally provided 1970


final String name;
final String value;
final String? value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

can query have name but no value? and for the line below, it has to be empty string not null string, as end user won't be able to distinguish intentional null string from no value. I think both fields should be not-null in this class

String message;
Exception innerException;
StackTrace stackTrace;
String? message;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

another design question, when does it make sense to raise ApiException without a message?


{{#native_serialization}}
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
static dynamic _deserialize(dynamic value, String targetType, {bool? growable}) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would it make sense to make growable false or true by default? this would avoid doing growable == true a few times below, consider it micro-optimisation. I would also make it false, since other dart apis use immutable structures


@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
String serialize(Object value) => value == null ? '' : json.encode(value);
String serialize(Object? value) => value == null ? '' : json.encode(value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does it ever make sense to serialise null object?

class HttpBasicAuth implements Authentication {
String username;
String password;
String? username;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making these not-null you will avoid defaulting to empty string below, another micro optimisation on our side

OAuth({this.accessToken});

String accessToken;
String? accessToken;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making this not-null you will avoid null check below. does it make sense to use OAuth without access token? Technically yes, but practically that's a sec vuln on endpoint to accept empty code

public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isBoolean;
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there really no other method for this already? Im really surprised this needs to be introduced as new code @wing328 ?

{{/isArray}}
{{/json_serializable}}
}
return Future<{{{returnType}}}>.value();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this was added recently to satisfy stricter linter config, so pls revert #10263

List<QueryParam> queryParams,
Object body,
Object? body,
Map<String, String> headerParams,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

headerParams and formParams are nullable in other openapi generators, so I would prefer to keep it this way for language agnostic users

}
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
targetType = match[1]; // ignore: parameter_assignments
targetType = match![1]!; // ignore: parameter_assignments

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

yea, that's better than my defauling to Object? 👍

@agilob

Copy link
Copy Markdown
Contributor

This branch was only passing tests because github actions have not kicked in and many tests didn't run...

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sorry, at our company we decided it is currently not worth enough to fix the requested stuff but also the still missing stuff. Other people can you pickup these changes if they want to. Maybe we will come back to this, but currently it's not our plan to do so in a timely manner.

@agilob

Copy link
Copy Markdown
Contributor

I've already rebased your branch and started fixing the above

@agilob

Copy link
Copy Markdown
Contributor

Can you close this PR pls?

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sure!

@agilob

Copy link
Copy Markdown
Contributor

#10637

Sign up for freeto 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.

2 participants

@provokateurin@agilob
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety - #10541

Closed
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator
Closed

Bump dart2 code compatibility to Dart 2.14 and introduce sound null-safety#10541
provokateurin wants to merge 2 commits into
OpenAPITools:masterfrom
stack11:fix/dart2-generator

Conversation

@provokateurin

@provokateurinprovokateurin commented Oct 6, 2021

Copy link
Copy Markdown
Contributor

@jaumard@josh-burton@amondnet@sbu-WBT@kuhnroyal@agilob@ahmednfwela

I actually started working on this a few weeks ago, before any of the current PRs against the dart2 generator were made.
I'm unsure what to do now, but I want to put out my work, so that we can have a great dart2 generator.
Anyway I update the Dart version to the latest stable and thus implemented null-safety. I wasn't able to actually test the generated code yet, but there are no errors shown anymore (due to the project I'm generated a client for using oneOf).
I deleted the tests, because they didn't do anything at all and with null-safety there were errors because of uninitialized fields.

Related PRs:
#10532
#10536

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (5.3.0), 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@agilob

Copy link
Copy Markdown
Contributor

This PR does more than adding null safety to dart generator, I think it should be split into a few smaller PRs. A few general comments:

  • I would go as far as dart 2.14, but something older, this might be too big change for some
  • ignore and remove all changes related to json_serializable, consider this generator gone. Ideally, [dart] json_serializable: remove experimental generator #10532 would be merged before this one
  • we tend to keep changes in dart-dio and dart-dio-next and dart in separate PRs
  • with removal of generated test files this is even more braking change, this risks deleting user developed tests

}
}
return null;
return DateTime(1970);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

user of this API can't distinguish between incorrect date and intentionally provided 1970


final String name;
final String value;
final String? value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

can query have name but no value? and for the line below, it has to be empty string not null string, as end user won't be able to distinguish intentional null string from no value. I think both fields should be not-null in this class

String message;
Exception innerException;
StackTrace stackTrace;
String? message;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

another design question, when does it make sense to raise ApiException without a message?


{{#native_serialization}}
static dynamic _deserialize(dynamic value, String targetType, {bool growable}) {
static dynamic _deserialize(dynamic value, String targetType, {bool? growable}) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Would it make sense to make growable false or true by default? this would avoid doing growable == true a few times below, consider it micro-optimisation. I would also make it false, since other dart apis use immutable structures


@Deprecated('Scheduled for removal in OpenAPI Generator 6.x. Use serializeAsync() instead.')
String serialize(Object value) => value == null ? '' : json.encode(value);
String serialize(Object? value) => value == null ? '' : json.encode(value);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Does it ever make sense to serialise null object?

class HttpBasicAuth implements Authentication {
String username;
String password;
String? username;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making these not-null you will avoid defaulting to empty string below, another micro optimisation on our side

OAuth({this.accessToken});

String accessToken;
String? accessToken;

@agilobagilobOct 6, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

by making this not-null you will avoid null check below. does it make sense to use OAuth without access token? Technically yes, but practically that's a sec vuln on endpoint to accept empty code

public String arrayModelType;
public boolean isAlias; // Is this effectively an alias of another simple type
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isBoolean;
public boolean isString, isInteger, isLong, isNumber, isNumeric, isFloat, isDouble, isDate, isDateTime, isShort, isUnboundedInteger, isPrimitiveType, isBoolean;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there really no other method for this already? Im really surprised this needs to be introduced as new code @wing328 ?

{{/isArray}}
{{/json_serializable}}
}
return Future<{{{returnType}}}>.value();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this was added recently to satisfy stricter linter config, so pls revert #10263

List<QueryParam> queryParams,
Object body,
Object? body,
Map<String, String> headerParams,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

headerParams and formParams are nullable in other openapi generators, so I would prefer to keep it this way for language agnostic users

}
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
targetType = match[1]; // ignore: parameter_assignments
targetType = match![1]!; // ignore: parameter_assignments

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

yea, that's better than my defauling to Object? 👍

@agilob

Copy link
Copy Markdown
Contributor

This branch was only passing tests because github actions have not kicked in and many tests didn't run...

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sorry, at our company we decided it is currently not worth enough to fix the requested stuff but also the still missing stuff. Other people can you pickup these changes if they want to. Maybe we will come back to this, but currently it's not our plan to do so in a timely manner.

@agilob

Copy link
Copy Markdown
Contributor

I've already rebased your branch and started fixing the above

@agilob

Copy link
Copy Markdown
Contributor

Can you close this PR pls?

@provokateurin

Copy link
Copy Markdown
ContributorAuthor

Sure!

@agilob

Copy link
Copy Markdown
Contributor

#10637

Sign up for freeto 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.

2 participants

@provokateurin@agilob