benchling-sdk 1.20__tar.gz → 1.21.1__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.
Files changed (125) hide show
  1. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/PKG-INFO +3 -4
  2. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/helpers/webhook_helpers.py +34 -11
  3. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/status/framework.py +1 -1
  4. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/auth/client_credentials_oauth2.py +1 -1
  5. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/serialization_helpers.py +1 -1
  6. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/aa_sequence_service.py +1 -1
  7. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/app_service.py +2 -2
  8. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/assay_result_service.py +1 -1
  9. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/assay_run_service.py +3 -3
  10. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/codon_usage_table_service.py +1 -1
  11. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/custom_entity_service.py +1 -1
  12. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/dna_alignments_service.py +1 -1
  13. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/dna_oligo_service.py +1 -1
  14. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/dna_sequence_service.py +1 -1
  15. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/enzyme_service.py +1 -1
  16. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/event_service.py +1 -1
  17. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/feature_library_service.py +2 -2
  18. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/lab_automation_service.py +3 -3
  19. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/mixture_service.py +1 -1
  20. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/molecule_service.py +1 -1
  21. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/monomer_service.py +1 -1
  22. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/nucleotide_alignments_service.py +1 -1
  23. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/oligo_service.py +1 -1
  24. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/request_service.py +2 -2
  25. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/rna_oligo_service.py +1 -1
  26. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/rna_sequence_service.py +1 -1
  27. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/workflow_flowchart_service.py +1 -1
  28. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/workflow_output_service.py +1 -1
  29. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/workflow_task_group_service.py +1 -1
  30. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/workflow_task_service.py +1 -1
  31. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/pyproject.toml +84 -26
  32. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/LICENSE +0 -0
  33. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/README.md +0 -0
  34. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/__init__.py +0 -0
  35. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/__init__.py +0 -0
  36. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/canvas/__init__.py +0 -0
  37. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/canvas/errors.py +0 -0
  38. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/canvas/framework.py +0 -0
  39. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/canvas/types.py +0 -0
  40. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/config/__init__.py +0 -0
  41. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/config/cryptography_helpers.py +0 -0
  42. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/config/decryption_provider.py +0 -0
  43. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/config/errors.py +0 -0
  44. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/config/framework.py +0 -0
  45. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/config/helpers.py +0 -0
  46. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/config/mock_config.py +0 -0
  47. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/config/types.py +0 -0
  48. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/framework.py +0 -0
  49. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/helpers/__init__.py +0 -0
  50. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/helpers/manifest_helpers.py +0 -0
  51. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/status/__init__.py +0 -0
  52. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/status/errors.py +0 -0
  53. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/status/helpers.py +0 -0
  54. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/status/types.py +0 -0
  55. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/apps/types.py +0 -0
  56. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/auth/__init__.py +0 -0
  57. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/auth/api_key_auth.py +0 -0
  58. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/auth/bearer_token_auth.py +0 -0
  59. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/benchling.py +0 -0
  60. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/docs/__init__.py +0 -0
  61. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/docs/__main__.py +0 -0
  62. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/errors.py +0 -0
  63. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/__init__.py +0 -0
  64. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/client_helpers.py +0 -0
  65. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/constants.py +0 -0
  66. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/decorators.py +0 -0
  67. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/file_helpers.py +0 -0
  68. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/logging_helpers.py +0 -0
  69. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/package_helpers.py +0 -0
  70. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/pagination_helpers.py +0 -0
  71. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/response_helpers.py +0 -0
  72. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/retry_helpers.py +0 -0
  73. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/task_helpers.py +0 -0
  74. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/helpers/transaction_manager.py +0 -0
  75. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/models/__init__.py +0 -0
  76. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/models/webhooks/__init__.py +0 -0
  77. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/models/webhooks/v0/__init__.py +0 -0
  78. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/py.typed +0 -0
  79. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/__init__.py +0 -0
  80. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/__init__.py +0 -0
  81. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/alpha/__init__.py +0 -0
  82. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/alpha/v2_alpha_app_service.py +0 -0
  83. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/alpha/v2_alpha_assembly_service.py +0 -0
  84. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/base_service.py +0 -0
  85. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/__init__.py +0 -0
  86. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_analysis_service.py +0 -0
  87. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_app_definition_service.py +0 -0
  88. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_app_service.py +0 -0
  89. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_audit_service.py +0 -0
  90. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_collaboration_service.py +0 -0
  91. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_data_frame_service.py +0 -0
  92. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_entry_service.py +0 -0
  93. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_folder_service.py +0 -0
  94. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_project_service.py +0 -0
  95. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/beta/v2_beta_worklist_service.py +0 -0
  96. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/__init__.py +0 -0
  97. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/api_service.py +0 -0
  98. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/blob_service.py +0 -0
  99. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/box_service.py +0 -0
  100. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/container_service.py +0 -0
  101. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/custom_notation_service.py +0 -0
  102. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/dropdown_service.py +0 -0
  103. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/entity_service.py +0 -0
  104. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/entry_service.py +0 -0
  105. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/export_service.py +0 -0
  106. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/folder_service.py +0 -0
  107. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/instrument_query_service.py +0 -0
  108. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/inventory_service.py +0 -0
  109. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/label_template_service.py +0 -0
  110. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/location_service.py +0 -0
  111. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/organization_service.py +0 -0
  112. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/plate_service.py +0 -0
  113. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/printer_service.py +0 -0
  114. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/project_service.py +0 -0
  115. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/registry_service.py +0 -0
  116. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/schema_service.py +0 -0
  117. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/task_service.py +0 -0
  118. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/team_service.py +0 -0
  119. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/user_service.py +0 -0
  120. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/warehouse_service.py +0 -0
  121. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/stable/workflow_flowchart_config_version_service.py +0 -0
  122. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/v2_alpha_service.py +0 -0
  123. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/v2_beta_service.py +0 -0
  124. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2/v2_stable_service.py +0 -0
  125. {benchling_sdk-1.20 → benchling_sdk-1.21.1}/benchling_sdk/services/v2_service.py +0 -0
@@ -1,14 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: benchling-sdk
3
- Version: 1.20
3
+ Version: 1.21.1
4
4
  Summary: SDK for interacting with the Benchling Platform.
5
5
  License: Apache-2.0
6
6
  Author: Benchling Support
7
7
  Author-email: support@benchling.com
8
- Requires-Python: >=3.8,<4.0
8
+ Requires-Python: >=3.9,<4.0
9
9
  Classifier: License :: OSI Approved :: Apache Software License
10
10
  Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.8
12
11
  Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
@@ -17,7 +16,7 @@ Provides-Extra: python-jose
17
16
  Requires-Dist: PyYAML (>=6.0,<7.0)
18
17
  Requires-Dist: attrs (>=20.1.0)
19
18
  Requires-Dist: backoff (>=1.10.0,<3)
20
- Requires-Dist: benchling-api-client (==2.0.338)
19
+ Requires-Dist: benchling-api-client (==2.0.342)
21
20
  Requires-Dist: certifi (>=2022.12.7)
22
21
  Requires-Dist: cryptography (>=42.0.0) ; extra == "cryptography"
23
22
  Requires-Dist: dataclasses-json (>=0.5.2,<0.6.0)
@@ -1,6 +1,6 @@
1
1
  import base64
2
2
  from datetime import datetime, timedelta, timezone
3
- from typing import cast, List, Protocol, Union
3
+ from typing import cast, List, Optional, Protocol, Union
4
4
 
5
5
  from benchling_api_client.v2.benchling_client import BenchlingApiClient
6
6
  import httpx
@@ -12,6 +12,21 @@ from benchling_sdk.helpers.package_helpers import _required_packages_context, Ex
12
12
  from benchling_sdk.services.v2.stable.api_service import build_json_response
13
13
 
14
14
 
15
+ class HeadersMapping(Protocol):
16
+ """
17
+ A general type for objects that represent request headers.
18
+
19
+ This can be a dict, or any `Mapping[str, str]`, or an instance of a class like
20
+ Flask's Headers class which is dict-like to a limited degree.
21
+ """
22
+
23
+ def __contains__(self, key: str) -> bool:
24
+ pass
25
+
26
+ def __getitem__(self, key: str) -> str:
27
+ pass
28
+
29
+
15
30
  class WebhookVerificationError(Exception):
16
31
  """
17
32
  Webhook Verification Error.
@@ -93,7 +108,7 @@ def _production_webhook_jwks(app_definition_id: str) -> str:
93
108
  def _retrieve_jwks(
94
109
  app_installation_or_definition_id: str,
95
110
  jwk_url_provider: Union[JwkUrlProvider, LegacyJwkUrlProvider],
96
- httpx_client: httpx.Client = None,
111
+ httpx_client: Optional[httpx.Client] = None,
97
112
  ):
98
113
  if httpx_client is None:
99
114
  httpx_client = _default_httpx_webhook_client()
@@ -106,8 +121,8 @@ def _retrieve_jwks(
106
121
 
107
122
  def jwks_by_app(
108
123
  app_id: str,
109
- httpx_client: httpx.Client = None,
110
- jwk_url_provider: LegacyJwkUrlProvider = None,
124
+ httpx_client: Optional[httpx.Client] = None,
125
+ jwk_url_provider: Optional[LegacyJwkUrlProvider] = None,
111
126
  ) -> jwk.JWKSet:
112
127
  """
113
128
  Get JWKs by App (Deprecated).
@@ -128,8 +143,8 @@ def jwks_by_app(
128
143
 
129
144
  def jwks_by_app_definition(
130
145
  app_definition_id: str,
131
- httpx_client: httpx.Client = None,
132
- jwk_url_provider: JwkUrlProvider = None,
146
+ httpx_client: Optional[httpx.Client] = None,
147
+ jwk_url_provider: Optional[JwkUrlProvider] = None,
133
148
  ) -> jwk.JWKSet:
134
149
  """
135
150
  Get JWKs for a Benchling App from its global app_definition_id.
@@ -146,7 +161,7 @@ def jwks_by_app_definition(
146
161
 
147
162
 
148
163
  def verify_app_installation(
149
- app_id: str, data: str, headers: dict, jwk_function: LegacyGetJwksFunction = None
164
+ app_id: str, data: str, headers: HeadersMapping, jwk_function: Optional[LegacyGetJwksFunction] = None
150
165
  ) -> None:
151
166
  """
152
167
  Verify a webhook for an app installation (Deprecated).
@@ -162,13 +177,21 @@ def verify_app_installation(
162
177
  _verify(app_id, data, headers, jwk_function)
163
178
 
164
179
 
165
- def verify(app_definition_id: str, data: str, headers: dict, jwk_function: GetJwksFunction = None) -> None:
180
+ def verify(
181
+ app_definition_id: str,
182
+ data: str,
183
+ headers: HeadersMapping,
184
+ jwk_function: Optional[GetJwksFunction] = None,
185
+ ) -> None:
166
186
  """
167
187
  Verify a webhook for a Benchling App from its global app_definition_id.
168
188
 
169
189
  Verifies that a webhook was a valid webhook from Benchling.
170
190
  Raises WebhookVerificationError if the webhook could not be verified.
171
191
  Resolves JWKs from Benchling with default settings. Pass jwk_function for customization.
192
+
193
+ The headers parameter can be a dict, or a dict-like object such as the Headers type
194
+ from Flask.
172
195
  """
173
196
  default_jwk_function: GetJwksFunction = jwks_by_app_definition
174
197
  _jwk_function: GetJwksFunction = default_jwk_function if jwk_function is None else jwk_function
@@ -196,7 +219,7 @@ def _has_valid_signature(to_verify: str, jwks: jwk.JWKSet, encoded_signatures: L
196
219
  def _verify(
197
220
  app_installation_or_definition_id: str,
198
221
  data: str,
199
- headers: dict,
222
+ headers: HeadersMapping,
200
223
  jwk_function: Union[GetJwksFunction, LegacyGetJwksFunction],
201
224
  ) -> None:
202
225
  _verify_headers_present(headers)
@@ -210,7 +233,7 @@ def _verify(
210
233
  raise WebhookVerificationError("No matching signature found")
211
234
 
212
235
 
213
- def _der_signatures_from_versioned_signatures(versioned_signatures: str) -> List[str]:
236
+ def _der_signatures_from_versioned_signatures(versioned_signatures: List[str]) -> List[str]:
214
237
  """
215
238
  Parse and return a list of ders signatures from a single string.
216
239
 
@@ -226,7 +249,7 @@ def _der_signatures_from_versioned_signatures(versioned_signatures: str) -> List
226
249
  return der_signatures
227
250
 
228
251
 
229
- def _verify_headers_present(headers: dict) -> None:
252
+ def _verify_headers_present(headers: HeadersMapping) -> None:
230
253
  """
231
254
  Verify Headers Present.
232
255
 
@@ -5,7 +5,7 @@ from contextlib import AbstractContextManager
5
5
  from types import TracebackType
6
6
  from typing import cast, Iterable, List, Optional, Protocol, Type, TYPE_CHECKING, Union
7
7
 
8
- from benchling_api_client.v2.stable.types import Unset, UNSET
8
+ from benchling_api_client.v2.stable.types import UNSET, Unset
9
9
 
10
10
  from benchling_sdk.apps.status.errors import (
11
11
  AppUserFacingError,
@@ -70,7 +70,7 @@ class ClientCredentialsOAuth2(AuthorizationMethod):
70
70
  self,
71
71
  client_id: str,
72
72
  client_secret: str,
73
- token_url: str = None,
73
+ token_url: Optional[str] = None,
74
74
  httpx_client: Optional[httpx.Client] = None,
75
75
  ):
76
76
  """
@@ -1,7 +1,7 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union
3
3
 
4
- from benchling_api_client.v2.types import Unset, UNSET
4
+ from benchling_api_client.v2.types import UNSET, Unset
5
5
  from dataclasses_json import DataClassJsonMixin
6
6
 
7
7
  from benchling_sdk.models import CustomFields, Field, Fields, SchemaFieldsQueryParam
@@ -111,7 +111,7 @@ class AaSequenceService(BaseService):
111
111
  creator_ids: Optional[Iterable[str]] = None,
112
112
  sort: Optional[ListAASequencesSort] = None,
113
113
  page_size: Optional[int] = None,
114
- next_token: NextToken = None,
114
+ next_token: Optional[NextToken] = None,
115
115
  author_idsany_of: Optional[Iterable[str]] = None,
116
116
  returning: Optional[Iterable[str]] = None,
117
117
  ) -> Response[AaSequencesPaginatedList]:
@@ -389,7 +389,7 @@ class AppService(BaseService):
389
389
  enabled: Optional[ListAppCanvasesEnabled] = None,
390
390
  archive_reason: Optional[str] = None,
391
391
  sort: Optional[Union[str, ListAppCanvasesSort]] = None,
392
- next_token: NextToken = None,
392
+ next_token: Optional[NextToken] = None,
393
393
  page_size: Optional[int] = None,
394
394
  ) -> Response[AppCanvasesPaginatedList]:
395
395
  response = list_app_canvases.sync_detailed(
@@ -555,7 +555,7 @@ class AppService(BaseService):
555
555
  modified_at_gte: Optional[datetime] = None,
556
556
  sort: Optional[ListAppSessionsSort] = None,
557
557
  returning: Optional[Iterable[str]] = None,
558
- next_token: NextToken = None,
558
+ next_token: Optional[NextToken] = None,
559
559
  page_size: Optional[int] = None,
560
560
  ) -> Response[AppSessionsPaginatedList]:
561
561
  response = list_app_sessions.sync_detailed(
@@ -71,7 +71,7 @@ class AssayResultService(BaseService):
71
71
  max_created_time: Optional[int] = None,
72
72
  entity_ids: Optional[Iterable[str]] = None,
73
73
  assay_run_ids: Optional[Iterable[str]] = None,
74
- next_token: NextToken = None,
74
+ next_token: Optional[NextToken] = None,
75
75
  page_size: Optional[int] = None,
76
76
  ids: Optional[Iterable[str]] = None,
77
77
  storage_ids: Optional[Iterable[str]] = None,
@@ -67,7 +67,7 @@ class AssayRunService(BaseService):
67
67
  schema_id: str,
68
68
  min_created_time: Optional[int] = None,
69
69
  max_created_time: Optional[int] = None,
70
- next_token: NextToken = None,
70
+ next_token: Optional[NextToken] = None,
71
71
  page_size: Optional[int] = None,
72
72
  ids: Optional[Iterable[str]] = None,
73
73
  ) -> Response[AssayRunsPaginatedList]:
@@ -152,7 +152,7 @@ class AssayRunService(BaseService):
152
152
  self,
153
153
  assay_run_id: str,
154
154
  modified_at: Optional[str] = None,
155
- next_token: NextToken = None,
155
+ next_token: Optional[NextToken] = None,
156
156
  ) -> Response[AutomationFileInputsPaginatedList]:
157
157
  response = list_automation_input_generators.sync_detailed(
158
158
  client=self.client,
@@ -186,7 +186,7 @@ class AssayRunService(BaseService):
186
186
  def _automation_output_processors_page(
187
187
  self,
188
188
  assay_run_id: str,
189
- next_token: NextToken = None,
189
+ next_token: Optional[NextToken] = None,
190
190
  ) -> Response[AutomationOutputProcessorsPaginatedList]:
191
191
  """Deprecated in favor of lab_automation.automation_output_processors."""
192
192
  log_deprecation(
@@ -30,7 +30,7 @@ class CodonUsageTableService(BaseService):
30
30
  name_includes: Optional[str] = None,
31
31
  names_any_of: Optional[Iterable[str]] = [],
32
32
  page_size: Optional[int] = None,
33
- next_token: NextToken = None,
33
+ next_token: Optional[NextToken] = None,
34
34
  ) -> Response[CodonUsageTablesPaginatedList]:
35
35
  response = list_codon_usage_tables.sync_detailed(
36
36
  client=self.client,
@@ -93,7 +93,7 @@ class CustomEntityService(BaseService):
93
93
  creator_ids: Optional[Iterable[str]] = None,
94
94
  schema_fields: Optional[Dict[str, Any]] = None,
95
95
  page_size: Optional[int] = None,
96
- next_token: NextToken = None,
96
+ next_token: Optional[NextToken] = None,
97
97
  author_idsany_of: Optional[Iterable[str]] = None,
98
98
  returning: Optional[Iterable[str]] = None,
99
99
  ) -> Response[CustomEntitiesPaginatedList]:
@@ -66,7 +66,7 @@ class DnaAlignmentsService(BaseService):
66
66
  sequence_ids: Optional[List[str]] = None,
67
67
  sort: Optional[ListDNAAlignmentsSort] = None,
68
68
  page_size: Optional[int] = None,
69
- next_token: NextToken = None,
69
+ next_token: Optional[NextToken] = None,
70
70
  ) -> Response[DnaAlignmentsPaginatedList]:
71
71
  response = list_dna_alignments.sync_detailed(
72
72
  client=self.client,
@@ -89,7 +89,7 @@ class DnaOligoService(BaseService):
89
89
  schema_fields: Optional[Dict[str, Any]] = None,
90
90
  creator_ids: Optional[Iterable[str]] = None,
91
91
  page_size: Optional[int] = None,
92
- next_token: NextToken = None,
92
+ next_token: Optional[NextToken] = None,
93
93
  author_idsany_of: Optional[Iterable[str]] = None,
94
94
  returning: Optional[Iterable[str]] = None,
95
95
  custom_notation_id: Optional[str] = None,
@@ -109,7 +109,7 @@ class DnaSequenceService(BaseService):
109
109
  creator_ids: Optional[Iterable[str]] = None,
110
110
  schema_fields: Optional[Dict[str, Any]] = None,
111
111
  page_size: Optional[int] = None,
112
- next_token: NextToken = None,
112
+ next_token: Optional[NextToken] = None,
113
113
  author_idsany_of: Optional[Iterable[str]] = None,
114
114
  returning: Optional[Iterable[str]] = None,
115
115
  ) -> Response[DnaSequencesPaginatedList]:
@@ -29,7 +29,7 @@ class EnzymeService(BaseService):
29
29
  name_includes: Optional[str] = None,
30
30
  names_any_of: Optional[Iterable[str]] = [],
31
31
  page_size: Optional[int] = None,
32
- next_token: NextToken = None,
32
+ next_token: Optional[NextToken] = None,
33
33
  ) -> Response[EnzymesPaginatedList]:
34
34
  response = list_enzymes.sync_detailed(
35
35
  client=self.client,
@@ -29,7 +29,7 @@ class EventService(BaseService):
29
29
  event_types: Optional[str] = None,
30
30
  poll: Optional[bool] = None,
31
31
  page_size: Optional[int] = None,
32
- next_token: NextToken = None,
32
+ next_token: Optional[NextToken] = None,
33
33
  ) -> Response[EventsPaginatedList]:
34
34
  response = list_events.sync_detailed(
35
35
  client=self.client,
@@ -73,7 +73,7 @@ class FeatureLibraryService(BaseService):
73
73
  sort: Optional[ListFeatureLibrariesSort] = None,
74
74
  page_size: Optional[int] = None,
75
75
  returning: Optional[Iterable[str]] = None,
76
- next_token: NextToken = None,
76
+ next_token: Optional[NextToken] = None,
77
77
  ) -> Response[FeatureLibrariesPaginatedList]:
78
78
  response = list_feature_libraries.sync_detailed(
79
79
  client=self.client,
@@ -166,7 +166,7 @@ class FeatureLibraryService(BaseService):
166
166
  def _features_page(
167
167
  self,
168
168
  page_size: Optional[int] = None,
169
- next_token: NextToken = None,
169
+ next_token: Optional[NextToken] = None,
170
170
  name: Optional[str] = None,
171
171
  ids: Optional[Iterable[str]] = None,
172
172
  namesany_ofcase_sensitive: Optional[Iterable[str]] = None,
@@ -131,7 +131,7 @@ class LabAutomationService(BaseService):
131
131
  automation_file_config_name: Optional[str],
132
132
  archive_reason: Optional[str],
133
133
  modified_at: Optional[str],
134
- next_token: NextToken = None,
134
+ next_token: Optional[NextToken] = None,
135
135
  ) -> Response[AutomationOutputProcessorsPaginatedList]:
136
136
  response = list_automation_output_processors.sync_detailed(
137
137
  client=self.client,
@@ -147,8 +147,8 @@ class LabAutomationService(BaseService):
147
147
  def automation_output_processors(
148
148
  self,
149
149
  assay_run_id: str,
150
- automation_file_config_name: str = None,
151
- archive_reason: str = None,
150
+ automation_file_config_name: Optional[str] = None,
151
+ archive_reason: Optional[str] = None,
152
152
  modified_at: Optional[str] = None,
153
153
  ) -> PageIterator[AutomationOutputProcessor]:
154
154
  """
@@ -83,7 +83,7 @@ class MixtureService(BaseService):
83
83
  names_any_of_case_sensitive: Optional[Iterable[str]] = None,
84
84
  schema_fields: Optional[Dict[str, Any]] = None,
85
85
  page_size: Optional[int] = None,
86
- next_token: NextToken = None,
86
+ next_token: Optional[NextToken] = None,
87
87
  author_idsany_of: Optional[Iterable[str]] = None,
88
88
  ) -> Response[MixturesPaginatedList]:
89
89
  response = list_mixtures.sync_detailed(
@@ -84,7 +84,7 @@ class MoleculeService(BaseService):
84
84
  names_any_of: Optional[Iterable[str]] = None,
85
85
  schema_fields: Optional[Dict[str, Any]] = None,
86
86
  page_size: Optional[int] = None,
87
- next_token: NextToken = None,
87
+ next_token: Optional[NextToken] = None,
88
88
  author_idsany_of: Optional[Iterable[str]] = None,
89
89
  chemical_substructuremol: Optional[str] = None,
90
90
  chemical_substructuresmiles: Optional[str] = None,
@@ -41,7 +41,7 @@ class MonomerService(BaseService):
41
41
  def _list_page(
42
42
  self,
43
43
  page_size: Optional[int] = None,
44
- next_token: NextToken = None,
44
+ next_token: Optional[NextToken] = None,
45
45
  returning: Optional[Iterable[str]] = None,
46
46
  ) -> Response[MonomersPaginatedList]:
47
47
  response = list_monomers.sync_detailed(
@@ -58,7 +58,7 @@ class NucleotideAlignmentsService(BaseService):
58
58
  sequence_ids: Optional[List[str]] = None,
59
59
  sort: Optional[ListNucleotideAlignmentsSort] = None,
60
60
  page_size: Optional[int] = None,
61
- next_token: NextToken = None,
61
+ next_token: Optional[NextToken] = None,
62
62
  ) -> Response[NucleotideAlignmentsPaginatedList]:
63
63
  response = list_nucleotide_alignments.sync_detailed(
64
64
  client=self.client,
@@ -95,7 +95,7 @@ class OligoService(BaseService):
95
95
  schema_fields: Optional[Dict[str, Any]] = None,
96
96
  creator_ids: Optional[Iterable[str]] = None,
97
97
  page_size: Optional[int] = None,
98
- next_token: NextToken = None,
98
+ next_token: Optional[NextToken] = None,
99
99
  returning: Optional[Iterable[str]] = None,
100
100
  ) -> Response[OligosPaginatedList]:
101
101
  """Deprecate in favor of dna_oligos._dna_oligos_page or rna_oligos._rna_oligos_page."""
@@ -69,7 +69,7 @@ class RequestService(BaseService):
69
69
  request_status: Optional[RequestStatus] = None,
70
70
  min_created_time: Optional[int] = None,
71
71
  max_created_time: Optional[int] = None,
72
- next_token: NextToken = None,
72
+ next_token: Optional[NextToken] = None,
73
73
  page_size: Optional[int] = None,
74
74
  returning: Optional[Iterable[str]] = None,
75
75
  ) -> Response[RequestsPaginatedList]:
@@ -201,7 +201,7 @@ class RequestService(BaseService):
201
201
  self,
202
202
  entry_id: str,
203
203
  modified_at: Optional[str] = None,
204
- next_token: NextToken = None,
204
+ next_token: Optional[NextToken] = None,
205
205
  page_size: Optional[int] = None,
206
206
  ) -> Response[RequestFulfillmentsPaginatedList]:
207
207
  response = list_request_fulfillments.sync_detailed(
@@ -98,7 +98,7 @@ class RnaOligoService(BaseService):
98
98
  schema_fields: Optional[Dict[str, Any]] = None,
99
99
  creator_ids: Optional[Iterable[str]] = None,
100
100
  page_size: Optional[int] = None,
101
- next_token: NextToken = None,
101
+ next_token: Optional[NextToken] = None,
102
102
  author_idsany_of: Optional[Iterable[str]] = None,
103
103
  returning: Optional[Iterable[str]] = None,
104
104
  custom_notation_id: Optional[str] = None,
@@ -104,7 +104,7 @@ class RnaSequenceService(BaseService):
104
104
  creator_ids: Optional[Iterable[str]] = None,
105
105
  schema_fields: Optional[Dict[str, Any]] = None,
106
106
  page_size: Optional[int] = None,
107
- next_token: NextToken = None,
107
+ next_token: Optional[NextToken] = None,
108
108
  author_idsany_of: Optional[Iterable[str]] = None,
109
109
  returning: Optional[Iterable[str]] = None,
110
110
  custom_notation_id: Optional[str] = None,
@@ -44,7 +44,7 @@ class WorkflowFlowchartService(BaseService):
44
44
  ids: Optional[Iterable[str]] = None,
45
45
  created_at: Optional[datetime.date] = None,
46
46
  page_size: Optional[int] = None,
47
- next_token: NextToken = None,
47
+ next_token: Optional[NextToken] = None,
48
48
  ) -> Response[WorkflowFlowchartPaginatedList]:
49
49
  response = list_workflow_flowcharts.sync_detailed(
50
50
  client=self.client,
@@ -81,7 +81,7 @@ class WorkflowOutputService(BaseService):
81
81
  linked_item_ids_none_of: Optional[Iterable[str]] = None,
82
82
  archive_reason: Optional[str] = None,
83
83
  page_size: Optional[int] = None,
84
- next_token: NextToken = None,
84
+ next_token: Optional[NextToken] = None,
85
85
  ) -> Response[WorkflowOutputsPaginatedList]:
86
86
  response = list_workflow_outputs.sync_detailed(
87
87
  client=self.client,
@@ -70,7 +70,7 @@ class WorkflowTaskGroupService(BaseService):
70
70
  display_ids: Optional[Iterable[str]] = None,
71
71
  archive_reason: Optional[str] = None,
72
72
  page_size: Optional[int] = None,
73
- next_token: NextToken = None,
73
+ next_token: Optional[NextToken] = None,
74
74
  ) -> Response[WorkflowTaskGroupsPaginatedList]:
75
75
  response = list_workflow_task_groups.sync_detailed(
76
76
  client=self.client,
@@ -92,7 +92,7 @@ class WorkflowTaskService(BaseService):
92
92
  linked_item_ids_none_of: Optional[Iterable[str]] = None,
93
93
  archive_reason: Optional[str] = None,
94
94
  page_size: Optional[int] = None,
95
- next_token: NextToken = None,
95
+ next_token: Optional[NextToken] = None,
96
96
  ) -> Response[WorkflowTasksPaginatedList]:
97
97
  response = list_workflow_tasks.sync_detailed(
98
98
  client=self.client,
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "benchling-sdk"
3
- version = "1.20" # NOTE: This version number is ignored and does not correspond to releases (see README)
3
+ version = "1.21.1" # NOTE: This version number is ignored and does not correspond to releases (see README)
4
4
  description = "SDK for interacting with the Benchling Platform."
5
5
  authors = ["Benchling Support <support@benchling.com>"]
6
6
  packages = [{include = "benchling_sdk"}]
@@ -18,7 +18,7 @@ testpaths = [
18
18
  ]
19
19
 
20
20
  [tool.poetry.dependencies]
21
- python = "^3.8"
21
+ python = "^3.9"
22
22
  backoff = ">=1.10.0, <3"
23
23
  dataclasses-json = "^0.5.2"
24
24
  httpx = ">=0.23.0"
@@ -28,7 +28,7 @@ PyYAML = "^6.0"
28
28
  # See issue: https://github.com/giampaolo/psutil/issues/2165
29
29
  psutil = {version = "^5.9.4", python = "^3.11" }
30
30
  jwcrypto = "^1.5.1"
31
- benchling-api-client = "2.0.338"
31
+ benchling-api-client = "2.0.342"
32
32
  # Minimum version due to vulnerability in 2022.9.24
33
33
  certifi = ">=2022.12.7"
34
34
  # Cryptography extras - see ExtrasPackage.CRYPTOGRAPHY
@@ -44,19 +44,16 @@ cryptography = ["cryptography"]
44
44
  python-jose = ["python-jose"]
45
45
 
46
46
  [tool.poetry.group.dev.dependencies]
47
- black = "^22.3.0"
48
- isort = "^5.10.1"
49
47
  pre-commit = "^2.6.0"
50
48
  ipython = "^7.16.1"
51
- mypy = "^0.960"
52
- flake8 = "^3.8.3"
49
+ mypy = "^1.13"
50
+ ruff = "^0.7.3"
53
51
  taskipy = "^1.6.0"
54
52
  Jinja2 = "^3.1.2"
55
53
  Markdown = "3.3.4" # Errors in Markdown 3.3.5 related to TypeError: entry_points() got an unexpected keyword argument 'group'
56
54
  toml = "^0.10.2"
57
55
  packaging = "^20.9"
58
56
  coverage = "^5.5"
59
- flake8-docstrings = "^1.6.0"
60
57
  ddt = "1.4.4"
61
58
  pytest = "^7.1.2"
62
59
  beautifulsoup4 = "4.10.0"
@@ -67,10 +64,8 @@ boto3 = "^1.24.67"
67
64
  boto3-stubs = {extras = ["ssm"], version = "1.24.67"}
68
65
  types-s3transfer = "0.6.0.post4"
69
66
  botocore-stubs = "1.28.4"
70
- # Used by flake8, version pinning is because v5 removes a deprecated call flake is currently using.
71
- importlib-metadata = "^4.13.0"
72
67
  sphinx-multiversion-pre-post-build = "^0.2.4"
73
- time-machine = "^2.8.2"
68
+ time-machine = "^2.15.0" # change to >=2.15.0 once we drop Python 3.8 support
74
69
  python-jose = "^3.3.0"
75
70
  gitpython = "^3.1.31"
76
71
  pytest-rerunfailures = "^12.0"
@@ -81,29 +76,92 @@ unit = "pytest -s tests/unit/"
81
76
  integration = "pytest -vv --reruns 3 --reruns-delay 1 -s tests/integration/"
82
77
  # Separate than unit tests because they intentionally take awhile but still mock Benchling
83
78
  retry_strategy_tests = "pytest -vv --reruns 3 --reruns-delay 1 -s tests/retries/"
79
+ format = "ruff check . --fix"
80
+ lint = "ruff check . && mypy ."
84
81
  models = "task generate_models && task sort_models && task format_models"
85
82
  generate_models = "python3 -m regenerate_models"
86
83
  format_models = "black benchling_sdk/models"
87
- sort_models = "isort benchling_sdk/models"
84
+ sort_models = "ruff check benchling_sdk/models --fix"
88
85
  regenerate_docs = "./scripts/regenerate_docs.sh"
89
86
  regenerate_doc_sources = "sphinx-apidoc --module-first -H benchling-sdk -e -f -o sphinx/source . tests* regenerate* > stdout.log 2> stderr.log"
90
87
  check_docs = "python3 -m regenerate_docs --check"
91
88
 
92
- [tool.black]
93
- line-length=110
89
+ [tool.ruff]
90
+ target-version = "py39"
91
+ line-length = 110
92
+ exclude = [
93
+ ".git",
94
+ ".mypy_cache",
95
+ ".venv",
96
+ ]
97
+
98
+ [tool.ruff.lint]
99
+ select = ["D", "E", "F", "I", "UP", "B", "PL", "RUF"]
100
+ ignore = [
101
+ "D100", # don't require docstring for modules
102
+ "D104", # don't require docstring for public packages
103
+ "D105", # don't require docstring for magic methods
104
+ "D203", # don't require blank line before class docstring
105
+ "D211", # no-blank-line-before-class
106
+ "D212", # multi-line-summary-first-line
107
+ "D213", # multi-line-summary-second-line
108
+ "D413", # don't require blank line after docstring section
109
+
110
+ "E501",
111
+ "PLR0913",
112
+ "PLR2004",
113
+
114
+ # rules that we can unignore once we've made some code updates:
115
+ "B006",
116
+ "B007",
117
+ "B008",
118
+ "B009",
119
+ "B010",
120
+ "B018",
121
+ "B028",
122
+ "B904",
123
+ "E721",
124
+ "E731",
125
+ "PLR0911",
126
+ "PLW2901",
127
+ "RUF002",
128
+ "RUF005",
129
+ "RUF012",
130
+ "RUF019",
131
+ "RUF100",
132
+ "UP004",
133
+ "UP006",
134
+ "UP007",
135
+ "UP012",
136
+ "UP015",
137
+ "UP018",
138
+ "UP033",
139
+ "UP037",
140
+ "UP035",
141
+ ]
142
+
143
+ [tool.ruff.lint.isort]
144
+ combine-as-imports=true
145
+ default-section="third-party"
146
+ force-sort-within-sections=true
147
+ known-first-party=["benchling_sdk"]
148
+ known-third-party=["attr", "backoff", "benchling_api_client", "benchling_jira_api", "boto3", "bs4", "cryptography", "dataclasses_json", "httpx", "jinja2", "jose", "jwcrypto", "ordered_set", "pytest", "time_machine", "util", "yaml"]
149
+ order-by-type=false
94
150
 
95
- [tool.isort]
96
- combine_as_imports=true
97
- default_section="THIRDPARTY"
98
- force_alphabetical_sort_within_sections=true
99
- force_sort_within_sections=true
100
- include_trailing_comma=true
101
- known_first_party=["benchling_sdk"]
102
- known_third_party=["attr", "backoff", "benchling_api_client", "benchling_jira_api", "boto3", "bs4", "cryptography", "dataclasses_json", "httpx", "jinja2", "jose", "jwcrypto", "ordered_set", "pytest", "time_machine", "util", "yaml"]
103
- line_length=110
104
- multi_line_output=3
105
- order_by_type=false
106
- skip = ["tests/packaged/run_smoke_test.py"]
151
+ [tool.ruff.lint.per-file-ignores]
152
+ "tests/*" = [
153
+ "D100", "D101", "D102", "D104", "D106", "D107", # missing docstrings
154
+ "PLR2004",
155
+ ]
156
+ "tests/packaged/run_smoke_test.py" = [
157
+ "D103", # missing docstrings
158
+ ]
159
+ # Ignore imperative mood for some class docstrings
160
+ "benchling_sdk/benchling.py" = ["D401"]
161
+ "benchling_sdk/services/v2/v2_stable_service.py" = ["D401"]
162
+ "benchling_sdk/services/v2/stable/assay_run_service.py" = ["D401"]
163
+ # Scripts that aren't published
164
+ "regenerate_docs.py" = [ "D103", "D205", "D400", "D415" ]
107
165
 
108
166
  [build-system]
109
167
  requires = ["poetry>=1.2"]
File without changes
File without changes