Skip to content

Commit ec19c8e

Browse files
authored
Merge pull request #1096 from appwrite/feat-add-deprecated
add deprecation handling in templates
2 parents 28bc3a2 + b07cde4 commit ec19c8e

File tree

20 files changed

+208
-8
lines changed

20 files changed

+208
-8
lines changed

example.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ function getSSLPage($url) {
4242
$platform = 'console';
4343
// $platform = 'server';
4444

45-
$spec = getSSLPage("https://raw.githubusercontent.com/appwrite/appwrite/1.7.x/app/config/specs/swagger2-latest-{$platform}.json");
45+
$spec = getSSLPage("https://raw.githubusercontent.com/appwrite/appwrite/deprecate-old-methods/app/config/specs/swagger2-1.8.x-{$platform}.json");
4646

4747
if(empty($spec)) {
4848
throw new Exception('Failed to fetch spec from Appwrite server');

src/SDK/Language/CLI.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ public function getFilters(): array
433433
{
434434
return array_merge(parent::getFilters(), [
435435
new TwigFilter('caseKebab', function ($value) {
436-
return strtolower(preg_replace('/(?<!^)([A-Z][a-z]|(?<=[a-z])[^a-z]|(?<=[A-Z])[0-9_])/', '-$1', $value));
436+
return strtolower(preg_replace('/(?<!^)([A-Z][a-z]|(?<=[a-z])[^a-z\s]|(?<=[A-Z])[0-9_])/', '-$1', $value));
437437
})
438438
]);
439439
}

src/SDK/SDK.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,22 @@ public function __construct(Language $language, Spec $spec)
207207
}
208208
return $value;
209209
}));
210+
$this->twig->addFilter(new TwigFilter('capitalizeFirst', function ($value) {
211+
return ucfirst($value);
212+
}));
213+
$this->twig->addFilter(new TwigFilter('caseSnakeExceptFirstDot', function ($value) {
214+
$parts = explode('.', $value, 2);
215+
$toSnake = function ($str) {
216+
preg_match_all('!([A-Za-z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!', $str, $matches);
217+
return implode('_', array_map(function ($m) {
218+
return $m === strtoupper($m) ? strtolower($m) : lcfirst($m);
219+
}, $matches[0]));
220+
};
221+
if (count($parts) < 2) {
222+
return $toSnake($value);
223+
}
224+
return $parts[0] . '.' . $toSnake($parts[1]);
225+
}));
210226
}
211227

212228
/**

src/Spec/Swagger2.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ protected function parseMethod(string $methodName, string $pathName, array $meth
176176
'consumes' => $method['consumes'] ?? [],
177177
'cookies' => $method['x-appwrite']['cookies'] ?? false,
178178
'type' => $method['x-appwrite']['type'] ?? false,
179+
'deprecated' => $method['deprecated'] ?? false,
179180
'headers' => [],
180181
'parameters' => [
181182
'all' => [],
@@ -188,6 +189,11 @@ protected function parseMethod(string $methodName, string $pathName, array $meth
188189
'responseModel' => $responseModel,
189190
];
190191

192+
if ($method['x-appwrite']['deprecated'] ?? false) {
193+
$output['since'] = $method['x-appwrite']['deprecated']['since'] ?? '';
194+
$output['replaceWith'] = $method['x-appwrite']['deprecated']['replaceWith'] ?? '';
195+
}
196+
191197
if ($output['type'] == 'graphql') {
192198
$output['headers']['x-sdk-graphql'] = "true";
193199
}

templates/android/library/src/main/java/io/package/services/Service.kt.twig

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,19 @@ class {{ service.name | caseUcfirst }}(client: Client) : Service(client) {
3838
* @return [{{ method | returnType(spec, sdk.namespace | caseDot) | raw }}]
3939
{%~ endif %}
4040
*/
41+
{%~ if method.deprecated %}
42+
{%~ if method.since and method.replaceWith %}
43+
@Deprecated(
44+
message = "This API has been deprecated since {{ method.since }}. Please use `{{ method.replaceWith | capitalizeFirst }}` instead.",
45+
replaceWith = ReplaceWith("{{ sdk.namespace | caseDot }}.services.{{ method.replaceWith | capitalizeFirst }}"),
46+
since = "{{ method.since }}"
47+
)
48+
{%~ else %}
49+
@Deprecated(
50+
message = "This API has been deprecated."
51+
)
52+
{%~ endif %}
53+
{%~ endif %}
4154
{%~ if method.parameters.all | reduce((carry, param) => carry or not param.required) %}
4255
@JvmOverloads
4356
{%~ endif %}
@@ -192,6 +205,19 @@ class {{ service.name | caseUcfirst }}(client: Client) : Service(client) {
192205
* @return [{{ method | returnType(spec, sdk.namespace | caseDot) | raw }}]
193206
{%~ endif %}
194207
*/
208+
{%~ if method.deprecated %}
209+
{%~ if method.since and method.replaceWith %}
210+
@Deprecated(
211+
message = "This API has been deprecated since {{ method.since }}. Please use `{{ method.replaceWith | capitalizeFirst }}` instead.",
212+
replaceWith = ReplaceWith("{{ sdk.namespace | caseDot }}.services.{{ method.replaceWith | capitalizeFirst }}"),
213+
since = "{{ method.since }}"
214+
)
215+
{%~ else %}
216+
@Deprecated(
217+
message = "This API has been deprecated."
218+
)
219+
{%~ endif %}
220+
{%~ endif %}
195221
{%~ if method.parameters.all | reduce((carry, param) => carry or not param.required) %}
196222
@JvmOverloads
197223
{%~ endif %}

templates/apple/Sources/Services/Service.swift.twig

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ open class {{ service.name | caseUcfirst | overrideIdentifier }}: Service {
2727
{%~ if method.type == "webAuth" %}
2828
@available(iOS 14.0, macOS 11.0, tvOS 14.0, watchOS 7.0, *)
2929
{%~ endif %}
30+
{%~ if method.deprecated %}
31+
{%~ if method.since and method.replaceWith %}
32+
@available(*, deprecated, message: "This API has been deprecated since {{ method.since }}. Please use `{{ method.replaceWith | capitalizeFirst }}` instead.")
33+
{%~ else %}
34+
@available(*, deprecated, message: "This API has been deprecated.")
35+
{%~ endif %}
36+
{%~ endif %}
3037
open func {{ method.name | caseCamel | overrideIdentifier }}{% if method.responseModel | hasGenericType(spec) %}<T>{% endif %}(
3138
{%~ for parameter in method.parameters.all %}
3239
{{ parameter.name | caseCamel | escapeSwiftKeyword }}: {{ parameter | typeName(spec) | raw }}{% if not parameter.required or parameter.nullable %}? = nil{% endif %}{% if not loop.last or 'multipart/form-data' in method.consumes or method.responseModel | hasGenericType(spec) %},{% endif %}
@@ -95,6 +102,13 @@ open class {{ service.name | caseUcfirst | overrideIdentifier }}: Service {
95102
{%~ if method.type == "webAuth" %}
96103
@available(iOS 14.0, macOS 11.0, tvOS 14.0, watchOS 7.0, *)
97104
{%~ endif %}
105+
{%~ if method.deprecated %}
106+
{%~ if method.since and method.replaceWith %}
107+
@available(*, deprecated, message: "This API has been deprecated since {{ method.since }}. Please use `{{ method.replaceWith | capitalizeFirst }}` instead.")
108+
{%~ else %}
109+
@available(*, deprecated, message: "This API has been deprecated.")
110+
{%~ endif %}
111+
{%~ endif %}
98112
open func {{ method.name | caseCamel }}(
99113
{%~ for parameter in method.parameters.all %}
100114
{{ parameter.name | caseCamel | escapeSwiftKeyword }}: {{ parameter | typeName(spec) | raw }}{% if not parameter.required or parameter.nullable %}? = nil{% endif %}{% if not loop.last or 'multipart/form-data' in method.consumes %},{% endif %}

templates/cli/lib/commands/command.js.twig

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ const {{ service.name | caseLower }} = new Command("{{ service.name | caseLower
5959
/**
6060
* @param {{ "{" }}{{ service.name | caseUcfirst }}{{ method.name | caseUcfirst }}RequestParams{{ "}" }} params
6161
*/
62-
{%~ block decleration -%}
62+
{% block declaration %}
6363
const {{ service.name | caseLower }}{{ method.name | caseUcfirst }} = async ({
6464
{%- for parameter in method.parameters.all -%}
6565
{{ parameter.name | caseCamel | escapeKeyword }},
@@ -72,7 +72,13 @@ const {{ service.name | caseLower }}{{ method.name | caseUcfirst }} = async ({
7272
{%- if method.type == 'location' -%}, destination{%- endif -%}
7373
{% if hasConsolePreview(method.name,service.name) %}, console{%- endif -%}
7474
}) => {
75-
{%~ endblock %}
75+
{% if method.deprecated %}
76+
{% if method.since and method.replaceWith %}
77+
console.warn('Warning: This command is deprecated since {{ method.since }}.{% if method.replaceWith %} Please use "{{ method.replaceWith | replace({'.': ' '}) | caseKebab }}" instead.{% endif %}');
78+
{% else %}
79+
console.warn('Warning: This command is deprecated.');
80+
{% endif %}
81+
{% endif %}
7682
let client = !sdk ? await {% if service.name == "projects" %}sdkForConsole(){% else %}sdkForProject(){% endif %} :
7783
sdk;
7884
let apiPath = '{{ method.path }}'{% for parameter in method.parameters.path %}.replace('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %};
@@ -82,13 +88,14 @@ const {{ service.name | caseLower }}{{ method.name | caseUcfirst }} = async ({
8288
{{ include('cli/base/requests/api.twig') }}
8389
{% endif %}
8490
}
91+
{% endblock declaration %}
8592

8693
{% endfor %}
8794
{% for method in service.methods %}
8895
{{service.name | caseLower }}
8996
.command(`{{ method.name | caseKebab }}`)
9097
{% autoescape false %}
91-
.description(`{{ method.description | replace({'`':'\''}) | replace({'\n':' '}) | replace({'\n \n':' '}) }}`)
98+
.description(`{% if method.deprecated %}[**DEPRECATED** - This command is deprecated.{% if method.replaceWith %} Please use '{{ method.replaceWith | replace({'.': ' '}) | caseKebab }}' instead{% endif %}] {% endif %}{{ method.description | replace({'`':'\''}) | replace({'\n':' '}) | replace({'\n \n':' '}) }}`)
9299
{% for parameter in method.parameters.all %}
93100
.{% if parameter.required and not parameter.nullable %}requiredOption{% else %}option{% endif %}(`--{{ parameter.name | escapeKeyword | caseKebab }}{% if parameter | typeName == 'boolean' %} [value]{% else %} {% if parameter.array.type|length > 0 %}[{% else %}<{% endif %}{{ parameter.name | escapeKeyword | caseKebab }}{% if parameter.array.type|length > 0 %}...{% endif %}{% if parameter.array.type|length > 0 %}]{% else %}>{% endif %}{% endif %}`, `{{ parameter.description | replace({'`':'\''}) | replace({'\n':' '}) | replace({'\n \n':' '}) }}`{% if parameter | typeName == 'boolean' %}, (value) => value === undefined ? true : parseBool(value){% elseif parameter | typeName == 'number' %}, parseInteger{% endif %})
94101
{% endfor %}

templates/dart/lib/services/service.dart.twig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ class {{ service.name | caseUcfirst }} extends Service {
1717
{%~ if method.description %}
1818
{{ method.description | dartComment }}
1919
{% endif %}
20+
{%~ if method.deprecated %}
21+
{%~ if method.since and method.replaceWith %}
22+
@Deprecated('This API has been deprecated since {{ method.since }}. Please use `{{ method.replaceWith | capitalizeFirst }}` instead.')
23+
{%~ else %}
24+
@Deprecated('This API has been deprecated.')
25+
{%~ endif %}
26+
{%~ endif %}
2027
{% if method.type == 'location' %}Future<Uint8List>{% else %}{% if method.responseModel and method.responseModel != 'any' %}Future<models.{{method.responseModel | caseUcfirst | overrideIdentifier}}>{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel | overrideIdentifier }}({{ _self.method_parameters(method.parameters.all, method.consumes) }}) async {
2128
final String apiPath = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | overrideIdentifier }}{% if parameter.enumValues | length > 0 %}.value{% endif %}){% endfor %};
2229

templates/deno/src/services/service.ts.twig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ export class {{ service.name | caseUcfirst }} extends Service {
7777
{% endfor %}
7878
* @throws {AppwriteException}
7979
* @returns {Promise}
80+
{%~ if method.deprecated %}
81+
{%~ if method.since and method.replaceWith %}
82+
* @deprecated This API has been deprecated since {{ method.since }}. Please use `{{ method.replaceWith | capitalizeFirst }}` instead.
83+
{%~ else %}
84+
* @deprecated This API has been deprecated.
85+
{%~ endif %}
86+
{%~ endif %}
8087
*/
8188
async {{ method.name | caseCamel }}{% if generics %}<{{generics}}>{% endif %}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | typeName }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress = (progress: UploadProgress) => {}{% endif %}): Promise<{% if method.type == 'webAuth' %}string{% elseif method.type == 'location' %}ArrayBuffer{% else %}{% if method.responseModel and method.responseModel != 'any' %}{% if not spec.definitions[method.responseModel].additionalProperties %}Models.{% endif %}{{method.responseModel | caseUcfirst}}{% if generics_return %}<{{generics_return}}>{% endif %}{% else %}Response{% endif %}{% endif %}> {
8289
{% for parameter in method.parameters.all %}

templates/dotnet/Package/Services/ServiceTemplate.cs.twig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ namespace {{ spec.title | caseUcfirst }}.Services
2626
/// </para>
2727
{%~ endif %}
2828
/// </summary>
29+
{%~ if method.deprecated %}
30+
{%~ if method.since and method.replaceWith %}
31+
[Obsolete("This API has been deprecated since {{ method.since }}. Please use `{{ method.replaceWith | capitalizeFirst }}` instead.")]
32+
{%~ else %}
33+
[Obsolete("This API has been deprecated.")]
34+
{%~ endif %}
35+
{%~ endif %}
2936
public Task{% if method.type == "webAuth" %}<String>{% else %}<{{ utils.resultType(spec.title, method) }}>{% endif %} {{ method.name | caseUcfirst }}({{ utils.method_parameters(method.parameters, method.consumes) }})
3037
{
3138
var apiPath = "{{ method.path }}"{% if method.parameters.path | length == 0 %};{% endif %}

0 commit comments

Comments
 (0)