You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2014/06/19 16:52:48 UTC
[2/4] git commit: [#7381] update GoogleCodeProjectNameValidator for
hosted domains, add tests
[#7381] update GoogleCodeProjectNameValidator for hosted domains, add tests
Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/b7d020c3
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/b7d020c3
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/b7d020c3
Branch: refs/heads/master
Commit: b7d020c37f4c7d68c28ae0661fd3c7b71a0c3aae
Parents: f80727e
Author: Dave Brondsema <db...@slashdotmedia.com>
Authored: Thu May 29 19:53:02 2014 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Thu Jun 19 14:51:55 2014 +0000
----------------------------------------------------------------------
.../forgeimporters/google/__init__.py | 29 +++++--
.../forgeimporters/google/tests/test_init.py | 83 ++++++++++++++++++++
2 files changed, 106 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/allura/blob/b7d020c3/ForgeImporters/forgeimporters/google/__init__.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/__init__.py b/ForgeImporters/forgeimporters/google/__init__.py
index aebc596..a7bb1d9 100644
--- a/ForgeImporters/forgeimporters/google/__init__.py
+++ b/ForgeImporters/forgeimporters/google/__init__.py
@@ -124,13 +124,30 @@ class GoogleCodeProjectNameValidator(fev.FancyValidator):
}
def _to_python(self, value, state=None):
- url = urlparse(value.strip())
- if url.netloc.endswith('.googlecode.com'):
- project_name = url.netloc.split('.')[0]
+ project_name_re = re.compile(r'^[a-z0-9][a-z0-9-]{,61}$')
+ if project_name_re.match(value):
+ # just a name
+ project_name = value
else:
- project_name = os.path.basename(url.path.strip('/'))
- if not re.match(r'^[a-z0-9][a-z0-9-]{,61}$', project_name):
- raise fev.Invalid(self.message('invalid', state), value, state)
+ # try as a URL
+ project_name = None
+ project_name_simple = None
+ url = urlparse(value.strip())
+ if url.netloc.endswith('.googlecode.com'):
+ project_name = url.netloc.split('.')[0]
+ elif url.netloc == 'code.google.com':
+ path_parts = url.path.lstrip('/').split('/')
+ if len(path_parts) >= 2 and path_parts[0] == 'p':
+ project_name = path_parts[1]
+ elif len(path_parts) >= 4 and path_parts[0] == 'a' and path_parts[2] == 'p':
+ project_name_simple = path_parts[3]
+ project_name = '/'.join(path_parts[0:4])
+
+ if not project_name_simple:
+ project_name_simple = project_name
+
+ if not project_name or not project_name_re.match(project_name_simple):
+ raise fev.Invalid(self.message('invalid', state), value, state)
if not GoogleCodeProjectExtractor(project_name).check_readable():
raise fev.Invalid(self.message('unavailable', state), value, state)
http://git-wip-us.apache.org/repos/asf/allura/blob/b7d020c3/ForgeImporters/forgeimporters/google/tests/test_init.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/google/tests/test_init.py b/ForgeImporters/forgeimporters/google/tests/test_init.py
new file mode 100644
index 0000000..8acb0e3
--- /dev/null
+++ b/ForgeImporters/forgeimporters/google/tests/test_init.py
@@ -0,0 +1,83 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from nose.tools import assert_equal
+from mock import patch
+from formencode.validators import Invalid
+
+from allura.tests import decorators as td
+from forgeimporters.google import GoogleCodeProjectNameValidator, GoogleCodeProjectExtractor
+
+
+class TestGoogleCodeProjectNameValidator(object):
+
+ def setUp(self):
+ self.readable_patcher = patch.object(GoogleCodeProjectExtractor, 'check_readable')
+ self.readable_mock = self.readable_patcher.start()
+ self.readable_mock.return_value = True
+
+ def tearDown(self):
+ self.readable_patcher.stop()
+
+ def test_simple(self):
+ assert_equal(
+ GoogleCodeProjectNameValidator()._to_python('gmapcatcher'),
+ 'gmapcatcher'
+ )
+
+ def test_code_dot_google(self):
+ assert_equal(
+ GoogleCodeProjectNameValidator()._to_python('http://code.google.com/p/gmapcatcher/'),
+ 'gmapcatcher'
+ )
+ assert_equal(
+ GoogleCodeProjectNameValidator()._to_python('https://code.google.com/p/gmapcatcher/'),
+ 'gmapcatcher'
+ )
+
+ def test_googlecode_com(self):
+ assert_equal(
+ GoogleCodeProjectNameValidator()._to_python('http://gmapcatcher.googlecode.com/'),
+ 'gmapcatcher'
+ )
+ assert_equal(
+ GoogleCodeProjectNameValidator()._to_python('https://gmapcatcher.googlecode.com/'),
+ 'gmapcatcher'
+ )
+
+ def test_not_readable(self):
+ self.readable_mock.return_value = False
+ with td.raises(Invalid):
+ GoogleCodeProjectNameValidator()._to_python('gmapcatcher')
+
+ def test_invalid(self):
+ with td.raises(Invalid):
+ GoogleCodeProjectNameValidator()._to_python('http://code.google.com/')
+ with td.raises(Invalid):
+ GoogleCodeProjectNameValidator()._to_python('http://foobar.com/p/gmapcatcher')
+ with td.raises(Invalid):
+ GoogleCodeProjectNameValidator()._to_python('http://code.google.com/p/asdf_asdf')
+ with td.raises(Invalid):
+ GoogleCodeProjectNameValidator()._to_python('http://code.google.com/x/y/z')
+
+ def test_hosted_domain(self):
+ assert_equal(
+ GoogleCodeProjectNameValidator()._to_python('https://code.google.com/a/eclipselabs.org/p/restclient-tool'),
+ 'a/eclipselabs.org/p/restclient-tool'
+ )
+ with td.raises(Invalid):
+ GoogleCodeProjectNameValidator()._to_python('http://code.google.com/a/eclipselabs.org/bogus')