33import itertools
44import logging
55import re
6+ from collections .abc import Iterable
67
78import pytest # type: ignore
89
@@ -964,17 +965,25 @@ class TestClosedLayers:
964965 @pytest .mark .parametrize (
965966 "importer, imported" ,
966967 [
967- ("mypackage. highest" , "mypackage. low" ),
968- ("mypackage. highest" , "mypackage. lowest" ),
969- ("mypackage. high" , "mypackage. low" ),
970- ("mypackage. high" , "mypackage. lowest" ),
968+ ("highest" , "low" ),
969+ ("highest" , "lowest" ),
970+ ("high" , "low" ),
971+ ("high" , "lowest" ),
971972 ],
972973 )
973- def test_cannot_import_through_closed_mid (self , importer , imported ):
974- graph = self ._build_legal_graph ()
974+ def test_one_closed_layer (self , importer , imported ):
975+ layers = [
976+ Layer ("highest" ),
977+ Layer ("high" ),
978+ Layer ("mid" , closed = True ),
979+ Layer ("low" ),
980+ Layer ("lowest" ),
981+ ]
982+ graph = self ._build_layers (layers )
983+
975984 graph .add_import (importer = importer , imported = imported )
976985
977- result = self . _analyze ( graph )
986+ result = graph . find_illegal_dependencies_for_layers ( layers )
978987
979988 assert result == {
980989 PackageDependency .new (
@@ -984,53 +993,40 @@ def test_cannot_import_through_closed_mid(self, importer, imported):
984993 ),
985994 }
986995
987- def test_cannot_import_through_closed_mid_indirect (self ):
988- graph = self ._build_legal_graph ()
989- graph .add_import (importer = "mypackage.high" , imported = "mypackage.other" )
990- graph .add_import (importer = "mypackage.other" , imported = "mypackage.low" )
996+ def test_indirect_import_cannot_bypass_closed_layer (self ):
997+ layers = [
998+ Layer ("high" ),
999+ Layer ("mid" , closed = True ),
1000+ Layer ("low" ),
1001+ ]
1002+ graph = self ._build_layers (layers )
9911003
992- result = self ._analyze (graph )
1004+ graph .add_module ("other" )
1005+ graph .add_import (importer = "high" , imported = "other" )
1006+ graph .add_import (importer = "other" , imported = "low" )
1007+
1008+ result = graph .find_illegal_dependencies_for_layers (layers )
9931009
9941010 assert result == {
9951011 PackageDependency .new (
996- importer = "mypackage.high" ,
997- imported = "mypackage.low" ,
998- routes = {
999- Route .single_chained ("mypackage.high" , "mypackage.other" , "mypackage.low" )
1000- },
1012+ importer = "high" ,
1013+ imported = "low" ,
1014+ routes = {Route .single_chained ("high" , "other" , "low" )},
10011015 ),
10021016 }
10031017
1004- def _build_legal_graph (self ):
1018+ def _build_layers (self , layers : Iterable [ Layer ] ):
10051019 graph = ImportGraph ()
1006- for module in (
1007- "mypackage" ,
1008- "mypackage.highest" ,
1009- "mypackage.high" ,
1010- "mypackage.mid" ,
1011- "mypackage.low" ,
1012- "mypackage.lowest" ,
1013- "mypackage.other" ,
1014- ):
1020+
1021+ modules = []
1022+ for layer in layers :
1023+ assert len (layer .module_tails ) == 1
1024+ module = list (layer .module_tails )[0 ]
10151025 graph .add_module (module )
1026+ modules .append (module )
10161027
1017- # Add some 'legal' imports that respect the layering
1018- graph .add_import (importer = "mypackage.highest" , imported = "mypackage.high" )
1019- graph .add_import (importer = "mypackage.high" , imported = "mypackage.mid" )
1020- graph .add_import (importer = "mypackage.mid" , imported = "mypackage.low" )
1021- graph .add_import (importer = "mypackage.low" , imported = "mypackage.lowest" )
1022- graph .add_import (importer = "mypackage.highest" , imported = "mypackage.mid" )
1023- graph .add_import (importer = "mypackage.mid" , imported = "mypackage.lowest" )
1028+ # Legal imports, from higher layer to immediate lower layer
1029+ for higher_module , lower_module in zip (modules [:- 1 ], modules [1 :]):
1030+ graph .add_import (importer = higher_module , imported = lower_module )
10241031
10251032 return graph
1026-
1027- def _analyze (self , graph : ImportGraph ) -> set [PackageDependency ]:
1028- return graph .find_illegal_dependencies_for_layers (
1029- layers = (
1030- Layer ("mypackage.highest" , closed = False ),
1031- Layer ("mypackage.high" , closed = False ),
1032- Layer ("mypackage.mid" , closed = True ), # Closed layer
1033- Layer ("mypackage.low" , closed = False ),
1034- Layer ("mypackage.lowest" , closed = False ),
1035- ),
1036- )
0 commit comments