def test_next_best_specitemmask_with_range_1():
    """Mixing semver range operators and next_best matching is not allowed"""
    mask = '-^1.0.0'
    versions = [
        '1.0.0',
    ]
    with pytest.raises(ValueError):
        VersionFilter.semver_filter(mask, versions)
def test_next_best_example():
    versions = ['1.0.0', '2.0.0', '3.0.1']
    current_version = '2.0.0'
    assert VersionFilter.semver_filter('Y.0.0', versions,
                                       current_version) == []
    # but with next_best ...
    assert VersionFilter.semver_filter('-Y.0.0', versions,
                                       current_version) == ['3.0.1']
def test_semver_caret_with_locks():
    mask = '^L.L.L'
    versions = ['0.3.0', '0.3.1', '0.4.0', '1.0.0', '1.3.0']
    current_version = '0.3.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (1 == len(subset))
    assert ('0.3.1' in subset)
def test_eq_and_eq_prefix_on_current_version():
    mask = 'L.L.Y'
    versions = ['0.9.5', '0.9.6', '1.0.0']
    current_version = '==0.9.5'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (1 == len(subset))
    assert ('0.9.6' in subset)
def test_v_prefix_on_versions():
    mask = 'L.L.Y'
    versions = ['v0.9.5', 'v0.9.6', 'v1.0.0']
    current_version = '0.9.5'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (1 == len(subset))
    assert ('v0.9.6' in subset)
def test_major_updates_only_2():
    mask = 'Y.0.0'  # tell me major version changes only once per major version
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', '2.0.1', '2.0.2'
    ]
    current_version = '1.9.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (0 == len(subset))
def test_readme_example_regex():
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', 'nightly'
    ]

    subset = VersionFilter.regex_filter(r'^night', versions)
    assert (1 == len(subset))
    assert ('nightly' in subset)
def test_partial_versions_5():
    mask = 'L.Y.Y'
    versions = ['1.8', '1.8.1', '1.8.2', '1.9', '1.9.1', '1.10', 'nightly']
    current_version = '1.8'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (5 == len(subset))
    assert ('1.8' not in subset)
    assert ('nightly' not in subset)
def test_next_best_specitemmask_matching_versions_literal3():
    mask = '-1.0.0'
    versions = [
        '1.0.0',
        '2.0.1',
    ]
    subset = VersionFilter.semver_filter(mask, versions)
    assert (0 == len(subset))
def test_prerelease_6():
    mask = 'Y.Y.Y-Y'
    versions = [
        '0.9.5', '1.0.0-alpha.e2', '1.0.0-alpha.12', '1.0.0-alpha.58', '0.9.6',
        '1.0.0'
    ]
    subset = VersionFilter.semver_filter(mask, versions)
    assert (6 == len(subset))
def test_in_next_major():
    mask = 'L1.Y.Y'
    versions = ['1.0.0', '1.0.1', '1.1.0', '1.2.0', '2.0.0', '2.0.1', '3.0.0']
    current_version = '1.0.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (2 == len(subset))
    assert ('2.0.0' in subset)
    assert ('2.0.1' in subset)
def test_all_updates_1():
    mask = 'Y.Y.Y'  # Give me every patch, minor and major update
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', '2.0.0', '2.0.1'
    ]
    current_version = '1.8.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (7 == len(subset))
    assert ('1.8.0' not in subset)
def test_validate_only():
    invalid_masks = [
        'L1.Y.Y', '1.0.0', '1.0.0', '1.0', '1', 'L', 'L.Y', 'L.Y.Y', 'L.Y.Y',
        'Y.0.0', 'Y.0.0', 'Y.Y.0', 'L.Y.0', 'Y.Y.Y', '2.0.0', 'Y.Y.Y', '1.8.Y',
        '1.8.Y || 1.10.Y', 'Y.Y.0 || L.L.Y', '>1.8.0 && <2.0.0', 'L.Y.Y',
        'L.Y.Y-Y', 'L.Y.Y-Y', 'L.Y.Y', 'Y.Y.Y', 'Y.Y.Y-Y', 'L.L.Y-alpine',
        'L.L.Y-alpine3.6', 'L.L.Y-L', 'L.L.Y-L', 'L.L.Y', 'L.L.Y', 'L.L.Y',
        'L.L.Y', 'L.L.Y', '^1.0.0', '^L.L.L', '^L.L.L', '-1.0.0', '-1.0.0',
        '-1.0.0', '-L.0.0', '-L.0.0', '-L.0.0', '-Y.0.0', '-Y.0.0', '-Y.0.0',
        '-Y.0.0', '-Y.Y.0', '-Y.0.0', '>=L1.0.0', 'L1.Y.Y', 'L.L.L-L'
    ]

    for m in invalid_masks:
        assert (VersionFilter.semver_validate(m) is True)

    invalid_masks = ['-^1.1.1', 'a', '?.?.?', '', 'YY.0.0', 'LL.0.0']
    for m in invalid_masks:
        assert (VersionFilter.semver_validate(m) is False)
def test_semver_filter_sorted_return():
    mask = 'Y.Y.Y'
    versions = ['0.9.6', '1.0.0', '0.9.5']
    current_version = None
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (3 == len(subset))
    assert ('0.9.5' == subset[0])
    assert ('0.9.6' == subset[1])
    assert ('1.0.0' == subset[2])
def test_explicit_major_updates_only_1():
    mask = '2.0.0'
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', '2.0.0', '2.0.1'
    ]
    current_version = '1.9.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (1 == len(subset))
    assert ('2.0.0' in subset)
def test_next_best_specitemmask_matching_versions_lock3():
    mask = '-L.0.0'
    versions = [
        '1.0.0',
        '2.0.1',
    ]
    current_version = '1.0.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (0 == len(subset))
def test_python_filter():
    mask = 'Y.Y.Y'
    versions = [
        '0.1.0', '1.1.0', '1.2.1.dev0', '1.2.dev0', '1.2.post0', '1.2.0a1'
    ]
    subset = VersionFilter.semver_filter(mask, versions)
    assert (2 == len(subset))
    assert ('0.1.0' in subset)
    assert ('1.1.0' in subset)
def test_caret():
    mask = '^1.0.0'
    versions = [
        '1.0.0', '1.0.1', '1.1.0', '1.2.0-alpha', '2.0.0', '2.0.0-beta'
    ]
    current_version = '1.0.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (2 == len(subset))
    assert ('1.0.1' in subset)
    assert ('1.1.0' in subset)
def test_django_config_example_1():
    mask = '1.8.Y'
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', '2.0.0', '2.0.1'
    ]
    subset = VersionFilter.semver_filter(mask, versions)
    assert (3 == len(subset))
    assert ('1.8.0' in subset)
    assert ('1.8.1' in subset)
    assert ('1.8.2' in subset)
def test_prerelease_4():
    mask = 'L.Y.Y'
    versions = [
        '0.9.5', '1.0.0-alpha.e2', '1.0.0-alpha.12', '1.0.0-alpha.58', '0.9.6',
        '1.0.0'
    ]
    current_version = '0.9.5'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (1 == len(subset))
    assert ('0.9.6' in subset)
def test_prerelease_lock_2():
    mask = 'L.L.Y-L'
    versions = [
        '3.6', '3.6-alpine', '3.6-alpine3.6', '3.6-onbuild', '3.6.1',
        '3.6.1-alpine', '3.6.1-alpine3.6', '3.6.1-onbuild'
    ]
    current_version = '3.6-alpine3.6'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (1 == len(subset))
    assert ('3.6.1-alpine3.6' in subset)
def test_minor_updates_2():
    mask = 'L.Y.0'  # give me minor version changes only for my current major version, exclude all patch updates
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', '2.0.0', '2.0.1'
    ]
    current_version = '1.8.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (2 == len(subset))
    assert ('1.9.0' in subset)
    assert ('1.10.0' in subset)
def test_minor_updates_1():
    mask = 'Y.Y.0'  # tell me minor version changes only once per minor version, exclude all patch updates
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', '2.0.0', '2.0.1'
    ]
    current_version = '1.8.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (3 == len(subset))
    assert ('1.9.0' in subset)
    assert ('1.10.0' in subset)
    assert ('2.0.0' in subset)
def test_readme_example_semver():
    mask = 'L.Y.Y'
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', 'nightly'
    ]
    current_version = '1.9.0'

    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (2 == len(subset))
    assert ('1.9.1' in subset)
    assert ('1.10.0' in subset)
def test_modifier_example_1():
    mask = '>1.8.0 && <2.0.0'  # all releases between 1.8.0 and 2.0.0
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', '2.0.0', '2.0.1'
    ]
    current_version = '1.8.1'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (4 == len(subset))
    assert ('1.8.2' in subset)
    assert ('1.9.0' in subset)
    assert ('1.9.1' in subset)
    assert ('1.10.0' in subset)
def test_django_current_example_1():
    mask = 'Y.Y.0 || L.L.Y'  # new major and minors, patches to my minor
    versions = [
        '1.8.0', '1.8.1', '1.8.2', '1.9.0', '1.9.1', '1.10.0', '2.0.0', '2.0.1'
    ]
    current_version = '1.8.1'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (4 == len(subset))
    assert ('1.8.2' in subset)
    assert ('1.9.0' in subset)
    assert ('1.10.0' in subset)
    assert ('2.0.0' in subset)
def test_next_best_specitemmask_matching_versions_yes6():
    mask = '-Y.0.0'
    versions = [
        '1.0.0',
        '1.1.0',
        '1.1.1',
        '1.2.1',
        '2.0.1',
    ]
    current_version = '1.2.1'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (1 == len(subset))
    assert ('2.0.1' in subset)
def test_next_best_specitemmask_matching_versions_yes1():
    mask = '-Y.0.0'
    versions = [
        '1.0.1',
        '2.0.1',
    ]
    current_version = '1.0.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (2 == len(subset))
    assert (
        '1.0.1' in subset
    )  # how could the 1.0.0 current version exists if this is the first version in list
    assert ('2.0.1' in subset)
def test_next_best_specitemmask_matching_versions_yes2():
    mask = '-Y.0.0'
    versions = [
        '1.1.0',
        '1.2.0',
        '1.3.0',
        '2.0.1',
        '3.1.2',
    ]
    current_version = '1.0.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (3 == len(subset))
    assert (
        '1.1.0' in subset
    )  # Surprising, but it's only here because 1.0.0 (current_version) is not in the list
    assert ('2.0.1' in subset)
    assert ('3.1.2' in subset)
def test_caret_babel_cli_example():
    mask = '^L.L.L'
    versions = [
        '6.24.0',
        '7.0.0-alpha.3',
        '7.0.0-alpha.4',
        '7.0.0-alpha.6',
        '7.0.0-alpha.7',
        '6.24.1',
        '7.0.0-alpha.8',
        '7.0.0-alpha.9',
        '7.0.0-alpha.10',
        '7.0.0-alpha.11',
        '7.0.0-alpha.12',
        '7.0.0-alpha.14',
    ]
    current_version = '6.24.0'
    subset = VersionFilter.semver_filter(mask, versions, current_version)
    assert (1 == len(subset))
    assert ('6.24.1' in subset)