示例#1
0
    def ansible(cls, directory: t.Optional[str],
                output_directory: t.Optional[str] = None) -> 'ChangelogData':
        paths = PathsConfig.force_ansible('')

        config = ChangelogConfig.default(paths, CollectionDetails(paths), 'Ansible')
        # TODO: adjust the following lines once Ansible switches to semantic versioning
        config.use_semantic_versioning = False
        config.release_tag_re = r'''(v(?:[\d.ab\-]|rc)+)'''
        config.pre_release_tag_re = r'''(?P<pre_release>(?:[ab]|rc)+\d*)$'''

        changelog_path = ''
        if directory is not None:
            changelog_path = os.path.join(directory, 'changelog.yaml')
        changes = ChangesData(config, changelog_path)
        if output_directory is not None:
            changes.path = os.path.join(output_directory, 'changelog.yaml')
        return cls(paths, config, changes, flatmap=True)
def test_fragments_filename_ignore(tmp_path):
    '''Ensure we don't load files we mean to ignore'''
    paths = PathsConfig.force_ansible(str(tmp_path))
    config = ChangelogConfig.default(paths, CollectionDetails(paths))
    test_filenames = [
        '.test.yaml', 'test.yaml~', 'test.yml~', 'test', 'valid.yml',
        'valid.yaml'
    ]

    for fn in test_filenames:
        p = tmp_path / fn
        p.write_text('minor_changes: ["foo"]')

    loaded = load_fragments(paths, config, [], None, tmp_path)
    assert sorted([x.name for x in loaded]) == ['valid.yaml', 'valid.yml']

    config.ignore_other_fragment_extensions = False
    loaded = load_fragments(paths, config, [], None, tmp_path)
    assert sorted([x.name for x in loaded]) == [
        'test', 'test.yaml~', 'test.yml~', 'valid.yaml', 'valid.yml'
    ]
示例#3
0
def test_config_store_collection(collection_config_path):
    collection_config_path.write_text('')
    paths = PathsConfig.detect()
    collection_details = CollectionDetails(paths)

    config = ChangelogConfig.default(paths, collection_details)
    assert config.flatmap is None

    config.store()
    config = ChangelogConfig.load(paths, collection_details)
    assert config.flatmap is None

    config.always_refresh = 'full'
    config.flatmap = True
    config.store()
    config = ChangelogConfig.load(paths, collection_details)
    assert config.always_refresh == 'full'
    assert config.flatmap is True

    config.always_refresh = True
    config.store()
    config = ChangelogConfig.load(paths, collection_details)
    assert config.always_refresh == 'full'
    assert config.flatmap is True

    config.always_refresh = 'none'
    config.flatmap = False
    config.store()
    config = ChangelogConfig.load(paths, collection_details)
    assert config.always_refresh == 'none'
    assert config.flatmap is False

    config.always_refresh = False
    config.store()
    config = ChangelogConfig.load(paths, collection_details)
    assert config.always_refresh == 'none'
    assert config.flatmap is False
示例#4
0
 def set_config_raw(self, config: bytes):
     self.mkdir(self.paths.changelog_dir)
     self._write(self.paths.config_path, config)
     self.config = ChangelogConfig.load(self.paths,
                                        CollectionDetails(self.paths))
示例#5
0
def test_config_loading_bad_changes_format(collection_config_path):
    collection_config_path.write_text('changes_format: other')
    paths = PathsConfig.detect()
    collection_details = CollectionDetails(paths)
    with pytest.raises(ChangelogError):
        ChangelogConfig.load(paths, collection_details)
示例#6
0
def test_collection_details(tmp_path):
    paths = PathsConfig.force_ansible(str(tmp_path))
    details = CollectionDetails(paths)
    with pytest.raises(Exception) as exc:
        details.get_namespace()
    assert str(
        exc.value
    ) == 'Internal error: cannot get collection details for non-collection'
    with pytest.raises(Exception) as exc:
        details.get_name()
    assert str(
        exc.value
    ) == 'Internal error: cannot get collection details for non-collection'
    with pytest.raises(Exception) as exc:
        details.get_version()
    assert str(
        exc.value
    ) == 'Internal error: cannot get collection details for non-collection'
    with pytest.raises(Exception) as exc:
        details.get_flatmap()
    assert str(
        exc.value
    ) == 'Internal error: cannot get collection details for non-collection'

    paths = PathsConfig.force_collection(str(tmp_path))
    details = CollectionDetails(paths)
    with pytest.raises(ChangelogError) as exc:
        details.get_namespace()
    assert 'Cannot find galaxy.yml' in str(exc.value)
    with pytest.raises(ChangelogError) as exc:
        details.get_name()
    assert 'Cannot find galaxy.yml' in str(exc.value)
    with pytest.raises(ChangelogError) as exc:
        details.get_version()
    assert 'Cannot find galaxy.yml' in str(exc.value)
    with pytest.raises(ChangelogError) as exc:
        details.get_flatmap()
    assert 'Cannot find galaxy.yml' in str(exc.value)

    galaxy_path = tmp_path / 'galaxy.yml'
    galaxy_path.write_text('---\na: b\n')
    paths = PathsConfig.force_collection(str(tmp_path))
    details = CollectionDetails(paths)
    with pytest.raises(ChangelogError) as exc:
        details.get_namespace()
    assert 'Cannot find "namespace" field in galaxy.yaml' in str(exc.value)
    with pytest.raises(ChangelogError) as exc:
        details.get_name()
    assert 'Cannot find "name" field in galaxy.yaml' in str(exc.value)
    with pytest.raises(ChangelogError) as exc:
        details.get_version()
    assert 'Cannot find "version" field in galaxy.yaml' in str(exc.value)
    assert details.get_flatmap() is None

    galaxy_path = tmp_path / 'galaxy.yml'
    galaxy_path.write_text('---\nnamespace: 1\nname: 2\nversion: 3\ntype: 4')
    paths = PathsConfig.force_collection(str(tmp_path))
    details = CollectionDetails(paths)
    with pytest.raises(ChangelogError) as exc:
        details.get_namespace()
    assert 'Cannot find "namespace" field in galaxy.yaml' in str(exc.value)
    with pytest.raises(ChangelogError) as exc:
        details.get_name()
    assert 'Cannot find "name" field in galaxy.yaml' in str(exc.value)
    with pytest.raises(ChangelogError) as exc:
        details.get_version()
    assert 'Cannot find "version" field in galaxy.yaml' in str(exc.value)
    assert details.get_flatmap() is False

    galaxy_path = tmp_path / 'galaxy.yml'
    galaxy_path.write_text(
        '---\nnamespace: a\nname: b\nversion: c\ntype: flatmap')
    paths = PathsConfig.force_collection(str(tmp_path))
    details = CollectionDetails(paths)
    assert details.get_namespace() == 'a'
    assert details.get_name() == 'b'
    assert details.get_version() == 'c'
    assert details.get_flatmap() is True

    galaxy_path = tmp_path / 'galaxy.yml'
    galaxy_path.write_text('---\ntype: other')
    paths = PathsConfig.force_collection(str(tmp_path))
    details = CollectionDetails(paths)
    assert details.get_flatmap() is False

    galaxy_path = tmp_path / 'galaxy.yml'
    galaxy_path.write_text(
        '---\nnamespace: a\nname: b\nversion: c\ntype: flatmap')
    paths = PathsConfig.force_collection(str(tmp_path))
    details = CollectionDetails(paths)
    details.namespace = 'test'
    details.name = 'asdf'
    details.version = '1.0.0'
    details.flatmap = False
    assert details.get_namespace() == 'test'
    assert details.get_name() == 'asdf'
    assert details.get_version() == '1.0.0'
    assert details.get_flatmap() is False
def test_changes_data():
    paths = PathsConfig.force_collection('/')
    details = CollectionDetails(paths)
    config = ChangelogConfig.default(paths, details)

    data = {
        'ancestor': None,
        'releases': {},
    }

    changes = ChangesData(config,
                          os.path.join(config.paths.changelog_dir,
                                       config.changes_file),
                          data_override=data)
    changes.ancestor = '0.1.0'

    assert not changes.has_release
    assert sorted(changes.releases.keys()) == []

    changes.add_release('1.1.0', None, datetime.date(2020, 2, 1))

    assert changes.has_release
    assert sorted(changes.releases.keys()) == ['1.1.0']
    assert changes.latest_version == '1.1.0'

    changes.add_release('1.0.0', None, datetime.date(2020, 1, 1))

    assert changes.has_release
    assert sorted(changes.releases.keys()) == ['1.0.0', '1.1.0']
    assert changes.latest_version == '1.1.0'

    changes.add_release('1.2.0', None, datetime.date(2020, 3, 1))

    assert changes.has_release
    assert sorted(changes.releases.keys()) == ['1.0.0', '1.1.0', '1.2.0']
    assert changes.latest_version == '1.2.0'

    changes.add_release('1.2.1', None, datetime.date(2020, 3, 2))
    changes.add_release('1.3.0-alpha', None, datetime.date(2020, 3, 3))
    changes.add_release('1.3.0-beta', None, datetime.date(2020, 3, 4))
    changes.add_release('1.3.0', None, datetime.date(2020, 3, 5))
    changes.add_release('1.3.1-alpha', None, datetime.date(2020, 3, 6))

    assert sorted(changes.releases.keys()) == [
        '1.0.0',
        '1.1.0',
        '1.2.0',
        '1.2.1',
        '1.3.0',
        '1.3.0-alpha',
        '1.3.0-beta',
        '1.3.1-alpha',
    ]

    changes2 = ChangesData(config,
                           os.path.join(config.paths.changelog_dir,
                                        config.changes_file),
                           data_override=ChangesBase.empty())
    changes2.ancestor = '1.3.1-alpha'
    changes2.add_release('1.3.2', None, datetime.date(2020, 3, 10))
    changes2.add_release('1.3.3', None, datetime.date(2020, 3, 10))
    assert sorted(changes2.releases.keys()) == [
        '1.3.2',
        '1.3.3',
    ]

    changes3 = ChangesData(config,
                           os.path.join(config.paths.changelog_dir,
                                        config.changes_file),
                           data_override=ChangesBase.empty())
    changes3.add_release('0.1.0', None, datetime.date(2019, 7, 30))
    changes3.add_release('0.2.0', None, datetime.date(2019, 12, 31))
    assert sorted(changes3.releases.keys()) == [
        '0.1.0',
        '0.2.0',
    ]

    for order in [
        [changes, changes2],
        [changes2, changes],
    ]:
        changes_concat = ChangesData.concatenate(order)
        assert sorted(changes_concat.releases.keys()) == [
            '1.0.0',
            '1.1.0',
            '1.2.0',
            '1.2.1',
            '1.3.0',
            '1.3.0-alpha',
            '1.3.0-beta',
            '1.3.1-alpha',
            '1.3.2',
            '1.3.3',
        ]
        assert changes_concat.ancestor == '0.1.0'

    for order in [
        [changes, changes2, changes3],
        [changes, changes3, changes2],
        [changes2, changes, changes3],
        [changes2, changes3, changes],
        [changes3, changes, changes2],
        [changes3, changes2, changes],
    ]:
        changes_concat = ChangesData.concatenate(order)
        assert sorted(changes_concat.releases.keys()) == [
            '0.1.0',
            '0.2.0',
            '1.0.0',
            '1.1.0',
            '1.2.0',
            '1.2.1',
            '1.3.0',
            '1.3.0-alpha',
            '1.3.0-beta',
            '1.3.1-alpha',
            '1.3.2',
            '1.3.3',
        ]
        assert changes_concat.ancestor is None

    changes_concat.ancestor = '0.0.1'

    changes_concat.prune_versions(versions_after='0.1.0', versions_until=None)
    assert sorted(changes_concat.releases.keys()) == [
        '0.2.0',
        '1.0.0',
        '1.1.0',
        '1.2.0',
        '1.2.1',
        '1.3.0',
        '1.3.0-alpha',
        '1.3.0-beta',
        '1.3.1-alpha',
        '1.3.2',
        '1.3.3',
    ]
    assert changes_concat.ancestor == '0.1.0'

    changes_concat.prune_versions(versions_after=None, versions_until='1.3.2')
    assert sorted(changes_concat.releases.keys()) == [
        '0.2.0',
        '1.0.0',
        '1.1.0',
        '1.2.0',
        '1.2.1',
        '1.3.0',
        '1.3.0-alpha',
        '1.3.0-beta',
        '1.3.1-alpha',
        '1.3.2',
    ]
    assert changes_concat.ancestor == '0.1.0'

    changes_concat.prune_versions(versions_after='1.1.0',
                                  versions_until='1.3.0')
    assert sorted(changes_concat.releases.keys()) == [
        '1.2.0',
        '1.2.1',
        '1.3.0',
        '1.3.0-alpha',
        '1.3.0-beta',
    ]
    assert changes_concat.ancestor == '1.1.0'
示例#8
0
 def ansible_base(cls, changelog_data: t.Optional[t.Any] = None) -> 'ChangelogData':
     paths = PathsConfig.force_ansible('')
     collection_details = CollectionDetails(paths)
     config = ChangelogConfig.default(paths, collection_details)
     return cls(paths, config, ChangesData(config, '', changelog_data), flatmap=False)
示例#9
0
def test_is_release_version_collection_fail(version):
    paths = PathsConfig.force_collection('.')
    config = ChangelogConfig.default(paths, CollectionDetails(paths))
    with pytest.raises(ChangelogError):
        is_release_version(config, version)
示例#10
0
def test_is_release_version_collection(version, is_release):
    paths = PathsConfig.force_collection('.')
    config = ChangelogConfig.default(paths, CollectionDetails(paths))
    assert is_release_version(config, version) == is_release
示例#11
0
def test_is_release_version_ansible(version, is_release):
    paths = PathsConfig.force_ansible('.')
    config = ChangelogConfig.default(paths, CollectionDetails(paths))
    config.release_tag_re = r'(v(?:[\d.ab\-]|rc)+)'
    config.pre_release_tag_re = r'(?P<pre_release>(?:[ab]|rc)+\d*)$'
    assert is_release_version(config, version) == is_release