Skip to content

Commit 9dc285d

Browse files
Attempt at reducing the possibility of having import cycles when user configs import rez
Signed-off-by: Jean-Christophe Morin <[email protected]>
1 parent 73efa77 commit 9dc285d

File tree

6 files changed

+60
-21
lines changed

6 files changed

+60
-21
lines changed

src/rez/package_order.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from hashlib import sha1
77
from typing import Dict, Iterable, List, Optional, Union
88

9-
from rez.config import config
109
from rez.utils.data_utils import cached_class_property
1110
from rez.version import Version, VersionRange
1211
from rez.version._version import _Comparable, _ReversedComparable, _LowerBound, _UpperBound, _Bound
@@ -637,6 +636,7 @@ def from_pod(cls, data):
637636
@cached_class_property
638637
def singleton(cls):
639638
"""Filter list as configured by rezconfig.package_filter."""
639+
from rez.config import config
640640
return cls.from_pod(config.package_orderers)
641641

642642
@staticmethod

src/rez/package_repository.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from rez.utils.resources import ResourcePool, ResourceHandle
66
from rez.utils.data_utils import cached_property
77
from rez.plugin_managers import plugin_manager
8-
from rez.config import config
98
from rez.exceptions import ResourceError
109
from contextlib import contextmanager
1110
import threading
@@ -525,6 +524,7 @@ def __init__(self, resource_pool=None):
525524
None, a default pool is created based on config settings.
526525
"""
527526
if resource_pool is None:
527+
from rez.config import config
528528
cache_size = config.resource_caching_maxsize
529529
if cache_size < 0: # -1 == disable caching
530530
cache_size = None

src/rez/packages.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Copyright Contributors to the Rez Project
33

44

5-
from rez.package_repository import package_repository_manager
65
from rez.package_resources import PackageFamilyResource, PackageResource, \
76
VariantResource, package_family_schema, package_schema, variant_schema, \
87
package_release_keys, late_requires_schema
@@ -17,7 +16,6 @@
1716
from rez.version import Version, VersionRange
1817
from rez.version import VersionedObject
1918
from rez.serialise import FileFormat
20-
from rez.config import config
2119

2220
import os
2321
import sys
@@ -99,11 +97,13 @@ def config(self):
9997
Defaults to global config if this package did not provide a 'config'
10098
section.
10199
"""
100+
from rez.config import config
102101
return self.resource.config or config
103102

104103
@cached_property
105104
def is_local(self):
106105
"""Returns True if the package is in the local package repository"""
106+
from rez.package_repository import package_repository_manager
107107
local_repo = package_repository_manager.get_repository(
108108
self.config.local_packages_path)
109109
return (self.resource._repository.uid == local_repo.uid)
@@ -262,6 +262,7 @@ def is_relocatable(self):
262262
if self.relocatable is not None:
263263
return self.relocatable
264264

265+
from rez.config import config
265266
if config.default_relocatable_per_repository:
266267
value = config.default_relocatable_per_repository.get(
267268
self.repository.location)
@@ -282,6 +283,7 @@ def is_cachable(self):
282283
if self.cachable is not None:
283284
return self.cachable
284285

286+
from rez.config import config
285287
if config.default_cachable_per_repository:
286288
# TODO: The location of filesystem repository is canonical path,
287289
# so if the path in `default_cachable_per_repository` isn't
@@ -451,6 +453,7 @@ def install(self, path, dry_run=False, overrides=None):
451453
`Variant` object - the (existing or newly created) variant in the
452454
specified repository. If `dry_run` is True, None may be returned.
453455
"""
456+
from rez.package_repository import package_repository_manager
454457
repo = package_repository_manager.get_repository(path)
455458
resource = repo.install_variant(self.resource,
456459
dry_run=dry_run,
@@ -507,6 +510,7 @@ def __contains__(self, package):
507510

508511
@cached_property
509512
def _repository_uids(self):
513+
from rez.package_repository import package_repository_manager
510514
uids = set()
511515
for path in self.paths:
512516
repo = package_repository_manager.get_repository(path)
@@ -532,6 +536,8 @@ def iter_package_families(paths=None):
532536
Returns:
533537
`PackageFamily` iterator.
534538
"""
539+
from rez.config import config
540+
from rez.package_repository import package_repository_manager
535541
for path in (paths or config.packages_path):
536542
repo = package_repository_manager.get_repository(path)
537543
for resource in repo.iter_package_families():
@@ -607,6 +613,7 @@ def get_package_family_from_repository(name, path):
607613
Returns:
608614
`PackageFamily` object, or None if the family was not found.
609615
"""
616+
from rez.package_repository import package_repository_manager
610617
repo = package_repository_manager.get_repository(path)
611618

612619
family_resource = repo.get_package_family(name)
@@ -626,6 +633,7 @@ def get_package_from_repository(name, version, path):
626633
Returns:
627634
`Package` object, or None if the package was not found.
628635
"""
636+
from rez.package_repository import package_repository_manager
629637
repo = package_repository_manager.get_repository(path)
630638

631639
if isinstance(version, str):
@@ -649,6 +657,7 @@ def get_package_from_handle(package_handle):
649657
Returns:
650658
`Package`.
651659
"""
660+
from rez.package_repository import package_repository_manager
652661
if isinstance(package_handle, dict):
653662
package_handle = ResourceHandle.from_dict(package_handle)
654663
package_resource = package_repository_manager.get_resource_from_handle(package_handle)
@@ -713,6 +722,7 @@ def get_variant(variant_handle, context=None):
713722
Returns:
714723
`Variant`.
715724
"""
725+
from rez.package_repository import package_repository_manager
716726
if isinstance(variant_handle, dict):
717727
variant_handle = ResourceHandle.from_dict(variant_handle)
718728

@@ -733,6 +743,7 @@ def get_package_from_uri(uri, paths=None):
733743
Returns:
734744
`Package`, or None if the package could not be found.
735745
"""
746+
from rez.package_repository import package_repository_manager
736747
def _find_in_path(path):
737748
repo = package_repository_manager.get_repository(path)
738749
pkg_resource = repo.get_package_from_uri(uri)
@@ -741,6 +752,7 @@ def _find_in_path(path):
741752
else:
742753
return None
743754

755+
from rez.config import config
744756
for path in (paths or config.packages_path):
745757
pkg = _find_in_path(path)
746758
if pkg is not None:
@@ -780,6 +792,7 @@ def get_variant_from_uri(uri, paths=None):
780792
Returns:
781793
`Variant`, or None if the variant could not be found.
782794
"""
795+
from rez.package_repository import package_repository_manager
783796
def _find_in_path(path):
784797
repo = package_repository_manager.get_repository(path)
785798
variant_resource = repo.get_variant_from_uri(uri)
@@ -788,6 +801,7 @@ def _find_in_path(path):
788801
else:
789802
return None
790803

804+
from rez.config import config
791805
for path in (paths or config.packages_path):
792806
variant = _find_in_path(path)
793807
if variant is not None:
@@ -951,6 +965,8 @@ def get_latest_package_from_string(txt, paths=None, error=False):
951965

952966
def _get_families(name, paths=None):
953967
entries = []
968+
from rez.config import config
969+
from rez.package_repository import package_repository_manager
954970
for path in (paths or config.packages_path):
955971
repo = package_repository_manager.get_repository(path)
956972
family_resource = repo.get_package_family(name)

src/rez/plugin_managers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
"""
66
Manages loading of all types of Rez plugins.
77
"""
8-
from rez.config import config, expand_system_vars, _load_config_from_filepaths
98
from rez.utils.formatting import columnise
109
from rez.utils.schema import dict_to_schema
1110
from rez.utils.data_utils import LazySingleton, cached_property, deep_update
@@ -54,6 +53,7 @@ def extend_path(path, name):
5453
init_py = "__init__" + os.extsep + "py"
5554
path = path[:]
5655

56+
from rez.config import config
5757
def append_if_valid(dir_):
5858
if os.path.isdir(dir_):
5959
subdir = os.path.normcase(os.path.join(dir_, pname))
@@ -126,6 +126,7 @@ def load_plugins(self):
126126
# be found before the builtin plugins (from /rezplugins).
127127
paths = reversed(paths)
128128

129+
from rez.config import config, _load_config_from_filepaths
129130
for path in paths:
130131
if config.debug("plugins"):
131132
print_debug("searching plugin path %s...", path)
@@ -226,6 +227,7 @@ def config_schema(self):
226227
"""Returns the merged configuration data schema for this plugin
227228
type."""
228229
from rez.config import _plugin_config_dict
230+
from rez.config import expand_system_vars
229231
d = _plugin_config_dict.get(self.type_name, {})
230232

231233
for name, plugin_class in self.plugin_classes.items():

src/rez/serialise.py

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,10 @@
2424
from rez.utils.memcached import memcached
2525
from rez.utils.execution import add_sys_paths
2626
from rez.util import get_function_arg_names
27-
from rez.config import config
2827
from rez.vendor.atomicwrites import atomic_write
2928
from rez.vendor import yaml
3029

3130

32-
tmpdir_manager = TempDirs(config.tmpdir, prefix="rez_write_")
33-
debug_print = config.debug_printer("file_loads")
3431
file_cache = {}
3532

3633

@@ -60,14 +57,19 @@ def open_file_for_write(filepath, mode=None):
6057
Yields:
6158
File-like object.
6259
"""
60+
from rez.config import config
61+
6362
stream = StringIO()
6463
yield stream
6564
content = stream.getvalue()
6665

6766
filepath = os.path.realpath(filepath)
67+
tmpdir_manager = TempDirs(config.tmpdir, prefix="rez_write_")
68+
6869
tmpdir = tmpdir_manager.mkdtemp()
6970
cache_filepath = os.path.join(tmpdir, os.path.basename(filepath))
7071

72+
debug_print = config.debug_printer("file_loads")
7173
debug_print("Writing to %s (local cache of %s)", cache_filepath, filepath)
7274

7375
# Attempt to make file writable if it isn't already. Just fallthrough
@@ -136,9 +138,11 @@ def load_from_file(filepath, format_=FileFormat.py, update_data_callback=None,
136138
format_=format_,
137139
update_data_callback=update_data_callback)
138140
else:
139-
return _load_from_file(filepath=filepath,
140-
format_=format_,
141-
update_data_callback=update_data_callback)
141+
return _load_from_file()(
142+
filepath=filepath,
143+
format_=format_,
144+
update_data_callback=update_data_callback
145+
)
142146

143147

144148
def _load_from_file__key(filepath, format_, update_data_callback):
@@ -152,17 +156,28 @@ def _load_from_file__key(filepath, format_, update_data_callback):
152156
int(st.st_ino), st.st_mtime))
153157

154158

155-
@memcached(servers=config.memcached_uri if config.cache_package_files else None,
156-
min_compress_len=config.memcached_package_file_min_compress_len,
157-
key=_load_from_file__key,
158-
debug=config.debug_memcache)
159-
def _load_from_file(filepath, format_, update_data_callback):
160-
return _load_file(filepath, format_, update_data_callback)
159+
def _load_from_file():
160+
from rez.config import config
161+
162+
# A lot of gymnastics to avoid habing to import rez.config at the top level.
163+
@memcached(
164+
servers=config.memcached_uri if config.cache_package_files else None,
165+
min_compress_len=config.memcached_package_file_min_compress_len,
166+
key=_load_from_file__key,
167+
debug=config.debug_memcache
168+
)
169+
def _load_from_file_inner(filepath, format_, update_data_callback):
170+
return _load_file(filepath, format_, update_data_callback)
171+
172+
return _load_from_file_inner
161173

162174

163175
def _load_file(filepath, format_, update_data_callback, original_filepath=None):
176+
from rez.config import config
177+
164178
load_func = load_functions[format_]
165179

180+
debug_print = config.debug_printer("file_loads")
166181
if debug_print:
167182
if original_filepath:
168183
debug_print("Loading file: %s (local cache of %s)",
@@ -441,7 +456,7 @@ def load_txt(stream, **kwargs):
441456

442457
def clear_file_caches():
443458
"""Clear any cached files."""
444-
_load_from_file.forget()
459+
_load_from_file().forget()
445460

446461

447462
load_functions = {FileFormat.py: load_py,

src/rez/utils/memcached.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Copyright Contributors to the Rez Project
33

44

5-
from rez.config import config
65
from rez.vendor.memcache.memcache import Client as Client_, \
76
SERVER_MAX_KEY_LENGTH, __version__ as memcache_client_version
87
from rez.util import get_function_arg_names
@@ -32,7 +31,6 @@ def __bool__(self):
3231

3332
miss = _Miss()
3433

35-
logger = config.debug_printer("memcache")
3634

3735
def __init__(self, servers, debug=False):
3836
"""Create a memcached client.
@@ -48,6 +46,8 @@ def __init__(self, servers, debug=False):
4846
self._client = None
4947
self.debug = debug
5048
self.current = ''
49+
from rez.config import config
50+
self.logger = config.debug_printer("memcache")
5151

5252
def __bool__(self):
5353
return bool(self.servers)
@@ -223,7 +223,7 @@ def release(self, key):
223223

224224

225225
@contextmanager
226-
def memcached_client(servers=config.memcached_uri, debug=config.debug_memcache):
226+
def memcached_client(servers=None, debug=None):
227227
"""Get a shared memcached instance.
228228
229229
This function shares the same memcached instance across nested invocations.
@@ -236,6 +236,12 @@ def memcached_client(servers=config.memcached_uri, debug=config.debug_memcache):
236236
Returns:
237237
`Client`: Memcached instance.
238238
"""
239+
from rez.config import config
240+
if servers is None:
241+
servers = config.memcached_uri
242+
if debug is None:
243+
debug = config.debug_memcache
244+
239245
key = None
240246
try:
241247
client, key = scoped_instance_manager.acquire(servers, debug=debug)

0 commit comments

Comments
 (0)