Skip to content

Commit a550390

Browse files
committed
feat: use ruff for codegen
1 parent 16518bf commit a550390

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

reacton/generate.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from textwrap import indent
66
from typing import Any, Dict, Generic, Type, TypeVar
77

8-
import black
98
import bqplot
109
import ipywidgets
1110
import ipywidgets as widgets # type: ignore
@@ -106,9 +105,28 @@ def get_element_class(self, cls):
106105
def get_ignore_props(self, cls):
107106
return self.ignore_props
108107

108+
# Replicated from https://gist.github.com/shner-elmo/b2639a4d1e04ceafaad120acfb31213c
109+
def ruff_format(self, code: str) -> str:
110+
import subprocess
111+
from ruff.__main__ import find_ruff_bin
112+
113+
ruff_args = [
114+
find_ruff_bin(),
115+
"format",
116+
"--stdin-filename",
117+
"foo.py", # you can pass any random string, it wont use it...
118+
# these two lines are optional, but this is how you can pass the config for ruff
119+
"--line-length",
120+
f"{MAX_LINE_LENGTH}",
121+
]
122+
proc = subprocess.run(ruff_args, input=code, text=True, capture_output=True)
123+
proc.check_returncode() # raise an Exception if return code is not 0
124+
return proc.stdout
125+
109126
def generate_component(self, cls: Type[widgets.Widget], blacken=True):
110127
element_class_name = self.get_element_class(cls).__name__
111128
ignore = self.get_ignore_props(cls)
129+
112130
traits = {key: value for key, value in cls.class_traits().items() if "output" not in value.metadata and not key.startswith("_") and key not in ignore}
113131

114132
def has_default(trait):
@@ -293,9 +311,8 @@ def {{ method_name }}(**kwargs):
293311
)
294312

295313
if blacken:
296-
mode = black.Mode(line_length=MAX_LINE_LENGTH)
297314
try:
298-
code = black.format_file_contents(code, fast=False, mode=mode)
315+
code = self.ruff_format(code)
299316
except Exception:
300317
print("code:\n", code)
301318
raise
@@ -325,10 +342,7 @@ def generate(self, path, blacken=True):
325342
raise ValueError(f"Could not find new line after marker: {marker!r}")
326343
code_total = current_code[: start + 1] + "\n" + code
327344
if blacken:
328-
import black
329-
330-
mode = black.Mode(line_length=MAX_LINE_LENGTH)
331-
code_total = black.format_file_contents(code_total, fast=False, mode=mode)
345+
code_total = self.ruff_format(code_total)
332346
only_valid = True
333347
if only_valid:
334348
try:

reacton/generate_test.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ def _MyTest(
2222
2323
@implements(_MyTest)
2424
def MyTest(**kwargs):
25-
2625
widget_cls = reacton.generate_test.MyTest
2726
comp = reacton.core.ComponentWidget(widget=widget_cls)
2827
return Element(comp, kwargs=kwargs)
2928
3029
3130
del _MyTest
3231
'''
32+
if code.strip() != code_expected.strip():
33+
print(code)
3334
assert code.strip() == code_expected.strip()
3435

3536

0 commit comments

Comments
 (0)