|  | @@ -2,36 +2,23 @@ from typing import Any
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import toml
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -ALL_DEPENDENCY_GROUP_NAMES = [
 | 
	
		
			
				|  |  | -    # default main group
 | 
	
		
			
				|  |  | -    "",
 | 
	
		
			
				|  |  | -    # required groups
 | 
	
		
			
				|  |  | -    "indirect",
 | 
	
		
			
				|  |  | -    "storage",
 | 
	
		
			
				|  |  | -    "tools",
 | 
	
		
			
				|  |  | -    "vdb",
 | 
	
		
			
				|  |  | -    # optional groups
 | 
	
		
			
				|  |  | -    "dev",
 | 
	
		
			
				|  |  | -    "lint",
 | 
	
		
			
				|  |  | -]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def load_api_poetry_configs() -> dict[str, Any]:
 | 
	
		
			
				|  |  |      pyproject_toml = toml.load("api/pyproject.toml")
 | 
	
		
			
				|  |  | -    return pyproject_toml.get("tool").get("poetry")
 | 
	
		
			
				|  |  | +    return pyproject_toml["tool"]["poetry"]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def load_dependency_groups() -> dict[str, dict[str, dict[str, Any]]]:
 | 
	
		
			
				|  |  | -    poetry_configs = load_api_poetry_configs()
 | 
	
		
			
				|  |  | -    group_name_to_dependencies = {
 | 
	
		
			
				|  |  | -        group_name: (poetry_configs.get("group").get(group_name) if group_name else poetry_configs).get("dependencies")
 | 
	
		
			
				|  |  | -        for group_name in ALL_DEPENDENCY_GROUP_NAMES
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return group_name_to_dependencies
 | 
	
		
			
				|  |  | +def load_all_dependency_groups() -> dict[str, dict[str, dict[str, Any]]]:
 | 
	
		
			
				|  |  | +    configs = load_api_poetry_configs()
 | 
	
		
			
				|  |  | +    configs_by_group = {"main": configs}
 | 
	
		
			
				|  |  | +    for group_name in configs["group"]:
 | 
	
		
			
				|  |  | +        configs_by_group[group_name] = configs["group"][group_name]
 | 
	
		
			
				|  |  | +    dependencies_by_group = {group_name: base["dependencies"] for group_name, base in configs_by_group.items()}
 | 
	
		
			
				|  |  | +    return dependencies_by_group
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def test_group_dependencies_sorted():
 | 
	
		
			
				|  |  | -    for group_name, dependencies in load_dependency_groups().items():
 | 
	
		
			
				|  |  | +    for group_name, dependencies in load_all_dependency_groups().items():
 | 
	
		
			
				|  |  |          dependency_names = list(dependencies.keys())
 | 
	
		
			
				|  |  |          expected_dependency_names = sorted(set(dependency_names))
 | 
	
		
			
				|  |  |          section = f"tool.poetry.group.{group_name}.dependencies" if group_name else "tool.poetry.dependencies"
 | 
	
	
		
			
				|  | @@ -42,17 +29,18 @@ def test_group_dependencies_sorted():
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def test_group_dependencies_version_operator():
 | 
	
		
			
				|  |  | -    for group_name, dependencies in load_dependency_groups().items():
 | 
	
		
			
				|  |  | +    for group_name, dependencies in load_all_dependency_groups().items():
 | 
	
		
			
				|  |  |          for dependency_name, specification in dependencies.items():
 | 
	
		
			
				|  |  | -            version_spec = specification if isinstance(specification, str) else specification.get("version")
 | 
	
		
			
				|  |  | +            version_spec = specification if isinstance(specification, str) else specification["version"]
 | 
	
		
			
				|  |  |              assert not version_spec.startswith("^"), (
 | 
	
		
			
				|  |  | -                f"'^' is not allowed in dependency version," f" but found in '{dependency_name} = {version_spec}'"
 | 
	
		
			
				|  |  | +                f"Please replace '{dependency_name} = {version_spec}' with '{dependency_name} = ~{version_spec[1:]}' "
 | 
	
		
			
				|  |  | +                f"'^' operator is too wide and not allowed in the version specification."
 | 
	
		
			
				|  |  |              )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def test_duplicated_dependency_crossing_groups():
 | 
	
		
			
				|  |  |      all_dependency_names: list[str] = []
 | 
	
		
			
				|  |  | -    for dependencies in load_dependency_groups().values():
 | 
	
		
			
				|  |  | +    for dependencies in load_all_dependency_groups().values():
 | 
	
		
			
				|  |  |          dependency_names = list(dependencies.keys())
 | 
	
		
			
				|  |  |          all_dependency_names.extend(dependency_names)
 | 
	
		
			
				|  |  |      expected_all_dependency_names = set(all_dependency_names)
 |