Skip to content

Commit ecdaaae

Browse files
committed
Switch to hooks for linting
1 parent 725b63d commit ecdaaae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+318
-462
lines changed

.github/workflows/ci.yml

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,17 @@ on:
1010
jobs:
1111
lint:
1212
runs-on: ubuntu-22.04
13-
strategy:
14-
matrix:
15-
python-version: ["3.10"]
1613
steps:
1714
- name: Checkout code
1815
uses: actions/checkout@v4
1916
- name: Setup Python
2017
uses: actions/setup-python@v5
2118
with:
22-
python-version: ${{ matrix.python-version }}
23-
- name: Install dependencies
24-
run: |
25-
sudo apt-get update
26-
sudo apt-get install -y libldap2-dev libsasl2-dev libssl-dev
27-
pip install --upgrade pip
28-
pip install -r requirements/dev.txt
29-
- name: black
30-
run: black --check flask_appbuilder
31-
- name: flake8
32-
run: flake8 flask_appbuilder
33-
- name: mypy
34-
run: mypy flask_appbuilder/**/*.py
35-
- name: black
36-
run: black --check tests
37-
- name: flake8
38-
run: flake8 tests
19+
python-version: "3.10"
20+
- name: Install prek
21+
run: pip install prek
22+
- name: Run linters
23+
run: prek run --all-files
3924

4025
test-postgres:
4126
runs-on: ubuntu-22.04

.pre-commit-config.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
repos:
2+
- repo: https://github.com/astral-sh/ruff-pre-commit
3+
rev: v0.15.7
4+
hooks:
5+
- id: ruff-check
6+
args: [--fix]
7+
- id: ruff-format
8+
- repo: https://github.com/pre-commit/mirrors-mypy
9+
rev: v1.19.1
10+
hooks:
11+
- id: mypy
12+
additional_dependencies: [types-PyYAML]
13+
args: [--ignore-missing-imports]
14+
pass_filenames: false
15+
entry: mypy flask_appbuilder

flask_appbuilder/_compat.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
# -*- coding: utf-8 -*-
22
"""
3-
Some py2/py3 compatibility support based on a stripped down
4-
version of six so we don't have to depend on a specific version
5-
of it.
3+
Some py2/py3 compatibility support based on a stripped down
4+
version of six so we don't have to depend on a specific version
5+
of it.
66
7-
:copyright: (c) 2013 by Armin Ronacher.
8-
:license: BSD, see LICENSE for more details.
7+
:copyright: (c) 2013 by Armin Ronacher.
8+
:license: BSD, see LICENSE for more details.
99
"""
10+
1011
import sys
1112

1213
PY2 = sys.version_info[0] == 2

flask_appbuilder/api/__init__.py

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import re
77
import traceback
88
from typing import (
9+
TYPE_CHECKING,
910
Any,
1011
Callable,
1112
Dict,
@@ -14,14 +15,13 @@
1415
Set,
1516
Tuple,
1617
Type,
17-
TYPE_CHECKING,
1818
Union,
1919
)
2020
import urllib.parse
2121

2222
from apispec import APISpec, yaml_utils
2323
from apispec.exceptions import DuplicateComponentNameError
24-
from flask import Blueprint, current_app, jsonify, make_response, request, Response
24+
from flask import Blueprint, Response, current_app, jsonify, make_response, request
2525
from flask_appbuilder._compat import as_unicode
2626
from flask_appbuilder.api.convert import Model2SchemaConverter
2727
from flask_appbuilder.api.schemas import (
@@ -507,9 +507,7 @@ def __init__(self) -> None:
507507
# Init class permission override attrs
508508
if not self.previous_class_permission_name and self.class_permission_name:
509509
self.previous_class_permission_name = self.__class__.__name__
510-
self.class_permission_name = (
511-
self.class_permission_name or self.__class__.__name__
512-
)
510+
self.class_permission_name = self.class_permission_name or self.__class__.__name__
513511

514512
# Init previous permission override attrs
515513
is_collect_previous = False
@@ -1244,9 +1242,8 @@ def _init_properties(self) -> None:
12441242
]
12451243
self.list_select_columns = self.list_select_columns or self.list_columns
12461244

1247-
self.order_columns = (
1248-
self.order_columns
1249-
or self.datamodel.get_order_columns_list(list_columns=self.list_columns)
1245+
self.order_columns = self.order_columns or self.datamodel.get_order_columns_list(
1246+
list_columns=self.list_columns
12501247
)
12511248
# Process excluded columns
12521249
if not self.show_columns:
@@ -1256,9 +1253,7 @@ def _init_properties(self) -> None:
12561253
self.show_select_columns = self.show_select_columns or self.show_columns
12571254

12581255
if not self.add_columns:
1259-
self.add_columns = [
1260-
x for x in list_cols if x not in self.add_exclude_columns
1261-
]
1256+
self.add_columns = [x for x in list_cols if x not in self.add_exclude_columns]
12621257
if not self.edit_columns:
12631258
self.edit_columns = [
12641259
x for x in list_cols if x not in self.edit_exclude_columns
@@ -1345,9 +1340,7 @@ def merge_show_columns(self, response: Dict[str, Any], **kwargs: Any) -> None:
13451340
else:
13461341
response[API_SHOW_COLUMNS_RES_KEY] = self.show_columns
13471342

1348-
def merge_description_columns(
1349-
self, response: Dict[str, Any], **kwargs: Any
1350-
) -> None:
1343+
def merge_description_columns(self, response: Dict[str, Any], **kwargs: Any) -> None:
13511344
pruned_select_cols = kwargs.get(API_SELECT_COLUMNS_RIS_KEY, [])
13521345
if pruned_select_cols:
13531346
response[API_DESCRIPTION_COLUMNS_RES_KEY] = self._description_columns_json(
@@ -1397,9 +1390,7 @@ def info_headless(self, **kwargs: Any) -> Response:
13971390
@safe
13981391
@rison(get_info_schema)
13991392
@permission_name("info")
1400-
@merge_response_func(
1401-
BaseApi.merge_current_user_permissions, API_PERMISSIONS_RIS_KEY
1402-
)
1393+
@merge_response_func(BaseApi.merge_current_user_permissions, API_PERMISSIONS_RIS_KEY)
14031394
@merge_response_func(merge_add_field_info, API_ADD_COLUMNS_RIS_KEY)
14041395
@merge_response_func(merge_edit_field_info, API_EDIT_COLUMNS_RIS_KEY)
14051396
@merge_response_func(merge_search_filters, API_FILTERS_RIS_KEY)
@@ -1998,9 +1989,7 @@ def _handle_columns_args(
19981989
select_columns_arg = args.get(API_SELECT_SEL_COLUMNS_RIS_KEY, [])
19991990
response_columns_arg = args.get(API_SELECT_COLUMNS_RIS_KEY, [])
20001991
if select_columns_arg and response_columns_arg:
2001-
raise InvalidColumnArgsFABException(
2002-
"Cannot use both select and sel columns"
2003-
)
1992+
raise InvalidColumnArgsFABException("Cannot use both select and sel columns")
20041993
select_columns = default_select_columns
20051994
response_columns = []
20061995
if select_columns_arg:

flask_appbuilder/api/convert.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
from flask import current_app
44
from flask_appbuilder.models.sqla import Model
55
from flask_appbuilder.models.sqla.interface import SQLAInterface
6-
from marshmallow import fields, Schema
6+
from marshmallow import Schema, fields
77
from marshmallow.fields import Field
8-
from marshmallow_sqlalchemy import field_for
9-
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
8+
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema, field_for
109

1110

1211
class TreeNode:

flask_appbuilder/api/manager.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
from apispec.ext.marshmallow import MarshmallowPlugin
33
from apispec.ext.marshmallow.common import resolve_schema_cls
44
from flask import current_app, request
5-
from flask_appbuilder.api import BaseApi
6-
from flask_appbuilder.api import expose, protect, safe
5+
from flask_appbuilder.api import BaseApi, expose, protect, safe
76
from flask_appbuilder.basemanager import BaseManager
87
from flask_appbuilder.baseviews import BaseView
98
from flask_appbuilder.security.decorators import has_access

flask_appbuilder/api/schemas.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from marshmallow import post_load, Schema
1+
from marshmallow import Schema, post_load
22

33
from ..const import (
44
API_ADD_COLUMNS_RIS_KEY,

flask_appbuilder/babel/manager.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ def __init__(self, appbuilder):
1818
appbuilder_parent_dir = os.path.join(
1919
os.path.dirname(os.path.abspath(__file__)), os.pardir
2020
)
21-
appbuilder_translations_path = os.path.join(
22-
appbuilder_parent_dir, "translations"
23-
)
21+
appbuilder_translations_path = os.path.join(appbuilder_parent_dir, "translations")
2422
if "BABEL_TRANSLATION_DIRECTORIES" in current_app.config:
2523
current_translation_directories = current_app.config.get(
2624
"BABEL_TRANSLATION_DIRECTORIES"

flask_appbuilder/base.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from functools import reduce
44
import logging
5-
from typing import Any, Callable, cast, Dict, List, Optional, Type, TYPE_CHECKING, Union
5+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Type, Union, cast
66

7-
from flask import Blueprint, current_app, Flask, url_for
7+
from flask import Blueprint, Flask, current_app, url_for
88
from flask_appbuilder import __version__
99
from flask_appbuilder.api.manager import OpenApiManager
1010
from flask_appbuilder.babel.manager import BabelManager
@@ -24,7 +24,7 @@
2424

2525
if TYPE_CHECKING:
2626
from flask_appbuilder.basemanager import BaseManager
27-
from flask_appbuilder.baseviews import BaseView, AbstractViewApi
27+
from flask_appbuilder.baseviews import AbstractViewApi, BaseView
2828
from flask_appbuilder.security.manager import BaseSecurityManager
2929

3030
log = logging.getLogger(__name__)
@@ -163,9 +163,7 @@ def init_app(self, app: Flask, session: SessionBase) -> None:
163163
self._session = session
164164
self.base_template = app.config.get("FAB_BASE_TEMPLATE", self.base_template)
165165
self.static_folder = app.config.get("FAB_STATIC_FOLDER", self.static_folder)
166-
self.static_url_path = app.config.get(
167-
"FAB_STATIC_URL_PATH", self.static_url_path
168-
)
166+
self.static_url_path = app.config.get("FAB_STATIC_URL_PATH", self.static_url_path)
169167
_index_view = app.config.get("FAB_INDEX_VIEW", None)
170168
if _index_view:
171169
self.indexview = dynamic_class_import(_index_view) # type: ignore
@@ -184,9 +182,7 @@ def init_app(self, app: Flask, session: SessionBase) -> None:
184182

185183
if self.update_perms: # default is True, if False takes precedence from config
186184
self.update_perms = app.config.get("FAB_UPDATE_PERMS", True)
187-
_security_manager_class_name = app.config.get(
188-
"FAB_SECURITY_MANAGER_CLASS", None
189-
)
185+
_security_manager_class_name = app.config.get("FAB_SECURITY_MANAGER_CLASS", None)
190186
if _security_manager_class_name is not None:
191187
security_manager_class = dynamic_class_import(_security_manager_class_name)
192188
self.security_manager_class = cast(
@@ -612,9 +608,7 @@ def get_url_for_logout(self) -> str:
612608
def get_url_for_index(self) -> str:
613609
if self._indexview is None:
614610
return ""
615-
return url_for(
616-
"%s.%s" % (self._indexview.endpoint, self._indexview.default_view)
617-
)
611+
return url_for("%s.%s" % (self._indexview.endpoint, self._indexview.default_view))
618612

619613
@property
620614
def get_url_for_userinfo(self) -> str:

flask_appbuilder/baseviews.py

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import json
44
import logging
55
import re
6-
from typing import List, Optional, TYPE_CHECKING
6+
from typing import TYPE_CHECKING, List, Optional
77

88
from flask import (
9-
abort,
109
Blueprint,
10+
abort,
1111
current_app,
1212
flash,
1313
render_template,
@@ -24,11 +24,11 @@
2424
wrap_route_handler_with_hooks,
2525
)
2626
from flask_appbuilder.urltools import (
27+
Stack,
2728
get_filter_args,
2829
get_order_args,
2930
get_page_args,
3031
get_page_size_args,
31-
Stack,
3232
)
3333
from flask_appbuilder.widgets import FormWidget, ListWidget, SearchWidget, ShowWidget
3434
from flask_babel import lazy_gettext
@@ -85,8 +85,7 @@ def create_blueprint(
8585
appbuilder: "AppBuilder",
8686
endpoint: Optional[str] = None,
8787
static_folder: Optional[str] = None,
88-
):
89-
...
88+
): ...
9089

9190
def get_uninit_inner_views(self):
9291
"""
@@ -209,9 +208,7 @@ def __init__(self):
209208
# Init class permission override attrs
210209
if not self.previous_class_permission_name and self.class_permission_name:
211210
self.previous_class_permission_name = self.__class__.__name__
212-
self.class_permission_name = (
213-
self.class_permission_name or self.__class__.__name__
214-
)
211+
self.class_permission_name = self.class_permission_name or self.__class__.__name__
215212

216213
# Init previous permission override attrs
217214
is_collect_previous = False
@@ -890,8 +887,8 @@ def __init__(self, **kwargs):
890887
if self.method_permission_name.get(attr_name):
891888
if not self.previous_method_permission_name.get(attr_name):
892889
self.previous_method_permission_name[attr_name] = action.name
893-
permission_name = (
894-
PERMISSION_PREFIX + self.method_permission_name.get(attr_name)
890+
permission_name = PERMISSION_PREFIX + self.method_permission_name.get(
891+
attr_name
895892
)
896893
if permission_name not in self.base_permissions:
897894
self.base_permissions.append(permission_name)
@@ -958,9 +955,8 @@ def _init_properties(self):
958955
list_cols = self.datamodel.get_user_columns_list()
959956
self.list_columns = self.list_columns or [list_cols[0]]
960957
self._gen_labels_columns(self.list_columns)
961-
self.order_columns = (
962-
self.order_columns
963-
or self.datamodel.get_order_columns_list(list_columns=self.list_columns)
958+
self.order_columns = self.order_columns or self.datamodel.get_order_columns_list(
959+
list_columns=self.list_columns
964960
)
965961
if self.show_fieldsets:
966962
self.show_columns = []
@@ -976,9 +972,7 @@ def _init_properties(self):
976972
if self.add_fieldsets:
977973
self.add_columns = []
978974
for fieldset_item in self.add_fieldsets:
979-
self.add_columns = self.add_columns + list(
980-
fieldset_item[1].get("fields")
981-
)
975+
self.add_columns = self.add_columns + list(fieldset_item[1].get("fields"))
982976
else:
983977
if not self.add_columns:
984978
self.add_columns = [
@@ -1123,9 +1117,7 @@ def _get_list_widget(
11231117
)
11241118
return widgets
11251119

1126-
def _get_show_widget(
1127-
self, pk, item, widgets=None, actions=None, show_fieldsets=None
1128-
):
1120+
def _get_show_widget(self, pk, item, widgets=None, actions=None, show_fieldsets=None):
11291121
widgets = widgets or {}
11301122
actions = actions or self.actions
11311123
show_fieldsets = show_fieldsets or self.show_fieldsets
@@ -1188,9 +1180,7 @@ def _list(self, **kwargs):
11881180
returns list and search widget
11891181
"""
11901182
if get_order_args().get(self.__class__.__name__):
1191-
order_column, order_direction = get_order_args().get(
1192-
self.__class__.__name__
1193-
)
1183+
order_column, order_direction = get_order_args().get(self.__class__.__name__)
11941184
else:
11951185
order_column, order_direction = "", ""
11961186
page = get_page_args().get(self.__class__.__name__)

0 commit comments

Comments
 (0)