From 2e21ec088d688868570ca3f3005098bbc284e0c1 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Aug 29 2019 03:56:13 +0000 Subject: [PATCH 1/5] Use jinja's template loader. --- diff --git a/r2spec/spec.py b/r2spec/spec.py index 39ad341..ab3baed 100644 --- a/r2spec/spec.py +++ b/r2spec/spec.py @@ -27,7 +27,7 @@ import os import re import sys import textwrap -from jinja2 import Template +from jinja2 import Environment, FileSystemLoader from r2spec import get_logger, get_rpm_tag, R2specError @@ -205,17 +205,15 @@ class Spec: """ Read the empty template and fills it with the information retrieved. """ - template = '%s/specfile.tpl' % os.path.dirname(__file__) self.log.info('Filling spec template') + loader = FileSystemLoader(os.path.dirname(__file__)) + env = Environment(loader=loader) try: - stream = open(template, 'r') - tplfile = stream.read() - stream.close() - mytemplate = Template(tplfile) + mytemplate = env.get_template('specfile.tpl') self.spec = mytemplate.render(self.__dict) except IOError as err: self.log.debug('ERROR: %s', err) - raise R2specError('Cannot read the file %s' % template) + raise R2specError('Cannot read the file %s' % (err, )) def get_specfile(self): """ Return the path to the spec file. From af64327e7b429009396deabe7a54f4641942f5a8 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Aug 29 2019 03:56:14 +0000 Subject: [PATCH 2/5] Put (Build)Requires on separate lines. --- diff --git a/r2spec/spec.py b/r2spec/spec.py index ab3baed..46904cf 100644 --- a/r2spec/spec.py +++ b/r2spec/spec.py @@ -60,7 +60,7 @@ def format_dependencies(dependencies): dep = 'R-%s' % dep.strip() dep_list.append(dep) - return ' '.join(dep_list).strip() + return dep_list class Spec: @@ -207,7 +207,7 @@ class Spec: """ self.log.info('Filling spec template') loader = FileSystemLoader(os.path.dirname(__file__)) - env = Environment(loader=loader) + env = Environment(loader=loader, lstrip_blocks=True, trim_blocks=True) try: mytemplate = env.get_template('specfile.tpl') self.spec = mytemplate.render(self.__dict) diff --git a/r2spec/specfile.tpl b/r2spec/specfile.tpl index be014ac..5eba405 100644 --- a/r2spec/specfile.tpl +++ b/r2spec/specfile.tpl @@ -1,6 +1,8 @@ %global packname {{ packname }} -{% if (arch == False) %}%global rlibdir %{_datadir}/R/library -{% else %}%global rlibdir %{_libdir}/R/library +{% if arch %} +%global rlibdir %{_libdir}/R/library +{% else %} +%global rlibdir %{_datadir}/R/library {% endif %} Name: R-%{packname} @@ -13,40 +15,55 @@ URL: {{URL}} Source0: {{source0}} # Here's the R view of the dependencies world: -# Depends: {{depends}} -# Imports: {{imports}} -# Suggests: {{suggests}} +# Depends: {{ depends | join(' ') }} +# Imports: {{ imports | join(' ') }} +# Suggests: {{ suggests | join(' ') }} # LinkingTo: # Enhances: -{% if (arch == False) %}BuildArch: noarch +{% if not arch %} +BuildArch: noarch Requires: R-core {% endif %} -{% if depends != "" %}Requires: {{depends}}{% endif %} -{% if imports != "" %}Requires: {{imports}}{% endif %} -{% if suggests != "" %}Requires: {{suggests}}{% endif %} -BuildRequires: R-devel tex(latex) {{depends}} -{% if imports != "" %}BuildRequires: {{imports}}{% endif %} -{% if suggests != "" %}BuildRequires: {{suggests}}{% endif %} +{% for dep in depends + imports %} +Requires: {{dep}} +{% endfor %} +{% for dep in suggests %} +Requires: {{dep}} +{% endfor %} +BuildRequires: R-devel +BuildRequires: tex(latex) +{% for dep in depends + imports %} +BuildRequires: {{dep}} +{% endfor %} +{% for dep in suggests %} +BuildRequires: {{dep}} +{% endfor %} %description {{description}} + %prep %setup -q -c -n %{packname} + %build + %install mkdir -p %{buildroot}%{rlibdir} %{_bindir}/R CMD INSTALL -l %{buildroot}%{rlibdir} %{packname} test -d %{packname}/src && (cd %{packname}/src; rm -f *.o *.so) rm -f %{buildroot}%{rlibdir}/R.css -{% if (no_check == False) %} + + +{% if not no_check %} %check %{_bindir}/R CMD check %{packname} -{% endif %} + +{% endif %} %files %dir %{rlibdir}/%{packname} %doc %{rlibdir}/%{packname}/doc From d52d0952185af90da4b59b183222ce689149ead2 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Aug 29 2019 03:56:14 +0000 Subject: [PATCH 3/5] Add full version information to dependencies. --- diff --git a/r2spec/spec.py b/r2spec/spec.py index 46904cf..a1aa0c3 100644 --- a/r2spec/spec.py +++ b/r2spec/spec.py @@ -24,25 +24,37 @@ from __future__ import absolute_import, division, print_function import datetime import os -import re import sys import textwrap +from collections import namedtuple + from jinja2 import Environment, FileSystemLoader from r2spec import get_logger, get_rpm_tag, R2specError +class Package(namedtuple('Package', 'name version')): + def __str__(self): + if self.version: + return self.name + ' ' + self.version + else: + return self.name + + @property + def rpm_version(self): + if self.version: + return self.name + ' ' + self.version.replace('-', '.') + else: + return self.name + + def format_dependencies(dependencies): """ Format the dependencies cleanning them as much as possible for rpm. """ ignorelist = ['R'] - # Regular expression used to determine whether the string is a - # version number - versionmotif = re.compile(r'\d\.\d\.?\d?') char = { '\r': '', '(': ' ', ')': ' ', - ',': ' ', ' ': ' ', } @@ -50,15 +62,17 @@ def format_dependencies(dependencies): dependencies = dependencies.replace(key, char[key]) dep_list = [] - for dep in dependencies.split(' '): - if dep.strip(): - if not ">" in dep \ - and not "<" in dep \ - and not "=" in dep \ - and len(versionmotif.findall(dep)) == 0 \ - and dep.strip() not in ignorelist: - dep = 'R-%s' % dep.strip() - dep_list.append(dep) + for dep in dependencies.split(','): + dep = dep.strip() + if dep: + if ' ' in dep: + name, version = dep.split(' ', 1) + else: + name = dep + version = '' + if name not in ignorelist: + name = 'R-%s' % name.strip() + dep_list.append(Package(name, version.strip())) return dep_list diff --git a/r2spec/specfile.tpl b/r2spec/specfile.tpl index 5eba405..294aa14 100644 --- a/r2spec/specfile.tpl +++ b/r2spec/specfile.tpl @@ -15,9 +15,9 @@ URL: {{URL}} Source0: {{source0}} # Here's the R view of the dependencies world: -# Depends: {{ depends | join(' ') }} -# Imports: {{ imports | join(' ') }} -# Suggests: {{ suggests | join(' ') }} +# Depends: {{ depends | join(', ') }} +# Imports: {{ imports | join(', ') }} +# Suggests: {{ suggests | join(', ') }} # LinkingTo: # Enhances: @@ -26,18 +26,18 @@ BuildArch: noarch Requires: R-core {% endif %} {% for dep in depends + imports %} -Requires: {{dep}} +Requires: {{dep.rpm_version}} {% endfor %} {% for dep in suggests %} -Requires: {{dep}} +Requires: {{dep.rpm_version}} {% endfor %} BuildRequires: R-devel BuildRequires: tex(latex) {% for dep in depends + imports %} -BuildRequires: {{dep}} +BuildRequires: {{dep.rpm_version}} {% endfor %} {% for dep in suggests %} -BuildRequires: {{dep}} +BuildRequires: {{dep.rpm_version}} {% endfor %} %description From c621af9d459bcabe758dee4553979abaac1a43ba Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Aug 29 2019 03:56:14 +0000 Subject: [PATCH 4/5] Use rpm Suggests for R Suggests. Fixes #9. --- diff --git a/r2spec/specfile.tpl b/r2spec/specfile.tpl index 294aa14..1114488 100644 --- a/r2spec/specfile.tpl +++ b/r2spec/specfile.tpl @@ -29,7 +29,7 @@ Requires: R-core Requires: {{dep.rpm_version}} {% endfor %} {% for dep in suggests %} -Requires: {{dep.rpm_version}} +Suggests: {{dep.rpm_version}} {% endfor %} BuildRequires: R-devel BuildRequires: tex(latex) From a2a0e8b01090b57454352b71bae6e3bac6d95d0f Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Aug 29 2019 05:06:53 +0000 Subject: [PATCH 5/5] Disable explicit Requires/Suggests by default. These are automatically provided by rpm macros now. --- diff --git a/r2spec/r2spec_obj.py b/r2spec/r2spec_obj.py index e08f69d..0489330 100644 --- a/r2spec/r2spec_obj.py +++ b/r2spec/r2spec_obj.py @@ -66,8 +66,8 @@ def setup_parser(prog): help='Path to local sources of a R package.') parser.add_argument('--no-check', action='store_true', help='Do not include the %%check section in the generated spec file.') - parser.add_argument('--no-suggest', action='store_true', - help='Do not include the dependencies marked as \'Suggest\' by the source as dependencies of the RPM.') + parser.add_argument('--with-deps', action='store_true', + help='Include the dependencies marked by the source as dependencies of the RPM.') parser.add_argument('--force-dl', action='store_true', help='Enforce the download of the source, even if they are already on the system.') parser.add_argument('--keep-sources', action='store_true', @@ -285,7 +285,7 @@ class R2spec(object): pack.remove_sources() spec = Spec(settings, pack, no_check=args.no_check, - no_suggest=args.no_suggest) + with_deps=args.with_deps) spec.fill_spec_info() spec.get_template() spec.write_spec(True) diff --git a/r2spec/spec.py b/r2spec/spec.py index a1aa0c3..1c40725 100644 --- a/r2spec/spec.py +++ b/r2spec/spec.py @@ -84,16 +84,17 @@ class Spec: """ def __init__(self, settings, package=None, no_check=False, - no_suggest=False): + with_deps=False): """ Constructor. """ self.package = package self.settings = settings - self.__dict = {} + self.__dict = { + 'with_deps': with_deps + } self.log = get_logger() self.spec = None self.no_check = no_check - self.no_suggest = no_suggest def add_files(self, files): """ Add to a spec file the given files list. @@ -159,11 +160,8 @@ class Spec: self.package.get('Depends')) self.__dict['imports'] = format_dependencies( self.package.get('Imports')) - if not self.no_suggest: - self.__dict['suggests'] = format_dependencies( - self.package.get('Suggests')) - else: - self.__dict['suggests'] = "" + self.__dict['suggests'] = format_dependencies( + self.package.get('Suggests')) self.__dict['description'] = textwrap.fill( self.package.get('Description'), width=75) diff --git a/r2spec/specfile.tpl b/r2spec/specfile.tpl index 1114488..45d8d1b 100644 --- a/r2spec/specfile.tpl +++ b/r2spec/specfile.tpl @@ -23,14 +23,18 @@ Source0: {{source0}} {% if not arch %} BuildArch: noarch +{% if with_deps %} Requires: R-core {% endif %} +{% endif %} +{% if with_deps %} {% for dep in depends + imports %} Requires: {{dep.rpm_version}} {% endfor %} {% for dep in suggests %} Suggests: {{dep.rpm_version}} {% endfor %} +{% endif %} BuildRequires: R-devel BuildRequires: tex(latex) {% for dep in depends + imports %}