pydplus 1.0.0.dev0__tar.gz → 2.0.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pydplus
3
- Version: 1.0.0.dev0
3
+ Version: 2.0.0
4
4
  Summary: A Python toolset for the RSA ID Plus cloud authentication platform
5
5
  License: MIT License
6
6
 
@@ -23,13 +23,13 @@ License: MIT License
23
23
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
24
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
25
  SOFTWARE.
26
- Keywords: rsa-security,id-plus,securid,authentication-manager,sso,mfa,iam,identity,authentication
26
+ Keywords: rsa-security,id-plus,rsa-id-plus,securid,rsa-securid,authentication-manager,rsa-authentication-manager,cloud-access-service,single-sign-on,sso,mfa,iam,identity,authentication,multifactor-authentication,fido
27
27
  Author: Jeff Shurtliff
28
28
  Author-email: jeffshurtliff@gmail.com
29
29
  Maintainer: Jeff Shurtliff
30
30
  Maintainer-email: jeffshurtliff@gmail.com
31
- Requires-Python: >=3.9.2,<3.14.0
32
- Classifier: Development Status :: 4 - Beta
31
+ Requires-Python: >=3.12,<3.14.0
32
+ Classifier: Development Status :: 5 - Production/Stable
33
33
  Classifier: License :: OSI Approved :: MIT License
34
34
  Classifier: License :: Freely Distributable
35
35
  Classifier: Intended Audience :: Information Technology
@@ -47,33 +47,29 @@ Classifier: Topic :: System :: Systems Administration
47
47
  Classifier: Topic :: System :: Systems Administration :: Authentication/Directory
48
48
  Classifier: Programming Language :: Python :: 3
49
49
  Classifier: Programming Language :: Python :: 3 :: Only
50
- Classifier: Programming Language :: Python :: 3.9
51
- Classifier: Programming Language :: Python :: 3.10
52
- Classifier: Programming Language :: Python :: 3.11
53
50
  Classifier: Programming Language :: Python :: 3.12
54
51
  Classifier: Programming Language :: Python :: 3.13
55
52
  Requires-Dist: PyYAML (>=6.0.3,<7)
56
53
  Requires-Dist: certifi (>=2024.7.4)
57
- Requires-Dist: cryptography (>=46.0.6)
58
- Requires-Dist: idna (>=3.7,<4)
59
- Requires-Dist: pyjwt (>=2.12.0)
54
+ Requires-Dist: cryptography (>=48.0.1)
55
+ Requires-Dist: idna (>=3.15,<4)
56
+ Requires-Dist: pyjwt (>=2.13.0)
60
57
  Requires-Dist: requests (>=2.32.5)
61
- Requires-Dist: tomli (>=2.0.0) ; python_version < "3.11"
62
- Requires-Dist: urllib3 (>=2.6.3,<3)
58
+ Requires-Dist: urllib3 (>=2.7.0,<3)
63
59
  Project-URL: Changelog, https://pydplus.readthedocs.io/en/latest/CHANGELOG.html
64
- Project-URL: Documentation, https://pydplus.readthedocs.io/en/latest/
60
+ Project-URL: Documentation, https://pydplus.readthedocs.io/en/stable/
65
61
  Project-URL: Homepage, https://github.com/jeffshurtliff/pydplus
66
62
  Project-URL: Issue Tracker, https://github.com/jeffshurtliff/pydplus/issues
67
63
  Project-URL: Repository, https://github.com/jeffshurtliff/pydplus
68
64
  Description-Content-Type: text/markdown
69
65
 
70
- <img src="docs/_static/pydplus-icon-cropped.png"
66
+ <img src="https://raw.githubusercontent.com/jeffshurtliff/pydplus/main/docs/_static/pydplus-icon-cropped.png"
71
67
  class="pydplus-c-landing-page-logo"
72
68
  style="background-color: transparent; max-height: 320px;"
73
- alt="PyDPlus Logo" />
69
+ alt="PyDPlus Logo">
74
70
 
75
71
  # PyDPlus
76
- A Python toolset for the RSA ID Plus cloud authentication platform.
72
+ A Python toolset for the RSA<sup>&reg;</sup> ID Plus cloud authentication platform.
77
73
 
78
74
  <table>
79
75
  <tr>
@@ -85,27 +81,35 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
85
81
  </td>
86
82
  </tr>
87
83
  <tr>
88
- <td>Latest Beta/RC Release</td>
84
+ <td>Latest Pre-release</td>
89
85
  <td>
90
86
  <a href="https://pypi.org/project/pydplus/#history">
91
- <img alt="PyPI" src="https://img.shields.io/badge/pypi-1.0.0b1-blue">
87
+ <img alt="PyPI" src="https://img.shields.io/badge/pypi-none-blue">
92
88
  </a>
93
89
  </td>
94
90
  </tr>
95
91
  <tr>
96
- <td>Build Status</td>
92
+ <td>Supported Versions (Stable Release)</td>
97
93
  <td>
98
- <a href="https://github.com/jeffshurtliff/pydplus/blob/main/.github/workflows/ci.yml">
99
- <img alt="GitHub Workflow Status"
100
- src="https://img.shields.io/github/actions/workflow/status/jeffshurtliff/pydplus/ci.yml?branch=main">
94
+ <a href="https://pypi.org/project/pydplus/">
95
+ <img alt="PyPI - Python Versions Supported (Stable Release)" src="https://img.shields.io/pypi/pyversions/pydplus">
101
96
  </a>
102
97
  </td>
103
98
  </tr>
104
99
  <tr>
105
- <td>Supported Versions</td>
100
+ <td>Commits Since Latest Release</td>
101
+ <td>
102
+ <a href="https://github.com/jeffshurtliff/pydplus/compare/2.0.0...HEAD">
103
+ <img alt="GitHub commits since latest release" src="https://img.shields.io/github/commits-since/jeffshurtliff/pydplus/latest">
104
+ </a>
105
+ </td>
106
+ </tr>
107
+ <tr>
108
+ <td>Build Status</td>
106
109
  <td>
107
- <a href="https://pypi.org/project/pydplus/">
108
- <img alt="PyPI - Python Versions Supported" src="https://img.shields.io/pypi/pyversions/pydplus">
110
+ <a href="https://github.com/jeffshurtliff/pydplus/blob/main/.github/workflows/ci.yml">
111
+ <img alt="GitHub Workflow Status"
112
+ src="https://img.shields.io/github/actions/workflow/status/jeffshurtliff/pydplus/ci.yml?branch=main">
109
113
  </a>
110
114
  </td>
111
115
  </tr>
@@ -113,15 +117,15 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
113
117
  <td>Code Coverage</td>
114
118
  <td>
115
119
  <a href="https://codecov.io/gh/jeffshurtliff/pydplus">
116
- <img alt="Codecov - Code Coverage" src="https://codecov.io/gh/jeffshurtliff/pydplus/branch/main/graph/badge.svg?token=QBynJO48jN" />
120
+ <img alt="Codecov - Code Coverage" src="https://codecov.io/gh/jeffshurtliff/pydplus/branch/main/graph/badge.svg?token=QBynJO48jN">
117
121
  </a>
118
122
  </td>
119
123
  </tr>
120
124
  <tr>
121
125
  <td>Documentation</td>
122
126
  <td>
123
- <a href="https://pydplus.readthedocs.io/en/latest/?badge=latest">
124
- <img alt="Documentation Status" src="https://readthedocs.org/projects/pydplus/badge/?version=latest" />
127
+ <a href="https://pydplus.readthedocs.io/en/stable/?badge=stable">
128
+ <img alt="Documentation Status" src="https://readthedocs.org/projects/pydplus/badge/?version=stable">
125
129
  </a>
126
130
  </td>
127
131
  </tr>
@@ -142,30 +146,29 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
142
146
  </td>
143
147
  </tr>
144
148
  <tr>
145
- <td style="vertical-align: top;">Issues</td>
149
+ <td>Issues</td>
146
150
  <td>
147
151
  <a href="https://github.com/jeffshurtliff/pydplus/issues">
148
- <img style="margin-bottom:5px;" alt="GitHub Open Issues" src="https://img.shields.io/github/issues-raw/jeffshurtliff/pydplus"><br />
149
- </a>
150
- <a href="https://github.com/jeffshurtliff/pydplus/issues">
151
- <img alt="GitHub Closed Issues" src="https://img.shields.io/github/issues-closed-raw/jeffshurtliff/pydplus">
152
+ <img alt="Issues (GitHub)" src="https://img.shields.io/github/issues/jeffshurtliff/pydplus">
152
153
  </a>
153
154
  </td>
154
155
  </tr>
155
156
  <tr>
156
- <td style="vertical-align: top;">Pull Requests</td>
157
+ <td>Pull Requests</td>
157
158
  <td>
158
159
  <a href="https://github.com/jeffshurtliff/pydplus/pulls">
159
- <img style="margin-bottom:5px;" alt="GitHub Open Pull Requests" src="https://img.shields.io/github/issues-pr-raw/jeffshurtliff/pydplus"><br />
160
- </a>
161
- <a href="https://github.com/jeffshurtliff/pydplus/pulls">
162
- <img alt="GitHub Closed Pull Requests" src="https://img.shields.io/github/issues-pr-closed-raw/jeffshurtliff/pydplus">
160
+ <img alt="Pull Requests (GitHub)" src="https://img.shields.io/github/issues-pr/jeffshurtliff/pydplus">
163
161
  </a>
164
162
  </td>
165
163
  </tr>
166
164
  </table>
167
165
 
168
166
  ## Installation
167
+
168
+ > [!IMPORTANT]
169
+ > PyDPlus `2.0.0` and newer require Python `3.12+`.<br>
170
+ > PyDPlus `1.0.1` is the final release line that supports Python `3.9`.
171
+
169
172
  Install from PyPI:
170
173
 
171
174
  ```sh
@@ -180,8 +183,8 @@ cd pydplus
180
183
  poetry install
181
184
  ```
182
185
 
183
- ## Change Log
184
- The change log can be found in the [documentation](https://pydplus.readthedocs.io/en/latest/CHANGELOG.html).
186
+ ## Changelog
187
+ The changelog can be found in the [documentation](https://pydplus.readthedocs.io/en/latest/CHANGELOG.html).
185
188
 
186
189
  ## Usage
187
190
  PyDPlus is designed for Python-based administration workflows in RSA ID Plus tenants, including:
@@ -218,7 +221,7 @@ pydp = PyDPlus(
218
221
  ```
219
222
 
220
223
  Legacy API authentication is also supported. See the
221
- [Authentication](https://pydplus.readthedocs.io/en/latest/guides/authentication.html) guide for both patterns.
224
+ [Authentication](https://pydplus.readthedocs.io/en/stable/guides/authentication.html) guide for both patterns.
222
225
 
223
226
  ### 3) Define OAuth scopes (three practical options)
224
227
 
@@ -254,12 +257,12 @@ response = pydp.users.disable_user(user_id=user_id)
254
257
 
255
258
  For deeper coverage, see:
256
259
 
257
- - Quickstart: <https://pydplus.readthedocs.io/en/latest/getting-started/quickstart.html>
258
- - Authentication guide: <https://pydplus.readthedocs.io/en/latest/guides/authentication.html>
259
- - Client reference: <https://pydplus.readthedocs.io/en/latest/reference/client.html>
260
+ - Quickstart: <https://pydplus.readthedocs.io/en/stable/getting-started/quickstart.html>
261
+ - Authentication guide: <https://pydplus.readthedocs.io/en/stable/guides/authentication.html>
262
+ - Client reference: <https://pydplus.readthedocs.io/en/stable/reference/client.html>
260
263
 
261
264
  ## Documentation
262
- The documentation is located here: [https://pydplus.readthedocs.io/en/latest/](https://pydplus.readthedocs.io/en/latest/)
265
+ The documentation is located here: [https://pydplus.readthedocs.io/en/stable/](https://pydplus.readthedocs.io/en/stable/)
263
266
 
264
267
  ## License
265
268
  [MIT License](https://github.com/jeffshurtliff/pydplus/blob/main/LICENSE)
@@ -1,10 +1,10 @@
1
- <img src="docs/_static/pydplus-icon-cropped.png"
1
+ <img src="https://raw.githubusercontent.com/jeffshurtliff/pydplus/main/docs/_static/pydplus-icon-cropped.png"
2
2
  class="pydplus-c-landing-page-logo"
3
3
  style="background-color: transparent; max-height: 320px;"
4
- alt="PyDPlus Logo" />
4
+ alt="PyDPlus Logo">
5
5
 
6
6
  # PyDPlus
7
- A Python toolset for the RSA ID Plus cloud authentication platform.
7
+ A Python toolset for the RSA<sup>&reg;</sup> ID Plus cloud authentication platform.
8
8
 
9
9
  <table>
10
10
  <tr>
@@ -16,27 +16,35 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
16
16
  </td>
17
17
  </tr>
18
18
  <tr>
19
- <td>Latest Beta/RC Release</td>
19
+ <td>Latest Pre-release</td>
20
20
  <td>
21
21
  <a href="https://pypi.org/project/pydplus/#history">
22
- <img alt="PyPI" src="https://img.shields.io/badge/pypi-1.0.0b1-blue">
22
+ <img alt="PyPI" src="https://img.shields.io/badge/pypi-none-blue">
23
23
  </a>
24
24
  </td>
25
25
  </tr>
26
26
  <tr>
27
- <td>Build Status</td>
27
+ <td>Supported Versions (Stable Release)</td>
28
28
  <td>
29
- <a href="https://github.com/jeffshurtliff/pydplus/blob/main/.github/workflows/ci.yml">
30
- <img alt="GitHub Workflow Status"
31
- src="https://img.shields.io/github/actions/workflow/status/jeffshurtliff/pydplus/ci.yml?branch=main">
29
+ <a href="https://pypi.org/project/pydplus/">
30
+ <img alt="PyPI - Python Versions Supported (Stable Release)" src="https://img.shields.io/pypi/pyversions/pydplus">
32
31
  </a>
33
32
  </td>
34
33
  </tr>
35
34
  <tr>
36
- <td>Supported Versions</td>
35
+ <td>Commits Since Latest Release</td>
36
+ <td>
37
+ <a href="https://github.com/jeffshurtliff/pydplus/compare/2.0.0...HEAD">
38
+ <img alt="GitHub commits since latest release" src="https://img.shields.io/github/commits-since/jeffshurtliff/pydplus/latest">
39
+ </a>
40
+ </td>
41
+ </tr>
42
+ <tr>
43
+ <td>Build Status</td>
37
44
  <td>
38
- <a href="https://pypi.org/project/pydplus/">
39
- <img alt="PyPI - Python Versions Supported" src="https://img.shields.io/pypi/pyversions/pydplus">
45
+ <a href="https://github.com/jeffshurtliff/pydplus/blob/main/.github/workflows/ci.yml">
46
+ <img alt="GitHub Workflow Status"
47
+ src="https://img.shields.io/github/actions/workflow/status/jeffshurtliff/pydplus/ci.yml?branch=main">
40
48
  </a>
41
49
  </td>
42
50
  </tr>
@@ -44,15 +52,15 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
44
52
  <td>Code Coverage</td>
45
53
  <td>
46
54
  <a href="https://codecov.io/gh/jeffshurtliff/pydplus">
47
- <img alt="Codecov - Code Coverage" src="https://codecov.io/gh/jeffshurtliff/pydplus/branch/main/graph/badge.svg?token=QBynJO48jN" />
55
+ <img alt="Codecov - Code Coverage" src="https://codecov.io/gh/jeffshurtliff/pydplus/branch/main/graph/badge.svg?token=QBynJO48jN">
48
56
  </a>
49
57
  </td>
50
58
  </tr>
51
59
  <tr>
52
60
  <td>Documentation</td>
53
61
  <td>
54
- <a href="https://pydplus.readthedocs.io/en/latest/?badge=latest">
55
- <img alt="Documentation Status" src="https://readthedocs.org/projects/pydplus/badge/?version=latest" />
62
+ <a href="https://pydplus.readthedocs.io/en/stable/?badge=stable">
63
+ <img alt="Documentation Status" src="https://readthedocs.org/projects/pydplus/badge/?version=stable">
56
64
  </a>
57
65
  </td>
58
66
  </tr>
@@ -73,30 +81,29 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
73
81
  </td>
74
82
  </tr>
75
83
  <tr>
76
- <td style="vertical-align: top;">Issues</td>
84
+ <td>Issues</td>
77
85
  <td>
78
86
  <a href="https://github.com/jeffshurtliff/pydplus/issues">
79
- <img style="margin-bottom:5px;" alt="GitHub Open Issues" src="https://img.shields.io/github/issues-raw/jeffshurtliff/pydplus"><br />
80
- </a>
81
- <a href="https://github.com/jeffshurtliff/pydplus/issues">
82
- <img alt="GitHub Closed Issues" src="https://img.shields.io/github/issues-closed-raw/jeffshurtliff/pydplus">
87
+ <img alt="Issues (GitHub)" src="https://img.shields.io/github/issues/jeffshurtliff/pydplus">
83
88
  </a>
84
89
  </td>
85
90
  </tr>
86
91
  <tr>
87
- <td style="vertical-align: top;">Pull Requests</td>
92
+ <td>Pull Requests</td>
88
93
  <td>
89
94
  <a href="https://github.com/jeffshurtliff/pydplus/pulls">
90
- <img style="margin-bottom:5px;" alt="GitHub Open Pull Requests" src="https://img.shields.io/github/issues-pr-raw/jeffshurtliff/pydplus"><br />
91
- </a>
92
- <a href="https://github.com/jeffshurtliff/pydplus/pulls">
93
- <img alt="GitHub Closed Pull Requests" src="https://img.shields.io/github/issues-pr-closed-raw/jeffshurtliff/pydplus">
95
+ <img alt="Pull Requests (GitHub)" src="https://img.shields.io/github/issues-pr/jeffshurtliff/pydplus">
94
96
  </a>
95
97
  </td>
96
98
  </tr>
97
99
  </table>
98
100
 
99
101
  ## Installation
102
+
103
+ > [!IMPORTANT]
104
+ > PyDPlus `2.0.0` and newer require Python `3.12+`.<br>
105
+ > PyDPlus `1.0.1` is the final release line that supports Python `3.9`.
106
+
100
107
  Install from PyPI:
101
108
 
102
109
  ```sh
@@ -111,8 +118,8 @@ cd pydplus
111
118
  poetry install
112
119
  ```
113
120
 
114
- ## Change Log
115
- The change log can be found in the [documentation](https://pydplus.readthedocs.io/en/latest/CHANGELOG.html).
121
+ ## Changelog
122
+ The changelog can be found in the [documentation](https://pydplus.readthedocs.io/en/latest/CHANGELOG.html).
116
123
 
117
124
  ## Usage
118
125
  PyDPlus is designed for Python-based administration workflows in RSA ID Plus tenants, including:
@@ -149,7 +156,7 @@ pydp = PyDPlus(
149
156
  ```
150
157
 
151
158
  Legacy API authentication is also supported. See the
152
- [Authentication](https://pydplus.readthedocs.io/en/latest/guides/authentication.html) guide for both patterns.
159
+ [Authentication](https://pydplus.readthedocs.io/en/stable/guides/authentication.html) guide for both patterns.
153
160
 
154
161
  ### 3) Define OAuth scopes (three practical options)
155
162
 
@@ -185,12 +192,12 @@ response = pydp.users.disable_user(user_id=user_id)
185
192
 
186
193
  For deeper coverage, see:
187
194
 
188
- - Quickstart: <https://pydplus.readthedocs.io/en/latest/getting-started/quickstart.html>
189
- - Authentication guide: <https://pydplus.readthedocs.io/en/latest/guides/authentication.html>
190
- - Client reference: <https://pydplus.readthedocs.io/en/latest/reference/client.html>
195
+ - Quickstart: <https://pydplus.readthedocs.io/en/stable/getting-started/quickstart.html>
196
+ - Authentication guide: <https://pydplus.readthedocs.io/en/stable/guides/authentication.html>
197
+ - Client reference: <https://pydplus.readthedocs.io/en/stable/reference/client.html>
191
198
 
192
199
  ## Documentation
193
- The documentation is located here: [https://pydplus.readthedocs.io/en/latest/](https://pydplus.readthedocs.io/en/latest/)
200
+ The documentation is located here: [https://pydplus.readthedocs.io/en/stable/](https://pydplus.readthedocs.io/en/stable/)
194
201
 
195
202
  ## License
196
203
  [MIT License](https://github.com/jeffshurtliff/pydplus/blob/main/LICENSE)
@@ -3,10 +3,10 @@
3
3
  # --------------------------------------------------------------------
4
4
  [project]
5
5
  name = "pydplus"
6
- version = "1.0.0.dev0"
6
+ version = "2.0.0"
7
7
  description = "A Python toolset for the RSA ID Plus cloud authentication platform"
8
8
  readme = "README.md"
9
- requires-python = ">=3.9.2,<3.14.0"
9
+ requires-python = ">=3.12,<3.14.0"
10
10
  license = { file = "LICENSE" }
11
11
  authors = [
12
12
  { name = "Jeff Shurtliff", email = "jeffshurtliff@gmail.com" }
@@ -14,11 +14,28 @@ authors = [
14
14
  maintainers = [
15
15
  { name = "Jeff Shurtliff", email = "jeffshurtliff@gmail.com" }
16
16
  ]
17
- keywords = ["rsa-security", "id-plus", "securid", "authentication-manager", "sso", "mfa", "iam", "identity", "authentication"]
17
+ keywords = [
18
+ "rsa-security",
19
+ "id-plus",
20
+ "rsa-id-plus",
21
+ "securid",
22
+ "rsa-securid",
23
+ "authentication-manager",
24
+ "rsa-authentication-manager",
25
+ "cloud-access-service",
26
+ "single-sign-on",
27
+ "sso",
28
+ "mfa",
29
+ "iam",
30
+ "identity",
31
+ "authentication",
32
+ "multifactor-authentication",
33
+ "fido",
34
+ ]
18
35
 
19
36
  classifiers = [
20
37
  # Project maturity
21
- "Development Status :: 4 - Beta",
38
+ "Development Status :: 5 - Production/Stable",
22
39
 
23
40
  # License
24
41
  "License :: OSI Approved :: MIT License",
@@ -42,9 +59,6 @@ classifiers = [
42
59
  # Supported Python versions
43
60
  "Programming Language :: Python :: 3",
44
61
  "Programming Language :: Python :: 3 :: Only",
45
- "Programming Language :: Python :: 3.9",
46
- "Programming Language :: Python :: 3.10",
47
- "Programming Language :: Python :: 3.11",
48
62
  "Programming Language :: Python :: 3.12",
49
63
  "Programming Language :: Python :: 3.13",
50
64
  ]
@@ -52,21 +66,20 @@ classifiers = [
52
66
  dependencies = [
53
67
  "PyYAML>=6.0.3,<7",
54
68
  "requests>=2.32.5",
55
- "pyjwt>=2.12.0", # Explicit pin to avoid CVE-2026-32597
56
- "cryptography>=46.0.6", # Explicit pin to address known cryptography security advisories
57
- "urllib3>=2.6.3,<3", # Explicit pin to avoid CVE-2024-37891
58
- "idna>=3.7,<4", # Explicit pin to avoid CVE-2024-3651
59
- "certifi>=2024.7.4", # Explicit pin to mitigate CA removals (e-Tugra, GLOBALTRUST)
69
+ "pyjwt>=2.13.0", # Explicit pin to address known PyJWT security advisories
70
+ "cryptography>=48.0.1", # Explicit pin to address known cryptography security advisories
60
71
 
61
- # Backport of tomllib for Python < 3.11
62
- "tomli>=2.0.0; python_version < '3.11'",
72
+ # Explicit pin to address known urllib3 security advisories
73
+ "urllib3>=2.7.0,<3",
74
+ "idna>=3.15,<4", # Explicit pin to address known IDNA security advisories
75
+ "certifi>=2024.7.4", # Explicit pin to mitigate CA removals (e-Tugra, GLOBALTRUST)
63
76
  ]
64
77
 
65
78
  [project.urls]
66
79
  Homepage = "https://github.com/jeffshurtliff/pydplus"
67
80
  Repository = "https://github.com/jeffshurtliff/pydplus"
68
- Documentation = "https://pydplus.readthedocs.io/en/latest/" # Change to stable after first release
69
- Changelog = "https://pydplus.readthedocs.io/en/latest/CHANGELOG.html" # Uncomment when docs are ready
81
+ Documentation = "https://pydplus.readthedocs.io/en/stable/"
82
+ Changelog = "https://pydplus.readthedocs.io/en/latest/CHANGELOG.html"
70
83
  "Issue Tracker" = "https://github.com/jeffshurtliff/pydplus/issues"
71
84
 
72
85
  # --------------------------------------------------------------------
@@ -80,7 +93,7 @@ packages = [
80
93
  include = ["LICENSE", "README.md"]
81
94
 
82
95
  [tool.poetry.group.dev.dependencies]
83
- pytest = "^7.2"
96
+ pytest = ">=9.0.3"
84
97
  pytest-cov = "^7.0.0"
85
98
  bandit = { version = "^1.7.8", extras = ["sarif"] }
86
99
  Sphinx = "^7.4.7"
@@ -88,9 +101,11 @@ pydata-sphinx-theme = "^0.15.4"
88
101
  myst-parser = "^3.0.1"
89
102
  sphinx-favicon = "^1.0.1"
90
103
  ruff = "^0.15.8"
104
+ twine = "^6.1.0"
105
+ pygments = ">=2.20.0" # Explicit pin to avoid CVE-2026-4539
91
106
 
92
107
  [tool.ruff]
93
- target-version = "py39"
108
+ target-version = "py312"
94
109
  line-length = 130
95
110
  src = ["src", "tests"]
96
111
 
@@ -3,8 +3,8 @@
3
3
  :Module: pydplus.api
4
4
  :Synopsis: Defines the basic functions associated with the RSA ID Plus API
5
5
  :Created By: Jeff Shurtliff
6
- :Last Modified: Jeff Shurtliff
7
- :Modified Date: 30 Mar 2026
6
+ :Last Modified: Jeff Shurtliff (via GPT-5.5-codex)
7
+ :Modified Date: 30 Jun 2026
8
8
  """
9
9
 
10
10
  from __future__ import annotations
@@ -143,7 +143,7 @@ def api_call_with_payload(
143
143
  def _raise_exception_for_payload():
144
144
  """Raise a :py:exc:`TypeError` exception when the payload is an invalid data type."""
145
145
  _error_msg = f'The API payload must be a dictionary or string (provided: {type(payload)})'
146
- logger.error(_error_msg)
146
+ logger.error('The API payload must be a dictionary or string')
147
147
  raise TypeError(_error_msg)
148
148
 
149
149
  # Define the parameters as an empty dictionary if none are provided
@@ -377,8 +377,8 @@ def _should_allow_failed_responses(_pydp_object, _allow_failed_response: Optiona
377
377
  # Use the default strict mode value to define the value if an exception is raised
378
378
  _allow_failed_response = False if const.DEFAULT_STRICT_MODE is True else True
379
379
  _exc_type = errors.handlers.get_exception_type(_exc)
380
- _error_msg = f'Using default strict mode due to the following {_exc_type} exception: {_exc}'
381
- logger.error(_error_msg)
380
+ _error_msg = f'Using default strict mode due to the following {_exc_type} exception'
381
+ logger.error('Using default strict mode due to an exception')
382
382
  return _allow_failed_response
383
383
 
384
384
 
@@ -436,7 +436,7 @@ def _perform_api_call_with_payload(
436
436
  """Perform API requests that include payload data and return the response object."""
437
437
  if not full_api_url:
438
438
  error_msg = 'A full API URL must be defined before calling _perform_api_call_with_payload()'
439
- logger.error(error_msg)
439
+ logger.error('A full API URL must be defined before calling _perform_api_call_with_payload()')
440
440
  raise errors.exceptions.APIMethodError(error_msg)
441
441
 
442
442
  if isinstance(method, str) and method.upper() == const.API_REQUEST_TYPES.POST:
@@ -474,11 +474,11 @@ def _perform_api_call_with_payload(
474
474
  raise_payload_exception()
475
475
  elif isinstance(method, str) and method.upper() == const.API_REQUEST_TYPES.GET:
476
476
  error_msg = 'The GET API call method is not valid when a payload has been provided.'
477
- logger.error(error_msg)
477
+ logger.error('The GET API call method is not valid when a payload has been provided')
478
478
  raise errors.exceptions.APIMethodError(error_msg)
479
479
  else:
480
480
  error_msg = 'A valid API call method (POST or PATCH or PUT) must be defined.'
481
- logger.error(error_msg)
481
+ logger.error('A valid API call method must be defined')
482
482
  raise errors.exceptions.APIMethodError(error_msg)
483
483
  return None
484
484
 
@@ -504,9 +504,9 @@ def _get_full_api_url(_pydp_object, _endpoint: str, _api_type: str = const.DEFAU
504
504
  if not isinstance(_api_type, str):
505
505
  _error_msg = f'The API Type value must be a string. (provided: {type(_api_type)})'
506
506
  else:
507
- _error_msg = f"The value '{_api_type}' is not a valid API type. "
507
+ _error_msg = 'The configured API type is not valid. '
508
508
  _error_msg += f"(expected: '{const.ADMIN_API_TYPE}' or '{const.AUTH_API_TYPE}')"
509
- logger.error(_error_msg)
509
+ logger.error('The configured API type is not valid')
510
510
  raise errors.exceptions.InvalidFieldError(_error_msg)
511
511
 
512
512
  # Make sure the endpoint begins with a slash
@@ -530,7 +530,7 @@ def _raise_status_code_exception(_response, _method: str, _show_full_error: bool
530
530
  _exc_msg = f'The {_method.upper()} request failed with a {_response.status_code} status code.'
531
531
  if _show_full_error:
532
532
  _exc_msg += f'\n{_response.text}'
533
- logger.error(_exc_msg)
533
+ logger.error('The API request failed with a non-success status code')
534
534
  raise errors.exceptions.APIRequestError(_exc_msg)
535
535
 
536
536
 
@@ -549,8 +549,8 @@ def _convert_response_to_json(_response, _allow_failed_response: bool = False):
549
549
  _response = _response.json()
550
550
  except Exception as _exc:
551
551
  _exc_type = errors.handlers.get_exception_type(_exc)
552
- _error_msg = f'Failed to convert the API response to JSON format due to the following {_exc_type} exception: {_exc}'
553
- logger.error(_error_msg)
552
+ _error_msg = f'Failed to convert the API response to JSON format due to the following {_exc_type} exception'
553
+ logger.error('Failed to convert the API response to JSON format')
554
554
  if not _allow_failed_response:
555
555
  raise errors.exceptions.APIResponseConversionError(_error_msg)
556
556
  return _response