Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@ jobs:
osv-scanner scan source --lockfile=pubspec.lock
dart analyze --no-fatal-warnings
flutter test
../../scripts/validate-dart-examples.sh .
;;
apple|swift)
if [ ! -f .swift-format ]; then
Expand Down Expand Up @@ -337,6 +338,7 @@ jobs:
dart pub get
osv-scanner scan source --lockfile=pubspec.lock
dart analyze --no-fatal-warnings
../../scripts/validate-dart-examples.sh .
;;
go)
go mod tidy || true
Expand Down
37 changes: 37 additions & 0 deletions scripts/validate-dart-examples.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash

set -euo pipefail

sdk_dir="${1:-.}"
sdk_dir="$(cd "$sdk_dir" && pwd)"

tmp="$(mktemp -d "$sdk_dir/docs-examples.XXXXXX")"
trap 'rm -rf "$tmp"' EXIT

count=0
while IFS= read -r example; do
name="${example#"$sdk_dir/docs/examples/"}"
name="${name%.md}"
file="$tmp/${name//[^a-zA-Z0-9]/_}.dart"

awk '
/^```dart$/ { in_block = 1; next }
/^```$/ && in_block { exit }
in_block && /^import / { imports = imports $0 "\n"; next }
in_block { body = body " " $0 "\n" }
END {
if (body == "") exit
printf "// ignore_for_file: deprecated_member_use_from_same_package, unused_local_variable\n%s\nFuture<void> main() async {\n%s}\n", imports, body
}
' "$example" > "$file"

if [[ ! -s "$file" ]]; then
rm -f "$file"
continue
fi

count=$((count + 1))
done < <(find "$sdk_dir/docs/examples" -type f -name '*.md' | sort)

echo "Analyzing $count generated Dart examples"
(cd "$sdk_dir" && dart analyze --fatal-warnings "$tmp")
12 changes: 4 additions & 8 deletions templates/dart/docs/example.md.twig
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
```dart
{% if (method | methodType) == 'upload' %}
import 'dart:io';
{% if (method | methodType) == 'location' %}
import 'dart:typed_data';
{% endif %}
import 'package:{{ language.params.packageName }}/{{ language.params.packageName }}.dart';
{% if method.method.value != 'delete' and (method | methodType) not in ['webAuth', 'location'] and (method | getValidResponseModels)|length <= 1 and (method | responseModel) %}
{% if method.method.value != 'delete' and (method | methodType) not in ['webAuth', 'location'] and (method | getValidResponseModels)|length <= 1 and (method | responseModel) and (method | responseModel) != 'any' and not (method | textResponse) %}
import 'package:{{ language.params.packageName }}/models.dart' as models;
{% endif %}
{% set hasEnumParam = false %}
Expand All @@ -15,10 +15,6 @@ import 'package:{{ language.params.packageName }}/models.dart' as models;
{% if hasEnumParam %}
import 'package:{{ language.params.packageName }}/enums.dart' as enums;
{% endif %}
{% if (method | parameters('all')) | hasPermissionParam %}
import 'package:{{ language.params.packageName }}/permission.dart';
import 'package:{{ language.params.packageName }}/role.dart';
{% endif %}

Client client = Client()
{%~ if [(method | securitySchemes)]|length > 0 %}
Expand All @@ -32,7 +28,7 @@ Client client = Client()

{{ service.name | caseUcfirst }} {{ service.name | caseCamel }} = {{service.name | caseUcfirst}}(client);

{% if method.method.value != 'delete' and (method | methodType) != 'webAuth' %}{% if (method | methodType) == 'location' %}Uint8List{% elseif (method | textResponse) %}String{% elseif (method | getValidResponseModels)|length > 1 %}dynamic{% else %}models.{{ (method | responseModel) | caseUcfirst | overrideIdentifier }}{% endif %} result = {% endif %}await {{ service.name | caseCamel }}.{{ (method | methodName) | caseCamel }}({% if (method | parameters('all')) | length == 0 %});{% endif %}
{% if method.method.value != 'delete' and (method | methodType) != 'webAuth' %}{% if (method | methodType) == 'location' %}Uint8List result = {% elseif (method | textResponse) %}String result = {% elseif (method | getValidResponseModels)|length > 1 or (method | responseModel) == 'any' %}dynamic result = {% elseif (method | responseModel) %}models.{{ (method | responseModel) | caseUcfirst | overrideIdentifier }} result = {% endif %}{% endif %}await {{ service.name | caseCamel }}.{{ (method | methodName) | caseCamel }}({% if (method | parameters('all')) | length == 0 %});{% endif %}

{%~ for parameter in (method | parameters('all')) %}
{{ parameter.name | caseCamel | overrideIdentifier }}: {% if (parameter | enumValues) | length > 0 %}{{ parameter | enumExample }}{% else %}{{ parameter | paramExample | replace({'<field-name>': (parameter.name | caseCamel) }) | raw }}{% endif %},{% if not parameter.required %} // (optional){% endif %}
Expand Down
12 changes: 3 additions & 9 deletions templates/flutter/docs/example.md.twig
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
```dart
{% if (method | methodType) in ['upload', 'location'] %}
import 'dart:io';
{% endif %}
{% if (method | methodType) == 'location' %}
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
{% endif %}
import 'package:{{ language.params.packageName }}/{{ language.params.packageName }}.dart';
{% if method.method.value != 'delete' and (method | methodType) not in ['webAuth', 'location'] and (method | getValidResponseModels)|length <= 1 and (method | responseModel) %}
{% if method.method.value != 'delete' and (method | methodType) not in ['webAuth', 'location'] and (method | getValidResponseModels)|length <= 1 and (method | responseModel) and (method | responseModel) != 'any' and not (method | textResponse) %}
import 'package:{{ language.params.packageName }}/models.dart' as models;
{% endif %}
{% set hasEnumParam = false %}
Expand All @@ -19,10 +17,6 @@ import 'package:{{ language.params.packageName }}/models.dart' as models;
{% if hasEnumParam %}
import 'package:{{ language.params.packageName }}/enums.dart' as enums;
{% endif %}
{% if (method | parameters('all')) | hasPermissionParam %}
import 'package:{{ language.params.packageName }}/permission.dart';
import 'package:{{ language.params.packageName }}/role.dart';
{% endif %}

Client client = Client()
{%~ if [(method | securitySchemes)]|length > 0 %}
Expand Down Expand Up @@ -62,7 +56,7 @@ FutureBuilder<Uint8List>(
},
);
{% else %}
{% if method.method.value != 'delete' and (method | methodType) != 'webAuth' %}{% if (method | methodType) == 'location' %}Uint8List{% elseif (method | textResponse) %}String{% elseif (method | getValidResponseModels)|length > 1 %}dynamic{% else %}models.{{ (method | responseModel) | caseUcfirst | overrideIdentifier }}{% endif %} result = {% endif %}await {{ service.name | caseCamel }}.{{ (method | methodName) | caseCamel }}({% if (method | parameters('all')) | length == 0 %});{% endif %}
{% if method.method.value != 'delete' and (method | methodType) != 'webAuth' %}{% if (method | methodType) == 'location' %}Uint8List result = {% elseif (method | textResponse) %}String result = {% elseif (method | getValidResponseModels)|length > 1 or (method | responseModel) == 'any' %}dynamic result = {% elseif (method | responseModel) %}models.{{ (method | responseModel) | caseUcfirst | overrideIdentifier }} result = {% endif %}{% endif %}await {{ service.name | caseCamel }}.{{ (method | methodName) | caseCamel }}({% if (method | parameters('all')) | length == 0 %});{% endif %}

{%~ for parameter in (method | parameters('all')) %}
{{ parameter.name | caseCamel | overrideIdentifier}}: {% if (parameter | enumValues) | length > 0%}{{ parameter | enumExample }}{% else %}{{ parameter | paramExample | replace({'<field-name>': (parameter.name | caseCamel) }) | raw }}{% endif %},{% if not parameter.required %} // optional{% endif %}
Expand Down
Loading