@@ -30,20 +30,20 @@ def test_solver_dependency_cache_respects_source_type(
30
30
add_to_repo (repo , "demo" , "1.0.0" )
31
31
32
32
cache = DependencyCache (provider )
33
- cache .search_for .cache_clear ()
33
+ cache ._search_for_cached .cache_clear ()
34
34
35
35
# ensure cache was never hit for both calls
36
36
cache .search_for (dependency_pypi , 0 )
37
37
cache .search_for (dependency_git , 0 )
38
- assert not cache .search_for .cache_info ().hits
38
+ assert not cache ._search_for_cached .cache_info ().hits
39
39
40
40
# increase test coverage by searching for copies
41
41
# (when searching for the exact same object, __eq__ is never called)
42
42
packages_pypi = cache .search_for (deepcopy (dependency_pypi ), 0 )
43
43
packages_git = cache .search_for (deepcopy (dependency_git ), 0 )
44
44
45
- assert cache .search_for .cache_info ().hits == 2
46
- assert cache .search_for .cache_info ().currsize == 2
45
+ assert cache ._search_for_cached .cache_info ().hits == 2
46
+ assert cache ._search_for_cached .cache_info ().currsize == 2
47
47
48
48
assert len (packages_pypi ) == len (packages_git ) == 1
49
49
assert packages_pypi != packages_git
@@ -65,38 +65,59 @@ def test_solver_dependency_cache_pulls_from_prior_level_cache(
65
65
root : ProjectPackage , provider : Provider , repo : Repository
66
66
) -> None :
67
67
dependency_pypi = Factory .create_dependency ("demo" , ">=0.1.0" )
68
+ dependency_pypi_constrained = Factory .create_dependency ("demo" , ">=0.1.0,<2.0.0" )
68
69
root .add_dependency (dependency_pypi )
70
+ root .add_dependency (dependency_pypi_constrained )
69
71
add_to_repo (repo , "demo" , "1.0.0" )
70
72
71
73
wrapped_provider = mock .Mock (wraps = provider )
72
74
cache = DependencyCache (wrapped_provider )
73
- cache .search_for .cache_clear ()
75
+ cache ._search_for_cached .cache_clear ()
74
76
75
- # On first call, provider.search_for() should be called and the level-0
76
- # cache populated.
77
+ # On first call, provider.search_for() should be called and the cache
78
+ # populated.
77
79
cache .search_for (dependency_pypi , 0 )
78
80
assert len (wrapped_provider .search_for .mock_calls ) == 1
79
- assert ("demo" , None , None , None , None ) in cache ._cache [0 ]
80
- assert cache .search_for .cache_info ().hits == 0
81
- assert cache .search_for .cache_info ().misses == 1
82
-
83
- # On second call at level 1, provider.search_for() should not be called
84
- # again and the level-1 cache should be populated from the level-0 cache.
81
+ assert ("demo" , None , None , None , None ) in cache ._cache
82
+ assert ("demo" , None , None , None , None ) in cache ._cached_dependencies_by_level [0 ]
83
+ assert cache ._search_for_cached .cache_info ().hits == 0
84
+ assert cache ._search_for_cached .cache_info ().misses == 1
85
+
86
+ # On second call at level 1, neither provider.search_for() nor
87
+ # cache._search_for_cached() should have been called again, and the cache
88
+ # should remain the same.
85
89
cache .search_for (dependency_pypi , 1 )
86
90
assert len (wrapped_provider .search_for .mock_calls ) == 1
87
- assert ("demo" , None , None , None , None ) in cache ._cache [1 ]
88
- assert cache ._cache [0 ] == cache ._cache [1 ]
89
- assert cache .search_for .cache_info ().hits == 0
90
- assert cache .search_for .cache_info ().misses == 2
91
-
92
- # Clearing the level 1 cache should invalidate the lru_cache on
93
- # cache.search_for and wipe out the level 1 cache while preserving the
91
+ assert ("demo" , None , None , None , None ) in cache ._cache
92
+ assert ("demo" , None , None , None , None ) in cache ._cached_dependencies_by_level [0 ]
93
+ assert set (cache ._cached_dependencies_by_level .keys ()) == {0 }
94
+ assert cache ._search_for_cached .cache_info ().hits == 1
95
+ assert cache ._search_for_cached .cache_info ().misses == 1
96
+
97
+ # On third call at level 2 with an updated constraint for the `demo`
98
+ # package should not call provider.search_for(), but should call
99
+ # cache._search_for_cached() and update the cache.
100
+ cache .search_for (dependency_pypi_constrained , 2 )
101
+ assert len (wrapped_provider .search_for .mock_calls ) == 1
102
+ assert ("demo" , None , None , None , None ) in cache ._cache
103
+ assert ("demo" , None , None , None , None ) in cache ._cached_dependencies_by_level [0 ]
104
+ assert ("demo" , None , None , None , None ) in cache ._cached_dependencies_by_level [2 ]
105
+ assert set (cache ._cached_dependencies_by_level .keys ()) == {0 , 2 }
106
+ assert cache ._search_for_cached .cache_info ().hits == 1
107
+ assert cache ._search_for_cached .cache_info ().misses == 2
108
+
109
+ # Clearing the level 2 and level 1 caches should invalidate the lru_cache
110
+ # on cache.search_for and wipe out the level 2 cache while preserving the
94
111
# level 0 cache.
112
+ cache .clear_level (2 )
95
113
cache .clear_level (1 )
96
- assert set (cache ._cache .keys ()) == {0 }
97
- assert ("demo" , None , None , None , None ) in cache ._cache [0 ]
98
- assert cache .search_for .cache_info ().hits == 0
99
- assert cache .search_for .cache_info ().misses == 0
114
+ cache .search_for (dependency_pypi , 0 )
115
+ assert len (wrapped_provider .search_for .mock_calls ) == 1
116
+ assert ("demo" , None , None , None , None ) in cache ._cache
117
+ assert ("demo" , None , None , None , None ) in cache ._cached_dependencies_by_level [0 ]
118
+ assert set (cache ._cached_dependencies_by_level .keys ()) == {0 }
119
+ assert cache ._search_for_cached .cache_info ().hits == 0
120
+ assert cache ._search_for_cached .cache_info ().misses == 1
100
121
101
122
102
123
def test_solver_dependency_cache_respects_subdirectories (
@@ -123,20 +144,20 @@ def test_solver_dependency_cache_respects_subdirectories(
123
144
root .add_dependency (dependency_one_copy )
124
145
125
146
cache = DependencyCache (provider )
126
- cache .search_for .cache_clear ()
147
+ cache ._search_for_cached .cache_clear ()
127
148
128
149
# ensure cache was never hit for both calls
129
150
cache .search_for (dependency_one , 0 )
130
151
cache .search_for (dependency_one_copy , 0 )
131
- assert not cache .search_for .cache_info ().hits
152
+ assert not cache ._search_for_cached .cache_info ().hits
132
153
133
154
# increase test coverage by searching for copies
134
155
# (when searching for the exact same object, __eq__ is never called)
135
156
packages_one = cache .search_for (deepcopy (dependency_one ), 0 )
136
157
packages_one_copy = cache .search_for (deepcopy (dependency_one_copy ), 0 )
137
158
138
- assert cache .search_for .cache_info ().hits == 2
139
- assert cache .search_for .cache_info ().currsize == 2
159
+ assert cache ._search_for_cached .cache_info ().hits == 2
160
+ assert cache ._search_for_cached .cache_info ().currsize == 2
140
161
141
162
assert len (packages_one ) == len (packages_one_copy ) == 1
142
163
0 commit comments