You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/07/24 00:36:31 UTC

[15/27] git commit: [#6463] Move get_repo_type() to Extractor and add import guards

[#6463] Move get_repo_type() to Extractor and add import guards

Signed-off-by: Tim Van Steenburgh <tv...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/62099e2d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/62099e2d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/62099e2d

Branch: refs/heads/cj/6456
Commit: 62099e2d9dd567a928143c977bf2bd40f2f8ee73
Parents: 97e46b9
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Tue Jul 23 16:58:48 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Tue Jul 23 16:58:48 2013 +0000

----------------------------------------------------------------------
 .../forgeimporters/google/__init__.py           | 13 +++++++
 ForgeImporters/forgeimporters/google/code.py    | 39 +++++++++-----------
 .../forgeimporters/google/tests/test_code.py    | 31 +---------------
 .../tests/google/test_extractor.py              | 27 ++++++++++++++
 4 files changed, 59 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/62099e2d/ForgeImporters/forgeimporters/google/__init__.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/__init__.py b/ForgeImporters/forgeimporters/google/__init__.py
index 4d264e4..49aa907 100644
--- a/ForgeImporters/forgeimporters/google/__init__.py
+++ b/ForgeImporters/forgeimporters/google/__init__.py
@@ -15,6 +15,7 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
+import re
 import urllib
 import urllib2
 from urlparse import urlparse
@@ -30,6 +31,8 @@ from allura import model as M
 
 
 class GoogleCodeProjectExtractor(object):
+    RE_REPO_TYPE = re.compile(r'(svn|hg|git)')
+
     PAGE_MAP = {
             'project_info': 'http://code.google.com/p/%s/',
             'source_browse': 'http://code.google.com/p/%s/source/browse/',
@@ -72,3 +75,13 @@ class GoogleCodeProjectExtractor(object):
         trove = M.TroveCategory.query.get(fullname=self.LICENSE_MAP[license])
         self.project.trove_license.append(trove._id)
 
+    def get_repo_type(self):
+        repo_type = self.page.find(id="crumb_root")
+        if not repo_type:
+            raise Exception("Couldn't detect repo type: no #crumb_root in "
+                    "{0}".format(self.url))
+        re_match = self.RE_REPO_TYPE.match(repo_type.text.lower())
+        if re_match:
+            return re_match.group(0)
+        else:
+            raise Exception("Unknown repo type: {0}".format(repo_type.text))

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/62099e2d/ForgeImporters/forgeimporters/google/code.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/code.py b/ForgeImporters/forgeimporters/google/code.py
index 3c2e484..29951a6 100644
--- a/ForgeImporters/forgeimporters/google/code.py
+++ b/ForgeImporters/forgeimporters/google/code.py
@@ -15,8 +15,6 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-import re
-
 import formencode as fe
 from formencode import validators as fev
 
@@ -34,15 +32,26 @@ from tg.decorators import (
 from allura.controllers import BaseController
 from allura.lib.decorators import require_post
 
-from forgehg.hg_main import ForgeHgApp
-from forgegit.git_main import ForgeGitApp
-from forgesvn.svn_main import ForgeSVNApp
-
 from forgeimporters.base import ToolImporter
 from forgeimporters.google import GoogleCodeProjectExtractor
 
+TARGET_APPS = []
+try:
+    from forgehg.hg_main import ForgeHgApp
+    TARGET_APPS.append(ForgeHgApp)
+except ImportError:
+    pass
+try:
+    from forgegit.git_main import ForgeGitApp
+    TARGET_APPS.append(ForgeGitApp)
+except ImportError:
+    pass
+try:
+    from forgesvn.svn_main import ForgeSVNApp
+    TARGET_APPS.append(ForgeSVNApp)
+except ImportError:
+    pass
 
-RE_REPO_TYPE = re.compile(r'(svn|hg|git)')
 REPO_URLS = {
     'svn': 'http://{0}.googlecode.com/svn/trunk/',
     'git': 'https://code.google.com/p/{0}/',
@@ -59,18 +68,6 @@ def get_repo_url(project_name, type_):
     return REPO_URLS[type_].format(project_name)
 
 
-def get_repo_type(extractor):
-    repo_type = extractor.page.find(id="crumb_root")
-    if not repo_type:
-        raise Exception("Couldn't detect repo type: no #crumb_root in "
-                "{0}".format(extractor.url))
-    re_match = RE_REPO_TYPE.match(repo_type.text.lower())
-    if re_match:
-        return re_match.group(0)
-    else:
-        raise Exception("Unknown repo type: {0}".format(repo_type.text))
-
-
 class GoogleRepoImportSchema(fe.Schema):
     gc_project_name = fev.UnicodeString(not_empty=True)
     mount_point = fev.UnicodeString()
@@ -96,7 +93,7 @@ class GoogleRepoImportController(BaseController):
 
 
 class GoogleRepoImporter(ToolImporter):
-    target_app = (ForgeHgApp, ForgeGitApp, ForgeSVNApp)
+    target_app = TARGET_APPS
     source = 'Google Code'
     controller = GoogleRepoImportController
     tool_label = 'Google Code Source Importer'
@@ -111,7 +108,7 @@ class GoogleRepoImporter(ToolImporter):
         if not project.get_tool_data('google-code', 'project_name'):
             raise Exception("Missing Google Code project name")
         extractor = GoogleCodeProjectExtractor(project, page='source_browse')
-        repo_type = get_repo_type(extractor)
+        repo_type = extractor.get_repo_type()
         repo_url = get_repo_url(project.get_tool_data('google-code',
             'project_name'), repo_type)
         return project.install_app(

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/62099e2d/ForgeImporters/forgeimporters/google/tests/test_code.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tests/test_code.py b/ForgeImporters/forgeimporters/google/tests/test_code.py
index 1459290..a2d9a54 100644
--- a/ForgeImporters/forgeimporters/google/tests/test_code.py
+++ b/ForgeImporters/forgeimporters/google/tests/test_code.py
@@ -6,7 +6,6 @@ from forgesvn.tests import with_svn
 
 from forgeimporters.google.code import (
         get_repo_url,
-        get_repo_type,
         GoogleRepoImporter,
         GoogleRepoImportController,
         )
@@ -27,34 +26,6 @@ class TestGetRepoUrl(TestCase):
         self.assertEqual(r, 'https://code.google.com/p/projname/')
 
 
-class TestRepoType(TestCase):
-
-    def _make_extractor(self, html):
-        from BeautifulSoup import BeautifulSoup
-        return Mock(page=BeautifulSoup(html),
-                url="http://test/source/browse")
-
-    def test_happy_path(self):
-        extractor = self._make_extractor(
-                '<span id="crumb_root">\nsvn/&nbsp;</span>')
-        self.assertEqual('svn', get_repo_type(extractor))
-
-    def test_no_crumb_root(self):
-        extractor = self._make_extractor('')
-        with self.assertRaises(Exception) as cm:
-            get_repo_type(extractor)
-        self.assertEqual(str(cm.exception),
-                "Couldn't detect repo type: no #crumb_root in "
-                "http://test/source/browse")
-
-    def test_unknown_repo_type(self):
-        extractor = self._make_extractor(
-                '<span id="crumb_root">cvs</span>')
-        with self.assertRaises(Exception) as cm:
-            get_repo_type(extractor)
-        self.assertEqual(str(cm.exception), "Unknown repo type: cvs")
-
-
 class TestGoogleRepoImporter(TestCase):
 
     def _make_project(self, gc_proj_name=None):
@@ -62,7 +33,7 @@ class TestGoogleRepoImporter(TestCase):
         project.get_tool_data.side_effect = lambda *args: gc_proj_name
         return project
 
-    @patch('forgeimporters.google.code.get_repo_type')
+    @patch('forgeimporters.google.code.GoogleCodeProjectExtractor.get_repo_type')
     @patch('forgeimporters.google.code.get_repo_url')
     def test_import_tool_happy_path(self, get_repo_url, get_repo_type):
         get_repo_type.return_value = 'git'

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/62099e2d/ForgeImporters/forgeimporters/tests/google/test_extractor.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/tests/google/test_extractor.py b/ForgeImporters/forgeimporters/tests/google/test_extractor.py
index f03c82c..e346f1e 100644
--- a/ForgeImporters/forgeimporters/tests/google/test_extractor.py
+++ b/ForgeImporters/forgeimporters/tests/google/test_extractor.py
@@ -91,3 +91,30 @@ class TestGoogleCodeProjectExtractor(TestCase):
         extractor.page.find.return_value.findNext.return_value.find.return_value.string = 'non-existant license'
         extractor.get_license()
         M.TroveCategory.query.get.assert_called_once_with(fullname='Other/Proprietary License')
+
+    def _make_extractor(self, html):
+        from BeautifulSoup import BeautifulSoup
+        extractor = google.GoogleCodeProjectExtractor(self.project)
+        extractor.page = BeautifulSoup(html)
+        extractor.url="http://test/source/browse"
+        return extractor
+
+    def test_get_repo_type_happy_path(self):
+        extractor = self._make_extractor(
+                '<span id="crumb_root">\nsvn/&nbsp;</span>')
+        self.assertEqual('svn', extractor.get_repo_type())
+
+    def test_get_repo_type_no_crumb_root(self):
+        extractor = self._make_extractor('')
+        with self.assertRaises(Exception) as cm:
+            extractor.get_repo_type()
+        self.assertEqual(str(cm.exception),
+                "Couldn't detect repo type: no #crumb_root in "
+                "http://test/source/browse")
+
+    def test_get_repo_type_unknown_repo_type(self):
+        extractor = self._make_extractor(
+                '<span id="crumb_root">cvs</span>')
+        with self.assertRaises(Exception) as cm:
+            extractor.get_repo_type()
+        self.assertEqual(str(cm.exception), "Unknown repo type: cvs")