Beispiel #1
0
 def test_bad_versions(self, self_bv, self_pv):
     c = Convertor(package='pkg',
                   base_python_version=self_bv,
                   python_versions=self_pv,
                   template='epel6.spec')
     data = PackageData('pkg.tar.gz', 'pkg', 'pkg', '0.1')
     with pytest.raises(SystemExit):
         c.merge_versions(data)
Beispiel #2
0
 def test_merge_versions_fedora(self, self_bv, self_pv, data_pv,
                                expected_bv, expected_pv):
     c = Convertor(package='pkg', base_python_version=self_bv,
                   python_versions=self_pv, template='fedora.spec')
     data = PackageData('pkg.tar.gz', 'pkg', 'pkg', '0.1')
     data.python_versions = data_pv
     c.merge_versions(data)
     assert data.base_python_version == expected_bv
     assert data.python_versions == expected_pv
 def test_versions_epel6(self, self_bv, self_pv, data_bv, data_pv,
                         expected_bv, expected_pv):
     c = Convertor(package='pkg', base_python_version=self_bv, python_versions=self_pv,
                   template='epel6.spec')
     data = PackageData('pkg.tar.gz', 'pkg', 'pkg', '0.1')
     data.base_python_version = data_bv
     data.python_versions = data_pv
     c.merge_versions(data)
     assert data.base_python_version == expected_bv
     assert data.python_versions == expected_pv
Beispiel #4
0
def main(package, v, d, s, r, proxy, srpm, p, b, o, t, venv):
    """Convert PyPI package to RPM specfile or SRPM.

    \b
    \b\bArguments:
    PACKAGE             Provide PyPI name of the package or path to compressed source file."""
    register_file_log_handler('/tmp/pyp2rpm-{0}.log'.format(getpass.getuser()))

    if srpm or s:
        register_console_log_handler()

    distro = o
    if t in settings.KNOWN_DISTROS:
        distro = t

    logger = logging.getLogger(__name__)

    logger.info('Pyp2rpm initialized.')

    convertor = Convertor(package=package,
                          version=v,
                          save_dir=d,
                          template=t or settings.DEFAULT_TEMPLATE,
                          distro=distro,
                          base_python_version=b,
                          python_versions=p,
                          rpm_name=r,
                          proxy=proxy,
                          venv=venv)

    logger.debug('Convertor: {0} created. Trying to convert.'.format(convertor))
    converted = convertor.convert()
    logger.debug('Convertor: {0} succesfully converted.'.format(convertor))

    if srpm or s:
        if r:
            spec_name = r + '.spec'
        else:
            spec_name = 'python-' + convertor.name + '.spec'
        logger.info('Using name: {0} for specfile.'.format(spec_name))
        if d == settings.DEFAULT_PKG_SAVE_PATH:
            # default save_path is rpmbuild tree so we want to save spec
            # in  rpmbuild/SPECS/
            spec_path = d + '/SPECS/' + spec_name
        else:
            # if user provide save_path then save spec in provided path
            spec_path = d + '/' + spec_name
        spec_dir = os.path.dirname(spec_path)
        if not os.path.exists(spec_dir):
            os.makedirs(spec_dir)
        logger.debug('Opening specfile: {0}.'.format(spec_path))

        if not utils.PY3:
            converted = converted.encode('utf-8')
        with open(spec_path, 'w') as f:
            f.write(converted)
            logger.info('Specfile saved at: {0}.'.format(spec_path))

        if srpm:
            msg = utils.build_srpm(spec_path, d)
            if utils.PY3:
                logger.info(msg.decode('utf-8'))
            else:
                logger.info(msg)

    else:
        logger.debug('Printing specfile to stdout.')
        if utils.PY3:
            print(converted)
        else:
            print(converted.encode('utf-8'))
        logger.debug('Specfile printed.')
    logger.info("That's all folks!")
Beispiel #5
0
def main(package, v, d, s, r, proxy, srpm, p, b, o, t, venv, autonc, sclize,
         **scl_kwargs):
    """Convert PyPI package to RPM specfile or SRPM.

    \b
    \b\bArguments:
    PACKAGE             Provide PyPI name of the package or path to compressed
                        source file.
    """
    register_file_log_handler('/tmp/pyp2rpm-{0}.log'.format(getpass.getuser()))

    if srpm or s:
        register_console_log_handler()

    distro = o
    if t and os.path.splitext(t)[0] in settings.KNOWN_DISTROS:
        distro = t
    if not distro and not (b or p):
        raise click.UsageError("Default python versions for template {0} are "
                               "missing in settings, add them or use flags "
                               "-b/-p to set python versions.".format(t))

    logger = logging.getLogger(__name__)

    logger.info('Pyp2rpm initialized.')

    convertor = Convertor(package=package,
                          version=v,
                          save_dir=d,
                          template=t or settings.DEFAULT_TEMPLATE,
                          distro=distro,
                          base_python_version=b,
                          python_versions=p,
                          rpm_name=r,
                          proxy=proxy,
                          venv=venv,
                          autonc=autonc)

    logger.debug(
        'Convertor: {0} created. Trying to convert.'.format(convertor))
    converted = convertor.convert()
    logger.debug('Convertor: {0} succesfully converted.'.format(convertor))

    if sclize:
        converted = convert_to_scl(converted, scl_kwargs)

    if srpm or s:
        if r:
            spec_name = r + '.spec'
        else:
            prefix = 'python-' if not convertor.name.startswith(
                'python-') else ''
            spec_name = prefix + convertor.name + '.spec'
        logger.info('Using name: {0} for specfile.'.format(spec_name))
        if d == settings.DEFAULT_PKG_SAVE_PATH:
            # default save_path is rpmbuild tree so we want to save spec
            # in  rpmbuild/SPECS/
            spec_path = d + '/SPECS/' + spec_name
        else:
            # if user provide save_path then save spec in provided path
            spec_path = d + '/' + spec_name
        spec_dir = os.path.dirname(spec_path)
        if not os.path.exists(spec_dir):
            os.makedirs(spec_dir)
        logger.debug('Opening specfile: {0}.'.format(spec_path))

        if not utils.PY3:
            converted = converted.encode('utf-8')
        with open(spec_path, 'w') as f:
            f.write(converted)
            logger.info('Specfile saved at: {0}.'.format(spec_path))

        if srpm:
            msg = utils.build_srpm(spec_path, d)
            logger.info(msg)

    else:
        logger.debug('Printing specfile to stdout.')
        if utils.PY3:
            print(converted)
        else:
            print(converted.encode('utf-8'))
        logger.debug('Specfile printed.')
    logger.info("That's all folks!")
Beispiel #6
0
 def test_get_metadata_extractor(self, sf, expected):
     c = Convertor(package=sf)
     c.local_file = sf
     c.name = 'plumbum'
     assert isinstance(c.metadata_extractor, expected)
Beispiel #7
0
 def test_getter_bad_data(self, sf, expected):
     with pytest.raises(expected):
         c = Convertor(package=sf)
         c.getter
Beispiel #8
0
 def test_getter_good_data(self, sf, g):
     c = Convertor(package=sf)
     assert isinstance(c.getter, g)
 def test_bad_versions(self, self_bv, self_pv):
     c = Convertor(package='pkg', base_python_version=self_bv, python_versions=self_pv,
                   template='epel6.spec')
     data = PackageData('pkg.tar.gz', 'pkg', 'pkg', '0.1')
     with pytest.raises(SystemExit):
         c.merge_versions(data)
Beispiel #10
0
 def test_get_metadata_extractor(self, sf, expected):
     c = Convertor(package=sf)
     c.local_file = sf
     c.name = 'plumbum'
     assert isinstance(c.metadata_extractor, expected)
Beispiel #11
0
 def test_get_metadata_extractor(self, sf, n, mf, expected):
     c = Convertor(source_from = sf, name = n, metadata_from = mf)
     assert isinstance(c.get_metadata_extractor('spamfile'), expected)
Beispiel #12
0
 def test_getter_bad_data(self, sf, n, expected):
     with pytest.raises(expected):
         c = Convertor(source_from = sf, name = n)
         c.get_getter()
Beispiel #13
0
 def test_getter_good_data(self, sf, n, g):
     c = Convertor(source_from = sf, name = n)
     assert isinstance(c.get_getter(), g)
Beispiel #14
0
def main():
    parser = argparse.ArgumentParser(description = 'Convert PyPI package to RPM specfile.')
    parser.add_argument('-n',
                        required = False,
                        help = 'Name of the package on PyPI (ignored for local files).',
                        metavar = 'PYPI_NAME')
    parser.add_argument('-v',
                        required = False,
                        help = 'Version of the package to download (ignored for local files).',
                        metavar = 'VERSION')
    parser.add_argument('-m',
                        required = False,
                        help = 'Where to get metadata from ("pypi" or "local", default: "{0}").'.format(settings.DEFAULT_METADATA_SOURCE),
                        metavar = 'METADATA_SOURCE',
                        choices = ['pypi', 'local'],
                        default = settings.DEFAULT_METADATA_SOURCE)
    parser.add_argument('-s',
                        required = False,
                        help = 'Where to get package from ("pypi" or "/full/path/to/local/file", default: "{0}").'.format(settings.DEFAULT_PKG_SOURCE),
                        metavar = 'PACKAGE_SOURCE',
                        default = settings.DEFAULT_PKG_SOURCE)
    parser.add_argument('-d',
                        required = False,
                        help = 'Where to save the package file (default: "{0}")'.format(settings.DEFAULT_PKG_SAVE_PATH),
                        metavar = 'SAVE_DIR',
                        default = settings.DEFAULT_PKG_SAVE_PATH)
    parser.add_argument('-r',
                        required = False,
                        help = 'Name of rpm package (overrides calculated name)',
                        metavar = 'RPM_NAME',
                        default = None)
    parser.add_argument('-t',
                        required = False,
                        help = 'Template file (jinja2 format) to render (default: "{0}"). Search order is 1) filesystem, 2) default templates.'.format(settings.DEFAULT_TEMPLATE),
                        metavar = 'TEMPLATE') # no default, because we need to know, whether this was specified or not
    parser.add_argument('-o',
                        required = False,
                        help = 'Default distro whose conversion rules to use (default: "{0}"). Default templates have their rules associated and ignore this.'.format(settings.DEFAULT_DISTRO),
                        metavar = 'DISTRO',
                        default = settings.DEFAULT_DISTRO,
                        choices = settings.KNOWN_DISTROS)
    parser.add_argument('-b',
                        required = False,
                        help = 'Base Python version to package for (default: "{0}").'.format(settings.DEFAULT_PYTHON_VERSION),
                        metavar = 'BASE_PYTHON',
                        default = settings.DEFAULT_PYTHON_VERSION)
    parser.add_argument('-p',
                        required = False,
                        help = 'Additional Python versions to include in the specfile (e.g -p3 for %%{?with_python3}). Can be specified multiple times.',
                        metavar = 'PYTHON_VERSION',
                        default = [],
                        action = 'append')


    ns = parser.parse_args()
    if ns.__dict__['n'] == None and not os.path.exists(ns.__dict__['s']):
        parser.error('You must specify name of the package (-n) or full path (-s).')

    distro = ns.__dict__['o']
    if ns.__dict__['t'] in settings.KNOWN_DISTROS:
        distro = ns.__dict__['t']

    convertor = Convertor(name = ns.__dict__['n'],
                          version = ns.__dict__['v'],
                          metadata_from = ns.__dict__['m'],
                          source_from = ns.__dict__['s'],
                          save_dir = ns.__dict__['d'],
                          template = ns.__dict__['t'] or settings.DEFAULT_TEMPLATE,
                          distro = distro,
                          base_python_version = ns.__dict__['b'],
                          python_versions = ns.__dict__['p'],
                          rpm_name = ns.__dict__['r'])

    converted = convertor.convert()

    if isinstance(converted, str): # python 3
        print(converted)
    else: # python 2
        print(converted.encode(locale.getpreferredencoding()))