2021-08-01 21:47:39 -07:00
|
|
|
from click.testing import CliRunner
|
|
|
|
|
from sqlite_utils import cli, recipes
|
2020-05-02 21:13:49 -07:00
|
|
|
from pathlib import Path
|
|
|
|
|
import pytest
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
docs_path = Path(__file__).parent.parent / "docs"
|
2023-05-21 11:41:56 -07:00
|
|
|
commands_re = re.compile(r"(?:\$ | )sqlite-utils (\S+)")
|
2021-08-01 21:47:39 -07:00
|
|
|
recipes_re = re.compile(r"r\.(\w+)\(")
|
2020-05-02 21:13:49 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
|
|
|
def documented_commands():
|
2023-07-22 12:04:31 -07:00
|
|
|
rst = ""
|
|
|
|
|
for doc in ("cli.rst", "plugins.rst"):
|
|
|
|
|
rst += (docs_path / doc).read_text()
|
2020-05-02 21:13:49 -07:00
|
|
|
return {
|
|
|
|
|
command
|
|
|
|
|
for command in commands_re.findall(rst)
|
|
|
|
|
if "." not in command and ":" not in command
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-08-01 21:47:39 -07:00
|
|
|
@pytest.fixture(scope="session")
|
|
|
|
|
def documented_recipes():
|
|
|
|
|
rst = (docs_path / "cli.rst").read_text()
|
|
|
|
|
return set(recipes_re.findall(rst))
|
|
|
|
|
|
|
|
|
|
|
2020-05-02 21:13:49 -07:00
|
|
|
@pytest.mark.parametrize("command", cli.cli.commands.keys())
|
2020-07-27 00:08:57 -07:00
|
|
|
def test_commands_are_documented(documented_commands, command):
|
2020-05-02 21:13:49 -07:00
|
|
|
assert command in documented_commands
|
2020-09-22 15:47:11 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("command", cli.cli.commands.values())
|
2021-08-01 21:47:39 -07:00
|
|
|
def test_commands_have_help(command):
|
|
|
|
|
assert command.help, "{} is missing its help".format(command)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_convert_help():
|
|
|
|
|
result = CliRunner().invoke(cli.cli, ["convert", "--help"])
|
|
|
|
|
assert result.exit_code == 0
|
|
|
|
|
for expected in (
|
More type annotations (#697)
* Add comprehensive type annotations
- mypy.ini: expanded configuration with module-specific settings
- hookspecs.py: type annotations for hook functions
- plugins.py: typed get_plugins() return value
- recipes.py: full type annotations for parsedate, parsedatetime, jsonsplit
- utils.py: extensive type annotations including Row type alias,
TypeTracker, ValueTracker, and all utility functions
- db.py: type annotations for Database methods (__exit__,
ensure_autocommit_off, tracer, register_function, etc.) and
Queryable class methods
- tests/test_docs.py: updated to match new signature display format
* Fix type errors caught by ty check
- Add type: ignore comments for external library type stub limitations
(csv.reader, click.progressbar, IOBase.name, Callable.__name__)
- Change Iterable to Sequence for SQL where_args parameters
- Use db.table() instead of db[name] for proper Table return type
- Fix rebuild_fts return type from None to Table
- Update test_tracer to expect fewer queries (optimization side effect)
* Fix mypy type errors
- Add type: ignore comments for runtime-valid patterns mypy can't verify
- Fix new_column_types annotation to Dict[str, Set[type]]
- Add type: ignore for Default sentinel values passed to create_table
* mypy skip tests directory
* Fix CI: exclude typing imports from recipe docs, skip mypy on tests
- Add Callable and Optional to exclusion list in _generate_convert_help()
- Regenerate docs/cli-reference.rst with cog
- Add [mypy-tests.*] ignore_errors = True to skip test type errors
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 22:11:47 -08:00
|
|
|
"r.jsonsplit(value:",
|
|
|
|
|
"r.parsedate(value:",
|
|
|
|
|
"r.parsedatetime(value:",
|
2021-08-01 21:47:39 -07:00
|
|
|
):
|
|
|
|
|
assert expected in result.output
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
"recipe",
|
2022-03-20 21:01:35 -07:00
|
|
|
[
|
|
|
|
|
n
|
|
|
|
|
for n in dir(recipes)
|
|
|
|
|
if not n.startswith("_")
|
More type annotations (#697)
* Add comprehensive type annotations
- mypy.ini: expanded configuration with module-specific settings
- hookspecs.py: type annotations for hook functions
- plugins.py: typed get_plugins() return value
- recipes.py: full type annotations for parsedate, parsedatetime, jsonsplit
- utils.py: extensive type annotations including Row type alias,
TypeTracker, ValueTracker, and all utility functions
- db.py: type annotations for Database methods (__exit__,
ensure_autocommit_off, tracer, register_function, etc.) and
Queryable class methods
- tests/test_docs.py: updated to match new signature display format
* Fix type errors caught by ty check
- Add type: ignore comments for external library type stub limitations
(csv.reader, click.progressbar, IOBase.name, Callable.__name__)
- Change Iterable to Sequence for SQL where_args parameters
- Use db.table() instead of db[name] for proper Table return type
- Fix rebuild_fts return type from None to Table
- Update test_tracer to expect fewer queries (optimization side effect)
* Fix mypy type errors
- Add type: ignore comments for runtime-valid patterns mypy can't verify
- Fix new_column_types annotation to Dict[str, Set[type]]
- Add type: ignore for Default sentinel values passed to create_table
* mypy skip tests directory
* Fix CI: exclude typing imports from recipe docs, skip mypy on tests
- Add Callable and Optional to exclusion list in _generate_convert_help()
- Regenerate docs/cli-reference.rst with cog
- Add [mypy-tests.*] ignore_errors = True to skip test type errors
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 22:11:47 -08:00
|
|
|
and n not in ("json", "parser", "Callable", "Optional")
|
2022-03-20 21:01:35 -07:00
|
|
|
and callable(getattr(recipes, n))
|
|
|
|
|
],
|
2021-08-01 21:47:39 -07:00
|
|
|
)
|
|
|
|
|
def test_recipes_are_documented(documented_recipes, recipe):
|
|
|
|
|
assert recipe in documented_recipes
|