def test_good_changelog_yaml_files(yaml_filename):
    paths = PathsConfig.force_collection(base_dir='/')
    config = ChangelogConfig.default(paths, CollectionDetails(paths))
    data = load_yaml(yaml_filename)
    result = sanitize_changes(data, config)
    if 'ancestor' not in data and result['ancestor'] is None:
        result.pop('ancestor')
    assert result == data
Esempio n. 2
0
 def __init__(self, base_path: pathlib.Path, namespace: str, collection: str):
     collection_path = base_path / 'ansible_collections' / namespace / collection
     collection_path.mkdir(parents=True, exist_ok=True)
     super().__init__(base_path,
                      PathsConfig.force_collection(base_dir=str(collection_path)))
     self.namespace = namespace
     self.collection = collection
     self.collection_name = '{0}.{1}'.format(namespace, collection)
Esempio n. 3
0
 def collection(cls, collection_name: str, version: str,
                changelog_data: t.Optional[t.Any] = None) -> 'ChangelogData':
     paths = PathsConfig.force_collection('')
     collection_details = CollectionDetails(paths)
     collection_details.namespace, collection_details.name = collection_name.split('.', 1)
     collection_details.version = version
     collection_details.flatmap = False  # TODO!
     config = ChangelogConfig.default(paths, collection_details)
     return cls(paths,
                config,
                ChangesData(config, '', changelog_data),
                flatmap=True)  # TODO!
def test_bad_changelog_yaml_files(yaml_filename, json_filename):
    paths = PathsConfig.force_collection(base_dir='/')
    config = ChangelogConfig.default(paths, CollectionDetails(paths))
    try:
        data = load_yaml(yaml_filename)
        if not STORE_RESULT:
            sanitized_data = load_yaml(yaml_filename + '-sanitized')
    except Exception:
        # We are only interested in parsable YAML
        return
    result = sanitize_changes(data, config)
    if STORE_RESULT:
        store_yaml(yaml_filename + '-sanitized', result)
    else:
        assert result == sanitized_data
Esempio n. 5
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'
Esempio n. 7
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)
Esempio n. 8
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