Skip to content
This repository was archived by the owner on Jul 16, 2025. It is now read-only.

Commit 78dd061

Browse files
authored
Merge pull request #67 from reflex-dev/lendemor/use_ruff
enable ruff formatting
2 parents 654b477 + 1fccbd4 commit 78dd061

File tree

10 files changed

+95
-55
lines changed

10 files changed

+95
-55
lines changed

.github/workflows/pre-commit.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: pre-commit
2+
3+
on:
4+
pull_request:
5+
branches: ["main"]
6+
push:
7+
branches: ["main"]
8+
9+
jobs:
10+
pre-commit:
11+
timeout-minutes: 30
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: actions/checkout@v4
15+
- uses: actions/setup-python@v2
16+
with:
17+
python-version: "3.12"
18+
- run: |
19+
pip install pre-commit
20+
pip install pyright
21+
pre-commit run --all-files
22+
env:
23+
SKIP: update-pyi-files

.pre-commit-config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,9 @@ repos:
1010
- id: ruff
1111
args: ["--fix", "--exit-non-zero-on-fix"]
1212

13+
- repo: https://github.com/codespell-project/codespell
14+
rev: v2.3.0
15+
hooks:
16+
- id: codespell
17+
args: [custom_components, "*_demo"]
18+

ag_grid_demo/ag_grid_demo/ag_grid_demo.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
"""Welcome to Reflex! This file showcases the custom component in a basic app."""
22

3+
import pandas as pd
34
import reflex as rx
45
from reflex_ag_grid import ag_grid
5-
import pandas as pd
6-
76

87
df = pd.read_csv(
98
"https://raw.githubusercontent.com/plotly/datasets/master/wind_dataset.csv"
@@ -12,7 +11,7 @@
1211
column_defs = [
1312
ag_grid.column_def(field="direction"),
1413
ag_grid.column_def(field="strength"),
15-
ag_grid.column_def(field="frequency"),
14+
ag_grid.column_def(field="frequency", cell_renderer=ag_grid.renderers.link),
1615
]
1716

1817

@@ -42,8 +41,9 @@ def index():
4241
row_data=df.to_dict("records"),
4342
column_defs=column_defs,
4443
row_selection="multiple",
45-
on_selection_changed=lambda rows, _0, _1: BasicGridState.set_selection(
46-
rows
44+
on_selection_changed=lambda rows, _0, _1: BasicGridState.setvar(
45+
"selection",
46+
rows,
4747
),
4848
width="50vw",
4949
),

ag_grid_demo/ag_grid_demo/model_dm.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
import faker
44
import reflex as rx
5+
from reflex_ag_grid.wrapper import ModelWrapper, model_wrapper
56
from sqlmodel import Column, DateTime, Field, func
67

7-
from reflex_ag_grid.wrapper import model_wrapper, ModelWrapper
8-
98

109
class Friend(rx.Model, table=True):
1110
name: str

custom_components/reflex_ag_grid/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"handle_number_filter",
3232
"handle_text_filter",
3333
"model_wrapper",
34+
"where_filter_def",
3435
"where_number_filter",
3536
"where_text_filter",
36-
"where_filter_def",
3737
]

custom_components/reflex_ag_grid/ag_grid.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
# For wrapping react guide, visit https://reflex.dev/docs/wrapping-react/overview/
44

5+
import os
56
from types import SimpleNamespace
7+
from typing import Any, Callable, Literal, Union
8+
69
import reflex as rx
10+
from reflex.components.el import Div
11+
from reflex.components.props import PropsBase
712

8-
import os
9-
from typing import Any, Callable, Union
1013
from .datasource import Datasource, SSRMDatasource
11-
from reflex.components.props import PropsBase
12-
from typing import Literal
13-
from reflex.components.el import Div
1414

1515

1616
def callback_content(iterable: list[str]) -> str:
@@ -152,7 +152,7 @@ class AGRenderers(SimpleNamespace):
152152
href=rx.Var("params.value", _var_type=str),
153153
target="_blank",
154154
),
155-
).to(dict) # TODO: remove cast after reflex 0.6.6
155+
)
156156

157157

158158
class ColumnDef(PropsBase):
@@ -534,7 +534,7 @@ def select_rows_by_key(self, keys: list[str]) -> rx.event.EventHandler:
534534
api.forEachNode(function (node) {{
535535
if (keys_set.has(node.key)) {{
536536
selected_nodes.push(node);
537-
}}
537+
}}
538538
}});
539539
api.deselectAll()
540540
api.setNodesSelected({{ nodes: selected_nodes, newValue: true }});
@@ -552,7 +552,7 @@ def log_nodes(self) -> rx.event.EventSpec:
552552
"""
553553
)
554554

555-
def setGridOption(self, key: str, value: rx.Var) -> rx.event.EventSpec:
555+
def setGridOption(self, key: str, value: rx.Var) -> rx.event.EventSpec: # noqa: N802
556556
return self.api.set_grid_option(key, value)
557557

558558
def set_datasource(self, datasource: Datasource):

custom_components/reflex_ag_grid/datasource.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import reflex as rx
2-
32
from reflex.base import Base
43
from reflex.config import get_config
54
from reflex.utils import format
@@ -10,8 +9,8 @@
109
class Datasource(Base):
1110
uri: str | None = None
1211
endpoint_uri: str | None = None
13-
rowCount: rx.Var[int] | int | None = None
14-
getRows: rx.Var | None = None
12+
rowCount: rx.Var[int] | int | None = None # noqa: N815
13+
getRows: rx.Var | None = None # noqa: N815
1514

1615
def get_uri(self) -> str:
1716
return self.uri or (
@@ -86,7 +85,7 @@ def json(self) -> str:
8685
class SSRMDatasource(Base):
8786
uri: str | None = None
8887
endpoint_uri: str | None = None
89-
getRows: rx.Var | None = None
88+
getRows: rx.Var | None = None # noqa: N815
9089

9190
def get_uri(self) -> str:
9291
return self.uri or (

custom_components/reflex_ag_grid/handlers.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
import datetime
44
from typing import Any, Type, TypeVar
55

6-
from sqlmodel import not_, and_, or_
7-
from sqlmodel.sql.expression import SelectOfScalar
6+
import reflex as rx
87
from sqlalchemy.orm.attributes import InstrumentedAttribute
98
from sqlalchemy.sql.roles import WhereHavingRole
10-
11-
import reflex as rx
9+
from sqlmodel import and_, not_, or_
10+
from sqlmodel.sql.expression import SelectOfScalar
1211

1312
M = TypeVar("M", bound=rx.Model)
1413

@@ -32,7 +31,7 @@ def handle_text_filter(value, filter_def) -> bool:
3231
return not value
3332
if type == "notBlank":
3433
return bool(value)
35-
assert False, f"type {type} does not exist"
34+
raise TypeError(f"type {type} does not exist")
3635

3736

3837
def handle_number_filter(value, filter_def) -> bool:
@@ -57,7 +56,7 @@ def handle_number_filter(value, filter_def) -> bool:
5756
if type == "notBlank":
5857
return bool(value)
5958

60-
assert False, f"type {type} does not exist"
59+
raise TypeError(f"type {type} does not exist")
6160

6261

6362
def handle_filter_def(value, filter_def) -> bool:
@@ -85,13 +84,14 @@ def handle_filter_def(value, filter_def) -> bool:
8584
def handle_filter_model(row, filter_model) -> bool:
8685
if not filter_model:
8786
return True
88-
for field, filter_def in filter_model.items():
89-
try:
87+
field, filter_def = None, None
88+
try:
89+
for field, filter_def in filter_model.items():
9090
if not handle_filter_def(row[field], filter_def):
9191
return False
92-
except Exception as e:
93-
print(f"Error filtering {field} of {row}: {e}")
94-
return False
92+
except Exception as e:
93+
print(f"Error filtering {field} of {row}: {e}") # noqa: T201
94+
return False
9595
return True
9696

9797

@@ -122,7 +122,7 @@ def where_text_filter(
122122
return or_(value == None, value == "") # noqa: E711
123123
if type == "notBlank":
124124
return and_(value != None, value != "") # noqa: E711
125-
assert False, f"type {type} does not exist"
125+
raise TypeError(f"type {type} does not exist")
126126

127127

128128
def where_number_filter(
@@ -160,7 +160,7 @@ def where_number_filter(
160160
if type == "notBlank":
161161
return value != None # noqa: E711
162162

163-
assert False, f"type {type} does not exist"
163+
raise TypeError(f"type {type} does not exist")
164164

165165

166166
def where_filter_def(

custom_components/reflex_ag_grid/wrapper.py

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@
77
import json
88
from typing import Any, ClassVar, Generic, Type
99

10+
import reflex as rx
1011
from fastapi import Request
1112
from sqlmodel import col, func, select
1213

13-
import reflex as rx
14-
15-
from reflex_ag_grid.ag_grid import ag_grid, ColumnDef
14+
from reflex_ag_grid.ag_grid import ColumnDef, ag_grid
1615
from reflex_ag_grid.datasource import Datasource
17-
from reflex_ag_grid.handlers import apply_filter_model, apply_sort_model, M
16+
from reflex_ag_grid.handlers import M, apply_filter_model, apply_sort_model
1817

1918

2019
def _value_setter_signature(
@@ -41,12 +40,12 @@ def get_default_column_def(
4140
Returns:
4241
The column definition.
4342
"""
44-
_cdef_kwargs = dict(
45-
sortable=True,
46-
filter=True,
47-
editable=True if value_setter is not None else False,
48-
cell_editor=ag_grid.editors.text,
49-
)
43+
_cdef_kwargs = {
44+
"sortable": True,
45+
"filter": True,
46+
"editable": value_setter is not None,
47+
"cell_editor": ag_grid.editors.text,
48+
}
5049
_cdef_kwargs.update(cdef_kwargs)
5150
cdef = ag_grid.column_def(
5251
field=field,
@@ -100,17 +99,17 @@ def _add_data_route(cls):
10099
The backend route will call the _get_data method to fetch the data.
101100
"""
102101
app = rx.utils.prerequisites.get_app().app
103-
if cls.__data_route__ in app.api.routes:
102+
if cls.__data_route__ in app._api.routes:
104103
return
105104

106-
@app.api.get(cls.__data_route__)
105+
@app._api.get(cls.__data_route__)
107106
async def get_data(
108107
request: Request,
109108
state: str,
110109
start: int,
111110
end: int,
112-
filter_model: str = None,
113-
sort_model: str = None,
111+
filter_model: str | None = None,
112+
sort_model: str | None = None,
114113
):
115114
try:
116115
token = request.headers["X-Reflex-Client-Token"]
@@ -204,13 +203,13 @@ def get_component(cls, *children, **props) -> rx.Component:
204203
Returns:
205204
The Ag-Grid component.
206205
"""
207-
_props = dict(
208-
id=f"ag-grid-{cls.get_full_name()}",
209-
default_col_def={"flex": 1},
210-
max_blocks_in_cache=4,
211-
cache_block_size=50,
212-
group_default_expanded=None,
213-
)
206+
_props = {
207+
"id": f"ag-grid-{cls.get_full_name()}",
208+
"default_col_def": {"flex": 1},
209+
"max_blocks_in_cache": 4,
210+
"cache_block_size": 50,
211+
"group_default_expanded": None,
212+
}
214213
_props.update(props)
215214
return ag_grid.root(
216215
*children,
@@ -333,7 +332,7 @@ def _get_column_defs(self) -> list[ColumnDef]:
333332
field=field.name,
334333
ftype=field.type_,
335334
value_setter=type(self).on_value_setter,
336-
editable=True if field.name != "id" else False,
335+
editable=field.name != "id",
337336
)
338337
for field in self._model_class.__fields__.values()
339338
]

pyproject.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,17 @@ dev = ["build", "twine"]
2727

2828
[tool.setuptools.packages.find]
2929
where = ["custom_components"]
30+
31+
[tool.ruff]
32+
target-version = "py310"
33+
output-format = "concise"
34+
lint.isort.split-on-trailing-comma = false
35+
lint.select = ["B", "C4", "E", "ERA", "F", "FURB", "I", "N", "PERF", "PTH", "RUF", "SIM", "T", "TRY", "W"]
36+
lint.ignore = ["B008", "D205", "E501", "F403", "SIM115", "RUF006", "RUF008", "RUF012", "TRY0"]
37+
lint.pydocstyle.convention = "google"
38+
include = ["custom_components/**/*.py", "ag_grid_demo/**/*.py"]
39+
40+
[tool.ruff.lint.per-file-ignores]
41+
"__init__.py" = ["F401"]
42+
"env.py" = ["ALL"]
43+
"*/alembic/*" = ["ALL"]

0 commit comments

Comments
 (0)