mirror of
https://github.com/d9pouces/id_configurator.git
synced 2026-11-09 01:47:21 +01:00
a8143b61b1
Signed-off-by: d9pouces <github@19pouces.net>
53 lines
2.2 KiB
Python
53 lines
2.2 KiB
Python
"""Configure RubyGems to use the configured RubyRepository entries as its
|
|
gem sources, replacing the default (rubygems.org).
|
|
|
|
RubyGems' own HTTPS client (Net::HTTP, backed by OpenSSL) already trusts
|
|
whatever the `certificates` module installs into the system CA store, so no
|
|
separate certificate configuration is needed here, unlike npm's.
|
|
|
|
Written to RubyGems' system-wide config file, `Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE`
|
|
- `$sysconfdir/gemrc`, where `$sysconfdir` is Ruby's own configured
|
|
sysconfdir, not necessarily `/etc`. The official Ruby Docker image builds
|
|
Ruby with `--prefix=/usr/local`, giving `/usr/local/etc/gemrc` (confirmed
|
|
empirically, since Debian's own `sysconfdir` convention of `/etc` does not
|
|
apply to a from-source build). Also written to the more conventional
|
|
`/etc/gemrc`, for any Ruby built with the Debian/`sysconfdir=/etc`
|
|
convention instead (e.g. a distro-packaged `ruby` rather than the official
|
|
image) - harmless to write in both places, since only whichever one a given
|
|
Ruby build actually treats as its sysconfdir is ever read. Unlike a config
|
|
dropped in one specific user's home (`~/.gemrc`, RubyGems' separate "per
|
|
user" level), this applies regardless of which user invokes `gem`.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from id_configurator.config import RubyRepository
|
|
from id_configurator.context import Context
|
|
from id_configurator.modules.base import Module, register
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
_GEMRC_PATHS = ("usr/local/etc/gemrc", "etc/gemrc")
|
|
|
|
|
|
def _write_gemrc(context: Context, repositories: list[RubyRepository]) -> None:
|
|
lines = [":sources:"]
|
|
lines.extend(f"- {repository.url}" for repository in repositories)
|
|
content = ("\n".join(lines) + "\n").encode("utf-8")
|
|
for path in _GEMRC_PATHS:
|
|
context.write_file(path, content)
|
|
logger.info("configured gem to use %d source(s)", len(repositories))
|
|
|
|
|
|
@register
|
|
class RubyModule(Module):
|
|
name = "ruby"
|
|
|
|
def is_relevant(self, context: Context) -> bool:
|
|
return bool(context.config.configurations.ruby.repositories)
|
|
|
|
def apply(self, context: Context) -> None:
|
|
_write_gemrc(context, context.config.configurations.ruby.repositories)
|