Source code for skelpy.makers.setup

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""This module defines :class:`SetupMaker` class"""

from __future__ import absolute_import, print_function

import os
import sys
from functools import partial

from skelpy.utils.helpers import read_setup_cfg
from . import settings
from .base import BaseMaker


[docs]class SetupMaker(BaseMaker): """*Maker* class to create ``setup.py`` file in the project directory. Args: projectDir (str): absolute path of project directory force (bool): whether to overwrite if ``setup.py`` already exists """ def __init__(self, projectDir, force, **kwargs): self.projectDir = projectDir self.force = force self._update_settings() def _update_settings(self): """update :attr:`maker.settings` dictionary""" settings.update(read_setup_cfg(os.path.join(self.projectDir, 'setup.cfg'))) _format_multi_line_list = self._format _format_single_line_list = partial(self._format, indent=0, sep=', ') _format_multi_line_dict = partial(self._format, quote=False) info = { 'exclude': _format_single_line_list(settings.get('exclude')), 'python_requires': self._get_python_requires(settings.get('classifiers')), 'classifiers': _format_multi_line_list(settings.get('classifiers')), 'install_requires': _format_multi_line_list(settings.get('install_requires')), 'setup_requires': _format_multi_line_list(settings.get('setup_requires')), 'tests_require': _format_multi_line_list(settings.get('tests_require')), 'extras_require': _format_multi_line_dict(settings.get('extras_require')), } settings.update(info) @staticmethod def _format(text, quote=True, indent=8, sep=',\n'): """ convert data read from setup.cfg to the suitable format for setup.py Args: text (str): string to format quote (bool): whether to surround the output string with quotation marks indent (int): indent spaces sep (str): line separator """ if not text: return '' split_sep = '\n' if text.find('\n') != -1 else '; ' if quote: opt_list = list(map(repr, text.split(split_sep))) else: opt_list = text.split(split_sep) INDENT = ' ' * indent separator = sep + INDENT return separator.join(opt_list) @staticmethod def _get_python_requires(classifiers): """Infer the required python version from the given classifiers string Args: classifiers (str): the value of 'classifiers' in settings Returns: str: minimum(lowest) python version required """ count = 0 min_ver = 'HIGH_VERSION' classifiers_list = classifiers.split('\n') for c in classifiers_list: if c.startswith('Programming Language :: Python'): count += 1 ver = c.split('::')[-1].strip() if ver < min_ver: min_ver = ver # if we can not determine the required_python_version, apply the current if min_ver == 'HIGH_VERSION': min_ver = sys.version.split()[0] sign = '>=' if count >= 2 else '==' return sign + min_ver
[docs] def generate(self): """Worker method of :class:`SetupMaker`""" return self.write_file('setup', os.path.join(self.projectDir, 'setup.py'))