gemspec.py: new generator

This commit is contained in:
Anna “CyberTailor” 2023-07-16 22:19:59 +05:00
parent 64cac1080a
commit 18498e2c58
Signed by: CyberTaIlor
GPG Key ID: E7B76EDC50864BB1
12 changed files with 372 additions and 0 deletions

View File

@ -25,6 +25,7 @@ Supported generators
* Perl ([CPAN::Meta::Spec](http://search.cpan.org/perldoc?CPAN::Meta::Spec))
* PHP ([Composer](https://getcomposer.org/doc/04-schema.md), [PEAR/PECL](https://pear.php.net/manual/en/guide.developers.package2.php))
* Python ([PEP 621](https://peps.python.org/pep-0621/), [PEP 643](https://peps.python.org/pep-0643/), [Setuptools](https://setuptools.pypa.io/en/latest/userguide/declarative_config.html))
* Ruby ([Gem metadata](https://guides.rubygems.org/specification-reference/))
* Rust ([Cargo](https://doc.rust-lang.org/cargo/reference/manifest.html))
Language-independent:

View File

@ -9,6 +9,7 @@ Release Notes
-----
* New generator: Perl CPAN::Meta::Spec
* New generator: Ruby Gem
* Add command-line flags to control tests selection
0.4.0

View File

@ -22,6 +22,7 @@ import gentle.generators.cargo
import gentle.generators.composer
import gentle.generators.cpan
import gentle.generators.doap
import gentle.generators.gemspec
import gentle.generators.hpack
import gentle.generators.npm
import gentle.generators.nuspec

View File

@ -0,0 +1,80 @@
# SPDX-License-Identifier: WTFPL
# SPDX-FileCopyrightText: 2022 Anna <cyber@sysrq.in>
# No warranty
"""
Metadata XML generator for Crystal Shards.
The following attributes are supported:
* Upstream maintainer(s)
* Upstream documentation
* Remote ID
"""
import logging
from pathlib import Path
from gentle.generators import AbstractGenerator
from gentle.metadata import MetadataXML
from gentle.metadata.utils import extract_remote_id
try:
import yaml
from yaml import Loader
_HAS_PYYAML = True
class VersionTag(yaml.YAMLObject):
""" Dummy version tag """
yaml_tag = "!ruby/object:Gem::Version"
class RequirementTag(yaml.YAMLObject):
""" Dummy requirement tag """
yaml_tag = "!ruby/object:Gem::Requirement"
class DependencyTag(yaml.YAMLObject):
""" Dummy dependency tag """
yaml_tag = "!ruby/object:Gem::Dependency"
class SpecificationTag(yaml.YAMLObject):
""" Dummy specification tag """
yaml_tag = "!ruby/object:Gem::Specification"
except ModuleNotFoundError:
_HAS_PYYAML = False
logger = logging.getLogger("gemspec")
class GemspecGenerator(AbstractGenerator):
def __init__(self, srcdir: Path):
self.metadata_yml = srcdir / "all" / "metadata"
def update_metadata_xml(self, mxml: MetadataXML) -> None:
with open(self.metadata_yml) as file:
if (metadata := yaml.load(file, Loader)) is None:
return
if metadata.homepage:
logger.info("Found homepage: %s", metadata.homepage)
if (remote_id := extract_remote_id(metadata.homepage)) is not None:
mxml.add_upstream_remote_id(remote_id)
for name, value in metadata.metadata.items():
if not isinstance(value, str):
continue
logger.info("Found %s: %s", name, value)
match name:
case "bug_tracker_uri":
mxml.set_upstream_bugs_to(value)
case "changelog_uri":
mxml.set_upstream_changelog(value)
case "documentation_uri":
mxml.set_upstream_doc(value)
case "homepage_uri" | "source_code_uri":
if (remote_id := extract_remote_id(value)) is not None:
mxml.add_upstream_remote_id(remote_id)
@property
def active(self) -> bool:
return _HAS_PYYAML and self.metadata_yml.is_file()

View File

View File

View File

View File

@ -0,0 +1,234 @@
--- !ruby/object:Gem::Specification
name: rails
version: !ruby/object:Gem::Version
version: 7.0.6
platform: ruby
authors:
- David Heinemeier Hansson
autorequire:
bindir: bin
cert_chain: []
date: 2023-06-29 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
name: activesupport
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: actionpack
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: actionview
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: activemodel
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: activerecord
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: actionmailer
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: activejob
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: actioncable
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: activestorage
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: actionmailbox
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: actiontext
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: railties
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
version: 7.0.6
- !ruby/object:Gem::Dependency
name: bundler
requirement: !ruby/object:Gem::Requirement
requirements:
- - ">="
- !ruby/object:Gem::Version
version: 1.15.0
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - ">="
- !ruby/object:Gem::Version
version: 1.15.0
description: Ruby on Rails is a full-stack web framework optimized for programmer
happiness and sustainable productivity. It encourages beautiful code by favoring
convention over configuration.
email: david@loudthinking.com
executables: []
extensions: []
extra_rdoc_files: []
files:
- MIT-LICENSE
- README.md
homepage: https://rubyonrails.org
licenses:
- MIT
metadata:
bug_tracker_uri: https://github.com/rails/rails/issues
changelog_uri: https://github.com/rails/rails/releases/tag/v7.0.6
documentation_uri: https://api.rubyonrails.org/v7.0.6/
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
source_code_uri: https://github.com/rails/rails/tree/v7.0.6
rubygems_mfa_required: 'true'
post_install_message:
rdoc_options: []
require_paths:
- lib
required_ruby_version: !ruby/object:Gem::Requirement
requirements:
- - ">="
- !ruby/object:Gem::Version
version: 2.7.0
required_rubygems_version: !ruby/object:Gem::Requirement
requirements:
- - ">="
- !ruby/object:Gem::Version
version: 1.8.11
requirements: []
rubygems_version: 3.4.13
signing_key:
specification_version: 4
summary: Full-stack web application framework.
test_files: []

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2023 David Heinemeier Hansson
SPDX-License-Identifier: MIT

View File

@ -0,0 +1,9 @@
<pkgmetadata>
<!-- maintainer-needed -->
<upstream>
<bugs-to>https://github.com/rails/rails/issues</bugs-to>
<changelog>https://github.com/rails/rails/releases/tag/v7.0.6</changelog>
<doc>https://api.rubyonrails.org/v7.0.6/</doc>
<remote-id type="github">rails/rails</remote-id>
</upstream>
</pkgmetadata>

View File

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

View File

@ -0,0 +1,40 @@
# 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.gemspec import GemspecGenerator
from gentle.metadata import MetadataXML
from tests.utils import compare_mxml
def test_pkg_none(mxml: MetadataXML):
gen = GemspecGenerator(Path(__file__).parent / "pkg_none")
assert not gen.active
def test_pkg_empty(mxml: MetadataXML):
gen = GemspecGenerator(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", ["rails"])
def test_pkg(mxml: MetadataXML, dirname: str):
gen = GemspecGenerator(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) == ""