File: test_types.py

package info (click to toggle)
python-git 3.1.45-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,772 kB
  • sloc: python: 18,642; sh: 186; makefile: 78
file content (69 lines) | stat: -rw-r--r-- 2,350 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# This module is part of GitPython and is released under the
# 3-Clause BSD License: https://opensource.org/license/bsd-3-clause/

"""Tests for dynamic and static characteristics of git.types module attributes."""

import sys

if sys.version_info >= (3, 8):
    from typing import Literal
else:
    from typing_extensions import Literal

import pytest

import git.types


def test_cannot_access_undefined() -> None:
    """Accessing a bogus attribute in git.types remains a dynamic and static error."""
    with pytest.raises(AttributeError):
        git.types.foo  # type: ignore[attr-defined]


def test_can_access_lit_commit_ish_but_it_is_not_usable() -> None:
    """Lit_commit_ish_can be accessed, but warns and is an invalid type annotation."""
    # It would be fine to test attribute access rather than a "from" import. But a
    # "from" import is more likely to appear in actual usage, so it is used here.
    with pytest.deprecated_call() as ctx:
        from git.types import Lit_commit_ish

    # As noted in test_toplevel.test_util_alias_import, there may be multiple warnings,
    # but all with the same message.
    (message,) = {str(entry.message) for entry in ctx}
    assert "Lit_commit_ish is deprecated." in message
    assert 'Literal["commit", "tag", "blob", "tree"]' in message, "Has old definition."
    assert 'Literal["commit", "tag"]' in message, "Has new definition."
    assert "GitObjectTypeString" in message, "Has new type name for old definition."

    _: Lit_commit_ish = "commit"  # type: ignore[valid-type]

    # It should be as documented (even though deliberately unusable in static checks).
    assert Lit_commit_ish == Literal["commit", "tag"]


def test_dir() -> None:
    """dir() on git.types includes public names, even ``Lit_commit_ish``.

    It also contains private names that we don't test. See test_compat.test_dir.
    """
    expected_subset = {
        "PathLike",
        "TBD",
        "AnyGitObject",
        "Tree_ish",
        "Commit_ish",
        "GitObjectTypeString",
        "Lit_commit_ish",
        "Lit_config_levels",
        "ConfigLevels_Tup",
        "CallableProgress",
        "assert_never",
        "Files_TD",
        "Total_TD",
        "HSH_TD",
        "Has_Repo",
        "Has_id_attribute",
    }
    actual = set(dir(git.types))
    assert expected_subset <= actual