Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use ruff to format and fix some missing type hitns #905

Merged
merged 2 commits into from
Jan 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
repos:
- repo: https://github.com/ambv/black
rev: 23.7.0
- repo: https://github.com/rhysd/actionlint
rev: v1.6.26
hooks:
- id: black
files: "(tavern|tests)"
- id: actionlint
args: ["-shellcheck="]
- repo: https://github.com/hadialqattan/pycln
rev: v2.4.0
hooks:
- id: pycln
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: "v0.0.280"
rev: "v0.1.11"
hooks:
- id: ruff-format
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- repo: https://github.com/pre-commit/mirrors-prettier
Expand Down
4 changes: 3 additions & 1 deletion constraints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
# pip-compile --all-extras --output-file=constraints.txt --strip-extras pyproject.toml
# pip-compile --all-extras --output-file=constraints.txt --resolver=backtracking --strip-extras pyproject.toml
#
alabaster==0.7.13
# via sphinx
Expand Down Expand Up @@ -232,6 +232,8 @@ ruamel-yaml==0.17.31
# via pykwalify
ruamel-yaml-clib==0.2.7
# via ruamel-yaml
ruff==0.1.13
# via tavern (pyproject.toml)
secretstorage==3.3.3
# via keyring
six==1.16.0
Expand Down
1 change: 0 additions & 1 deletion example/advanced/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ def get_db():
"CREATE TABLE numbers_table (name TEXT NOT NULL, number INTEGER NOT NULL)"
)


return db


Expand Down
1 change: 0 additions & 1 deletion example/cookies/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ def get_db():
"CREATE TABLE numbers_table (name TEXT NOT NULL, number INTEGER NOT NULL)"
)


return db


Expand Down
3 changes: 1 addition & 2 deletions example/mqtt/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ def create_device():

try:
r["clean"]
except (TypeError):
except TypeError:
return jsonify({"error": "checking for clean key"}), 500
except KeyError:
try:
Expand Down Expand Up @@ -196,7 +196,6 @@ def attempt(query):
with contextlib.suppress(Exception):
db.execute(query)


attempt("DELETE FROM devices_table")
attempt(
"CREATE TABLE devices_table (device_id TEXT NOT NULL, lights_on INTEGER NOT NULL)"
Expand Down
7 changes: 4 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ dev = [
"fluent-logger",
"itsdangerous",
"mypy",
"ruff>=0.1.11",
"mypy-extensions",
"coverage[toml]",
"flit >=3.2,<4",
Expand Down Expand Up @@ -103,9 +104,6 @@ requests = "tavern._plugins.rest.tavernhook:TavernRestPlugin"
[project.entry-points.tavern_mqtt]
paho-mqtt = "tavern._plugins.mqtt.tavernhook"

[tool.black]
target-version = ['py37']

[tool.mypy]
python_version = 3.8
ignore_missing_imports = true
Expand Down Expand Up @@ -164,6 +162,9 @@ target-version = "py38"
[tool.ruff.isort]
known-first-party = ["tavern"]

[tool.ruff.format]
docstring-code-format = true

[tool.tbump.version]
current = "2.7.1"

Expand Down
24 changes: 21 additions & 3 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
# pip-compile --all-extras --generate-hashes --output-file=requirements.txt pyproject.toml
# pip-compile --all-extras --generate-hashes --output-file=requirements.txt --resolver=backtracking pyproject.toml
#
alabaster==0.7.13 \
--hash=sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 \
Expand Down Expand Up @@ -948,6 +948,25 @@ ruamel-yaml-clib==0.2.7 \
--hash=sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646 \
--hash=sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38
# via ruamel-yaml
ruff==0.1.13 \
--hash=sha256:226b517f42d59a543d6383cfe03cccf0091e3e0ed1b856c6824be03d2a75d3b6 \
--hash=sha256:2f59bcf5217c661254bd6bc42d65a6fd1a8b80c48763cb5c2293295babd945dd \
--hash=sha256:5f0312ba1061e9b8c724e9a702d3c8621e3c6e6c2c9bd862550ab2951ac75c16 \
--hash=sha256:6bbbc3042075871ec17f28864808540a26f0f79a4478c357d3e3d2284e832998 \
--hash=sha256:7a36fa90eb12208272a858475ec43ac811ac37e91ef868759770b71bdabe27b6 \
--hash=sha256:9a1600942485c6e66119da294c6294856b5c86fd6df591ce293e4a4cc8e72989 \
--hash=sha256:9ebb40442f7b531e136d334ef0851412410061e65d61ca8ce90d894a094feb22 \
--hash=sha256:9fb6b3b86450d4ec6a6732f9f60c4406061b6851c4b29f944f8c9d91c3611c7a \
--hash=sha256:a623349a505ff768dad6bd57087e2461be8db58305ebd5577bd0e98631f9ae69 \
--hash=sha256:b13ba5d7156daaf3fd08b6b993360a96060500aca7e307d95ecbc5bb47a69296 \
--hash=sha256:dcaab50e278ff497ee4d1fe69b29ca0a9a47cd954bb17963628fa417933c6eb1 \
--hash=sha256:e261f1baed6291f434ffb1d5c6bd8051d1c2a26958072d38dfbec39b3dda7352 \
--hash=sha256:e3fd36e0d48aeac672aa850045e784673449ce619afc12823ea7868fcc41d8ba \
--hash=sha256:e6894b00495e00c27b6ba61af1fc666f17de6140345e5ef27dd6e08fb987259d \
--hash=sha256:ee3febce7863e231a467f90e681d3d89210b900d49ce88723ce052c8761be8c7 \
--hash=sha256:f57de973de4edef3ad3044d6a50c02ad9fc2dff0d88587f25f1a48e3f72edf5e \
--hash=sha256:f988746e3c3982bea7f824c8fa318ce7f538c4dfefec99cd09c8770bd33e6539
# via tavern (pyproject.toml)
secretstorage==3.3.3 \
--hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \
--hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99
Expand Down Expand Up @@ -1073,7 +1092,6 @@ zipp==3.16.2 \
# via importlib-metadata

# WARNING: The following packages were not pinned, but pip requires them to be
# pinned when the requirements file includes hashes and the requirement is not
# satisfied by a package already installed. Consider using the --allow-unsafe flag.
# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag.
# pip
# setuptools
12 changes: 3 additions & 9 deletions scripts/smoke.bash
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,14 @@
set -ex

pre-commit run ruff --all-files
pre-commit run black --all-files
pre-commit run ruff-format --all-files

# Separate as isort can interfere with other testenvs
tox --parallel -c tox.ini \
-e py3check

tox --parallel -c tox.ini \
-e py3 \
-e py3mypy
-e py3,py3mypy

tox -c tox-integration.ini \
-e py3-generic \
-e py3-advanced \
-e py3-cookies \
-e py3-components \
-e py3-hooks \
-e py3-mqtt
-e py3-generic,py3-mqtt
12 changes: 7 additions & 5 deletions tavern/_core/dict_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,9 @@ def recurse_access_key(data, query: str):

Example:

>>> recurse_access_key({'a': 'b'}, 'a')
>>> recurse_access_key({"a": "b"}, "a")
'b'
>>> recurse_access_key({'a': {'b': ['c', 'd']}}, 'a.b[0]')
>>> recurse_access_key({"a": {"b": ["c", "d"]}}, "a.b[0]")
'c'

Args:
Expand Down Expand Up @@ -203,9 +203,9 @@ def _deprecated_recurse_access_key(current_val, keys):

Example:

>>> _deprecated_recurse_access_key({'a': 'b'}, ['a'])
>>> _deprecated_recurse_access_key({"a": "b"}, ["a"])
'b'
>>> _deprecated_recurse_access_key({'a': {'b': ['c', 'd']}}, ['a', 'b', '0'])
>>> _deprecated_recurse_access_key({"a": {"b": ["c", "d"]}}, ["a", "b", "0"])
'c'

Args:
Expand Down Expand Up @@ -351,7 +351,9 @@ def check_keys_match_recursive(

>>> check_keys_match_recursive({"a": {"b": "c"}}, {"a": {"b": "c"}}, []) is None
True
>>> check_keys_match_recursive({"a": {"b": "c"}}, {"a": {"b": "d"}}, []) # doctest: +IGNORE_EXCEPTION_DETAIL
>>> check_keys_match_recursive(
... {"a": {"b": "c"}}, {"a": {"b": "d"}}, []
... ) # doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
File "/home/michael/code/tavern/tavern/tavern/_core.util/dict_util.py", line 223, in check_keys_match_recursive
tavern._core.exceptions.KeyMismatchError: Key mismatch: (expected["a"]["b"] = 'c', actual["a"]["b"] = 'd')
Expand Down
7 changes: 6 additions & 1 deletion tavern/_core/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@
class TavernException(Exception):
"""Base exception

Fields are internal and might change in future
Fields are internal and might change in future without warning

Attributes:
is_final: whether this exception came from a 'finally' block
stage: stage that caused this issue
test_block_config: config for stage
"""

stage: Optional[Dict]
Expand Down
3 changes: 2 additions & 1 deletion tavern/_core/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import uuid
from abc import abstractmethod
from itertools import chain
from typing import List, Optional

import pytest
import yaml
Expand Down Expand Up @@ -120,7 +121,7 @@ def __init__(self, stream):
Resolver.__init__(self)
SourceMappingConstructor.__init__(self)

env_path_list = None
env_path_list: Optional[List] = None
env_var_name = "TAVERN_INCLUDE"


Expand Down
8 changes: 4 additions & 4 deletions tavern/_core/pytest/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,12 @@ def _load_fixture_values(self):
values.update(mark_values)

# Use autouse fixtures as well
for m in self.fixturenames:
if m in values:
logger.debug("%s already explicitly used", m)
for name in self.fixturenames:
if name in values:
logger.debug("%s already explicitly used", name)
continue

mark_values = {m: self.funcargs[m]}
mark_values = {name: self.funcargs[name]}
values.update(mark_values)

return values
Expand Down
4 changes: 2 additions & 2 deletions tavern/_core/schema/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import logging
import os
import tempfile
from typing import Dict
from typing import Dict, Mapping

import pykwalify
import yaml
Expand Down Expand Up @@ -129,7 +129,7 @@ def wrapfile(to_wrap):
os.remove(wrapped_tmp.name)


def verify_tests(test_spec, with_plugins: bool = True) -> None:
def verify_tests(test_spec: Mapping, with_plugins: bool = True) -> None:
"""Verify that a specific test block is correct

Todo:
Expand Down
7 changes: 4 additions & 3 deletions tavern/_core/schema/jsonschema.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import logging
import re
from typing import Mapping

import jsonschema
from jsonschema import Draft7Validator, ValidationError
Expand Down Expand Up @@ -104,12 +105,12 @@ def oneOf(validator: Draft7Validator, oneOf, instance, schema):
)


def verify_jsonschema(to_verify, schema) -> None:
def verify_jsonschema(to_verify: Mapping, schema: Mapping) -> None:
"""Verify a generic file against a given jsonschema

Args:
to_verify (dict): Filename of source tests to check
schema (dict): Schema to verify against
to_verify: Filename of source tests to check
schema: Schema to verify against

Raises:
BadSchemaError: Schema did not match
Expand Down
3 changes: 2 additions & 1 deletion tavern/_plugins/mqtt/tavernhook.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import logging
from os.path import abspath, dirname, join
from typing import Dict, Optional

import yaml

Expand All @@ -18,7 +19,7 @@


def get_expected_from_request(response_block, test_block_config, session):
expected = None
expected: Optional[Dict] = None

# mqtt response is not required
if response_block:
Expand Down
3 changes: 2 additions & 1 deletion tavern/entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import logging.config
from argparse import ArgumentParser
from textwrap import dedent
from typing import Dict

from .core import run

Expand Down Expand Up @@ -48,7 +49,7 @@ def main():
log_level = "INFO"

# Basic logging config that will print out useful information
log_cfg = {
log_cfg: Dict = {
"version": 1,
"formatters": {
"default": {
Expand Down
4 changes: 2 additions & 2 deletions tavern/response.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,12 @@ def recurse_check_key_match(
except exceptions.KeyMismatchError as e:
self._adderr(e.args[0], e=e)

def _check_for_validate_functions(self, response_block) -> None:
def _check_for_validate_functions(self, response_block: Mapping) -> None:
"""
See if there were any functions specified in the response block and save them for later use

Args:
response_block (dict): block of external functions to call
response_block: block of external functions to call
"""

def check_ext_functions(verify_block):
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/test_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ def add_opts(self, pytestconfig):

def _make_fake_exc_info(self, exc_type):
# Copied from pytest tests
class FakeExcinfo(_pytest._code.ExceptionInfo):
class FakeExcinfo(_pytest._code.ExceptionInfo): # type:ignore
pass

try:
Expand Down