nvidia-nat-test 1.3.0rc4__py3-none-any.whl → 1.3.0rc6__py3-none-any.whl

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.

Potentially problematic release.


This version of nvidia-nat-test might be problematic. Click here for more details.

nat/test/plugin.py CHANGED
@@ -15,6 +15,7 @@
15
15
 
16
16
  import os
17
17
  import subprocess
18
+ import types
18
19
  import typing
19
20
  from collections.abc import AsyncGenerator
20
21
  from collections.abc import Generator
@@ -219,10 +220,48 @@ def azure_openai_keys_fixture(fail_missing: bool):
219
220
  yield require_env_variables(
220
221
  varnames=["AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT"],
221
222
  reason="Azure integration tests require the `AZURE_OPENAI_API_KEY` and `AZURE_OPENAI_ENDPOINT` environment "
222
- "variable to be defined.",
223
+ "variables to be defined.",
223
224
  fail_missing=fail_missing)
224
225
 
225
226
 
227
+ @pytest.fixture(name="langfuse_keys", scope='session')
228
+ def langfuse_keys_fixture(fail_missing: bool):
229
+ """
230
+ Use for integration tests that require Langfuse credentials.
231
+ """
232
+ yield require_env_variables(
233
+ varnames=["LANGFUSE_PUBLIC_KEY", "LANGFUSE_SECRET_KEY"],
234
+ reason="Langfuse integration tests require the `LANGFUSE_PUBLIC_KEY` and `LANGFUSE_SECRET_KEY` environment "
235
+ "variables to be defined.",
236
+ fail_missing=fail_missing)
237
+
238
+
239
+ @pytest.fixture(name="wandb_api_key", scope='session')
240
+ def wandb_api_key_fixture(fail_missing: bool):
241
+ """
242
+ Use for integration tests that require a Weights & Biases API key.
243
+ """
244
+ yield require_env_variables(
245
+ varnames=["WANDB_API_KEY"],
246
+ reason="Weights & Biases integration tests require the `WANDB_API_KEY` environment variable to be defined.",
247
+ fail_missing=fail_missing)
248
+
249
+
250
+ @pytest.fixture(name="weave", scope='session')
251
+ def require_weave_fixture(fail_missing: bool) -> types.ModuleType:
252
+ """
253
+ Use for integration tests that require Weave to be running.
254
+ """
255
+ try:
256
+ import weave
257
+ return weave
258
+ except Exception as e:
259
+ reason = "Weave must be installed to run weave based tests"
260
+ if fail_missing:
261
+ raise RuntimeError(reason) from e
262
+ pytest.skip(reason=reason)
263
+
264
+
226
265
  @pytest.fixture(name="require_docker", scope='session')
227
266
  def require_docker_fixture(fail_missing: bool) -> "DockerClient":
228
267
  """
@@ -264,8 +303,15 @@ def examples_dir_fixture(root_repo_dir: Path) -> Path:
264
303
  return root_repo_dir / "examples"
265
304
 
266
305
 
267
- @pytest.fixture(name="require_etcd", scope="session")
268
- def require_etcd_fixture(fail_missing: bool = False) -> bool:
306
+ @pytest.fixture(name="env_without_nat_log_level", scope='function')
307
+ def env_without_nat_log_level_fixture() -> dict[str, str]:
308
+ env = os.environ.copy()
309
+ env.pop("NAT_LOG_LEVEL", None)
310
+ return env
311
+
312
+
313
+ @pytest.fixture(name="etcd_url", scope="session")
314
+ def etcd_url_fixture(fail_missing: bool = False) -> str:
269
315
  """
270
316
  To run these tests, an etcd server must be running
271
317
  """
@@ -273,21 +319,22 @@ def require_etcd_fixture(fail_missing: bool = False) -> bool:
273
319
 
274
320
  host = os.getenv("NAT_CI_ETCD_HOST", "localhost")
275
321
  port = os.getenv("NAT_CI_ETCD_PORT", "2379")
276
- health_url = f"http://{host}:{port}/health"
322
+ url = f"http://{host}:{port}"
323
+ health_url = f"{url}/health"
277
324
 
278
325
  try:
279
326
  response = requests.get(health_url, timeout=5)
280
327
  response.raise_for_status()
281
- return True
328
+ return url
282
329
  except: # noqa: E722
283
- failure_reason = f"Unable to connect to etcd server at {health_url}"
330
+ failure_reason = f"Unable to connect to etcd server at {url}"
284
331
  if fail_missing:
285
332
  raise RuntimeError(failure_reason)
286
333
  pytest.skip(reason=failure_reason)
287
334
 
288
335
 
289
336
  @pytest.fixture(name="milvus_uri", scope="session")
290
- def milvus_uri_fixture(require_etcd: bool, fail_missing: bool = False) -> str:
337
+ def milvus_uri_fixture(etcd_url: str, fail_missing: bool = False) -> str:
291
338
  """
292
339
  To run these tests, a Milvus server must be running
293
340
  """
@@ -418,7 +465,7 @@ def fixture_redis_server(fail_missing: bool) -> Generator[dict[str, str | int]]:
418
465
  pytest.skip(f"Error connecting to Redis server: {e}, skipping redis tests")
419
466
 
420
467
 
421
- @pytest_asyncio.fixture(name="mysql_server", scope="module")
468
+ @pytest_asyncio.fixture(name="mysql_server", scope="session")
422
469
  async def fixture_mysql_server(fail_missing: bool) -> AsyncGenerator[dict[str, str | int]]:
423
470
  """Fixture to safely skip MySQL based tests if MySQL is not running"""
424
471
  host = os.environ.get('NAT_CI_MYSQL_HOST', '127.0.0.1')
@@ -441,7 +488,7 @@ async def fixture_mysql_server(fail_missing: bool) -> AsyncGenerator[dict[str, s
441
488
  pytest.skip(f"Error connecting to MySQL server: {e}, skipping MySQL tests")
442
489
 
443
490
 
444
- @pytest.fixture(name="minio_server", scope="module")
491
+ @pytest.fixture(name="minio_server", scope="session")
445
492
  def minio_server_fixture(fail_missing: bool) -> Generator[dict[str, str | int]]:
446
493
  """Fixture to safely skip MinIO based tests if MinIO is not running"""
447
494
  host = os.getenv("NAT_CI_MINIO_HOST", "localhost")
@@ -468,17 +515,76 @@ def minio_server_fixture(fail_missing: bool) -> Generator[dict[str, str | int]]:
468
515
  aws_access_key_id=aws_access_key_id,
469
516
  aws_secret_access_key=aws_secret_access_key,
470
517
  endpoint_url=endpoint_url)
471
- client.head_bucket(Bucket=bucket_name)
518
+ client.list_buckets()
472
519
  yield minio_info
473
520
  except ImportError:
474
521
  if fail_missing:
475
522
  raise
476
523
  pytest.skip("aioboto3 not installed, skipping MinIO tests")
477
524
  except Exception as e:
478
- import botocore.exceptions
479
- if isinstance(e, botocore.exceptions.ClientError) and e.response['Error']['Code'] == '404':
480
- yield minio_info # Bucket does not exist, but server is reachable
481
- elif fail_missing:
525
+ if fail_missing:
526
+ raise
527
+ else:
528
+ pytest.skip(f"Error connecting to MinIO server: {e}, skipping MinIO tests")
529
+
530
+
531
+ @pytest.fixture(name="langfuse_bucket", scope="session")
532
+ def langfuse_bucket_fixture(fail_missing: bool, minio_server: dict[str, str | int]) -> Generator[str]:
533
+
534
+ bucket_name = os.getenv("NAT_CI_LANGFUSE_BUCKET", "langfuse")
535
+ try:
536
+ import botocore.session
537
+ session = botocore.session.get_session()
538
+
539
+ client = session.create_client("s3",
540
+ aws_access_key_id=minio_server["aws_access_key_id"],
541
+ aws_secret_access_key=minio_server["aws_secret_access_key"],
542
+ endpoint_url=minio_server["endpoint_url"])
543
+
544
+ buckets = client.list_buckets()
545
+ bucket_names = [b['Name'] for b in buckets['Buckets']]
546
+ if bucket_name not in bucket_names:
547
+ client.create_bucket(Bucket=bucket_name)
548
+
549
+ yield bucket_name
550
+ except ImportError:
551
+ if fail_missing:
552
+ raise
553
+ pytest.skip("aioboto3 not installed, skipping MinIO tests")
554
+ except Exception as e:
555
+ if fail_missing:
482
556
  raise
483
557
  else:
484
558
  pytest.skip(f"Error connecting to MinIO server: {e}, skipping MinIO tests")
559
+
560
+
561
+ @pytest.fixture(name="langfuse_url", scope="session")
562
+ def langfuse_url_fixture(fail_missing: bool, langfuse_bucket: str) -> str:
563
+ """
564
+ To run these tests, a langfuse server must be running.
565
+ """
566
+ import requests
567
+
568
+ host = os.getenv("NAT_CI_LANGFUSE_HOST", "localhost")
569
+ port = int(os.getenv("NAT_CI_LANGFUSE_PORT", "3000"))
570
+ url = f"http://{host}:{port}"
571
+ health_endpoint = f"{url}/api/public/health"
572
+ try:
573
+ response = requests.get(health_endpoint, timeout=5)
574
+ response.raise_for_status()
575
+
576
+ return url
577
+ except Exception as e:
578
+ reason = f"Unable to connect to Langfuse server at {url}: {e}"
579
+ if fail_missing:
580
+ raise RuntimeError(reason)
581
+ pytest.skip(reason=reason)
582
+
583
+
584
+ @pytest.fixture(name="langfuse_trace_url", scope="session")
585
+ def langfuse_trace_url_fixture(langfuse_url: str) -> str:
586
+ """
587
+ The langfuse_url fixture provides the base url, however the general.telemetry.tracing["langfuse"].endpoint expects
588
+ the trace url which is what this fixture provides.
589
+ """
590
+ return f"{langfuse_url}/api/public/otel/v1/traces"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nvidia-nat-test
3
- Version: 1.3.0rc4
3
+ Version: 1.3.0rc6
4
4
  Summary: Testing utilities for NeMo Agent toolkit
5
5
  Author: NVIDIA Corporation
6
6
  Maintainer: NVIDIA Corporation
@@ -16,7 +16,7 @@ Requires-Python: <3.14,>=3.11
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE-3rd-party.txt
18
18
  License-File: LICENSE.md
19
- Requires-Dist: nvidia-nat==v1.3.0-rc4
19
+ Requires-Dist: nvidia-nat==v1.3.0-rc6
20
20
  Requires-Dist: langchain-community~=0.3
21
21
  Requires-Dist: pytest~=8.3
22
22
  Dynamic: license-file
@@ -5,14 +5,14 @@ nat/test/functions.py,sha256=ZxXVzfaLBGOpR5qtmMrKU7q-M9-vVGGj3Xi5mrw4vHY,3557
5
5
  nat/test/llm.py,sha256=f6bz6arAQjhjuOKFrLfu_U1LbiyFzQmpM-q8b-WKSrU,9550
6
6
  nat/test/memory.py,sha256=xki_A2yiMhEZuQk60K7t04QRqf32nQqnfzD5Iv7fkvw,1456
7
7
  nat/test/object_store_tests.py,sha256=PyJioOtoSzILPq6LuD-sOZ_89PIcgXWZweoHBQpK2zQ,4281
8
- nat/test/plugin.py,sha256=Sh2iJy0XSKeTsODz_8azMKDCyv_T-ZLU6CLpOjm0Pu4,17306
8
+ nat/test/plugin.py,sha256=NV4JcUnqhBhQzO4sc3P8JDBlwWohmu5TYVCWRbNPwVo,20911
9
9
  nat/test/register.py,sha256=o1BEA5fyxyFyCxXhQ6ArmtuNpgRyTEfvw6HdBgECPLI,897
10
10
  nat/test/tool_test_runner.py,sha256=SxavwXHkvCQDl_PUiiiqgvGfexKJJTeBdI5i1qk6AzI,21712
11
11
  nat/test/utils.py,sha256=Lml187P9SUP3IB_HhBaU1XNhiljcpOFFZOAxgQR1vQo,5936
12
- nvidia_nat_test-1.3.0rc4.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
13
- nvidia_nat_test-1.3.0rc4.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
14
- nvidia_nat_test-1.3.0rc4.dist-info/METADATA,sha256=KIPlC8vJ6if6Z1KtZwNq8ehzmud1--gKUX_o6kyY18Y,1914
15
- nvidia_nat_test-1.3.0rc4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
- nvidia_nat_test-1.3.0rc4.dist-info/entry_points.txt,sha256=7dOP9XB6iMDqvav3gYx9VWUwA8RrFzhbAa8nGeC8e4Y,99
17
- nvidia_nat_test-1.3.0rc4.dist-info/top_level.txt,sha256=8-CJ2cP6-f0ZReXe5Hzqp-5pvzzHz-5Ds5H2bGqh1-U,4
18
- nvidia_nat_test-1.3.0rc4.dist-info/RECORD,,
12
+ nvidia_nat_test-1.3.0rc6.dist-info/licenses/LICENSE-3rd-party.txt,sha256=fOk5jMmCX9YoKWyYzTtfgl-SUy477audFC5hNY4oP7Q,284609
13
+ nvidia_nat_test-1.3.0rc6.dist-info/licenses/LICENSE.md,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
14
+ nvidia_nat_test-1.3.0rc6.dist-info/METADATA,sha256=-YItT2dhstrLBrPi7KyCSl0voptobrmQopZrQ4eKmA0,1914
15
+ nvidia_nat_test-1.3.0rc6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
+ nvidia_nat_test-1.3.0rc6.dist-info/entry_points.txt,sha256=7dOP9XB6iMDqvav3gYx9VWUwA8RrFzhbAa8nGeC8e4Y,99
17
+ nvidia_nat_test-1.3.0rc6.dist-info/top_level.txt,sha256=8-CJ2cP6-f0ZReXe5Hzqp-5pvzzHz-5Ds5H2bGqh1-U,4
18
+ nvidia_nat_test-1.3.0rc6.dist-info/RECORD,,