Skip to content

Commit

Permalink
添加pyright静态类型检查器 (#20)
Browse files Browse the repository at this point in the history
* 添加pyright静态类型检查器

* 基于pyright修复全局静态类型

* 添加pyright检测器到ci

* 修复ci缓存

* 添加ci扩展参数到pyright

* 修复ci依赖下载错误
  • Loading branch information
wu-clan authored Jun 25, 2023
1 parent 443d8e1 commit 3404def
Show file tree
Hide file tree
Showing 28 changed files with 124 additions and 104 deletions.
27 changes: 13 additions & 14 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,33 +19,32 @@ jobs:
# version_file_path: httpfpt/__init__.py
lint:
runs-on: ubuntu-latest
name: lint
name: lint ${{ matrix.python-version }}
strategy:
matrix:
python-version: ['3.8']
fail-fast: false
steps:
- uses: actions/checkout@v3

- name: Set up Python
- name: Setup python
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: pip

- name: Install Dependencies
run: pip install ruff==0.0.262 pre-commit==3.2.2

- name: ruff check
uses: chartboost/ruff-action@v1
with:
args: '--config .ruff.toml'

- name: black formatter
uses: psf/black@stable
with:
options: '--skip-string-normalization --line-length 120'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: pre-commit
uses: pre-commit/[email protected]
with:
extra_args: --all-files --verbose

- name: pyright
uses: jakebailey/pyright-action@v1
with:
project: .
verbose: true
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ httpfpt/log/
.idea/

# online case data
httpfpt/data/online/
httpfpt/data/online*/

# ruff
httpfpt/.ruff_cache/
3 changes: 1 addition & 2 deletions httpfpt/common/env_handler.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
from typing import NoReturn

import dotenv

Expand All @@ -20,7 +19,7 @@ def get_env_dict(filepath: str) -> dict:
return env_dict


def write_env_vars(filepath: str, filename: str, key: str, value: str) -> NoReturn:
def write_env_vars(filepath: str, filename: str, key: str, value: str) -> None:
"""
写入 env 信息
Expand Down
11 changes: 7 additions & 4 deletions httpfpt/common/json_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
import json
import os
from typing import Optional, NoReturn, Any
from typing import Optional, Any

from httpfpt.common.log import log

Expand Down Expand Up @@ -41,7 +41,7 @@ def write_json_file(
encoding: str = 'utf-8',
mode: str = 'a',
**kwargs,
) -> NoReturn:
) -> None:
"""
写入 json 文件
Expand All @@ -53,12 +53,15 @@ def write_json_file(
:param kwargs:
:return:
"""
if not os.path.exists(filepath):
os.makedirs(filepath)
if filepath is not None:
if not os.path.exists(filepath):
os.makedirs(filepath)
_file = os.path.join(filepath, filename)
else:
_file = filename
if not _file:
log.warning('写入 json 文件失败,文件名为空')
raise ValueError('写入 json 文件失败,文件名为空')
try:
with open(_file, encoding=encoding, mode=mode) as f:
json.dump(data, f, ensure_ascii=False, **kwargs)
Expand Down
21 changes: 10 additions & 11 deletions httpfpt/common/send_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import json
import time
from json import JSONDecodeError
from typing import NoReturn

import allure
import httpx
Expand Down Expand Up @@ -91,7 +90,7 @@ def _httpx_engin(**kwargs) -> HttpxResponse:
log.info('开始发送请求...')
with httpx.Client(
verify=verify,
proxies=proxies,
proxies=proxies, # type: ignore
follow_redirects=redirects,
) as client:
response = client.request(**kwargs)
Expand Down Expand Up @@ -247,14 +246,14 @@ def send_request(
return response_data

@staticmethod
def log_request_setup(parsed_data: dict) -> NoReturn:
def log_request_setup(parsed_data: dict) -> None:
log.info(f"请求 setup_testcase: {parsed_data['setup_testcase']}")
log.info(f"请求 setup_sql: {parsed_data['setup_sql']}")
log.info(f"请求 setup_hooks: {parsed_data['setup_hooks']}")
log.info(f"请求 setup_wait_time: {parsed_data['setup_wait_time']}")

@staticmethod
def log_request_up(parsed_data: dict) -> NoReturn:
def log_request_up(parsed_data: dict) -> None:
log.info(f"用例 env: {parsed_data['env']}")
log.info(f"用例 module: {parsed_data['module']}")
log.info(f"用例 name: {parsed_data['name']}")
Expand All @@ -272,15 +271,15 @@ def log_request_up(parsed_data: dict) -> NoReturn:
log.info(f"请求 files: {parsed_data['files_no_parse']}")

@staticmethod
def log_request_teardown(parsed_data: dict) -> NoReturn:
def log_request_teardown(parsed_data: dict) -> None:
log.info(f"请求 teardown_sql: {parsed_data['teardown_sql']}")
log.info(f"请求 teardown_hooks: {parsed_data['teardown_hooks']}")
log.info(f"请求 teardown_extract: {parsed_data['teardown_extract']}")
log.info(f"请求 teardown_assert: {parsed_data['teardown_assert']}")
log.info(f"请求 teardown_wait_time: {parsed_data['teardown_wait_time']}")

@staticmethod
def log_request_down(response_data: dict) -> NoReturn:
def log_request_down(response_data: dict) -> None:
log.info(f"请求发送时间: {response_data['stat']['execute_time']}")
str_status_code = str(response_data['status_code'])
if str_status_code.startswith('4') or str_status_code.startswith('5'):
Expand All @@ -290,7 +289,7 @@ def log_request_down(response_data: dict) -> NoReturn:
log.info(f"响应时间: {response_data['elapsed']} ms")

@staticmethod
def allure_request_setup(parsed_data: dict) -> NoReturn:
def allure_request_setup(parsed_data: dict) -> None:
allure_step(
'请求前置',
{
Expand All @@ -302,7 +301,7 @@ def allure_request_setup(parsed_data: dict) -> NoReturn:
)

@staticmethod
def allure_request_up(parsed_data: dict) -> NoReturn:
def allure_request_up(parsed_data: dict) -> None:
allure_step(
'请求数据',
{
Expand All @@ -322,7 +321,7 @@ def allure_request_up(parsed_data: dict) -> NoReturn:
)

@staticmethod
def allure_request_teardown(parsed_data: dict) -> NoReturn:
def allure_request_teardown(parsed_data: dict) -> None:
allure_step(
'请求后置',
{
Expand All @@ -335,7 +334,7 @@ def allure_request_teardown(parsed_data: dict) -> NoReturn:
)

@staticmethod
def allure_request_down(response_data: dict) -> NoReturn:
def allure_request_down(response_data: dict) -> None:
allure_step(
'响应数据',
{
Expand All @@ -345,7 +344,7 @@ def allure_request_down(response_data: dict) -> NoReturn:
)

@staticmethod
def allure_dynamic_data(parsed_data: dict) -> NoReturn:
def allure_dynamic_data(parsed_data: dict) -> None:
allure.dynamic.title(parsed_data['name'])
allure.dynamic.description(parsed_data['description'])
allure.dynamic.link(parsed_data['url'])
Expand Down
2 changes: 1 addition & 1 deletion httpfpt/common/toml_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def write_toml(filepath: str, filename: str, data: dict, encoding: str = 'utf-8'
_file = os.path.join(filepath, filename)
try:
with open(_file, encoding=encoding, mode=mode) as f:
result = rtoml.dump(data, f)
result = rtoml.dump(data, f) # type: ignore
except ValueError as e:
log.error(f'写入文件 "{filename}" 错误 \n {e}')
raise e
Expand Down
11 changes: 7 additions & 4 deletions httpfpt/common/yaml_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import os
from datetime import datetime
from pathlib import Path
from typing import List, Dict, Any, Union, Optional, NoReturn
from typing import List, Dict, Any, Union, Optional

import yaml

Expand All @@ -25,6 +25,9 @@ def read_yaml(
_file = os.path.join(filepath, filename)
else:
_file = filename
if not _file:
log.error('读取 yaml 文件失败,文件名为空')
raise ValueError('读取 yaml 文件失败,文件名为空')
try:
with open(_file, encoding='utf-8') as f:
data = yaml.load(f, Loader=yaml.FullLoader)
Expand All @@ -38,7 +41,7 @@ def read_yaml(
raise ValueError(f'数据文件 {filename} 没有数据! 请检查数据文件内容是否正确!')


def write_yaml(filepath: str, filename: str, data: Any = None, *, encoding: str = 'utf-8', mode: str = 'a') -> NoReturn:
def write_yaml(filepath: str, filename: str, data: Any = None, *, encoding: str = 'utf-8', mode: str = 'a') -> None:
"""
将数据写入包含 yaml 格式数据的文件
Expand Down Expand Up @@ -70,7 +73,7 @@ def write_yaml_report(
encoding: str = 'utf-8',
mode: str = 'a',
status: str,
) -> NoReturn:
) -> None:
"""
写入 yaml 测试报告
Expand All @@ -97,7 +100,7 @@ def write_yaml_report(
log.success(f'写入 {filename} 测试报告成功')


def write_yaml_vars(data: dict) -> NoReturn:
def write_yaml_vars(data: dict) -> None:
"""
写入 yaml 全部变量
Expand Down
12 changes: 6 additions & 6 deletions httpfpt/db/mysql_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# _*_ coding:utf-8 _*_
import datetime
import decimal
from typing import NoReturn, Any
from typing import Any, Optional

import pymysql
from dbutils.pooled_db import PooledDB
Expand Down Expand Up @@ -59,7 +59,7 @@ def query(self, sql: str, fetch: str = 'all') -> Any:
finally:
self.close()

def execute(self, sql: str) -> NoReturn:
def execute(self, sql: str) -> None:
"""
执行 sql 操作
Expand All @@ -76,7 +76,7 @@ def execute(self, sql: str) -> NoReturn:
finally:
self.close()

def close(self) -> NoReturn:
def close(self) -> None:
"""
关闭游标和数据库连接
Expand All @@ -85,7 +85,7 @@ def close(self) -> NoReturn:
self.cursor.close()
self.conn.close()

def exec_case_sql(self, sql: list, env: str = None) -> dict:
def exec_case_sql(self, sql: list, env: Optional[str] = None) -> dict:
"""
执行用例 sql
Expand Down Expand Up @@ -115,9 +115,9 @@ def exec_case_sql(self, sql: list, env: str = None) -> dict:
log.info(f'执行变量提取 sql: {s["sql"]}')
key = s['key']
set_type = s['type']
sql = s['sql']
sql_text = s['sql']
json_path = s['jsonpath']
query_data = self.query(sql)
query_data = self.query(sql_text)
value = jsonpath(query_data, json_path)
if value:
value = value[0]
Expand Down
12 changes: 6 additions & 6 deletions httpfpt/db/redis_db.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from typing import Any, NoReturn
from typing import Any

from redis import Redis, AuthenticationError

Expand Down Expand Up @@ -50,7 +50,7 @@ def get(self, key: Any) -> Any:
log.warning(f'获取 redis 数据 {key} 失败, 此数据不存在')
return data

def set(self, key: Any, value: Any, **kwargs) -> NoReturn:
def set(self, key: Any, value: Any, **kwargs) -> None:
"""
设置 redis 数据
Expand All @@ -61,7 +61,7 @@ def set(self, key: Any, value: Any, **kwargs) -> NoReturn:
self.redis.set(key, value, **kwargs)
log.info(f'设置 redis 数据 {key} 成功')

def rset(self, key: Any, value: Any, **kwargs) -> NoReturn:
def rset(self, key: Any, value: Any, **kwargs) -> None:
"""
重置设置 redis 数据
Expand All @@ -74,7 +74,7 @@ def rset(self, key: Any, value: Any, **kwargs) -> NoReturn:
self.redis.set(key, value, **kwargs)
log.info(f'重置 redis 数据 {key} 成功')

def delete(self, *key: Any) -> NoReturn:
def delete(self, *key: Any) -> None:
"""
删除 redis 数据
Expand All @@ -99,7 +99,7 @@ def exists(self, *key: Any) -> int:
log.warning(f'判断 redis 数据 {key} 不存在')
return num

def lpush(self, key: Any, *value: Any) -> NoReturn:
def lpush(self, key: Any, *value: Any) -> None:
"""
从左侧插入列表数据
Expand All @@ -110,7 +110,7 @@ def lpush(self, key: Any, *value: Any) -> NoReturn:
self.redis.lpush(key, *value)
log.info(f'从左侧插入 redis 数据 {key} 成功')

def relpush(self, key: Any, *value: Any) -> NoReturn:
def relpush(self, key: Any, *value: Any) -> None:
"""
删除原数据并重新从左侧插入列表数据
Expand Down
4 changes: 2 additions & 2 deletions httpfpt/enums/assert_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ class AssertType(StrEnum):
length_greater_than_or_equal = 'len_ge'
contains = 'contains'
not_contains = 'not_contains'
startswith = 'startswith'
endswith = 'endswith'
startswith = 'startswith' # type: ignore
endswith = 'endswith' # type: ignore
Loading

0 comments on commit 3404def

Please sign in to comment.