stackit-authorization 0.7.0__tar.gz → 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- stackit_authorization-0.8.0/.gitignore +267 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/PKG-INFO +10 -11
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/pyproject.toml +48 -36
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/api_client.py +36 -25
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/exceptions.py +1 -1
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/__init__.py +0 -1
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/add_custom_role_response.py +10 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/add_members_payload.py +10 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/add_role_payload.py +10 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/delete_role_response.py +4 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/error_response.py +4 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/existing_permission.py +7 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/get_role_response.py +10 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/list_members_response.py +13 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/list_permissions_response.py +7 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/list_user_memberships_response.py +7 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/list_user_permissions_response.py +7 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/member.py +7 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/members_response.py +13 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/permission.py +7 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/permission_request.py +7 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/remove_members_payload.py +10 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/role.py +13 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/roles_response.py +13 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/update_role_payload.py +10 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/update_role_response.py +10 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/user_membership.py +13 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/user_permission.py +13 -6
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/models/zookie.py +4 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/rest.py +19 -3
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/LICENSE.md +0 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/NOTICE.txt +0 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/README.md +0 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/__init__.py +0 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/api/__init__.py +0 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/api/default_api.py +0 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/api_response.py +0 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/configuration.py +0 -0
- {stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/py.typed +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
### VisualStudioCode template
|
|
2
|
+
.vscode/*
|
|
3
|
+
!.vscode/settings.json
|
|
4
|
+
!.vscode/tasks.json
|
|
5
|
+
!.vscode/launch.json
|
|
6
|
+
!.vscode/extensions.json
|
|
7
|
+
!.vscode/*.code-snippets
|
|
8
|
+
|
|
9
|
+
# Local History for Visual Studio Code
|
|
10
|
+
.history/
|
|
11
|
+
|
|
12
|
+
# Built Visual Studio Code Extensions
|
|
13
|
+
*.vsix
|
|
14
|
+
|
|
15
|
+
### JetBrains template
|
|
16
|
+
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
|
17
|
+
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
|
18
|
+
|
|
19
|
+
# User-specific stuff
|
|
20
|
+
.idea/**/workspace.xml
|
|
21
|
+
.idea/**/tasks.xml
|
|
22
|
+
.idea/**/usage.statistics.xml
|
|
23
|
+
.idea/**/dictionaries
|
|
24
|
+
.idea/**/shelf
|
|
25
|
+
|
|
26
|
+
# AWS User-specific
|
|
27
|
+
.idea/**/aws.xml
|
|
28
|
+
|
|
29
|
+
# Generated files
|
|
30
|
+
.idea/**/contentModel.xml
|
|
31
|
+
|
|
32
|
+
# Sensitive or high-churn files
|
|
33
|
+
.idea/**/dataSources/
|
|
34
|
+
.idea/**/dataSources.ids
|
|
35
|
+
.idea/**/dataSources.local.xml
|
|
36
|
+
.idea/**/sqlDataSources.xml
|
|
37
|
+
.idea/**/dynamic.xml
|
|
38
|
+
.idea/**/uiDesigner.xml
|
|
39
|
+
.idea/**/dbnavigator.xml
|
|
40
|
+
|
|
41
|
+
# Gradle
|
|
42
|
+
.idea/**/gradle.xml
|
|
43
|
+
.idea/**/libraries
|
|
44
|
+
|
|
45
|
+
# Gradle and Maven with auto-import
|
|
46
|
+
# When using Gradle or Maven with auto-import, you should exclude module files,
|
|
47
|
+
# since they will be recreated, and may cause churn. Uncomment if using
|
|
48
|
+
# auto-import.
|
|
49
|
+
# .idea/artifacts
|
|
50
|
+
# .idea/compiler.xml
|
|
51
|
+
# .idea/jarRepositories.xml
|
|
52
|
+
# .idea/modules.xml
|
|
53
|
+
# .idea/*.iml
|
|
54
|
+
# .idea/modules
|
|
55
|
+
# *.iml
|
|
56
|
+
# *.ipr
|
|
57
|
+
|
|
58
|
+
# CMake
|
|
59
|
+
cmake-build-*/
|
|
60
|
+
|
|
61
|
+
# Mongo Explorer plugin
|
|
62
|
+
.idea/**/mongoSettings.xml
|
|
63
|
+
|
|
64
|
+
# File-based project format
|
|
65
|
+
*.iws
|
|
66
|
+
|
|
67
|
+
# IntelliJ
|
|
68
|
+
out/
|
|
69
|
+
|
|
70
|
+
# mpeltonen/sbt-idea plugin
|
|
71
|
+
.idea_modules/
|
|
72
|
+
|
|
73
|
+
# JIRA plugin
|
|
74
|
+
atlassian-ide-plugin.xml
|
|
75
|
+
|
|
76
|
+
# Cursive Clojure plugin
|
|
77
|
+
.idea/replstate.xml
|
|
78
|
+
|
|
79
|
+
# SonarLint plugin
|
|
80
|
+
.idea/sonarlint/
|
|
81
|
+
|
|
82
|
+
# Crashlytics plugin (for Android Studio and IntelliJ)
|
|
83
|
+
com_crashlytics_export_strings.xml
|
|
84
|
+
crashlytics.properties
|
|
85
|
+
crashlytics-build.properties
|
|
86
|
+
fabric.properties
|
|
87
|
+
|
|
88
|
+
# Editor-based Rest Client
|
|
89
|
+
.idea/httpRequests
|
|
90
|
+
|
|
91
|
+
# Android studio 3.1+ serialized cache file
|
|
92
|
+
.idea/caches/build_file_checksums.ser
|
|
93
|
+
|
|
94
|
+
### VirtualEnv template
|
|
95
|
+
# Virtualenv
|
|
96
|
+
# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
|
|
97
|
+
.Python
|
|
98
|
+
[Bb]in
|
|
99
|
+
[Ii]nclude
|
|
100
|
+
[Ll]ib
|
|
101
|
+
[Ll]ib64
|
|
102
|
+
[Ll]ocal
|
|
103
|
+
[Ss]cripts
|
|
104
|
+
pyvenv.cfg
|
|
105
|
+
.venv
|
|
106
|
+
pip-selfcheck.json
|
|
107
|
+
|
|
108
|
+
### Python template
|
|
109
|
+
# Byte-compiled / optimized / DLL files
|
|
110
|
+
__pycache__/
|
|
111
|
+
*.py[cod]
|
|
112
|
+
*$py.class
|
|
113
|
+
|
|
114
|
+
# C extensions
|
|
115
|
+
*.so
|
|
116
|
+
|
|
117
|
+
# Distribution / packaging
|
|
118
|
+
build/
|
|
119
|
+
develop-eggs/
|
|
120
|
+
dist/
|
|
121
|
+
downloads/
|
|
122
|
+
eggs/
|
|
123
|
+
.eggs/
|
|
124
|
+
lib/
|
|
125
|
+
lib64/
|
|
126
|
+
parts/
|
|
127
|
+
sdist/
|
|
128
|
+
var/
|
|
129
|
+
wheels/
|
|
130
|
+
share/python-wheels/
|
|
131
|
+
*.egg-info/
|
|
132
|
+
.installed.cfg
|
|
133
|
+
*.egg
|
|
134
|
+
MANIFEST
|
|
135
|
+
|
|
136
|
+
# PyInstaller
|
|
137
|
+
# Usually these files are written by a python script from a template
|
|
138
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
139
|
+
*.manifest
|
|
140
|
+
*.spec
|
|
141
|
+
|
|
142
|
+
# Installer logs
|
|
143
|
+
pip-log.txt
|
|
144
|
+
pip-delete-this-directory.txt
|
|
145
|
+
|
|
146
|
+
# Unit test / coverage reports
|
|
147
|
+
htmlcov/
|
|
148
|
+
.tox/
|
|
149
|
+
.nox/
|
|
150
|
+
.coverage
|
|
151
|
+
.coverage.*
|
|
152
|
+
.cache
|
|
153
|
+
nosetests.xml
|
|
154
|
+
coverage.xml
|
|
155
|
+
*.cover
|
|
156
|
+
*.py,cover
|
|
157
|
+
.hypothesis/
|
|
158
|
+
.pytest_cache/
|
|
159
|
+
cover/
|
|
160
|
+
|
|
161
|
+
# Translations
|
|
162
|
+
*.mo
|
|
163
|
+
*.pot
|
|
164
|
+
|
|
165
|
+
# Django stuff:
|
|
166
|
+
*.log
|
|
167
|
+
local_settings.py
|
|
168
|
+
db.sqlite3
|
|
169
|
+
db.sqlite3-journal
|
|
170
|
+
|
|
171
|
+
# Flask stuff:
|
|
172
|
+
instance/
|
|
173
|
+
.webassets-cache
|
|
174
|
+
|
|
175
|
+
# Scrapy stuff:
|
|
176
|
+
.scrapy
|
|
177
|
+
|
|
178
|
+
# Sphinx documentation
|
|
179
|
+
docs/_build/
|
|
180
|
+
|
|
181
|
+
# PyBuilder
|
|
182
|
+
.pybuilder/
|
|
183
|
+
target/
|
|
184
|
+
|
|
185
|
+
# Jupyter Notebook
|
|
186
|
+
.ipynb_checkpoints
|
|
187
|
+
|
|
188
|
+
# IPython
|
|
189
|
+
profile_default/
|
|
190
|
+
ipython_config.py
|
|
191
|
+
|
|
192
|
+
# pyenv
|
|
193
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
194
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
195
|
+
# .python-version
|
|
196
|
+
|
|
197
|
+
# pipenv
|
|
198
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
199
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
200
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
201
|
+
# install all needed dependencies.
|
|
202
|
+
#Pipfile.lock
|
|
203
|
+
|
|
204
|
+
# poetry
|
|
205
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
206
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
207
|
+
# commonly ignored for libraries.
|
|
208
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
209
|
+
#poetry.lock
|
|
210
|
+
|
|
211
|
+
# pdm
|
|
212
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
213
|
+
#pdm.lock
|
|
214
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
215
|
+
# in version control.
|
|
216
|
+
# https://pdm.fming.dev/#use-with-ide
|
|
217
|
+
.pdm.toml
|
|
218
|
+
|
|
219
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
220
|
+
__pypackages__/
|
|
221
|
+
|
|
222
|
+
# Celery stuff
|
|
223
|
+
celerybeat-schedule
|
|
224
|
+
celerybeat.pid
|
|
225
|
+
|
|
226
|
+
# SageMath parsed files
|
|
227
|
+
*.sage.py
|
|
228
|
+
|
|
229
|
+
# Environments
|
|
230
|
+
.env
|
|
231
|
+
env/
|
|
232
|
+
venv/
|
|
233
|
+
ENV/
|
|
234
|
+
env.bak/
|
|
235
|
+
venv.bak/
|
|
236
|
+
|
|
237
|
+
# Spyder project settings
|
|
238
|
+
.spyderproject
|
|
239
|
+
.spyproject
|
|
240
|
+
|
|
241
|
+
# Rope project settings
|
|
242
|
+
.ropeproject
|
|
243
|
+
|
|
244
|
+
# mkdocs documentation
|
|
245
|
+
/site
|
|
246
|
+
|
|
247
|
+
# mypy
|
|
248
|
+
.mypy_cache/
|
|
249
|
+
.dmypy.json
|
|
250
|
+
dmypy.json
|
|
251
|
+
|
|
252
|
+
# Pyre type checker
|
|
253
|
+
.pyre/
|
|
254
|
+
|
|
255
|
+
# pytype static type analyzer
|
|
256
|
+
.pytype/
|
|
257
|
+
|
|
258
|
+
# Cython debug symbols
|
|
259
|
+
cython_debug/
|
|
260
|
+
|
|
261
|
+
# PyCharm
|
|
262
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
263
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
264
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
265
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
266
|
+
.idea/
|
|
267
|
+
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: stackit-authorization
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: STACKIT Membership API
|
|
5
|
+
Project-URL: Homepage, https://github.com/stackitcloud/stackit-sdk-python
|
|
6
|
+
Project-URL: Issues, https://github.com/stackitcloud/stackit-sdk-python/issues
|
|
7
|
+
Author-email: STACKIT Developer Tools <developer-tools@stackit.cloud>
|
|
5
8
|
License-File: LICENSE.md
|
|
6
9
|
License-File: NOTICE.txt
|
|
7
|
-
Author: STACKIT Developer Tools
|
|
8
|
-
Author-email: developer-tools@stackit.cloud
|
|
9
|
-
Requires-Python: >=3.9,<4.0
|
|
10
10
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
11
|
Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -16,12 +16,11 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
-
Requires-
|
|
20
|
-
Requires-Dist:
|
|
21
|
-
Requires-Dist:
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
|
|
24
|
-
Project-URL: Issues, https://github.com/stackitcloud/stackit-sdk-python/issues
|
|
19
|
+
Requires-Python: <4.0,>=3.9
|
|
20
|
+
Requires-Dist: pydantic>=2.9.2
|
|
21
|
+
Requires-Dist: python-dateutil>=2.9.0.post0
|
|
22
|
+
Requires-Dist: requests>=2.32.3
|
|
23
|
+
Requires-Dist: stackit-core>=0.0.1a
|
|
25
24
|
Description-Content-Type: text/markdown
|
|
26
25
|
|
|
27
26
|
# stackit.authorization
|
|
@@ -45,4 +44,4 @@ import stackit.authorization
|
|
|
45
44
|
|
|
46
45
|
## Getting Started
|
|
47
46
|
|
|
48
|
-
[Examples](https://github.com/stackitcloud/stackit-sdk-python/tree/main/examples) for the usage of the package can be found in the [GitHub repository](https://github.com/stackitcloud/stackit-sdk-python) of the SDK.
|
|
47
|
+
[Examples](https://github.com/stackitcloud/stackit-sdk-python/tree/main/examples) for the usage of the package can be found in the [GitHub repository](https://github.com/stackitcloud/stackit-sdk-python) of the SDK.
|
|
@@ -1,55 +1,67 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "stackit-authorization"
|
|
3
|
-
|
|
4
|
-
[tool.poetry]
|
|
5
|
-
name = "stackit-authorization"
|
|
6
|
-
version = "v0.7.0"
|
|
7
|
-
authors = [
|
|
8
|
-
"STACKIT Developer Tools <developer-tools@stackit.cloud>",
|
|
9
|
-
]
|
|
3
|
+
version = "v0.8.0"
|
|
10
4
|
description = "STACKIT Membership API"
|
|
5
|
+
authors = [{ name = "STACKIT Developer Tools", email = "developer-tools@stackit.cloud" }]
|
|
6
|
+
requires-python = ">=3.9,<4.0"
|
|
11
7
|
readme = "README.md"
|
|
12
|
-
#license = "NoLicense"
|
|
13
8
|
classifiers = [
|
|
14
9
|
"Programming Language :: Python :: 3",
|
|
15
10
|
"License :: OSI Approved :: Apache Software License",
|
|
16
11
|
"Operating System :: OS Independent",
|
|
12
|
+
"Programming Language :: Python :: 3.9",
|
|
13
|
+
"Programming Language :: Python :: 3.10",
|
|
14
|
+
"Programming Language :: Python :: 3.11",
|
|
15
|
+
"Programming Language :: Python :: 3.12",
|
|
16
|
+
"Programming Language :: Python :: 3.13",
|
|
17
|
+
"Programming Language :: Python :: 3.14",
|
|
17
18
|
]
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
dependencies = [
|
|
20
|
+
"stackit-core>=0.0.1a",
|
|
21
|
+
"requests>=2.32.3",
|
|
22
|
+
"pydantic>=2.9.2",
|
|
23
|
+
"python-dateutil>=2.9.0.post0",
|
|
20
24
|
]
|
|
21
25
|
|
|
22
|
-
[tool.poetry.dependencies]
|
|
23
|
-
python = ">=3.9,<4.0"
|
|
24
|
-
stackit-core = ">=0.0.1a"
|
|
25
|
-
requests = ">=2.32.3"
|
|
26
|
-
pydantic = ">=2.9.2"
|
|
27
|
-
python-dateutil = ">=2.9.0.post0"
|
|
28
|
-
|
|
29
|
-
[tool.poetry.group.dev.dependencies]
|
|
30
|
-
black = ">=24.8.0"
|
|
31
|
-
pytest = ">=8.3.3"
|
|
32
|
-
flake8 = [
|
|
33
|
-
{ version= ">=5.0.3", python="<3.12"},
|
|
34
|
-
{ version= ">=6.0.1", python=">=3.12"}
|
|
35
|
-
]
|
|
36
|
-
flake8-black = ">=0.3.6"
|
|
37
|
-
flake8-pyproject = ">=1.2.3"
|
|
38
|
-
autoimport = ">=1.6.1"
|
|
39
|
-
flake8-eol = ">=0.0.8"
|
|
40
|
-
flake8-eradicate = ">=1.5.0"
|
|
41
|
-
flake8-bandit = ">=4.1.1"
|
|
42
|
-
flake8-bugbear = ">=23.1.14"
|
|
43
|
-
flake8-quotes = ">=3.4.0"
|
|
44
|
-
isort = ">=5.13.2"
|
|
45
|
-
|
|
46
26
|
[project.urls]
|
|
47
27
|
Homepage = "https://github.com/stackitcloud/stackit-sdk-python"
|
|
48
28
|
Issues = "https://github.com/stackitcloud/stackit-sdk-python/issues"
|
|
49
29
|
|
|
30
|
+
[dependency-groups]
|
|
31
|
+
dev = [
|
|
32
|
+
"black>=24.8.0",
|
|
33
|
+
"pytest>=8.3.3",
|
|
34
|
+
"flake8>=5.0.3 ; python_full_version < '3.12'",
|
|
35
|
+
"flake8>=6.0.1 ; python_full_version >= '3.12'",
|
|
36
|
+
"flake8-black>=0.3.6",
|
|
37
|
+
"flake8-pyproject>=1.2.3",
|
|
38
|
+
"autoimport>=1.6.1",
|
|
39
|
+
"flake8-eol>=0.0.8",
|
|
40
|
+
"flake8-eradicate>=1.5.0",
|
|
41
|
+
"flake8-bandit>=4.1.1",
|
|
42
|
+
"flake8-bugbear>=23.1.14",
|
|
43
|
+
"flake8-quotes>=3.4.0",
|
|
44
|
+
"isort>=5.13.2",
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
[tool.uv]
|
|
48
|
+
default-groups = "all"
|
|
49
|
+
|
|
50
|
+
[tool.uv.sources]
|
|
51
|
+
stackit-core = { path = "../../core" }
|
|
52
|
+
|
|
53
|
+
[tool.hatch.build.targets.sdist]
|
|
54
|
+
include = ["src/stackit"]
|
|
55
|
+
|
|
56
|
+
[tool.hatch.build.targets.wheel]
|
|
57
|
+
include = ["src/stackit"]
|
|
58
|
+
|
|
59
|
+
[tool.hatch.build.targets.wheel.sources]
|
|
60
|
+
"src/stackit" = "stackit"
|
|
61
|
+
|
|
50
62
|
[build-system]
|
|
51
|
-
requires = ["
|
|
52
|
-
build-backend = "
|
|
63
|
+
requires = ["hatchling"]
|
|
64
|
+
build-backend = "hatchling.build"
|
|
53
65
|
|
|
54
66
|
[tool.pytest.ini_options]
|
|
55
67
|
pythonpath = [
|
{stackit_authorization-0.7.0 → stackit_authorization-0.8.0}/src/stackit/authorization/api_client.py
RENAMED
|
@@ -12,11 +12,13 @@
|
|
|
12
12
|
""" # noqa: E501
|
|
13
13
|
|
|
14
14
|
import datetime
|
|
15
|
+
import decimal
|
|
15
16
|
import json
|
|
16
17
|
import mimetypes
|
|
17
18
|
import os
|
|
18
19
|
import re
|
|
19
20
|
import tempfile
|
|
21
|
+
import uuid
|
|
20
22
|
from enum import Enum
|
|
21
23
|
from typing import Dict, List, Optional, Tuple, Union
|
|
22
24
|
from urllib.parse import quote
|
|
@@ -63,8 +65,11 @@ class ApiClient:
|
|
|
63
65
|
"bool": bool,
|
|
64
66
|
"date": datetime.date,
|
|
65
67
|
"datetime": datetime.datetime,
|
|
68
|
+
"decimal": decimal.Decimal,
|
|
69
|
+
"UUID": uuid.UUID,
|
|
66
70
|
"object": object,
|
|
67
71
|
}
|
|
72
|
+
_pool = None
|
|
68
73
|
|
|
69
74
|
def __init__(self, configuration, header_name=None, header_value=None, cookie=None) -> None:
|
|
70
75
|
self.config: Configuration = configuration
|
|
@@ -261,13 +266,13 @@ class ApiClient:
|
|
|
261
266
|
response_text = None
|
|
262
267
|
return_data = None
|
|
263
268
|
try:
|
|
264
|
-
if response_type
|
|
269
|
+
if response_type in ("bytearray", "bytes"):
|
|
265
270
|
return_data = response_data.data
|
|
266
271
|
elif response_type == "file":
|
|
267
272
|
return_data = self.__deserialize_file(response_data)
|
|
268
273
|
elif response_type is not None:
|
|
269
274
|
match = None
|
|
270
|
-
content_type = response_data.
|
|
275
|
+
content_type = response_data.headers.get("content-type")
|
|
271
276
|
if content_type is not None:
|
|
272
277
|
match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type)
|
|
273
278
|
encoding = match.group(1) if match else "utf-8"
|
|
@@ -284,7 +289,7 @@ class ApiClient:
|
|
|
284
289
|
return ApiResponse(
|
|
285
290
|
status_code=response_data.status,
|
|
286
291
|
data=return_data,
|
|
287
|
-
headers=response_data.
|
|
292
|
+
headers=response_data.headers,
|
|
288
293
|
raw_data=response_data.data,
|
|
289
294
|
)
|
|
290
295
|
|
|
@@ -296,6 +301,7 @@ class ApiClient:
|
|
|
296
301
|
If obj is str, int, long, float, bool, return directly.
|
|
297
302
|
If obj is datetime.datetime, datetime.date
|
|
298
303
|
convert to string in iso8601 format.
|
|
304
|
+
If obj is decimal.Decimal return string representation.
|
|
299
305
|
If obj is list, sanitize each element in the list.
|
|
300
306
|
If obj is dict, return the dict.
|
|
301
307
|
If obj is OpenAPI model, return the properties dict.
|
|
@@ -311,31 +317,30 @@ class ApiClient:
|
|
|
311
317
|
return obj.get_secret_value()
|
|
312
318
|
elif isinstance(obj, self.PRIMITIVE_TYPES):
|
|
313
319
|
return obj
|
|
320
|
+
elif isinstance(obj, uuid.UUID):
|
|
321
|
+
return str(obj)
|
|
314
322
|
elif isinstance(obj, list):
|
|
315
323
|
return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj]
|
|
316
324
|
elif isinstance(obj, tuple):
|
|
317
325
|
return tuple(self.sanitize_for_serialization(sub_obj) for sub_obj in obj)
|
|
318
326
|
elif isinstance(obj, (datetime.datetime, datetime.date)):
|
|
319
327
|
return obj.isoformat()
|
|
320
|
-
|
|
328
|
+
elif isinstance(obj, decimal.Decimal):
|
|
329
|
+
return str(obj)
|
|
321
330
|
elif isinstance(obj, dict):
|
|
322
|
-
|
|
331
|
+
return {key: self.sanitize_for_serialization(val) for key, val in obj.items()}
|
|
332
|
+
|
|
333
|
+
# Convert model obj to dict except
|
|
334
|
+
# attributes `openapi_types`, `attribute_map`
|
|
335
|
+
# and attributes which value is not None.
|
|
336
|
+
# Convert attribute name to json key in
|
|
337
|
+
# model definition for request.
|
|
338
|
+
if hasattr(obj, "to_dict") and callable(getattr(obj, "to_dict")): # noqa: B009
|
|
339
|
+
obj_dict = obj.to_dict()
|
|
323
340
|
else:
|
|
324
|
-
|
|
325
|
-
# attributes `openapi_types`, `attribute_map`
|
|
326
|
-
# and attributes which value is not None.
|
|
327
|
-
# Convert attribute name to json key in
|
|
328
|
-
# model definition for request.
|
|
329
|
-
if hasattr(obj, "to_dict") and callable(obj.to_dict):
|
|
330
|
-
obj_dict = obj.to_dict()
|
|
331
|
-
else:
|
|
332
|
-
obj_dict = obj.__dict__
|
|
333
|
-
|
|
334
|
-
if isinstance(obj_dict, list):
|
|
335
|
-
# here we handle instances that can either be a list or something else, and only became a real list by calling to_dict() # noqa: E501
|
|
336
|
-
return self.sanitize_for_serialization(obj_dict)
|
|
341
|
+
obj_dict = obj.__dict__
|
|
337
342
|
|
|
338
|
-
return
|
|
343
|
+
return self.sanitize_for_serialization(obj_dict)
|
|
339
344
|
|
|
340
345
|
def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]):
|
|
341
346
|
"""Deserializes response into an object.
|
|
@@ -354,7 +359,7 @@ class ApiClient:
|
|
|
354
359
|
data = json.loads(response_text)
|
|
355
360
|
except ValueError:
|
|
356
361
|
data = response_text
|
|
357
|
-
elif re.match(r"^application/(json|[\w
|
|
362
|
+
elif re.match(r"^application/(json|[\w!#$&.+\-^_]+\+json)\s*(;|$)", content_type, re.IGNORECASE):
|
|
358
363
|
if response_text == "":
|
|
359
364
|
data = ""
|
|
360
365
|
else:
|
|
@@ -400,12 +405,16 @@ class ApiClient:
|
|
|
400
405
|
|
|
401
406
|
if klass in self.PRIMITIVE_TYPES:
|
|
402
407
|
return self.__deserialize_primitive(data, klass)
|
|
403
|
-
elif klass
|
|
408
|
+
elif klass is object:
|
|
404
409
|
return self.__deserialize_object(data)
|
|
405
|
-
elif klass
|
|
410
|
+
elif klass is datetime.date:
|
|
406
411
|
return self.__deserialize_date(data)
|
|
407
|
-
elif klass
|
|
412
|
+
elif klass is datetime.datetime:
|
|
408
413
|
return self.__deserialize_datetime(data)
|
|
414
|
+
elif klass is decimal.Decimal:
|
|
415
|
+
return decimal.Decimal(data)
|
|
416
|
+
elif klass is uuid.UUID:
|
|
417
|
+
return uuid.UUID(data)
|
|
409
418
|
elif issubclass(klass, Enum):
|
|
410
419
|
return self.__deserialize_enum(data, klass)
|
|
411
420
|
else:
|
|
@@ -553,12 +562,14 @@ class ApiClient:
|
|
|
553
562
|
os.close(fd)
|
|
554
563
|
os.remove(path)
|
|
555
564
|
|
|
556
|
-
content_disposition = response.
|
|
565
|
+
content_disposition = response.headers.get("Content-Disposition")
|
|
557
566
|
if content_disposition:
|
|
558
567
|
m = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', content_disposition)
|
|
559
568
|
if m is None:
|
|
560
569
|
raise ValueError("Unexpected 'content-disposition' header value")
|
|
561
|
-
filename = m.group(1)
|
|
570
|
+
filename = os.path.basename(m.group(1)) # Strip any directory traversal
|
|
571
|
+
if filename in ("", ".", ".."): # fall back to tmp filename
|
|
572
|
+
filename = os.path.basename(path)
|
|
562
573
|
path = os.path.join(os.path.dirname(path), filename)
|
|
563
574
|
|
|
564
575
|
with open(path, "wb") as f:
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
Do not edit the class manually.
|
|
13
13
|
""" # noqa: E501
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
# import models into model package
|
|
17
16
|
from stackit.authorization.models.add_custom_role_response import AddCustomRoleResponse
|
|
18
17
|
from stackit.authorization.models.add_members_payload import AddMembersPayload
|
|
@@ -19,6 +19,7 @@ import re # noqa: F401
|
|
|
19
19
|
from typing import Any, ClassVar, Dict, List, Optional, Set
|
|
20
20
|
|
|
21
21
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
22
|
+
from pydantic_core import to_jsonable_python
|
|
22
23
|
from typing_extensions import Annotated, Self
|
|
23
24
|
|
|
24
25
|
from stackit.authorization.models.role import Role
|
|
@@ -37,6 +38,9 @@ class AddCustomRoleResponse(BaseModel):
|
|
|
37
38
|
@field_validator("resource_id")
|
|
38
39
|
def resource_id_validate_regular_expression(cls, value):
|
|
39
40
|
"""Validates the regular expression"""
|
|
41
|
+
if not isinstance(value, str):
|
|
42
|
+
value = str(value)
|
|
43
|
+
|
|
40
44
|
if not re.match(r"^([a-zA-Z0-9\/_|\-=+@.]{1,})$", value):
|
|
41
45
|
raise ValueError(r"must validate the regular expression /^([a-zA-Z0-9\/_|\-=+@.]{1,})$/")
|
|
42
46
|
return value
|
|
@@ -44,12 +48,16 @@ class AddCustomRoleResponse(BaseModel):
|
|
|
44
48
|
@field_validator("resource_type")
|
|
45
49
|
def resource_type_validate_regular_expression(cls, value):
|
|
46
50
|
"""Validates the regular expression"""
|
|
51
|
+
if not isinstance(value, str):
|
|
52
|
+
value = str(value)
|
|
53
|
+
|
|
47
54
|
if not re.match(r"^[a-z](?:-?[a-z]){1,63}$", value):
|
|
48
55
|
raise ValueError(r"must validate the regular expression /^[a-z](?:-?[a-z]){1,63}$/")
|
|
49
56
|
return value
|
|
50
57
|
|
|
51
58
|
model_config = ConfigDict(
|
|
52
|
-
|
|
59
|
+
validate_by_name=True,
|
|
60
|
+
validate_by_alias=True,
|
|
53
61
|
validate_assignment=True,
|
|
54
62
|
protected_namespaces=(),
|
|
55
63
|
)
|
|
@@ -60,8 +68,7 @@ class AddCustomRoleResponse(BaseModel):
|
|
|
60
68
|
|
|
61
69
|
def to_json(self) -> str:
|
|
62
70
|
"""Returns the JSON representation of the model using alias"""
|
|
63
|
-
|
|
64
|
-
return json.dumps(self.to_dict())
|
|
71
|
+
return json.dumps(to_jsonable_python(self.to_dict()))
|
|
65
72
|
|
|
66
73
|
@classmethod
|
|
67
74
|
def from_json(cls, json_str: str) -> Optional[Self]:
|
|
@@ -19,6 +19,7 @@ import re # noqa: F401
|
|
|
19
19
|
from typing import Any, ClassVar, Dict, List, Optional, Set
|
|
20
20
|
|
|
21
21
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
22
|
+
from pydantic_core import to_jsonable_python
|
|
22
23
|
from typing_extensions import Annotated, Self
|
|
23
24
|
|
|
24
25
|
from stackit.authorization.models.member import Member
|
|
@@ -36,12 +37,16 @@ class AddMembersPayload(BaseModel):
|
|
|
36
37
|
@field_validator("resource_type")
|
|
37
38
|
def resource_type_validate_regular_expression(cls, value):
|
|
38
39
|
"""Validates the regular expression"""
|
|
40
|
+
if not isinstance(value, str):
|
|
41
|
+
value = str(value)
|
|
42
|
+
|
|
39
43
|
if not re.match(r"^[a-z](?:-?[a-z]){1,63}$", value):
|
|
40
44
|
raise ValueError(r"must validate the regular expression /^[a-z](?:-?[a-z]){1,63}$/")
|
|
41
45
|
return value
|
|
42
46
|
|
|
43
47
|
model_config = ConfigDict(
|
|
44
|
-
|
|
48
|
+
validate_by_name=True,
|
|
49
|
+
validate_by_alias=True,
|
|
45
50
|
validate_assignment=True,
|
|
46
51
|
protected_namespaces=(),
|
|
47
52
|
)
|
|
@@ -52,8 +57,7 @@ class AddMembersPayload(BaseModel):
|
|
|
52
57
|
|
|
53
58
|
def to_json(self) -> str:
|
|
54
59
|
"""Returns the JSON representation of the model using alias"""
|
|
55
|
-
|
|
56
|
-
return json.dumps(self.to_dict())
|
|
60
|
+
return json.dumps(to_jsonable_python(self.to_dict()))
|
|
57
61
|
|
|
58
62
|
@classmethod
|
|
59
63
|
def from_json(cls, json_str: str) -> Optional[Self]:
|
|
@@ -80,9 +84,9 @@ class AddMembersPayload(BaseModel):
|
|
|
80
84
|
# override the default output from pydantic by calling `to_dict()` of each item in members (list)
|
|
81
85
|
_items = []
|
|
82
86
|
if self.members:
|
|
83
|
-
for
|
|
84
|
-
if
|
|
85
|
-
_items.append(
|
|
87
|
+
for _item_members in self.members:
|
|
88
|
+
if _item_members:
|
|
89
|
+
_items.append(_item_members.to_dict())
|
|
86
90
|
_dict["members"] = _items
|
|
87
91
|
return _dict
|
|
88
92
|
|