Add R/CRAN support.

This commit is contained in:
Jelmer Vernooij 2021-03-18 14:59:57 +00:00
parent 84c8a1abda
commit 97da5ea6bd
3 changed files with 64 additions and 1 deletions

View file

@ -55,6 +55,7 @@ issues (or lack of support for a particular ecosystem), please file a bug.
- Module::Build::Tiny
- PHP Pear
- Python - setup.py/setup.cfg/pyproject.toml
- R
- Ruby gems
- Waf
@ -69,6 +70,7 @@ The following "native" repositories are supported:
- hackage
- npm
- cargo
- cran
- golang\*
As well one distribution repository:

View file

@ -363,6 +363,28 @@ class Gradle(BuildSystem):
session, [self.executable, "installDist"], fixers)
class R(BuildSystem):
name = "R"
def __init__(self, path):
self.path = path
def __repr__(self):
return "%s(%r)" % (type(self).__name__, self.path)
def build(self, session, resolver, fixers):
run_with_build_fixers(session, ["R", "CMD", "build", "."], fixers)
def test(self, session, resolver, fixers):
run_with_build_fixers(session, ["R", "CMD", "test", "."], fixers)
@classmethod
def probe(cls, path):
if os.path.exists(os.path.join(path, 'DESCRIPTION')):
return cls(path)
class Meson(BuildSystem):
name = "meson"
@ -868,7 +890,7 @@ class PerlBuildTiny(BuildSystem):
BUILDSYSTEM_CLSES = [
Pear, SetupPy, Npm, Waf, Cargo, Meson, Cabal, Gradle, Maven,
DistInkt, Gem, Make, PerlBuildTiny, Golang]
DistInkt, Gem, Make, PerlBuildTiny, Golang, R]
def detect_buildsystems(path, trust_package=False):

View file

@ -76,6 +76,44 @@ class CPANResolver(Resolver):
raise UnsatisfiedRequirements(missing)
class CRANResolver(Resolver):
def __init__(self, session, repos='"http://cran.r-project.org'):
self.session = session
self.repos = repos
def __str__(self):
return "cran"
def __repr__(self):
return "%s(%r, %r)" % (type(self).__name__, self.session, self.repos)
def _cmd(self, req):
return ["R", "-e", "install.packages('%s', repos=%r)" % (req.package, self.repos)]
def explain(self, requirements):
from ..requirements import RPackageRequirement
rreqs = []
for requirement in requirements:
if not isinstance(requirement, RPackageRequirement):
continue
rreqs.append(requirement)
if rreqs:
yield ([self._cmd(req) for req in rreqs])
def install(self, requirements):
from ..requirements import RPackageRequirement
missing = []
for requirement in requirements:
if not isinstance(requirement, RPackageRequirement):
missing.append(requirement)
continue
self.session.check_call(self._cmd(requirement))
if missing:
raise UnsatisfiedRequirements(missing)
class HackageResolver(Resolver):
def __init__(self, session):
self.session = session
@ -268,6 +306,7 @@ NATIVE_RESOLVER_CLS = [
NpmResolver,
GoResolver,
HackageResolver,
CRANResolver,
]