Skip to content

Commit f0ee4cc

Browse files
Merge pull request #1045 from appwrite/add-python-types
chore: add python types
2 parents 6a10a65 + ce3ab1b commit f0ee4cc

File tree

9 files changed

+184
-107
lines changed

9 files changed

+184
-107
lines changed

.github/workflows/tests.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ jobs:
3636
Node20,
3737
PHP80,
3838
PHP83,
39-
Python38,
4039
Python39,
4140
Python310,
41+
Python311,
42+
Python312,
4243
Ruby27,
4344
Ruby30,
4445
Ruby31,

composer.lock

+97-90
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example.php

+1
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ function getSSLPage($url) {
220220

221221
$sdk
222222
->setName('NAME')
223+
->setVersion('7.2.0')
223224
->setDescription('Repo description goes here')
224225
->setShortDescription('Repo short description goes here')
225226
->setURL('https://example.com')

src/SDK/Language/Python.php

+23-10
Original file line numberDiff line numberDiff line change
@@ -231,16 +231,26 @@ public function getTypeName(array $parameter, array $spec = []): string
231231
if (!empty($parameter['enumValues'])) {
232232
return \ucfirst($parameter['name']);
233233
}
234-
return match ($parameter['type'] ?? '') {
235-
self::TYPE_FILE => 'InputFile',
236-
self::TYPE_NUMBER,
237-
self::TYPE_INTEGER => 'float',
238-
self::TYPE_BOOLEAN => 'bool',
239-
self::TYPE_STRING => 'str',
240-
self::TYPE_ARRAY => 'list',
241-
self::TYPE_OBJECT => 'dict',
242-
default => $parameter['type'],
243-
};
234+
switch ($parameter['type'] ?? '') {
235+
case self::TYPE_FILE:
236+
return 'InputFile';
237+
case self::TYPE_NUMBER:
238+
case self::TYPE_INTEGER:
239+
return 'float';
240+
case self::TYPE_BOOLEAN:
241+
return 'bool';
242+
case self::TYPE_STRING:
243+
return 'str';
244+
case self::TYPE_ARRAY:
245+
if (!empty(($parameter['array'] ?? [])['type']) && !\is_array($parameter['array']['type'])) {
246+
return 'list[' . $this->getTypeName($parameter['array']) . ']';
247+
}
248+
return 'list[str]';
249+
case self::TYPE_OBJECT:
250+
return 'dict';
251+
default:
252+
return $parameter['type'];
253+
}
244254
}
245255

246256
/**
@@ -360,6 +370,9 @@ public function getFilters(): array
360370
new TwigFilter('caseEnumKey', function (string $value) {
361371
return $this->toUpperSnakeCase($value);
362372
}),
373+
new TwigFilter('getPropertyType', function ($value, $method = []) {
374+
return $this->getTypeName($value, $method);
375+
}),
363376
];
364377
}
365378
}

templates/python/.github/workflows/publish.yml.twig

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
- name: Set up Python
1515
uses: actions/setup-python@v5
1616
with:
17-
python-version: '3.8'
17+
python-version: '3.9'
1818

1919
- name: Build package
2020
run: |

templates/python/package/client.py.twig

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class Client:
1313
self._endpoint = '{{spec.endpoint}}'
1414
self._global_headers = {
1515
'content-type': '',
16-
'user-agent' : '{{spec.title | caseUcfirst}}{{ language.name | caseUcfirst }}SDK/{{ sdk.version }} (${os.uname().sysname}; ${os.uname().version}; ${os.uname().machine})',
16+
'user-agent' : f'{{spec.title | caseUcfirst}}{{ language.name | caseUcfirst }}SDK/{{ sdk.version }} ({os.uname().sysname}; {os.uname().version}; {os.uname().machine})',
1717
'x-sdk-name': '{{ sdk.name }}',
1818
'x-sdk-platform': '{{ sdk.platform }}',
1919
'x-sdk-language': '{{ language.name | caseLower }}',

templates/python/package/services/service.py.twig

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,34 @@
11
from ..service import Service
22
from ..exception import AppwriteException
3+
{% set added = [] %}
4+
{% for method in service.methods %}
5+
{% for parameter in method.parameters.all %}
6+
{% if parameter.type == 'file' and parameter.type not in added %}
7+
from ..input_file import InputFile
8+
{% set added = added|merge(['InputFile']) %}
9+
{% endif %}
10+
{% if parameter.enumValues is not empty%}
11+
{% if parameter.enumName is not empty %}
12+
{% set name = parameter.enumName %}
13+
{% else %}
14+
{% set name = parameter.name %}
15+
{% endif %}
16+
{% if name not in added %}
17+
from ..enums.{{ name | caseSnake }} import {{ name | caseUcfirst }};
18+
{% set added = added|merge([name]) %}
19+
{% endif %}
20+
{% endif %}
21+
{% endfor %}
22+
{% endfor %}
323

424
class {{ service.name | caseUcfirst }}(Service):
525

626
def __init__(self, client):
727
super({{ service.name | caseUcfirst }}, self).__init__(client)
828
{% for method in service.methods %}
929

10-
def {{ method.name | caseSnake }}(self{% if method.parameters.all|length > 0 %}, {% endif %}{% for parameter in method.parameters.all %}{{ parameter.name | escapeKeyword | caseSnake }}{% if not parameter.required %} = None{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, on_progress = None{% endif %}):
30+
def {{ method.name | caseSnake }}(self{% if method.parameters.all|length > 0 %}, {% endif %}{% for parameter in method.parameters.all %}{{ parameter.name | escapeKeyword | caseSnake }}: {{ parameter | getPropertyType(method) | raw }}{% if not parameter.required %} = None{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, on_progress = None{% endif %}):
31+
"""{{method.title}}"""
1132

1233
api_path = '{{ method.path }}'
1334
{{ include('python/base/params.twig') }}

tests/Python38Test.php renamed to tests/Python311Test.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Tests;
44

5-
class Python38Test extends Base
5+
class Python311Test extends Base
66
{
77
protected string $sdkName = 'python';
88
protected string $sdkPlatform = 'server';
@@ -14,10 +14,10 @@ class Python38Test extends Base
1414
protected array $build = [
1515
'cp tests/languages/python/tests.py tests/sdks/python/test.py',
1616
'echo "" > tests/sdks/python/__init__.py',
17-
'docker run --rm -v $(pwd):/app -w /app --env PIP_TARGET=tests/sdks/python/vendor python:3.8-alpine pip install -r tests/sdks/python/requirements.txt --upgrade',
17+
'docker run --rm -v $(pwd):/app -w /app --env PIP_TARGET=tests/sdks/python/vendor python:3.11-alpine pip install -r tests/sdks/python/requirements.txt --upgrade',
1818
];
1919
protected string $command =
20-
'docker run --network="mockapi" --rm -v $(pwd):/app -w /app --env PIP_TARGET=tests/sdks/python/vendor --env PYTHONPATH=tests/sdks/python/vendor python:3.8-alpine python tests/sdks/python/test.py';
20+
'docker run --network="mockapi" --rm -v $(pwd):/app -w /app --env PIP_TARGET=tests/sdks/python/vendor --env PYTHONPATH=tests/sdks/python/vendor python:3.11-alpine python tests/sdks/python/test.py';
2121

2222
protected array $expectedOutput = [
2323
...Base::FOO_RESPONSES,

tests/Python312Test.php

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Tests;
4+
5+
class Python312Test extends Base
6+
{
7+
protected string $sdkName = 'python';
8+
protected string $sdkPlatform = 'server';
9+
protected string $sdkLanguage = 'python';
10+
protected string $version = '0.0.1';
11+
12+
protected string $language = 'python';
13+
protected string $class = 'Appwrite\SDK\Language\Python';
14+
protected array $build = [
15+
'cp tests/languages/python/tests.py tests/sdks/python/test.py',
16+
'echo "" > tests/sdks/python/__init__.py',
17+
'docker run --rm -v $(pwd):/app -w /app --env PIP_TARGET=tests/sdks/python/vendor python:3.12-alpine pip install -r tests/sdks/python/requirements.txt --upgrade',
18+
];
19+
protected string $command =
20+
'docker run --network="mockapi" --rm -v $(pwd):/app -w /app --env PIP_TARGET=tests/sdks/python/vendor --env PYTHONPATH=tests/sdks/python/vendor python:3.12-alpine python tests/sdks/python/test.py';
21+
22+
protected array $expectedOutput = [
23+
...Base::FOO_RESPONSES,
24+
...Base::BAR_RESPONSES,
25+
...Base::GENERAL_RESPONSES,
26+
...Base::UPLOAD_RESPONSES,
27+
...Base::ENUM_RESPONSES,
28+
...Base::EXCEPTION_RESPONSES,
29+
...Base::OAUTH_RESPONSES,
30+
...Base::QUERY_HELPER_RESPONSES,
31+
...Base::PERMISSION_HELPER_RESPONSES,
32+
...Base::ID_HELPER_RESPONSES
33+
];
34+
}

0 commit comments

Comments
 (0)