From 9909438ef8f95765272570b5c650e17f9af0bd17 Mon Sep 17 00:00:00 2001 From: Ivan Podkidyshev Date: Tue, 10 Feb 2026 21:50:10 +0100 Subject: [PATCH 1/6] Updated test to check for copyright --- tests/test_check_copyright_headers.py | 164 +++++++++++++++++++------- 1 file changed, 119 insertions(+), 45 deletions(-) diff --git a/tests/test_check_copyright_headers.py b/tests/test_check_copyright_headers.py index 8e6585be9..56a6607fd 100644 --- a/tests/test_check_copyright_headers.py +++ b/tests/test_check_copyright_headers.py @@ -15,6 +15,8 @@ # limitations under the License. import subprocess +from collections import defaultdict +from datetime import datetime from pathlib import Path import pytest @@ -37,61 +39,133 @@ # See the License for the specific language governing permissions and # limitations under the License.""" -HEADER_LINES = HEADER.count("\n") + 1 - -PY_FILES = [p for p in Path().glob("./src/**/*.py")] -PY_FILES += [p for p in Path().glob("./tests/**/*.py")] -TOML_FILES = [p for p in Path().glob("conf/**/*.toml")] + ["pyproject.toml", ".taplo.toml"] - - -def prepare_copyright_with_year(file: Path, line: str) -> str: - res = subprocess.run( - ["git", "log", "--format=%ad", "--date=format:%Y", "--follow", "-1", file], +HEADER_LINES = HEADER.split("\n") +HEADER_TAIL = "\n".join(HEADER_LINES[2:]) + +PY_FILES = list(Path().glob("./src/**/*.py")) + list(Path().glob("./tests/**/*.py")) +TOML_FILES = list(Path().glob("conf/**/*.toml")) + [Path("pyproject.toml"), Path(".taplo.toml")] + +CURRENT_YEAR = datetime.now().year + + +def _path_key(file: Path) -> str: + """Normalize path for cache lookup (e.g. ./src/foo.py and src/foo.py match).""" + return file.as_posix().lstrip("./") + + +def _format_years_to_ranges(years: list[int]) -> str: + """Turn sorted unique years into a string with ranges for consecutive years. + + E.g. [2024, 2026] -> "2024, 2026" + [2024, 2025, 2027] -> "2024-2025, 2027" + """ + if not years: + raise ValueError("Unexpected behavior. Expected at least one year in the list. If it's a new file - should be the current year") + + parts: list[str] = [] + range_start = years[0] + range_end = years[0] + for y in years[1:]: + if y == range_end + 1: + range_end = y + else: + parts.append(f"{range_start}-{range_end}" if range_start != range_end else str(range_start)) + range_start = y + range_end = y + parts.append(f"{range_start}-{range_end}" if range_start != range_end else str(range_start)) + return ", ".join(parts) + + +def test_format_years_to_ranges(): + """Check year range formatting: consecutive years become start-end, non-consecutive stay separate.""" + assert _format_years_to_ranges([2024, 2026]) == "2024, 2026" + assert _format_years_to_ranges([2024, 2025, 2027]) == "2024-2025, 2027" + assert _format_years_to_ranges([2024]) == "2024" + assert _format_years_to_ranges([2024, 2025, 2026]) == "2024-2026" + assert _format_years_to_ranges([]) == "" + + +@pytest.fixture(scope="session") +def git_commit_years_cache() -> dict[str, list[int]]: + """ + Map all git-tracked files in this repo to the sorted list of years when they were touched in a commit + + Example: + >>> git_commit_years_cache() + {"src/cloudai/core.py": [2024, 2025, 2026]} + """ + + # 1: get all tracked files + ls_out = subprocess.run( + ["git", "ls-files"], capture_output=True, text=True, + check=True, ) - if not res.stdout: - # in some cases when a file was renamed, --follow won't allow getting the last modified year - res = subprocess.run( - ["git", "log", "--format=%ad", "--date=format:%Y", "-1", file], - capture_output=True, - text=True, - ) - changed_years = res.stdout.splitlines() - last_modified_year_real = int(changed_years[0]) - - curr_year_spec = line.split(" ")[3] - spec_is_range = "-" in curr_year_spec - + files = ls_out.stdout.splitlines() + + # 2. Stream full history: each commit has a year line then affected files + log_cmd = [ + "git", + "-c", + "core.quotepath=false", + "log", + "--format=Y:%ad", + "--date=format:%Y", + "--name-only", + "--", + "src/", + "tests/", + "conf/", + "pyproject.toml", + ".taplo.toml", + ] + file_years: dict[str, set[int]] = defaultdict(set) + + process = subprocess.Popen(log_cmd, stdout=subprocess.PIPE, text=True) + if process.stdout is None: + raise OSError("git subprocess: stdout wasn't initialized for the subprocess") + + with process: + current_year: int | None = None + for line in process.stdout: + line = line.strip() + if not line: + continue + if line.startswith("Y:"): + current_year = int(line[2:]) + elif current_year is not None and line in files: + file_years[line].add(current_year) + + if process.returncode != 0: + raise RuntimeError("git subprocess: unknown error, check output") + + return {path: sorted(years) for path, years in file_years.items()} + + +def prepare_copyright_with_year(file: Path, years_cache: dict[str, list[int]]) -> str: + path_key = file.as_posix().replace("./", "", 1) + years = years_cache.get(path_key, [CURRENT_YEAR]) + years_str = _format_years_to_ranges(years) after_year_str = "NVIDIA CORPORATION & AFFILIATES. All rights reserved." - - if spec_is_range: - created_year = int(curr_year_spec.split("-")[0]) - return f"# Copyright (c) {created_year}-{last_modified_year_real} {after_year_str}" - - if int(curr_year_spec) < last_modified_year_real: - return f"# Copyright (c) {curr_year_spec}-{last_modified_year_real} {after_year_str}" - - return f"# Copyright (c) {last_modified_year_real} {after_year_str}" + return f"# Copyright (c) {years_str} {after_year_str}" @pytest.mark.parametrize("py_file", PY_FILES, ids=[str(f) for f in PY_FILES]) -def test_src_copyright_header(py_file: Path): +def test_src_copyright_header(py_file: Path, git_commit_years_cache: dict[str, list[int]]): with py_file.open() as file: - first_lines = [next(file).strip() for _ in range(HEADER_LINES)] + actual_copyright_lines = [next(file).strip() for _ in range(len(HEADER_LINES))] - assert first_lines[0] == "# SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES", ( - "SPDX-FileCopyrightText is not valid" - ) - assert first_lines[1] == prepare_copyright_with_year(py_file, first_lines[1]), "Copyright year is not valid" - assert "\n".join(first_lines[2:]) == "\n".join(HEADER.splitlines()[2:]), f"Header mismatch in {py_file}" + assert actual_copyright_lines[0] == HEADER_LINES[0], "SPDX-FileCopyrightText is not valid" + assert actual_copyright_lines[1] == prepare_copyright_with_year(py_file, git_commit_years_cache), "Copyright year is not valid" + assert "\n".join(actual_copyright_lines[2:]) == HEADER_TAIL, f"Header mismatch in {py_file}" @pytest.mark.parametrize("toml_file", TOML_FILES, ids=[str(f) for f in TOML_FILES]) -def test_toml_copyright_header(toml_file): - with open(toml_file, "r") as file: - first_lines = [next(file).strip() for _ in range(HEADER_LINES)] +def test_toml_copyright_header(toml_file: Path, git_commit_years_cache: dict[str, list[int]]): + with toml_file.open() as file: + actual_copyright_lines = [next(file).strip() for _ in range(len(HEADER_LINES))] - assert first_lines[0] == "# SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES" - assert first_lines[1] == prepare_copyright_with_year(toml_file, first_lines[1]) - assert "\n".join(first_lines[2:]) == "\n".join(HEADER.splitlines()[2:]), f"Header mismatch in {toml_file}" + assert actual_copyright_lines[0] == HEADER_LINES[0], "SPDX-FileCopyrightText is not valid" + assert actual_copyright_lines[1] == prepare_copyright_with_year(toml_file, git_commit_years_cache), "Copyright year is not valid" + assert "\n".join(actual_copyright_lines[2:]) == HEADER_TAIL, f"Header mismatch in {toml_file}" From ae826e622d671ded969246777a191adba21b9a70 Mon Sep 17 00:00:00 2001 From: Ivan Podkidyshev Date: Thu, 12 Feb 2026 13:31:41 +0100 Subject: [PATCH 2/6] neuroslop cleanup --- conf/common/system/example_runai_cluster.toml | 2 +- tests/test_check_copyright_headers.py | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/conf/common/system/example_runai_cluster.toml b/conf/common/system/example_runai_cluster.toml index b8a610523..e35bd9645 100644 --- a/conf/common/system/example_runai_cluster.toml +++ b/conf/common/system/example_runai_cluster.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/tests/test_check_copyright_headers.py b/tests/test_check_copyright_headers.py index 56a6607fd..8c2f73764 100644 --- a/tests/test_check_copyright_headers.py +++ b/tests/test_check_copyright_headers.py @@ -76,13 +76,17 @@ def _format_years_to_ranges(years: list[int]) -> str: return ", ".join(parts) -def test_format_years_to_ranges(): - """Check year range formatting: consecutive years become start-end, non-consecutive stay separate.""" - assert _format_years_to_ranges([2024, 2026]) == "2024, 2026" - assert _format_years_to_ranges([2024, 2025, 2027]) == "2024-2025, 2027" - assert _format_years_to_ranges([2024]) == "2024" - assert _format_years_to_ranges([2024, 2025, 2026]) == "2024-2026" - assert _format_years_to_ranges([]) == "" +@pytest.mark.parametrize( + ("years_list", "expected"), + ( + ([2024, 2026], "2024, 2026"), + ([2024, 2025, 2027], "2024-2025, 2027"), + ([2024], "2024"), + ([2024, 2025, 2026], "2024-2026"), + ) +) +def test_format_years_to_ranges(years_list: list[int], expected: str): + assert _format_years_to_ranges(years_list) == expected @pytest.fixture(scope="session") @@ -104,7 +108,7 @@ def git_commit_years_cache() -> dict[str, list[int]]: ) files = ls_out.stdout.splitlines() - # 2. Stream full history: each commit has a year line then affected files + # 2: stream full history: each commit has a year line then affected files log_cmd = [ "git", "-c", From e705ec620c91ad548d4061d05ee1ac7fedc78e35 Mon Sep 17 00:00:00 2001 From: Ivan Podkidyshev Date: Thu, 12 Feb 2026 14:28:30 +0100 Subject: [PATCH 3/6] fixed copyright for all files --- conf/common/system/example_runai_cluster.toml | 2 +- conf/common/test/dse_nccl_all_gather.toml | 2 +- conf/common/test/nccl_test.toml | 2 +- .../test_scenario/dse_nccl_all_gather.toml | 2 +- .../common/test_scenario/slurm_container.toml | 2 +- .../test_scenario/ucc_generator_test.toml | 2 +- .../test/aiconfigurator_disagg.toml | 2 +- .../test_scenario/aiconfigurator_disagg.toml | 2 +- .../dse_aiconfigurator_disagg.toml | 2 +- .../megatron_bridge_qwen_30b.toml | 2 +- conf/experimental/test/ddlb_test.toml | 2 +- .../experimental/test/deepep_low_latency.toml | 2 +- src/cloudai/_core/base_reporter.py | 2 +- src/cloudai/configurator/__init__.py | 2 +- src/cloudai/configurator/reward_functions.py | 2 +- src/cloudai/core.py | 2 +- src/cloudai/models/scenario.py | 2 +- src/cloudai/registration.py | 2 +- src/cloudai/systems/lsf/lsf_job.py | 2 +- src/cloudai/systems/lsf/lsf_runner.py | 2 +- src/cloudai/systems/runai/runai_job.py | 2 +- src/cloudai/workloads/ai_dynamo/__init__.py | 2 +- .../ai_dynamo/kubernetes_json_gen_strategy.py | 2 +- src/cloudai/workloads/aiconfig/__init__.py | 2 +- src/cloudai/workloads/bash_cmd/__init__.py | 2 +- src/cloudai/workloads/bash_cmd/bash_cmd.py | 2 +- src/cloudai/workloads/ddlb/__init__.py | 2 +- .../ddlb/slurm_command_gen_strategy.py | 2 +- src/cloudai/workloads/deepep/deepep.py | 2 +- .../deepep/report_generation_strategy.py | 2 +- .../deepep/slurm_command_gen_strategy.py | 2 +- .../workloads/megatron_bridge/__init__.py | 2 +- .../performance_report_generation_strategy.py | 2 +- .../prediction_report_generation_strategy.py | 2 +- .../nccl_test/prediction_report_generator.py | 2 +- .../nccl_test/report_generation_strategy.py | 2 +- src/cloudai/workloads/nixl_bench/__init__.py | 2 +- .../workloads/nixl_bench/nixl_bench.py | 2 +- .../workloads/nixl_kvbench/__init__.py | 2 +- .../report_generation_strategy.py | 2 +- src/cloudai/workloads/osu_bench/__init__.py | 2 +- src/cloudai/workloads/osu_bench/osu_bench.py | 2 +- .../osu_bench/slurm_command_gen_strategy.py | 2 +- .../workloads/triton_inference/__init__.py | 2 +- .../report_generation_strategy.py | 2 +- .../test_nccl_kubernetes_json_gen_strategy.py | 2 +- ...megatron_run_report_generation_strategy.py | 2 +- .../test_nccl_prediction_report_generator.py | 2 +- tests/test_base_runner.py | 2 +- tests/test_check_copyright_headers.py | 126 +++++++----------- tests/test_cli.py | 2 +- tests/test_git_repo_installer.py | 2 +- 52 files changed, 101 insertions(+), 127 deletions(-) diff --git a/conf/common/system/example_runai_cluster.toml b/conf/common/system/example_runai_cluster.toml index e35bd9645..5aa6e32f6 100644 --- a/conf/common/system/example_runai_cluster.toml +++ b/conf/common/system/example_runai_cluster.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/common/test/dse_nccl_all_gather.toml b/conf/common/test/dse_nccl_all_gather.toml index 94cb2579e..e9e32dc74 100644 --- a/conf/common/test/dse_nccl_all_gather.toml +++ b/conf/common/test/dse_nccl_all_gather.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/common/test/nccl_test.toml b/conf/common/test/nccl_test.toml index ecb1216e1..36412a6c5 100644 --- a/conf/common/test/nccl_test.toml +++ b/conf/common/test/nccl_test.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/common/test_scenario/dse_nccl_all_gather.toml b/conf/common/test_scenario/dse_nccl_all_gather.toml index 59604dd3a..67347f2bf 100644 --- a/conf/common/test_scenario/dse_nccl_all_gather.toml +++ b/conf/common/test_scenario/dse_nccl_all_gather.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/common/test_scenario/slurm_container.toml b/conf/common/test_scenario/slurm_container.toml index 73487a21b..349d78af3 100644 --- a/conf/common/test_scenario/slurm_container.toml +++ b/conf/common/test_scenario/slurm_container.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/common/test_scenario/ucc_generator_test.toml b/conf/common/test_scenario/ucc_generator_test.toml index 91ff0a04e..ec5911bc6 100644 --- a/conf/common/test_scenario/ucc_generator_test.toml +++ b/conf/common/test_scenario/ucc_generator_test.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/experimental/aiconfigurator/test/aiconfigurator_disagg.toml b/conf/experimental/aiconfigurator/test/aiconfigurator_disagg.toml index e7d93f648..5171d6206 100644 --- a/conf/experimental/aiconfigurator/test/aiconfigurator_disagg.toml +++ b/conf/experimental/aiconfigurator/test/aiconfigurator_disagg.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/experimental/aiconfigurator/test_scenario/aiconfigurator_disagg.toml b/conf/experimental/aiconfigurator/test_scenario/aiconfigurator_disagg.toml index aad039bfa..7597dccc0 100644 --- a/conf/experimental/aiconfigurator/test_scenario/aiconfigurator_disagg.toml +++ b/conf/experimental/aiconfigurator/test_scenario/aiconfigurator_disagg.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/experimental/aiconfigurator/test_scenario/dse_aiconfigurator_disagg.toml b/conf/experimental/aiconfigurator/test_scenario/dse_aiconfigurator_disagg.toml index 450afd673..be866f59d 100644 --- a/conf/experimental/aiconfigurator/test_scenario/dse_aiconfigurator_disagg.toml +++ b/conf/experimental/aiconfigurator/test_scenario/dse_aiconfigurator_disagg.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/experimental/megatron_bridge/test_scenario/megatron_bridge_qwen_30b.toml b/conf/experimental/megatron_bridge/test_scenario/megatron_bridge_qwen_30b.toml index 16d218f84..3e8798c83 100644 --- a/conf/experimental/megatron_bridge/test_scenario/megatron_bridge_qwen_30b.toml +++ b/conf/experimental/megatron_bridge/test_scenario/megatron_bridge_qwen_30b.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/experimental/test/ddlb_test.toml b/conf/experimental/test/ddlb_test.toml index 8f82066bd..069d92021 100644 --- a/conf/experimental/test/ddlb_test.toml +++ b/conf/experimental/test/ddlb_test.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/conf/experimental/test/deepep_low_latency.toml b/conf/experimental/test/deepep_low_latency.toml index 30bc973ae..b76342b4e 100644 --- a/conf/experimental/test/deepep_low_latency.toml +++ b/conf/experimental/test/deepep_low_latency.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/_core/base_reporter.py b/src/cloudai/_core/base_reporter.py index cf28b5993..eddbf5151 100644 --- a/src/cloudai/_core/base_reporter.py +++ b/src/cloudai/_core/base_reporter.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/configurator/__init__.py b/src/cloudai/configurator/__init__.py index b6fcc4ff3..36271f082 100644 --- a/src/cloudai/configurator/__init__.py +++ b/src/cloudai/configurator/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/configurator/reward_functions.py b/src/cloudai/configurator/reward_functions.py index 1c7782c43..a0e7e1769 100644 --- a/src/cloudai/configurator/reward_functions.py +++ b/src/cloudai/configurator/reward_functions.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/core.py b/src/cloudai/core.py index 27f9d6941..0bccdab84 100644 --- a/src/cloudai/core.py +++ b/src/cloudai/core.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/models/scenario.py b/src/cloudai/models/scenario.py index c0c5abf63..092f5f462 100644 --- a/src/cloudai/models/scenario.py +++ b/src/cloudai/models/scenario.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/registration.py b/src/cloudai/registration.py index 3b5bfc9af..fcd3881ae 100644 --- a/src/cloudai/registration.py +++ b/src/cloudai/registration.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/systems/lsf/lsf_job.py b/src/cloudai/systems/lsf/lsf_job.py index d03466461..d17b364e9 100644 --- a/src/cloudai/systems/lsf/lsf_job.py +++ b/src/cloudai/systems/lsf/lsf_job.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/systems/lsf/lsf_runner.py b/src/cloudai/systems/lsf/lsf_runner.py index 065208283..1c34c80e2 100644 --- a/src/cloudai/systems/lsf/lsf_runner.py +++ b/src/cloudai/systems/lsf/lsf_runner.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/systems/runai/runai_job.py b/src/cloudai/systems/runai/runai_job.py index c31995631..7baff9fda 100644 --- a/src/cloudai/systems/runai/runai_job.py +++ b/src/cloudai/systems/runai/runai_job.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/ai_dynamo/__init__.py b/src/cloudai/workloads/ai_dynamo/__init__.py index 70ed6453c..845da8483 100644 --- a/src/cloudai/workloads/ai_dynamo/__init__.py +++ b/src/cloudai/workloads/ai_dynamo/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/ai_dynamo/kubernetes_json_gen_strategy.py b/src/cloudai/workloads/ai_dynamo/kubernetes_json_gen_strategy.py index 4b661d546..8882a8069 100644 --- a/src/cloudai/workloads/ai_dynamo/kubernetes_json_gen_strategy.py +++ b/src/cloudai/workloads/ai_dynamo/kubernetes_json_gen_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/aiconfig/__init__.py b/src/cloudai/workloads/aiconfig/__init__.py index 36d914b8b..d77bbe081 100644 --- a/src/cloudai/workloads/aiconfig/__init__.py +++ b/src/cloudai/workloads/aiconfig/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/bash_cmd/__init__.py b/src/cloudai/workloads/bash_cmd/__init__.py index 8bb5bfbc2..5f2b0a324 100644 --- a/src/cloudai/workloads/bash_cmd/__init__.py +++ b/src/cloudai/workloads/bash_cmd/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/bash_cmd/bash_cmd.py b/src/cloudai/workloads/bash_cmd/bash_cmd.py index 8fe48908b..d09e4d96d 100644 --- a/src/cloudai/workloads/bash_cmd/bash_cmd.py +++ b/src/cloudai/workloads/bash_cmd/bash_cmd.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/ddlb/__init__.py b/src/cloudai/workloads/ddlb/__init__.py index 12bdebbca..d4d63e7c7 100644 --- a/src/cloudai/workloads/ddlb/__init__.py +++ b/src/cloudai/workloads/ddlb/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/ddlb/slurm_command_gen_strategy.py b/src/cloudai/workloads/ddlb/slurm_command_gen_strategy.py index 5c1847a11..de1347cb4 100644 --- a/src/cloudai/workloads/ddlb/slurm_command_gen_strategy.py +++ b/src/cloudai/workloads/ddlb/slurm_command_gen_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/deepep/deepep.py b/src/cloudai/workloads/deepep/deepep.py index 5cea353a8..1b01c88b6 100644 --- a/src/cloudai/workloads/deepep/deepep.py +++ b/src/cloudai/workloads/deepep/deepep.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/deepep/report_generation_strategy.py b/src/cloudai/workloads/deepep/report_generation_strategy.py index 6200253f1..fc33cd741 100644 --- a/src/cloudai/workloads/deepep/report_generation_strategy.py +++ b/src/cloudai/workloads/deepep/report_generation_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/deepep/slurm_command_gen_strategy.py b/src/cloudai/workloads/deepep/slurm_command_gen_strategy.py index 0f20dd3bb..60bbf3000 100644 --- a/src/cloudai/workloads/deepep/slurm_command_gen_strategy.py +++ b/src/cloudai/workloads/deepep/slurm_command_gen_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/megatron_bridge/__init__.py b/src/cloudai/workloads/megatron_bridge/__init__.py index 1ec40f530..c2fec6843 100644 --- a/src/cloudai/workloads/megatron_bridge/__init__.py +++ b/src/cloudai/workloads/megatron_bridge/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/nccl_test/performance_report_generation_strategy.py b/src/cloudai/workloads/nccl_test/performance_report_generation_strategy.py index 0d84bbaab..4a45eb4d9 100644 --- a/src/cloudai/workloads/nccl_test/performance_report_generation_strategy.py +++ b/src/cloudai/workloads/nccl_test/performance_report_generation_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/nccl_test/prediction_report_generation_strategy.py b/src/cloudai/workloads/nccl_test/prediction_report_generation_strategy.py index c8363bac9..8b529cc22 100644 --- a/src/cloudai/workloads/nccl_test/prediction_report_generation_strategy.py +++ b/src/cloudai/workloads/nccl_test/prediction_report_generation_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/nccl_test/prediction_report_generator.py b/src/cloudai/workloads/nccl_test/prediction_report_generator.py index e0655a610..11f01291c 100644 --- a/src/cloudai/workloads/nccl_test/prediction_report_generator.py +++ b/src/cloudai/workloads/nccl_test/prediction_report_generator.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/nccl_test/report_generation_strategy.py b/src/cloudai/workloads/nccl_test/report_generation_strategy.py index a5be684e8..f691c5956 100644 --- a/src/cloudai/workloads/nccl_test/report_generation_strategy.py +++ b/src/cloudai/workloads/nccl_test/report_generation_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/nixl_bench/__init__.py b/src/cloudai/workloads/nixl_bench/__init__.py index 635c03115..200e432a5 100644 --- a/src/cloudai/workloads/nixl_bench/__init__.py +++ b/src/cloudai/workloads/nixl_bench/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/nixl_bench/nixl_bench.py b/src/cloudai/workloads/nixl_bench/nixl_bench.py index 88db43ebb..02db27099 100644 --- a/src/cloudai/workloads/nixl_bench/nixl_bench.py +++ b/src/cloudai/workloads/nixl_bench/nixl_bench.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/nixl_kvbench/__init__.py b/src/cloudai/workloads/nixl_kvbench/__init__.py index 37427d755..901eb63f9 100644 --- a/src/cloudai/workloads/nixl_kvbench/__init__.py +++ b/src/cloudai/workloads/nixl_kvbench/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/nixl_perftest/report_generation_strategy.py b/src/cloudai/workloads/nixl_perftest/report_generation_strategy.py index 9ee3c4981..e00c08882 100644 --- a/src/cloudai/workloads/nixl_perftest/report_generation_strategy.py +++ b/src/cloudai/workloads/nixl_perftest/report_generation_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/osu_bench/__init__.py b/src/cloudai/workloads/osu_bench/__init__.py index 28fc77ded..56faf00f5 100644 --- a/src/cloudai/workloads/osu_bench/__init__.py +++ b/src/cloudai/workloads/osu_bench/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/osu_bench/osu_bench.py b/src/cloudai/workloads/osu_bench/osu_bench.py index 2b24c8c4b..a7865640d 100644 --- a/src/cloudai/workloads/osu_bench/osu_bench.py +++ b/src/cloudai/workloads/osu_bench/osu_bench.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/osu_bench/slurm_command_gen_strategy.py b/src/cloudai/workloads/osu_bench/slurm_command_gen_strategy.py index 455dd2ce6..21b782c1d 100644 --- a/src/cloudai/workloads/osu_bench/slurm_command_gen_strategy.py +++ b/src/cloudai/workloads/osu_bench/slurm_command_gen_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/triton_inference/__init__.py b/src/cloudai/workloads/triton_inference/__init__.py index b8af4a933..60d21fe34 100644 --- a/src/cloudai/workloads/triton_inference/__init__.py +++ b/src/cloudai/workloads/triton_inference/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/cloudai/workloads/triton_inference/report_generation_strategy.py b/src/cloudai/workloads/triton_inference/report_generation_strategy.py index 6929638f4..1039c0c8f 100644 --- a/src/cloudai/workloads/triton_inference/report_generation_strategy.py +++ b/src/cloudai/workloads/triton_inference/report_generation_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/tests/json_gen_strategy/test_nccl_kubernetes_json_gen_strategy.py b/tests/json_gen_strategy/test_nccl_kubernetes_json_gen_strategy.py index f5c46812c..f6d927925 100644 --- a/tests/json_gen_strategy/test_nccl_kubernetes_json_gen_strategy.py +++ b/tests/json_gen_strategy/test_nccl_kubernetes_json_gen_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/tests/report_generation_strategy/test_megatron_run_report_generation_strategy.py b/tests/report_generation_strategy/test_megatron_run_report_generation_strategy.py index d472b6648..897ad35c3 100644 --- a/tests/report_generation_strategy/test_megatron_run_report_generation_strategy.py +++ b/tests/report_generation_strategy/test_megatron_run_report_generation_strategy.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/tests/report_generation_strategy/test_nccl_prediction_report_generator.py b/tests/report_generation_strategy/test_nccl_prediction_report_generator.py index c47035215..7c2c6f9b2 100644 --- a/tests/report_generation_strategy/test_nccl_prediction_report_generator.py +++ b/tests/report_generation_strategy/test_nccl_prediction_report_generator.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/tests/test_base_runner.py b/tests/test_base_runner.py index 6598dc87c..2a671a851 100644 --- a/tests/test_base_runner.py +++ b/tests/test_base_runner.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/tests/test_check_copyright_headers.py b/tests/test_check_copyright_headers.py index 8c2f73764..06b6ec86e 100644 --- a/tests/test_check_copyright_headers.py +++ b/tests/test_check_copyright_headers.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,7 +15,6 @@ # limitations under the License. import subprocess -from collections import defaultdict from datetime import datetime from pathlib import Path @@ -48,11 +47,6 @@ CURRENT_YEAR = datetime.now().year -def _path_key(file: Path) -> str: - """Normalize path for cache lookup (e.g. ./src/foo.py and src/foo.py match).""" - return file.as_posix().lstrip("./") - - def _format_years_to_ranges(years: list[int]) -> str: """Turn sorted unique years into a string with ranges for consecutive years. @@ -83,93 +77,73 @@ def _format_years_to_ranges(years: list[int]) -> str: ([2024, 2025, 2027], "2024-2025, 2027"), ([2024], "2024"), ([2024, 2025, 2026], "2024-2026"), - ) + ), ) def test_format_years_to_ranges(years_list: list[int], expected: str): assert _format_years_to_ranges(years_list) == expected -@pytest.fixture(scope="session") -def git_commit_years_cache() -> dict[str, list[int]]: +def get_commit_years_for_file(path: Path) -> list[int]: """ - Map all git-tracked files in this repo to the sorted list of years when they were touched in a commit - - Example: - >>> git_commit_years_cache() - {"src/cloudai/core.py": [2024, 2025, 2026]} + Return sorted list of years when the file was changed: from git log --follow + (so renames/moves are included), plus current year if the file is new or has + uncommitted changes (staged or unstaged). """ - - # 1: get all tracked files - ls_out = subprocess.run( - ["git", "ls-files"], + path_str = path.as_posix() + res = subprocess.run( + ["git", "log", "--format=%ad", "--date=format:%Y", "--follow", "--", path_str], capture_output=True, text=True, - check=True, ) - files = ls_out.stdout.splitlines() - - # 2: stream full history: each commit has a year line then affected files - log_cmd = [ - "git", - "-c", - "core.quotepath=false", - "log", - "--format=Y:%ad", - "--date=format:%Y", - "--name-only", - "--", - "src/", - "tests/", - "conf/", - "pyproject.toml", - ".taplo.toml", - ] - file_years: dict[str, set[int]] = defaultdict(set) - - process = subprocess.Popen(log_cmd, stdout=subprocess.PIPE, text=True) - if process.stdout is None: - raise OSError("git subprocess: stdout wasn't initialized for the subprocess") - - with process: - current_year: int | None = None - for line in process.stdout: - line = line.strip() - if not line: - continue - if line.startswith("Y:"): - current_year = int(line[2:]) - elif current_year is not None and line in files: - file_years[line].add(current_year) - - if process.returncode != 0: - raise RuntimeError("git subprocess: unknown error, check output") - - return {path: sorted(years) for path, years in file_years.items()} + if not res.stdout.strip(): + res = subprocess.run( + ["git", "log", "--format=%ad", "--date=format:%Y", "--", path_str], + capture_output=True, + text=True, + ) + lines = [s.strip() for s in res.stdout.splitlines() if s.strip()] + years = sorted(set(int(y) for y in lines)) if lines else [CURRENT_YEAR] + + # Include current year if file is new, modified (unstaged), or staged + status = subprocess.run( + ["git", "status", "--porcelain", "--", path_str], + capture_output=True, + text=True, + ) + if status.stdout.strip(): + years = sorted(set(years) | {CURRENT_YEAR}) + return years -def prepare_copyright_with_year(file: Path, years_cache: dict[str, list[int]]) -> str: - path_key = file.as_posix().replace("./", "", 1) - years = years_cache.get(path_key, [CURRENT_YEAR]) +def prepare_copyright_with_year(years: list[int]) -> str: years_str = _format_years_to_ranges(years) after_year_str = "NVIDIA CORPORATION & AFFILIATES. All rights reserved." return f"# Copyright (c) {years_str} {after_year_str}" -@pytest.mark.parametrize("py_file", PY_FILES, ids=[str(f) for f in PY_FILES]) -def test_src_copyright_header(py_file: Path, git_commit_years_cache: dict[str, list[int]]): - with py_file.open() as file: - actual_copyright_lines = [next(file).strip() for _ in range(len(HEADER_LINES))] - +def _assert_copyright_in_file(file: Path): + with file.open() as f: + try: + actual_copyright_lines = [next(f).strip() for _ in range(len(HEADER_LINES))] + except StopIteration: + actual_copyright_lines = [] + + assert len(actual_copyright_lines) >= len(HEADER_LINES), "Copyright is missing or incomplete" + + expected_years = get_commit_years_for_file(file) + expected_years_line = prepare_copyright_with_year(expected_years) + assert actual_copyright_lines[0] == HEADER_LINES[0], "SPDX-FileCopyrightText is not valid" - assert actual_copyright_lines[1] == prepare_copyright_with_year(py_file, git_commit_years_cache), "Copyright year is not valid" - assert "\n".join(actual_copyright_lines[2:]) == HEADER_TAIL, f"Header mismatch in {py_file}" + assert actual_copyright_lines[1] == expected_years_line, "Copyright year is not valid" + assert "\n".join(actual_copyright_lines[2:]) == HEADER_TAIL, f"Header mismatch in {file}" -@pytest.mark.parametrize("toml_file", TOML_FILES, ids=[str(f) for f in TOML_FILES]) -def test_toml_copyright_header(toml_file: Path, git_commit_years_cache: dict[str, list[int]]): - with toml_file.open() as file: - actual_copyright_lines = [next(file).strip() for _ in range(len(HEADER_LINES))] - assert actual_copyright_lines[0] == HEADER_LINES[0], "SPDX-FileCopyrightText is not valid" - assert actual_copyright_lines[1] == prepare_copyright_with_year(toml_file, git_commit_years_cache), "Copyright year is not valid" - assert "\n".join(actual_copyright_lines[2:]) == HEADER_TAIL, f"Header mismatch in {toml_file}" +@pytest.mark.parametrize("py_file", PY_FILES, ids=[str(f) for f in PY_FILES]) +def test_src_copyright_header(py_file: Path): + _assert_copyright_in_file(py_file) + + +@pytest.mark.parametrize("toml_file", TOML_FILES, ids=[str(f) for f in TOML_FILES]) +def test_toml_copyright_header(toml_file: Path): + _assert_copyright_in_file(toml_file) diff --git a/tests/test_cli.py b/tests/test_cli.py index 6c4ba731c..2a3f394ec 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/tests/test_git_repo_installer.py b/tests/test_git_repo_installer.py index 0ce706792..e41198439 100644 --- a/tests/test_git_repo_installer.py +++ b/tests/test_git_repo_installer.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES -# Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); From a53ef2a4a6ec8d0b4b8d7608910505c5c633d729 Mon Sep 17 00:00:00 2001 From: Ivan Podkidyshev Date: Thu, 12 Feb 2026 14:35:08 +0100 Subject: [PATCH 4/6] fix linter --- tests/test_check_copyright_headers.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/test_check_copyright_headers.py b/tests/test_check_copyright_headers.py index 06b6ec86e..11c96b3b8 100644 --- a/tests/test_check_copyright_headers.py +++ b/tests/test_check_copyright_headers.py @@ -41,8 +41,8 @@ HEADER_LINES = HEADER.split("\n") HEADER_TAIL = "\n".join(HEADER_LINES[2:]) -PY_FILES = list(Path().glob("./src/**/*.py")) + list(Path().glob("./tests/**/*.py")) -TOML_FILES = list(Path().glob("conf/**/*.toml")) + [Path("pyproject.toml"), Path(".taplo.toml")] +PY_FILES = [*list(Path().glob("./src/**/*.py")), *list(Path().glob("./tests/**/*.py"))] +TOML_FILES = [*list(Path().glob("conf/**/*.toml")), Path("pyproject.toml"), Path(".taplo.toml")] CURRENT_YEAR = datetime.now().year @@ -54,8 +54,11 @@ def _format_years_to_ranges(years: list[int]) -> str: [2024, 2025, 2027] -> "2024-2025, 2027" """ if not years: - raise ValueError("Unexpected behavior. Expected at least one year in the list. If it's a new file - should be the current year") - + raise ValueError( + "Unexpected behavior. Expected at least one year in the list. If it's a new file - should be the " + "current year" + ) + parts: list[str] = [] range_start = years[0] range_end = years[0] @@ -127,12 +130,12 @@ def _assert_copyright_in_file(file: Path): actual_copyright_lines = [next(f).strip() for _ in range(len(HEADER_LINES))] except StopIteration: actual_copyright_lines = [] - + assert len(actual_copyright_lines) >= len(HEADER_LINES), "Copyright is missing or incomplete" - + expected_years = get_commit_years_for_file(file) expected_years_line = prepare_copyright_with_year(expected_years) - + assert actual_copyright_lines[0] == HEADER_LINES[0], "SPDX-FileCopyrightText is not valid" assert actual_copyright_lines[1] == expected_years_line, "Copyright year is not valid" assert "\n".join(actual_copyright_lines[2:]) == HEADER_TAIL, f"Header mismatch in {file}" From a6f338d1f1517a05cea742c314e15102540f2894 Mon Sep 17 00:00:00 2001 From: Ivan Podkidyshev Date: Thu, 12 Feb 2026 14:39:19 +0100 Subject: [PATCH 5/6] fix linter --- tests/test_check_copyright_headers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_check_copyright_headers.py b/tests/test_check_copyright_headers.py index 11c96b3b8..c6fa705d9 100644 --- a/tests/test_check_copyright_headers.py +++ b/tests/test_check_copyright_headers.py @@ -141,7 +141,6 @@ def _assert_copyright_in_file(file: Path): assert "\n".join(actual_copyright_lines[2:]) == HEADER_TAIL, f"Header mismatch in {file}" - @pytest.mark.parametrize("py_file", PY_FILES, ids=[str(f) for f in PY_FILES]) def test_src_copyright_header(py_file: Path): _assert_copyright_in_file(py_file) From 2cb3cc840812fb7850732f35ef3696d771a477d4 Mon Sep 17 00:00:00 2001 From: Ivan Podkidyshev Date: Thu, 12 Feb 2026 14:58:27 +0100 Subject: [PATCH 6/6] resolve neuroslop feedback --- tests/test_check_copyright_headers.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_check_copyright_headers.py b/tests/test_check_copyright_headers.py index c6fa705d9..966e5e272 100644 --- a/tests/test_check_copyright_headers.py +++ b/tests/test_check_copyright_headers.py @@ -86,6 +86,11 @@ def test_format_years_to_ranges(years_list: list[int], expected: str): assert _format_years_to_ranges(years_list) == expected +def test_empty_format_years_to_ranges(): + with pytest.raises(ValueError): + _format_years_to_ranges([]) + + def get_commit_years_for_file(path: Path) -> list[int]: """ Return sorted list of years when the file was changed: from git log --follow @@ -98,12 +103,18 @@ def get_commit_years_for_file(path: Path) -> list[int]: capture_output=True, text=True, ) + if res.returncode != 0 and res.returncode != 128: # 128 = no commits match + raise RuntimeError(f"git log failed for {path_str}: {res.stderr}") + if not res.stdout.strip(): res = subprocess.run( ["git", "log", "--format=%ad", "--date=format:%Y", "--", path_str], capture_output=True, text=True, ) + if res.returncode != 0 and res.returncode != 128: # 128 = no commits match + raise RuntimeError(f"git log failed for {path_str}: {res.stderr}") + lines = [s.strip() for s in res.stdout.splitlines() if s.strip()] years = sorted(set(int(y) for y in lines)) if lines else [CURRENT_YEAR]