nimble_python 0.4.0__tar.gz → 0.6.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.
Files changed (92) hide show
  1. nimble_python-0.6.0/.release-please-manifest.json +3 -0
  2. {nimble_python-0.4.0 → nimble_python-0.6.0}/CHANGELOG.md +36 -0
  3. {nimble_python-0.4.0 → nimble_python-0.6.0}/PKG-INFO +12 -12
  4. {nimble_python-0.4.0 → nimble_python-0.6.0}/README.md +11 -11
  5. {nimble_python-0.4.0 → nimble_python-0.6.0}/api.md +1 -10
  6. {nimble_python-0.4.0 → nimble_python-0.6.0}/pyproject.toml +1 -1
  7. {nimble_python-0.4.0 → nimble_python-0.6.0}/requirements-dev.lock +9 -9
  8. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_client.py +17 -823
  9. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_compat.py +1 -1
  10. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_version.py +1 -1
  11. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/resources/crawl.py +8 -8
  12. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/__init__.py +0 -6
  13. nimble_python-0.6.0/src/nimble_python/types/client_extract_params.py +1923 -0
  14. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/crawl_list_params.py +4 -4
  15. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/crawl_list_response.py +6 -8
  16. nimble_python-0.4.0/src/nimble_python/types/crawl_response.py → nimble_python-0.6.0/src/nimble_python/types/crawl_status_response.py +8 -10
  17. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/extract_response.py +36 -27
  18. nimble_python-0.6.0/tests/api_resources/test_client.py +424 -0
  19. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/api_resources/test_crawl.py +8 -20
  20. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_client.py +10 -18
  21. {nimble_python-0.4.0 → nimble_python-0.6.0}/uv.lock +328 -328
  22. nimble_python-0.4.0/.release-please-manifest.json +0 -3
  23. nimble_python-0.4.0/src/nimble_python/types/agent_response.py +0 -321
  24. nimble_python-0.4.0/src/nimble_python/types/client_agent_params.py +0 -27
  25. nimble_python-0.4.0/src/nimble_python/types/client_crawl_params.py +0 -1391
  26. nimble_python-0.4.0/src/nimble_python/types/client_extract_params.py +0 -1332
  27. nimble_python-0.4.0/src/nimble_python/types/client_search_params.py +0 -75
  28. nimble_python-0.4.0/src/nimble_python/types/crawl_status_response.py +0 -8
  29. nimble_python-0.4.0/src/nimble_python/types/search_response.py +0 -90
  30. nimble_python-0.4.0/tests/api_resources/test_client.py +0 -1224
  31. {nimble_python-0.4.0 → nimble_python-0.6.0}/.gitignore +0 -0
  32. {nimble_python-0.4.0 → nimble_python-0.6.0}/CONTRIBUTING.md +0 -0
  33. {nimble_python-0.4.0 → nimble_python-0.6.0}/LICENSE +0 -0
  34. {nimble_python-0.4.0 → nimble_python-0.6.0}/SECURITY.md +0 -0
  35. {nimble_python-0.4.0 → nimble_python-0.6.0}/bin/check-release-environment +0 -0
  36. {nimble_python-0.4.0 → nimble_python-0.6.0}/bin/publish-pypi +0 -0
  37. {nimble_python-0.4.0 → nimble_python-0.6.0}/examples/.keep +0 -0
  38. {nimble_python-0.4.0 → nimble_python-0.6.0}/release-please-config.json +0 -0
  39. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/__init__.py +0 -0
  40. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_base_client.py +0 -0
  41. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_compat.py +0 -0
  42. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_constants.py +0 -0
  43. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_exceptions.py +0 -0
  44. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_files.py +0 -0
  45. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_models.py +0 -0
  46. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_qs.py +0 -0
  47. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_resource.py +0 -0
  48. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_response.py +0 -0
  49. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_streaming.py +0 -0
  50. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_types.py +0 -0
  51. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/__init__.py +0 -0
  52. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_datetime_parse.py +0 -0
  53. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_json.py +0 -0
  54. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_logs.py +0 -0
  55. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_proxy.py +0 -0
  56. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_reflection.py +0 -0
  57. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_resources_proxy.py +0 -0
  58. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_streams.py +0 -0
  59. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_sync.py +0 -0
  60. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_transform.py +0 -0
  61. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_typing.py +0 -0
  62. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/_utils/_utils.py +0 -0
  63. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/lib/.keep +0 -0
  64. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/py.typed +0 -0
  65. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/resources/__init__.py +0 -0
  66. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/resources/agents.py +0 -0
  67. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/agent_get_response.py +0 -0
  68. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/agent_list_params.py +0 -0
  69. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/agent_list_response.py +0 -0
  70. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/client_map_params.py +0 -0
  71. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/crawl_terminate_response.py +0 -0
  72. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimble_python/types/map_response.py +0 -0
  73. {nimble_python-0.4.0 → nimble_python-0.6.0}/src/nimbleway/lib/.keep +0 -0
  74. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/__init__.py +0 -0
  75. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/api_resources/__init__.py +0 -0
  76. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/api_resources/test_agents.py +0 -0
  77. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/conftest.py +0 -0
  78. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/sample_file.txt +0 -0
  79. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_deepcopy.py +0 -0
  80. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_extract_files.py +0 -0
  81. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_files.py +0 -0
  82. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_models.py +0 -0
  83. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_qs.py +0 -0
  84. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_required_args.py +0 -0
  85. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_response.py +0 -0
  86. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_streaming.py +0 -0
  87. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_transform.py +0 -0
  88. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_utils/test_datetime_parse.py +0 -0
  89. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_utils/test_json.py +0 -0
  90. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_utils/test_proxy.py +0 -0
  91. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/test_utils/test_typing.py +0 -0
  92. {nimble_python-0.4.0 → nimble_python-0.6.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.6.0"
3
+ }
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.0 (2026-02-15)
4
+
5
+ Full Changelog: [v0.5.0...v0.6.0](https://github.com/Nimbleway/nimble-python/compare/v0.5.0...v0.6.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** manual updates ([a26613e](https://github.com/Nimbleway/nimble-python/commit/a26613e7fd71242e524a5a0b8e34b066cad16119))
10
+ * **api:** manual updates ([6f547e1](https://github.com/Nimbleway/nimble-python/commit/6f547e1967faf0a3cd819882d5acc1259bd7a5bd))
11
+ * **api:** manual updates ([65b6c51](https://github.com/Nimbleway/nimble-python/commit/65b6c51e5c34c7bed2904894e8881cda5dbc4ae8))
12
+
13
+
14
+ ### Chores
15
+
16
+ * format all `api.md` files ([6d888ec](https://github.com/Nimbleway/nimble-python/commit/6d888ec6d27d748df0200e9205d14debfa4fb135))
17
+
18
+ ## 0.5.0 (2026-02-12)
19
+
20
+ Full Changelog: [v0.4.0...v0.5.0](https://github.com/Nimbleway/nimble-python/compare/v0.4.0...v0.5.0)
21
+
22
+ ### Features
23
+
24
+ * **api:** add browser_actions, remove search method, update extract parameters ([ae29531](https://github.com/Nimbleway/nimble-python/commit/ae29531f5882f6344327a1fec38a211b33042cfd))
25
+ * **api:** api update ([07bfd54](https://github.com/Nimbleway/nimble-python/commit/07bfd5493c461ca377118d15d48c2f03fc74fadf))
26
+ * **api:** api update ([691e98f](https://github.com/Nimbleway/nimble-python/commit/691e98f9bbec60505e6503c21cd1e7beca100089))
27
+ * **api:** api update ([c28dfc0](https://github.com/Nimbleway/nimble-python/commit/c28dfc06a0541b9a34e1a9720fe17912e14d4510))
28
+ * **api:** api update ([5a03bb6](https://github.com/Nimbleway/nimble-python/commit/5a03bb6b343d89f88ba90e37e05115edd22e10a0))
29
+ * **api:** manual updates ([ea9b017](https://github.com/Nimbleway/nimble-python/commit/ea9b017da698c9003d7d8705d74b6464d574b5ee))
30
+ * **api:** manual updates ([5ff9f95](https://github.com/Nimbleway/nimble-python/commit/5ff9f959dfd96319f5d9a5774642928a40e403fb))
31
+ * **api:** manual updates ([f92a797](https://github.com/Nimbleway/nimble-python/commit/f92a797664b06b49848f8d75a9f860792e7402be))
32
+
33
+
34
+ ### Chores
35
+
36
+ * **internal:** bump dependencies ([fbd9597](https://github.com/Nimbleway/nimble-python/commit/fbd9597337a8423aa11675f1a3d0f1c8d45ef502))
37
+ * **internal:** fix lint error on Python 3.14 ([48e9753](https://github.com/Nimbleway/nimble-python/commit/48e97535c899d49463dcca47af04d99383d414d6))
38
+
3
39
  ## 0.4.0 (2026-02-09)
4
40
 
5
41
  Full Changelog: [v0.3.0...v0.4.0](https://github.com/Nimbleway/nimble-python/compare/v0.3.0...v0.4.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: nimble_python
3
- Version: 0.4.0
3
+ Version: 0.6.0
4
4
  Summary: The official Python library for the nimble API
5
5
  Project-URL: Homepage, https://github.com/Nimbleway/nimble-python
6
6
  Project-URL: Repository, https://github.com/Nimbleway/nimble-python
@@ -77,7 +77,7 @@ client = Nimble(
77
77
  )
78
78
 
79
79
  response = client.extract(
80
- url="https://example.com/page",
80
+ url="url",
81
81
  )
82
82
  print(response.task_id)
83
83
  ```
@@ -103,7 +103,7 @@ client = AsyncNimble(
103
103
 
104
104
  async def main() -> None:
105
105
  response = await client.extract(
106
- url="https://example.com/page",
106
+ url="url",
107
107
  )
108
108
  print(response.task_id)
109
109
 
@@ -139,7 +139,7 @@ async def main() -> None:
139
139
  http_client=DefaultAioHttpClient(),
140
140
  ) as client:
141
141
  response = await client.extract(
142
- url="https://example.com/page",
142
+ url="url",
143
143
  )
144
144
  print(response.task_id)
145
145
 
@@ -166,10 +166,10 @@ from nimble_python import Nimble
166
166
  client = Nimble()
167
167
 
168
168
  response = client.extract(
169
- url="https://example.com/page",
170
- metadata={},
169
+ url="url",
170
+ session={},
171
171
  )
172
- print(response.metadata)
172
+ print(response.session)
173
173
  ```
174
174
 
175
175
  ## Handling errors
@@ -189,7 +189,7 @@ client = Nimble()
189
189
 
190
190
  try:
191
191
  client.extract(
192
- url="https://example.com/page",
192
+ url="url",
193
193
  )
194
194
  except nimble_python.APIConnectionError as e:
195
195
  print("The server could not be reached")
@@ -234,7 +234,7 @@ client = Nimble(
234
234
 
235
235
  # Or, configure per-request:
236
236
  client.with_options(max_retries=5).extract(
237
- url="https://example.com/page",
237
+ url="url",
238
238
  )
239
239
  ```
240
240
 
@@ -259,7 +259,7 @@ client = Nimble(
259
259
 
260
260
  # Override per-request:
261
261
  client.with_options(timeout=5.0).extract(
262
- url="https://example.com/page",
262
+ url="url",
263
263
  )
264
264
  ```
265
265
 
@@ -302,7 +302,7 @@ from nimble_python import Nimble
302
302
 
303
303
  client = Nimble()
304
304
  response = client.with_raw_response.extract(
305
- url="https://example.com/page",
305
+ url="url",
306
306
  )
307
307
  print(response.headers.get('X-My-Header'))
308
308
 
@@ -322,7 +322,7 @@ To stream the response body, use `.with_streaming_response` instead, which requi
322
322
 
323
323
  ```python
324
324
  with client.with_streaming_response.extract(
325
- url="https://example.com/page",
325
+ url="url",
326
326
  ) as response:
327
327
  print(response.headers.get("X-My-Header"))
328
328
 
@@ -42,7 +42,7 @@ client = Nimble(
42
42
  )
43
43
 
44
44
  response = client.extract(
45
- url="https://example.com/page",
45
+ url="url",
46
46
  )
47
47
  print(response.task_id)
48
48
  ```
@@ -68,7 +68,7 @@ client = AsyncNimble(
68
68
 
69
69
  async def main() -> None:
70
70
  response = await client.extract(
71
- url="https://example.com/page",
71
+ url="url",
72
72
  )
73
73
  print(response.task_id)
74
74
 
@@ -104,7 +104,7 @@ async def main() -> None:
104
104
  http_client=DefaultAioHttpClient(),
105
105
  ) as client:
106
106
  response = await client.extract(
107
- url="https://example.com/page",
107
+ url="url",
108
108
  )
109
109
  print(response.task_id)
110
110
 
@@ -131,10 +131,10 @@ from nimble_python import Nimble
131
131
  client = Nimble()
132
132
 
133
133
  response = client.extract(
134
- url="https://example.com/page",
135
- metadata={},
134
+ url="url",
135
+ session={},
136
136
  )
137
- print(response.metadata)
137
+ print(response.session)
138
138
  ```
139
139
 
140
140
  ## Handling errors
@@ -154,7 +154,7 @@ client = Nimble()
154
154
 
155
155
  try:
156
156
  client.extract(
157
- url="https://example.com/page",
157
+ url="url",
158
158
  )
159
159
  except nimble_python.APIConnectionError as e:
160
160
  print("The server could not be reached")
@@ -199,7 +199,7 @@ client = Nimble(
199
199
 
200
200
  # Or, configure per-request:
201
201
  client.with_options(max_retries=5).extract(
202
- url="https://example.com/page",
202
+ url="url",
203
203
  )
204
204
  ```
205
205
 
@@ -224,7 +224,7 @@ client = Nimble(
224
224
 
225
225
  # Override per-request:
226
226
  client.with_options(timeout=5.0).extract(
227
- url="https://example.com/page",
227
+ url="url",
228
228
  )
229
229
  ```
230
230
 
@@ -267,7 +267,7 @@ from nimble_python import Nimble
267
267
 
268
268
  client = Nimble()
269
269
  response = client.with_raw_response.extract(
270
- url="https://example.com/page",
270
+ url="url",
271
271
  )
272
272
  print(response.headers.get('X-My-Header'))
273
273
 
@@ -287,7 +287,7 @@ To stream the response body, use `.with_streaming_response` instead, which requi
287
287
 
288
288
  ```python
289
289
  with client.with_streaming_response.extract(
290
- url="https://example.com/page",
290
+ url="url",
291
291
  ) as response:
292
292
  print(response.headers.get("X-My-Header"))
293
293
 
@@ -3,22 +3,13 @@
3
3
  Types:
4
4
 
5
5
  ```python
6
- from nimble_python.types import (
7
- AgentResponse,
8
- CrawlResponse,
9
- ExtractResponse,
10
- MapResponse,
11
- SearchResponse,
12
- )
6
+ from nimble_python.types import ExtractResponse, MapResponse
13
7
  ```
14
8
 
15
9
  Methods:
16
10
 
17
- - <code title="post /v1/agent">client.<a href="./src/nimble_python/_client.py">agent</a>(\*\*<a href="src/nimble_python/types/client_agent_params.py">params</a>) -> <a href="./src/nimble_python/types/agent_response.py">AgentResponse</a></code>
18
- - <code title="post /v1/crawl">client.<a href="./src/nimble_python/_client.py">crawl</a>(\*\*<a href="src/nimble_python/types/client_crawl_params.py">params</a>) -> <a href="./src/nimble_python/types/crawl_response.py">CrawlResponse</a></code>
19
11
  - <code title="post /v1/extract">client.<a href="./src/nimble_python/_client.py">extract</a>(\*\*<a href="src/nimble_python/types/client_extract_params.py">params</a>) -> <a href="./src/nimble_python/types/extract_response.py">ExtractResponse</a></code>
20
12
  - <code title="post /v1/map">client.<a href="./src/nimble_python/_client.py">map</a>(\*\*<a href="src/nimble_python/types/client_map_params.py">params</a>) -> <a href="./src/nimble_python/types/map_response.py">MapResponse</a></code>
21
- - <code title="post /v1/search">client.<a href="./src/nimble_python/_client.py">search</a>(\*\*<a href="src/nimble_python/types/client_search_params.py">params</a>) -> <a href="./src/nimble_python/types/search_response.py">SearchResponse</a></code>
22
13
 
23
14
  # Agents
24
15
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "nimble_python"
3
- version = "0.4.0"
3
+ version = "0.6.0"
4
4
  description = "The official Python library for the nimble API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -3,13 +3,13 @@
3
3
  -e .
4
4
  annotated-types==0.7.0
5
5
  # via pydantic
6
- anyio==4.12.0
6
+ anyio==4.12.1
7
7
  # via
8
8
  # httpx
9
9
  # nimble-python
10
10
  backports-asyncio-runner==1.2.0 ; python_full_version < '3.11'
11
11
  # via pytest-asyncio
12
- certifi==2025.11.12
12
+ certifi==2026.1.4
13
13
  # via
14
14
  # httpcore
15
15
  # httpx
@@ -36,7 +36,7 @@ idna==3.11
36
36
  # via
37
37
  # anyio
38
38
  # httpx
39
- importlib-metadata==8.7.0
39
+ importlib-metadata==8.7.1
40
40
  iniconfig==2.1.0 ; python_full_version < '3.10'
41
41
  # via pytest
42
42
  iniconfig==2.3.0 ; python_full_version >= '3.10'
@@ -50,11 +50,11 @@ mdurl==0.1.2
50
50
  mypy==1.17.0
51
51
  mypy-extensions==1.1.0
52
52
  # via mypy
53
- nodeenv==1.9.1
53
+ nodeenv==1.10.0
54
54
  # via pyright
55
55
  packaging==25.0
56
56
  # via pytest
57
- pathspec==0.12.1
57
+ pathspec==1.0.3
58
58
  # via mypy
59
59
  pluggy==1.6.0
60
60
  # via pytest
@@ -71,7 +71,7 @@ pytest==8.4.2 ; python_full_version < '3.10'
71
71
  # via
72
72
  # pytest-asyncio
73
73
  # pytest-xdist
74
- pytest==9.0.1 ; python_full_version >= '3.10'
74
+ pytest==9.0.2 ; python_full_version >= '3.10'
75
75
  # via
76
76
  # pytest-asyncio
77
77
  # pytest-xdist
@@ -82,14 +82,14 @@ python-dateutil==2.9.0.post0 ; python_full_version < '3.10'
82
82
  # via time-machine
83
83
  respx==0.22.0
84
84
  rich==14.2.0
85
- ruff==0.14.7
85
+ ruff==0.14.13
86
86
  six==1.17.0 ; python_full_version < '3.10'
87
87
  # via python-dateutil
88
88
  sniffio==1.3.1
89
89
  # via nimble-python
90
90
  time-machine==2.19.0 ; python_full_version < '3.10'
91
- time-machine==3.1.0 ; python_full_version >= '3.10'
92
- tomli==2.3.0 ; python_full_version < '3.11'
91
+ time-machine==3.2.0 ; python_full_version >= '3.10'
92
+ tomli==2.4.0 ; python_full_version < '3.11'
93
93
  # via
94
94
  # mypy
95
95
  # pytest