def test_license_exact_identification(tmpdir): wtfpl = '''\ DO WHAT THE F**K YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar <*****@*****.**> Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE F**K YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE F**K YOU WANT TO. ''' f = tmpdir.join('LICENSE') f.write(wtfpl) assert identify.license_id(f.strpath) == 'WTFPL'
def test_license_not_identified(): assert identify.license_id(os.devnull) is None
def test_license_identification(): assert identify.license_id('LICENSE') == 'MIT'
def format_file( filename: str, *, min_py3_version: Tuple[int, int], max_py_version: Tuple[int, int], ) -> bool: with open(filename) as f: contents = f.read() cfg = configparser.ConfigParser() cfg.read_string(contents) _clean_sections(cfg) # normalize names to underscores so sdist / wheel have the same prefix cfg['metadata']['name'] = cfg['metadata']['name'].replace('-', '_') # if README.md exists, set `long_description` + content type readme = _first_file(filename, 'readme') if readme is not None: long_description = f'file: {os.path.basename(readme)}' cfg['metadata']['long_description'] = long_description tags = identify.tags_from_filename(readme) if 'markdown' in tags: cfg['metadata']['long_description_content_type'] = 'text/markdown' elif 'rst' in tags: cfg['metadata']['long_description_content_type'] = 'text/x-rst' else: cfg['metadata']['long_description_content_type'] = 'text/plain' # set license fields if a license exists license_filename = _first_file(filename, 'licen[sc]e') if license_filename is not None: cfg['metadata']['license_file'] = os.path.basename(license_filename) license_id = identify.license_id(license_filename) if license_id is not None: cfg['metadata']['license'] = license_id if license_id in LICENSE_TO_CLASSIFIER: cfg['metadata']['classifiers'] = ( cfg['metadata'].get('classifiers', '').rstrip() + f'\n{LICENSE_TO_CLASSIFIER[license_id]}') requires = _python_requires(filename, min_py3_version=min_py3_version) if requires is not None: if not cfg.has_section('options'): cfg.add_section('options') cfg['options']['python_requires'] = requires install_requires = _requires(cfg, 'install_requires') if install_requires: cfg['options']['install_requires'] = '\n'.join(install_requires) setup_requires = _requires(cfg, 'setup_requires') if setup_requires: cfg['options']['setup_requires'] = '\n'.join(setup_requires) if cfg.has_section('options.extras_require'): for key in cfg['options.extras_require']: group_requires = _requires(cfg, key, 'options.extras_require') cfg['options.extras_require'][key] = '\n'.join(group_requires) py_classifiers = _py_classifiers(requires, max_py_version=max_py_version) if py_classifiers: cfg['metadata']['classifiers'] = ( cfg['metadata'].get('classifiers', '').rstrip() + f'\n{py_classifiers}') imp_classifiers = _imp_classifiers(filename) if imp_classifiers: cfg['metadata']['classifiers'] = ( cfg['metadata'].get('classifiers', '').rstrip() + f'\n{imp_classifiers}') # sort the classifiers if present if 'classifiers' in cfg['metadata']: classifiers = sorted(set(cfg['metadata']['classifiers'].split('\n'))) classifiers = _trim_py_classifiers( classifiers, requires, max_py_version=max_py_version, ) cfg['metadata']['classifiers'] = '\n'.join(classifiers) sections: Dict[str, Dict[str, str]] = {} for section, key_order in KEYS_ORDER: if section not in cfg: continue entries = {k.replace('-', '_'): v for k, v in cfg[section].items()} new_section = {k: entries.pop(k) for k in key_order if k in entries} # sort any remaining keys new_section.update(sorted(entries.items())) sections[section] = new_section cfg.pop(section) for section in cfg.sections(): sections[section] = dict(cfg[section]) cfg.pop(section) for k, v in sections.items(): cfg[k] = v sio = io.StringIO() cfg.write(sio) new_contents = sio.getvalue().strip() + '\n' new_contents = new_contents.replace('\t', ' ') new_contents = new_contents.replace(' \n', '\n') if new_contents != contents: with open(filename, 'w') as f: f.write(new_contents) return new_contents != contents