gemspec.py: new generator
This commit is contained in:
parent
64cac1080a
commit
18498e2c58
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
|
@ -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: []
|
|
@ -0,0 +1,3 @@
|
|||
SPDX-FileCopyrightText: 2023 David Heinemeier Hansson
|
||||
|
||||
SPDX-License-Identifier: MIT
|
|
@ -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>
|
|
@ -0,0 +1,3 @@
|
|||
SPDX-FileCopyrightText: 2023 Anna <cyber@sysrq.in>
|
||||
|
||||
SPDX-License-Identifier: CC0-1.0
|
|
@ -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) == ""
|
Loading…
Reference in New Issue