Normalise repository url when parsing package manifest

This commit is contained in:
Ivan Kravets
2019-12-22 23:45:12 +02:00
parent 26e7069099
commit 7e0fb43dbe
3 changed files with 51 additions and 21 deletions

View File

@ -5,14 +5,14 @@ isort:
isort -rc ./platformio
isort -rc ./tests
black:
format:
black --target-version py27 ./platformio
black --target-version py27 ./tests
test:
py.test --verbose --capture=no --exitfirst -n 6 --dist=loadscope tests --ignore tests/test_examples.py
before-commit: isort black lint test
before-commit: isort format lint test
clean-docs:
rm -rf docs/_build

View File

@ -125,6 +125,8 @@ class BaseManifestParser(object):
self._data = self.parse(contents)
except Exception as e:
raise ManifestParserError("Could not parse manifest -> %s" % e)
self._data = self.normalize_repository(self._data)
self._data = self.parse_examples(self._data)
# remove None fields
@ -139,7 +141,7 @@ class BaseManifestParser(object):
return self._data
@staticmethod
def cleanup_author(author):
def normalize_author(author):
assert isinstance(author, dict)
if author.get("email"):
author["email"] = re.sub(r"\s+[aA][tT]\s+", "@", author["email"])
@ -160,6 +162,22 @@ class BaseManifestParser(object):
email = raw[raw.index(ldel) + 1 : raw.index(rdel)]
return (name.strip(), email.strip() if email else None)
@staticmethod
def normalize_repository(data):
url = (data.get("repository") or {}).get("url")
if not url or "://" not in url:
return data
url_attrs = urlparse(url)
if url_attrs.netloc not in ("github.com", "bitbucket.org", "gitlab.com"):
return data
url = "https://%s%s" % (url_attrs.netloc, url_attrs.path)
if url.endswith("/"):
url = url[:-1]
if not url.endswith(".git"):
url += ".git"
data["repository"]["url"] = url
return data
def parse_examples(self, data):
examples = data.get("examples")
if (
@ -305,7 +323,7 @@ class LibraryJsonManifestParser(BaseManifestParser):
# normalize Union[dict, list] fields
if not isinstance(raw, list):
raw = [raw]
return [self.cleanup_author(author) for author in raw]
return [self.normalize_author(author) for author in raw]
@staticmethod
def _parse_platforms(raw):
@ -352,7 +370,7 @@ class ModuleJsonManifestParser(BaseManifestParser):
name, email = self.parse_author_name_and_email(author)
if not name:
continue
result.append(self.cleanup_author(dict(name=name, email=email)))
result.append(self.normalize_author(dict(name=name, email=email)))
return result
@staticmethod
@ -451,7 +469,7 @@ class LibraryPropertiesManifestParser(BaseManifestParser):
name, email = self.parse_author_name_and_email(author)
if not name:
continue
authors.append(self.cleanup_author(dict(name=name, email=email)))
authors.append(self.normalize_author(dict(name=name, email=email)))
for author in properties.get("maintainer", "").split(","):
name, email = self.parse_author_name_and_email(author)
if not name:
@ -466,27 +484,25 @@ class LibraryPropertiesManifestParser(BaseManifestParser):
item["email"] = email
if not found:
authors.append(
self.cleanup_author(dict(name=name, email=email, maintainer=True))
self.normalize_author(dict(name=name, email=email, maintainer=True))
)
return authors
def _parse_repository(self, properties):
if self.remote_url:
repo_parse = urlparse(self.remote_url)
repo_path_tokens = repo_parse.path[1:].split("/")[:-1]
if "github" in repo_parse.netloc:
url_attrs = urlparse(self.remote_url)
repo_path_tokens = url_attrs.path[1:].split("/")[:-1]
if "github" in url_attrs.netloc:
return dict(
type="git",
url="%s://github.com/%s"
% (repo_parse.scheme, "/".join(repo_path_tokens[:2])),
url="https://github.com/" + "/".join(repo_path_tokens[:2]),
)
if "raw" in repo_path_tokens:
return dict(
type="git",
url="%s://%s/%s"
url="https://%s/%s"
% (
repo_parse.scheme,
repo_parse.netloc,
url_attrs.netloc,
"/".join(repo_path_tokens[: repo_path_tokens.index("raw")]),
),
)
@ -498,9 +514,9 @@ class LibraryPropertiesManifestParser(BaseManifestParser):
result = {"exclude": ["extras", "docs", "tests", "test", "*.doxyfile", "*.pdf"]}
include = None
if self.remote_url:
repo_parse = urlparse(self.remote_url)
repo_path_tokens = repo_parse.path[1:].split("/")[:-1]
if "github" in repo_parse.netloc:
url_attrs = urlparse(self.remote_url)
repo_path_tokens = url_attrs.path[1:].split("/")[:-1]
if "github" in url_attrs.netloc:
include = "/".join(repo_path_tokens[3:]) or None
elif "raw" in repo_path_tokens:
include = (

View File

@ -29,6 +29,10 @@ def test_library_json_parser():
"name": "TestPackage",
"keywords": "kw1, KW2, kw3",
"platforms": ["atmelavr", "espressif"],
"repository": {
"type": "git",
"url": "http://github.com/username/repo/"
},
"url": "http://old.url.format",
"exclude": [".gitignore", "tests"],
"include": "mylib",
@ -44,6 +48,10 @@ def test_library_json_parser():
{
"name": "TestPackage",
"platforms": ["atmelavr", "espressif8266"],
"repository": {
"type": "git",
"url": "https://github.com/username/repo.git",
},
"export": {"exclude": [".gitignore", "tests"], "include": ["mylib"]},
"keywords": ["kw1", "kw2", "kw3"],
"homepage": "http://old.url.format",
@ -172,7 +180,7 @@ customField=Custom Value
"include": ["libraries/TestPackage"],
}
assert data["repository"] == {
"url": "https://github.com/username/reponame",
"url": "https://github.com/username/reponame.git",
"type": "git",
}
@ -299,7 +307,10 @@ architectures=avr,sam
"A library for monochrome TFTs and OLEDs. Supported display "
"controller: SSD1306, SSD1309, SSD1322, SSD1325"
),
"repository": {"url": "https://github.com/olikraus/u8glib", "type": "git"},
"repository": {
"url": "https://github.com/olikraus/u8glib.git",
"type": "git",
},
"frameworks": ["arduino"],
"platforms": ["atmelavr", "atmelsam"],
"version": "1.19.1",
@ -350,7 +361,10 @@ includes=MozziGuts.h
"sounds using familiar synthesis units like oscillators, delays, "
"filters and envelopes."
),
"repository": {"url": "https://github.com/sensorium/Mozzi", "type": "git"},
"repository": {
"url": "https://github.com/sensorium/Mozzi.git",
"type": "git",
},
"platforms": ["*"],
"frameworks": ["arduino"],
"export": {