bower.py: new generator
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Anna “CyberTailor” 2023-06-14 16:55:26 +05:00
parent 31cb1de5a8
commit a806f39cbb
Signed by: CyberTaIlor
GPG Key ID: E7B76EDC50864BB1
11 changed files with 143 additions and 0 deletions

View File

@ -12,6 +12,7 @@ gentle
Supported generators
--------------------
* [Bower](https://github.com/bower/spec/blob/master/json.md)
* Crystal ([Shards](https://github.com/crystal-lang/shards/blob/master/docs/shard.yml.adoc))
* Node.js ([npm](https://docs.npmjs.com/files/package.json/))
* Python ([PEP 621](https://peps.python.org/pep-0621/))

View File

@ -13,6 +13,7 @@ import gentle
from gentle.generators import AbstractGenerator
from gentle.metadata import MetadataXML
import gentle.generators.bower
import gentle.generators.cargo
import gentle.generators.composer
import gentle.generators.npm

View File

@ -0,0 +1,54 @@
# SPDX-License-Identifier: WTFPL
# SPDX-FileCopyrightText: 2023 Anna <cyber@sysrq.in>
# No warranty
"""
Metadata XML generator for Bower.
The following attributes are supported:
* Upstream maintainer(s)
* Remote ID
"""
import json
import logging
from pathlib import Path
from gentle.generators import AbstractGenerator
from gentle.metadata import Person, MetadataXML
from gentle.metadata.utils import extract_name_email, extract_remote_id
logger = logging.getLogger("bower")
class BowerGenerator(AbstractGenerator):
def __init__(self, srcdir: Path):
self.bower_json = srcdir / "bower.json"
def update_metadata_xml(self, mxml: MetadataXML) -> None:
with open(self.bower_json) as file:
try:
package = json.load(file)
except json.decoder.JSONDecodeError:
return
for maint in package.get("authors", []):
logger.info("Found upstream maintainer: %s", maint)
if isinstance(maint, str):
person = extract_name_email(maint)
else:
person = Person(name=maint.get("name", ""),
email=maint.get("email", ""))
if person is not None and person.name:
mxml.add_upstream_maintainer(person)
if (homepage := package.get("homepage")) is not None:
logger.info("Found homepage: %s", homepage)
if (remote_id := extract_remote_id(homepage)) is not None:
mxml.add_upstream_remote_id(remote_id)
@property
def active(self) -> bool:
return self.bower_json.is_file()

0
tests/bower/__init__.py Normal file
View File

View File

@ -0,0 +1,32 @@
{
"name": "aurelia-framework",
"version": "1.4.1",
"description": "The aurelia framework brings together all the required core aurelia libraries into a ready-to-go application-building platform.",
"keywords": [
"aurelia",
"framework",
"spa"
],
"homepage": "http://aurelia.io",
"main": "dist/commonjs/aurelia-framework.js",
"moduleType": "node",
"license": "MIT",
"authors": [
"Rob Eisenberg <rob@bluespire.com> (http://robeisenberg.com/)"
],
"repository": {
"type": "git",
"url": "http://github.com/aurelia/framework"
},
"dependencies": {
"aurelia-binding": "^2.0.0",
"aurelia-dependency-injection": "^1.0.0",
"aurelia-loader": "^1.0.0",
"aurelia-logging": "^1.0.0",
"aurelia-metadata": "^1.0.0",
"aurelia-pal": "^1.0.0",
"aurelia-path": "^1.0.0",
"aurelia-task-queue": "^1.0.0",
"aurelia-templating": "^1.11.1"
}
}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2023 Rob Eisenberg <rob@bluespire.com>
SPDX-License-Identifier: MIT

View File

@ -0,0 +1,8 @@
<pkgmetadata>
<upstream>
<maintainer>
<name>Rob Eisenberg</name>
<email>rob@bluespire.com</email>
</maintainer>
</upstream>
</pkgmetadata>

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2023 Anna <cyber@sysrq.in>
SPDX-License-Identifier: CC0-1.0

View File

View File

View File

@ -0,0 +1,41 @@
# SPDX-License-Identifier: WTFPL
# SPDX-FileCopyrightText: 2023 Anna <cyber@sysrq.in>
# No warranty
from copy import deepcopy
from pathlib import Path
import pytest
from gentle.generators.bower import BowerGenerator
from gentle.metadata import MetadataXML
from tests.utils import compare_mxml
def test_pkg_none(mxml: MetadataXML):
gen = BowerGenerator(Path(__file__).parent / "pkg_none")
assert not gen.active
def test_pkg_empty(mxml: MetadataXML):
gen = BowerGenerator(Path(__file__).parent / "pkg_empty")
assert gen.active
mxml_old = deepcopy(mxml)
gen.update_metadata_xml(mxml)
assert compare_mxml(mxml_old, mxml) == ""
@pytest.mark.parametrize("dirname", ["aurelia"])
def test_pkg(mxml: MetadataXML, dirname: str):
gen = BowerGenerator(Path(__file__).parent / dirname)
assert gen.active
gen.update_metadata_xml(mxml)
with open(Path(__file__).parent / dirname / "metadata.xml") as file:
assert mxml.dumps() == file.read().rstrip()
mxml_prev = deepcopy(mxml)
gen.update_metadata_xml(mxml)
assert compare_mxml(mxml_prev, mxml) == ""