Coverage for tests / test_deps.py: 100%

36 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-03 20:19 +0000

1from library_skills.deps import ( 1abcdefghi

2 get_node_top_level_deps, 

3 get_node_top_level_deps_from_files, 

4 get_python_top_level_deps, 

5 get_python_top_level_deps_from_files, 

6 get_top_level_deps, 

7) 

8 

9 

10def test_get_python_top_level_deps_normalizes_required_and_optional_deps(tmp_path): 1abcdefghi

11 pyproject = tmp_path / "pyproject.toml" 1stuvwxyzA

12 pyproject.write_text( 1stuvwxyzA

13 """ 

14[project] 

15dependencies = [ 

16 "Rich-Toolkit>=0.19", 

17 "FastAPI~=0.115", 

18 "pydantic[email]>=2 ; python_version >= '3.10'", 

19] 

20 

21[project.optional-dependencies] 

22dev = [ 

23 "PyTest_Cov>=4", 

24] 

25""", 

26 encoding="utf-8", 

27 ) 

28 

29 assert get_python_top_level_deps(tmp_path) == { 1stuvwxyzA

30 "rich-toolkit", 

31 "fastapi", 

32 "pydantic", 

33 "pytest-cov", 

34 } 

35 

36 

37def test_get_python_top_level_deps_includes_dependency_groups(tmp_path): 1abcdefghi

38 (tmp_path / "pyproject.toml").write_text( 1TUVWXYZ01

39 """ 

40[dependency-groups] 

41dev = [ 

42 { include-group = "tests" }, 

43 { include-group = 1 }, 

44 "Prek>=0.2", 

45] 

46tests = [ 

47 "PyTest_Cov>=4", 

48] 

49docs = "mkdocs" 

50cycle = [ 

51 { include-group = "cycle" }, 

52 "Ruff>=0.15", 

53] 

54""", 

55 encoding="utf-8", 

56 ) 

57 

58 assert get_python_top_level_deps(tmp_path) == { 1TUVWXYZ01

59 "prek", 

60 "pytest-cov", 

61 "ruff", 

62 } 

63 

64 

65def test_get_python_top_level_deps_returns_none_without_pyproject(tmp_path): 1abcdefghi

66 assert get_python_top_level_deps(tmp_path) is None 1BCDEFGHIJ

67 assert get_python_top_level_deps_from_files([]) is None 1BCDEFGHIJ

68 assert get_python_top_level_deps_from_files([tmp_path / "missing.toml"]) is None 1BCDEFGHIJ

69 

70 

71def test_get_python_top_level_deps_returns_none_for_invalid_toml(tmp_path): 1abcdefghi

72 (tmp_path / "pyproject.toml").write_text("[project\n", encoding="utf-8") 123456789!

73 

74 assert get_python_top_level_deps(tmp_path) is None 123456789!

75 

76 

77def test_get_python_top_level_deps_returns_empty_set_for_invalid_project_table( 1abcdefghi

78 tmp_path, 

79): 

80 (tmp_path / "pyproject.toml").write_text('project = "demo"\n', encoding="utf-8") 1#$%'()*+,

81 

82 assert get_python_top_level_deps(tmp_path) == set() 1#$%'()*+,

83 

84 

85def test_get_python_top_level_deps_ignores_non_string_dependencies(tmp_path): 1abcdefghi

86 (tmp_path / "pyproject.toml").write_text( 1-./:;=?@[

87 """ 

88[project] 

89dependencies = [ 

90 "rich>=13", 

91 1, 

92] 

93""", 

94 encoding="utf-8", 

95 ) 

96 

97 assert get_python_top_level_deps(tmp_path) == {"rich"} 1-./:;=?@[

98 

99 

100def test_get_node_top_level_deps_normalizes_dependency_fields(tmp_path): 1abcdefghi

101 (tmp_path / "package.json").write_text( 2] ^ _ ` { | } ~ ab

102 """ 

103{ 

104 "dependencies": {"@Scope/Demo_Pkg": "^1.0.0"}, 

105 "devDependencies": {"Vitest": "^4.0.0"}, 

106 "optionalDependencies": {"Optional.Pkg": "^1.0.0"}, 

107 "peerDependencies": {"Peer_Pkg": "^1.0.0"} 

108} 

109""", 

110 encoding="utf-8", 

111 ) 

112 

113 assert get_node_top_level_deps(tmp_path) == { 2] ^ _ ` { | } ~ ab

114 "@scope/demo-pkg", 

115 "vitest", 

116 "optional-pkg", 

117 "peer-pkg", 

118 } 

119 

120 

121def test_get_node_top_level_deps_handles_missing_invalid_and_non_object(tmp_path): 1abcdefghi

122 assert get_node_top_level_deps(tmp_path) is None 1jklmnopqr

123 assert get_node_top_level_deps_from_files([]) is None 1jklmnopqr

124 assert get_node_top_level_deps_from_files([tmp_path / "missing.json"]) is None 1jklmnopqr

125 

126 (tmp_path / "package.json").write_text("{", encoding="utf-8") 1jklmnopqr

127 assert get_node_top_level_deps(tmp_path) is None 1jklmnopqr

128 

129 (tmp_path / "package.json").write_text("[]", encoding="utf-8") 1jklmnopqr

130 assert get_node_top_level_deps(tmp_path) == set() 1jklmnopqr

131 

132 

133def test_get_top_level_deps_combines_python_and_node_metadata(tmp_path): 1abcdefghi

134 (tmp_path / "pyproject.toml").write_text( 1KLMNOPQRS

135 '[project]\ndependencies = ["Python_Pkg>=1"]\n', 

136 encoding="utf-8", 

137 ) 

138 (tmp_path / "package.json").write_text( 1KLMNOPQRS

139 '{"dependencies": {"node_pkg": "^1.0.0"}}', 

140 encoding="utf-8", 

141 ) 

142 

143 assert get_top_level_deps(tmp_path) == {"python-pkg", "node-pkg"} 1KLMNOPQRS