def check_changelog_list(versions_xml: str) -> List[LinterReport]: ''' Compare chages for Russian and English languages ''' reports = [] changelog = XmlChangelogParser.parse(versions_xml) for version in changelog.versions: changes_ru = version.changes.get('ru') changes_en = version.changes.get('') if not changes_ru: reports.append( LinterReport( LinterStatus.ERROR, 'Empty Russian changelog for version {}'.format( version.number))) continue if not changes_en: reports.append( LinterReport( LinterStatus.ERROR, 'Empty English changelog for version {}'.format( version.number))) continue if len(changes_ru) != len(changes_en): reports.append( LinterReport( LinterStatus.ERROR, 'Changelog for English and Russian versions are not equal for version {}' .format(version.number))) return reports
def check_changelog_content(versions_xml: str) -> List[LinterReport]: ''' Every item in change log list must ends with dot ''' reports = [] changelog = XmlChangelogParser.parse(versions_xml) for version in changelog.versions: changes_ru = version.changes.get('ru') changes_en = version.changes.get('') for item in changes_ru: if not item.description.endswith('.'): reports.append( LinterReport( LinterStatus.ERROR, 'Add the dot to change item for Russian changelog for version {}' .format(version.number))) for item in changes_en: if not item.description.endswith('.'): reports.append( LinterReport( LinterStatus.ERROR, 'Add the dot to change item for English changelog for version {}' .format(version.number))) return reports
def check_even_versions(versions_xml: str) -> List[LinterReport]: ''' Check that the date is set ''' reports = [] changelog = XmlChangelogParser.parse(versions_xml) for version in changelog.versions: try: build = int(version.number.split('.')[3]) except (ValueError, IndexError): reports.append( LinterReport( LinterStatus.ERROR, 'Invalid version format: {}'.format(version.number))) continue if build % 2 != 0: reports.append( LinterReport( LinterStatus.ERROR, 'Build number for version {} is odd (dev version)'.format( version.number))) return reports
def test_versions_changes_lang_default_ru(): text = '''<?xml version="1.1" encoding="UTF-8" ?> <versions> <version number="1.0"> <changes> <change>Fix bug</change> <change>Fix other bug</change> </changes> <changes lang="ru"> <change>Исправлена ошибка</change> <change>Исправлена другая ошибка</change> </changes> </version> </versions>''' result = XmlChangelogParser.parse(text) assert '' in result.versions[0].changes.get_languages() assert 'ru' in result.versions[0].changes.get_languages() assert result.versions[0].changes[''][0].description == 'Fix bug' assert result.versions[0].changes[''][1].description == 'Fix other bug' assert result.versions[0].changes['ru'][ 0].description == 'Исправлена ошибка' assert result.versions[0].changes['ru'][ 1].description == 'Исправлена другая ошибка'
def test_versions_empty_internal(): text = '''<?xml version="1.1" encoding="UTF-8" ?> <versions> <version></version> </versions>''' result = XmlChangelogParser.parse(text) assert result.versions == []
def test_versions_download_empty(): text = '''<?xml version="1.1" encoding="UTF-8" ?> <versions> <version number="1.0"> <download></download> </version> </versions>''' result = XmlChangelogParser.parse(text) assert result.versions[0].downloads == []
def check_versions_list(versions_xml: str) -> List[LinterReport]: ''' Check that the versions is not empty ''' reports = [] changelog = XmlChangelogParser.parse(versions_xml) if not changelog.versions: reports.append( LinterReport(LinterStatus.ERROR, 'No versions list for OutWiker')) return reports
def test_versions_changes_empty(): text = '''<?xml version="1.1" encoding="UTF-8" ?> <versions> <version number="1.0"> <changes></changes> </version> </versions>''' result = XmlChangelogParser.parse(text) assert len(result.versions) == 1 assert result.versions[0].changes.get_languages() == [''] assert result.versions[0].changes[''] == []
def test_versions_no_number(): text = '''<?xml version="1.1" encoding="UTF-8" ?> <versions> <version number="1.0" status="dev" date="29.08.2019"></version> <version status="beta" date="30.08.2019"></version> </versions>''' result = XmlChangelogParser.parse(text) assert len(result.versions) == 1 assert result.versions[0].number == '1.0' assert result.versions[0].status == 'dev' assert result.versions[0].date == datetime(2019, 8, 29) assert result.versions[0].changes.is_empty()
def check_release_date(versions_xml: str) -> List[LinterReport]: ''' Check that the date is set ''' reports = [] changelog = XmlChangelogParser.parse(versions_xml) for version in changelog.versions: if version.date is None: reports.append( LinterReport(LinterStatus.ERROR, 'No release date for OutWiker')) return reports
def test_versions_download_requirements(): text = '''<?xml version="1.1" encoding="UTF-8" ?> <versions> <version number="1.0"> <download href="http://example.com/application.zip"> <requirements> </requirements> </download> </version> </versions>''' result = XmlChangelogParser.parse(text) assert not result.versions[0].downloads[0].requirements.os_list assert not result.versions[0].downloads[0].requirements.api_list
def test_versions_changes_lang_en(): text = '''<?xml version="1.1" encoding="UTF-8" ?> <versions> <version number="1.0"> <changes lang="en"> <change>Fix bug</change> <change>Fix other bug</change> </changes> </version> </versions>''' result = XmlChangelogParser.parse(text) assert 'en' in result.versions[0].changes.get_languages() assert result.versions[0].changes['en'][0].description == 'Fix bug' assert result.versions[0].changes['en'][1].description == 'Fix other bug'
def check_https_protocol(versions_xml: str) -> List[LinterReport]: ''' Check version numbers for uniqueness. ''' reports = [] changelog = XmlChangelogParser.parse(versions_xml) for version in changelog.versions: for download in version.downloads: if not download.href.startswith('https://'): reports.append( LinterReport( LinterStatus.ERROR, 'Invalid HREF protocol: {}'.format(download.href))) return reports
def check_version_numbers(versions_xml: str) -> List[LinterReport]: ''' Check version numbers for uniqueness. ''' reports = [] versions = set() changelog = XmlChangelogParser.parse(versions_xml) for version in changelog.versions: if version.number in versions: reports.append( LinterReport(LinterStatus.ERROR, 'Not a unique version: {}'.format( version.number))) versions.add(version.number) return reports
def test_versions_download_requirements_os_api(): text = '''<?xml version="1.1" encoding="UTF-8" ?> <versions> <version number="1.0"> <download href="http://example.com/application.zip"> <requirements> <os>Windows</os> <os>Linux</os> <api>3.666</api> <api>3.667</api> </requirements> </download> </version> </versions>''' result = XmlChangelogParser.parse(text) assert 'Windows' in result.versions[0].downloads[0].requirements.os_list assert 'Linux' in result.versions[0].downloads[0].requirements.os_list assert (3, 666) in result.versions[0].downloads[0].requirements.api_list assert (3, 667) in result.versions[0].downloads[0].requirements.api_list
def check_download_plugin_url(versions_xml: str) -> List[LinterReport]: ''' Check version number in URL for download ''' reports = [] archive_extension = '.zip' changelog = XmlChangelogParser.parse(versions_xml) for version in changelog.versions: if not version.downloads: reports.append( LinterReport( LinterStatus.ERROR, 'Empty download list for version {}'.format( version.number))) continue for download in version.downloads: if not download.href.endswith(archive_extension): reports.append( LinterReport( LinterStatus.ERROR, 'Invalid archive format for version {}: {}'.format( version.number, download.href))) continue if not download.href[:-len(archive_extension)].endswith( version.number): reports.append( LinterReport( LinterStatus.ERROR, 'Invalid file name for version {}: {}'.format( version.number, download.href))) continue return reports