changeset 7329:401fe08bc6b8

utils: move repo_name_slug to utils2 to prevent import cycle on setup_db After commit 57a733313e4f, 'gearbox setup-db -c my.ini' fails with an import cycle as follows: Traceback (most recent call last): File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/bin/gearbox", line 11, in <module> sys.exit(main()) File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/gearbox/main.py", line 199, in main return gearbox.run(args) File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/gearbox/main.py", line 145, in run return self._run_subcommand(remainder) File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/gearbox/main.py", line 149, in _run_subcommand subcommand = self.command_manager.find_command(argv) File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/gearbox/commandmanager.py", line 78, in find_command cmd_factory = cmd_ep.resolve() File "/home/tdescham/repo/contrib/kallithea/venv/kallithea-release/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2324, in resolve module = __import__(self.module_name, fromlist=['__name__'], level=0) File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/lib/paster_commands/setup_db.py", line 27, in <module> from kallithea.lib.db_manage import DbManage File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/lib/db_manage.py", line 47, in <module> from kallithea.model.repo_group import RepoGroupModel File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/model/repo_group.py", line 35, in <module> import kallithea.lib.utils File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/lib/utils.py", line 48, in <module> from kallithea.model.repo_group import RepoGroupModel ImportError: cannot import name RepoGroupModel i.e. kallithea.model.repo_group wants to import kallithea.lib.utils which in turn wants to import kallithea.model.repo_group. In fact there exists kallithea.lib.utils and kallithea.lib.utils2. The current split is that 'utils2' contains 'simple' utilities, none of which depend on kallithea models, controllers, ... In contrast, 'utils' does rely on such kallithea classes. As kallithea.model.repo_group was only include kallithea.lib.utils for its repo_name_slug method, which has no dependency on other kallithea classes, move that method (and its dependent recursive_replace) to kallithea.lib.utils2 instead. This fixes the import cycle.
author Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
date Sat, 09 Jun 2018 21:24:45 +0200
parents e2519d2e74c2
children eac20c4b7b20
files kallithea/lib/utils.py kallithea/lib/utils2.py kallithea/model/repo.py kallithea/model/repo_group.py kallithea/model/validators.py
diffstat 5 files changed, 48 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/lib/utils.py	Sat Jun 09 16:30:22 2018 +0200
+++ b/kallithea/lib/utils.py	Sat Jun 09 21:24:45 2018 +0200
@@ -34,7 +34,6 @@
 
 from tg import request, response
 from tg.i18n import ugettext as _
-from webhelpers.text import collapse, remove_formatting, strip_tags
 from beaker.cache import _cache_decorate
 
 from kallithea.lib.vcs.utils.hgcompat import ui, config
@@ -54,42 +53,6 @@
 REMOVED_REPO_PAT = re.compile(r'rm__\d{8}_\d{6}_\d{6}_.*')
 
 
-def recursive_replace(str_, replace=' '):
-    """
-    Recursive replace of given sign to just one instance
-
-    :param str_: given string
-    :param replace: char to find and replace multiple instances
-
-    Examples::
-    >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-')
-    'Mighty-Mighty-Bo-sstones'
-    """
-
-    if str_.find(replace * 2) == -1:
-        return str_
-    else:
-        str_ = str_.replace(replace * 2, replace)
-        return recursive_replace(str_, replace)
-
-
-def repo_name_slug(value):
-    """
-    Return slug of name of repository
-    This function is called on each creation/modification
-    of repository to prevent bad names in repo
-    """
-
-    slug = remove_formatting(value)
-    slug = strip_tags(slug)
-
-    for c in """`?=[]\;'"<>,/~!@#$%^&*()+{}|: """:
-        slug = slug.replace(c, '-')
-    slug = recursive_replace(slug, '-')
-    slug = collapse(slug, '-')
-    return slug
-
-
 #==============================================================================
 # PERM DECORATOR HELPERS FOR EXTRACTING NAMES FOR PERM CHECKS
 #==============================================================================
--- a/kallithea/lib/utils2.py	Sat Jun 09 16:30:22 2018 +0200
+++ b/kallithea/lib/utils2.py	Sat Jun 09 21:24:45 2018 +0200
@@ -15,7 +15,9 @@
 kallithea.lib.utils2
 ~~~~~~~~~~~~~~~~~~~~
 
-Some simple helper functions
+Some simple helper functions.
+Note: all these functions should be independent of Kallithea classes, i.e.
+models, controllers, etc.  to prevent import cycles.
 
 This file was forked by the Kallithea project in July 2014.
 Original author and date, and relevant copyright and licensing information is below:
@@ -37,6 +39,7 @@
 
 import webob
 import urlobject
+from webhelpers.text import collapse, remove_formatting, strip_tags
 
 from tg.i18n import ugettext as _, ungettext
 from kallithea.lib.vcs.utils.lazy import LazyProperty
@@ -646,3 +649,39 @@
 
 def urlreadable(s, _cleanstringsub=re.compile('[^-a-zA-Z0-9./]+').sub):
     return _cleanstringsub('_', safe_str(s)).rstrip('_')
+
+
+def recursive_replace(str_, replace=' '):
+    """
+    Recursive replace of given sign to just one instance
+
+    :param str_: given string
+    :param replace: char to find and replace multiple instances
+
+    Examples::
+    >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-')
+    'Mighty-Mighty-Bo-sstones'
+    """
+
+    if str_.find(replace * 2) == -1:
+        return str_
+    else:
+        str_ = str_.replace(replace * 2, replace)
+        return recursive_replace(str_, replace)
+
+
+def repo_name_slug(value):
+    """
+    Return slug of name of repository
+    This function is called on each creation/modification
+    of repository to prevent bad names in repo
+    """
+
+    slug = remove_formatting(value)
+    slug = strip_tags(slug)
+
+    for c in """`?=[]\;'"<>,/~!@#$%^&*()+{}|: """:
+        slug = slug.replace(c, '-')
+    slug = recursive_replace(slug, '-')
+    slug = collapse(slug, '-')
+    return slug
--- a/kallithea/model/repo.py	Sat Jun 09 16:30:22 2018 +0200
+++ b/kallithea/model/repo.py	Sat Jun 09 21:24:45 2018 +0200
@@ -33,7 +33,7 @@
 from datetime import datetime
 from sqlalchemy.orm import subqueryload
 
-import kallithea.lib.utils
+import kallithea.lib.utils2
 from kallithea.lib.utils import make_ui, is_valid_repo_uri
 from kallithea.lib.vcs.backends import get_backend
 from kallithea.lib.utils2 import LazyProperty, safe_str, safe_unicode, \
@@ -316,7 +316,7 @@
 
             if 'repo_name' in kwargs:
                 repo_name = kwargs['repo_name']
-                if kallithea.lib.utils.repo_name_slug(repo_name) != repo_name:
+                if kallithea.lib.utils2.repo_name_slug(repo_name) != repo_name:
                     raise Exception('invalid repo name %s' % repo_name)
                 cur_repo.repo_name = cur_repo.get_new_name(repo_name)
 
@@ -367,7 +367,7 @@
             # with name and path of group
             repo_name_full = repo_name
             repo_name = repo_name.split(self.URL_SEPARATOR)[-1]
-            if kallithea.lib.utils.repo_name_slug(repo_name) != repo_name:
+            if kallithea.lib.utils2.repo_name_slug(repo_name) != repo_name:
                 raise Exception('invalid repo name %s' % repo_name)
 
             new_repo = Repository()
--- a/kallithea/model/repo_group.py	Sat Jun 09 16:30:22 2018 +0200
+++ b/kallithea/model/repo_group.py	Sat Jun 09 21:24:45 2018 +0200
@@ -32,7 +32,7 @@
 import shutil
 import datetime
 
-import kallithea.lib.utils
+import kallithea.lib.utils2
 from kallithea.lib.utils2 import LazyProperty
 
 from kallithea.model.db import RepoGroup, Session, Ui, UserRepoGroupToPerm, \
@@ -136,7 +136,7 @@
     def create(self, group_name, group_description, owner, parent=None,
                just_db=False, copy_permissions=False):
         try:
-            if kallithea.lib.utils.repo_name_slug(group_name) != group_name:
+            if kallithea.lib.utils2.repo_name_slug(group_name) != group_name:
                 raise Exception('invalid repo group name %s' % group_name)
 
             owner = User.guess_instance(owner)
@@ -295,7 +295,7 @@
                 repo_group.parent_group = RepoGroup.get(kwargs['parent_group_id'])
             if 'group_name' in kwargs:
                 group_name = kwargs['group_name']
-                if kallithea.lib.utils.repo_name_slug(group_name) != group_name:
+                if kallithea.lib.utils2.repo_name_slug(group_name) != group_name:
                     raise Exception('invalid repo group name %s' % group_name)
                 repo_group.group_name = repo_group.get_new_name(group_name)
             new_path = repo_group.full_path
--- a/kallithea/model/validators.py	Sat Jun 09 16:30:22 2018 +0200
+++ b/kallithea/model/validators.py	Sat Jun 09 21:24:45 2018 +0200
@@ -31,8 +31,8 @@
 )
 from kallithea.lib.compat import OrderedSet
 from kallithea.lib import ipaddr
-from kallithea.lib.utils import repo_name_slug, is_valid_repo_uri
-from kallithea.lib.utils2 import str2bool, aslist
+from kallithea.lib.utils import is_valid_repo_uri
+from kallithea.lib.utils2 import str2bool, aslist, repo_name_slug
 from kallithea.model.db import RepoGroup, Repository, UserGroup, User
 from kallithea.lib.exceptions import LdapImportError
 from kallithea.config.routing import ADMIN_PREFIX