Skip to content

Commit c27644d

Browse files
committed
switch to ruff
1 parent c3640ef commit c27644d

File tree

9 files changed

+116
-169
lines changed

9 files changed

+116
-169
lines changed

.pre-commit-config.yaml

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ repos:
1313
hooks:
1414
- id: prettier
1515
exclude: "main.*"
16-
- repo: https://github.com/ambv/black
17-
rev: "23.3.0"
18-
hooks:
19-
- id: black
2016
- repo: https://github.com/lovesegfault/beautysh
2117
rev: "v6.2.1"
2218
hooks:
@@ -25,3 +21,17 @@ repos:
2521
rev: "v1.30.0"
2622
hooks:
2723
- id: yamllint
24+
- repo: https://github.com/PyCQA/flake8
25+
rev: 7.0.0
26+
hooks:
27+
- id: flake8
28+
args: [--max-line-length=140]
29+
- repo: https://github.com/astral-sh/ruff-pre-commit
30+
# Ruff version.
31+
rev: "v0.4.4"
32+
hooks:
33+
# Run the linter.
34+
- id: ruff
35+
args: [--fix]
36+
# Run the formatter.
37+
- id: ruff-format

pyproject.toml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,36 @@ black = "^23.3.0"
2626
[build-system]
2727
requires = ["poetry-core"]
2828
build-backend = "poetry.core.masonry.api"
29+
30+
[tool.ruff]
31+
line-length = 140
32+
preview = true
33+
34+
exclude = ["*_v?.py", "tests", "scripts", "sample_extension", ".git"]
35+
36+
37+
[tool.ruff.lint]
38+
fixable = ["ALL"]
39+
ignore = ["E203", "D107", "D105"]
40+
select = [
41+
# pycodestyle
42+
"E",
43+
"D",
44+
# Pyflakes
45+
"F",
46+
# pyupgrade
47+
"UP",
48+
# flake8-bugbear
49+
"B",
50+
# flake8-simplify
51+
"SIM",
52+
# isort
53+
"I",
54+
"W"
55+
]
56+
[tool.ruff.format]
57+
indent-style = "space"
58+
line-ending = "auto"
59+
60+
[tool.ruff.lint.pydocstyle]
61+
convention = "google"

src/wlr_layout_ui/__init__.py

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def main():
2424
profiles = load_profiles()
2525
if sys.argv[1] == "-l":
2626
print("")
27-
for p in profiles.keys():
27+
for p in profiles:
2828
print(f" - {p}")
2929
elif sys.argv[1][0] == "-":
3030
load()
@@ -41,7 +41,7 @@ def main():
4141
try:
4242
profile = profiles[sys.argv[1]]
4343
except KeyError:
44-
print("No such profile: %s" % sys.argv[1])
44+
print(f"No such profile: {sys.argv[1]}")
4545
raise SystemExit(1)
4646
load()
4747
p_by_id = {p["uid"]: p for p in profile}
@@ -67,35 +67,13 @@ def main():
6767
print("Failed applying the layout")
6868
sys.exit(0)
6969
load()
70-
max_width = int(
71-
sum(
72-
max(screen.available, key=lambda mode: mode.width).width
73-
for screen in displayInfo
74-
)
75-
// UI_RATIO
76-
)
77-
max_height = int(
78-
sum(
79-
max(screen.available, key=lambda mode: mode.height).height
80-
for screen in displayInfo
81-
)
82-
// UI_RATIO
83-
)
70+
max_width = int(sum(max(screen.available, key=lambda mode: mode.width).width for screen in displayInfo) // UI_RATIO)
71+
max_height = int(sum(max(screen.available, key=lambda mode: mode.height).height for screen in displayInfo) // UI_RATIO)
8472
average_width = int(
85-
sum(
86-
max(screen.available, key=lambda mode: mode.width).width
87-
for screen in displayInfo
88-
)
89-
/ len(displayInfo)
90-
// UI_RATIO
73+
sum(max(screen.available, key=lambda mode: mode.width).width for screen in displayInfo) / len(displayInfo) // UI_RATIO
9174
)
9275
average_height = int(
93-
sum(
94-
max(screen.available, key=lambda mode: mode.height).height
95-
for screen in displayInfo
96-
)
97-
/ len(displayInfo)
98-
// UI_RATIO
76+
sum(max(screen.available, key=lambda mode: mode.height).height for screen in displayInfo) / len(displayInfo) // UI_RATIO
9977
)
10078

10179
width = max_width + average_width * 2

src/wlr_layout_ui/displaywidget.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def limit_size(text):
1818

1919
class GuiScreen(Widget):
2020
def __repr__(self):
21-
return "<Screen %s (%s) - %s>" % (self.rect, self.color, self.screen.name)
21+
return f"<Screen {self.rect} ({self.color}) - {self.screen.name}>"
2222

2323
__str__ = __repr__
2424

src/wlr_layout_ui/factories.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ def makeRectangle(x, y, w, h, color):
1515

1616

1717
@cache
18-
def makeLabel(text, x, y, color=[0, 0, 0], **kw):
18+
def makeLabel(text, x, y, color=None, **kw):
19+
if color is None:
20+
color = [0, 0, 0]
1921
return Label(text, x=x, y=y, color=color, **kw)

src/wlr_layout_ui/gui.py

Lines changed: 33 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,7 @@
77
from .displaywidget import GuiScreen
88
from .profiles import load_profiles, save_profile
99
from .screens import displayInfo, load
10-
from .settings import (
11-
ALLOW_DESELECT,
12-
FONT,
13-
LEGACY,
14-
PROG_NAME,
15-
UI_RATIO,
16-
WINDOW_MARGIN,
17-
reload_pre_commands,
18-
)
10+
from .settings import ALLOW_DESELECT, FONT, LEGACY, PROG_NAME, UI_RATIO, WINDOW_MARGIN, reload_pre_commands
1911
from .utils import (
2012
Rect,
2113
compute_bounding_box,
@@ -42,11 +34,12 @@ def get_closest_match(float_list, value):
4234

4335

4436
def get_size(screen, scale=0):
45-
"Get the size of the window based on the screen size and UI_RATIO"
37+
"""Get the size of the window based on the screen size and UI_RATIO."""
4638
if not scale:
4739
scale = UI_RATIO
48-
w, h = ((screen.mode.width / scale) / screen.scale), (
49-
(screen.mode.height / scale) / screen.scale
40+
w, h = (
41+
((screen.mode.width / scale) / screen.scale),
42+
((screen.mode.height / scale) / screen.scale),
5043
)
5144
if screen.transform in (1, 3, 5, 7):
5245
return (h, w)
@@ -63,9 +56,7 @@ def __init__(self, width, height):
6356
self.text_input: str | None = None
6457
self.error_message = ""
6558
self.error_message_duration = 0
66-
self.require_selected_item: set[Widget] = (
67-
set()
68-
) # Items that can't be displayed without a selection
59+
self.require_selected_item: set[Widget] = set() # Items that can't be displayed without a selection
6960

7061
but_w = 120
7162
but_h = 28
@@ -217,7 +208,7 @@ def __init__(self, width, height):
217208
self.set_current_modes_as_ref()
218209

219210
def set_current_modes_as_ref(self):
220-
"Set original cmd to allow reverting the selected mode"
211+
"""Set original cmd to allow reverting the selected mode."""
221212
self.original_cmd = make_command(
222213
[s.screen for s in self.gui_screens],
223214
[s.rect.scaled(UI_RATIO) for s in self.gui_screens],
@@ -234,9 +225,7 @@ def set_error(self, message, duration=200):
234225

235226
def sync_profiles(self):
236227
self.profiles = load_profiles()
237-
self.profile_list.options = [
238-
{"name": k, "value": v} for k, v in self.profiles.items()
239-
]
228+
self.profile_list.options = [{"name": k, "value": v} for k, v in self.profiles.items()]
240229

241230
def set_text_input(self, action):
242231
self.validate_text_input = action
@@ -255,10 +244,7 @@ def load_screens(self):
255244
max_width = max(m.width for m in screen.available)
256245
max_height = max(m.height for m in screen.available)
257246

258-
is_rotated = screen.transform in (1, 3, 5, 7)
259-
260247
if screen.mode:
261-
262248
w, h = get_size(screen)
263249
rect = Rect(
264250
int(x / UI_RATIO),
@@ -299,9 +285,7 @@ def center_layout(self, immediate=False):
299285
offY = (win_res[1] // 2) - avg_y
300286
for screen in self.gui_screens:
301287
if immediate:
302-
screen.set_position(
303-
screen.target_rect.x + offX, screen.target_rect.y + offY
304-
)
288+
screen.set_position(screen.target_rect.x + offX, screen.target_rect.y + offY)
305289
else:
306290
screen.target_rect.x = screen.target_rect.x + offX
307291
screen.target_rect.y = screen.target_rect.y + offY
@@ -358,10 +342,7 @@ def distance(point1: tuple[int, int], point2: tuple[int, int]):
358342
closest_match = None
359343
for coord in active_screen_coords:
360344
for other_screen_coord in other_screen_coords:
361-
if (
362-
min_distance is None
363-
or distance(coord, other_screen_coord) < min_distance
364-
):
345+
if min_distance is None or distance(coord, other_screen_coord) < min_distance:
365346
min_distance = distance(coord, other_screen_coord)
366347
closest_match = other_screen_coord, coord
367348
assert closest_match is not None
@@ -443,9 +424,7 @@ def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
443424
self.cursor_coords = (x, y)
444425

445426
if self.selected_item and self.selected_item.dragging:
446-
self.selected_item.set_position(
447-
self.selected_item.rect.x + dx, self.selected_item.rect.y + dy
448-
)
427+
self.selected_item.set_position(self.selected_item.rect.x + dx, self.selected_item.rect.y + dy)
449428

450429
def on_resize(self, width, height):
451430
pyglet.window.Window.on_resize(self, width, height)
@@ -505,10 +484,8 @@ def draw_countdown(self):
505484
lbl2.draw()
506485

507486
def draw_text_input(self):
508-
w, h = self.get_size()
509-
pyglet.text.Label(
510-
"Profile name: ", font_size=24, x=10, y=h // 2 + 40, align="left"
511-
).draw()
487+
_w, h = self.get_size()
488+
pyglet.text.Label("Profile name: ", font_size=24, x=10, y=h // 2 + 40, align="left").draw()
512489
text = self.text_input
513490
if int(time.time() * 1.5) % 2:
514491
text += "_"
@@ -538,9 +515,7 @@ def draw_screens_and_widgets(self):
538515
def on_draw(self):
539516
self.clear()
540517
# Draw a grey background
541-
pyglet.shapes.Rectangle(
542-
0, 0, self.width, self.height, color=(50, 50, 50, 255)
543-
).draw()
518+
pyglet.shapes.Rectangle(0, 0, self.width, self.height, color=(50, 50, 50, 255)).draw()
544519

545520
# Higher priority modes
546521
if self.text_input is not None:
@@ -587,26 +562,22 @@ def action_reload(self):
587562
self.center_layout(immediate=True)
588563

589564
def get_profile_data(self):
590-
screens_rect = [
591-
screen.target_rect.scaled(UI_RATIO) for screen in self.gui_screens
592-
]
565+
screens_rect = [screen.target_rect.scaled(UI_RATIO) for screen in self.gui_screens]
593566
trim_rects_flip_y(screens_rect)
594567
ret = []
595568
for rect, gs in zip(screens_rect, self.gui_screens):
596569
assert gs.screen.mode
597-
ret.append(
598-
{
599-
"active": gs.screen.active,
600-
"width": gs.screen.mode.width,
601-
"height": gs.screen.mode.height,
602-
"freq": gs.screen.mode.freq,
603-
"x": rect.x,
604-
"y": rect.y,
605-
"uid": gs.screen.uid,
606-
"scale": gs.screen.scale,
607-
"transform": gs.screen.transform,
608-
}
609-
)
570+
ret.append({
571+
"active": gs.screen.active,
572+
"width": gs.screen.mode.width,
573+
"height": gs.screen.mode.height,
574+
"freq": gs.screen.mode.freq,
575+
"x": rect.x,
576+
"y": rect.y,
577+
"uid": gs.screen.uid,
578+
"scale": gs.screen.scale,
579+
"transform": gs.screen.transform,
580+
})
610581
return ret
611582

612583
def action_save_new_profile(self):
@@ -617,9 +588,7 @@ def action_save_new_profile(self):
617588

618589
def action_save_profile(self):
619590
if self.profile_list.options:
620-
save_profile(
621-
self.profile_list.get_selected_option()["name"], self.get_profile_data()
622-
)
591+
save_profile(self.profile_list.get_selected_option()["name"], self.get_profile_data())
623592
self.sync_profiles()
624593
else:
625594
self.set_error("No profile selected!")
@@ -660,10 +629,7 @@ def action_update_scale(self):
660629
monitor.target_rect.width, monitor.target_rect.height = get_size(monitor.screen)
661630

662631
def action_update_frequencies(self, screen, mode=None):
663-
if mode is None:
664-
cur_mode = screen.screen.mode.width, screen.screen.mode.height
665-
else:
666-
cur_mode = mode
632+
cur_mode = (screen.screen.mode.width, screen.screen.mode.height) if mode is None else mode
667633
freqs = sorted_frequencies(screen.screen.available, cur_mode[0], cur_mode[1])
668634
self.freqs.options = [{"name": f"{r:.2f} Hz", "value": r} for r in freqs]
669635
if mode is None:
@@ -688,12 +654,10 @@ def action_toggle_screen_power(self):
688654
self.selected_item.screen.active = not self.selected_item.screen.active
689655

690656
def action_update_rotation(self):
691-
"Update the rotation of the selected screen"
657+
"""Update the rotation of the selected screen."""
692658
assert self.selected_item
693659
self.selected_item.screen.transform = self.rotation.get_value()
694-
self.selected_item.target_rect.width, self.selected_item.target_rect.height = (
695-
get_size(self.selected_item.screen)
696-
)
660+
self.selected_item.target_rect.width, self.selected_item.target_rect.height = get_size(self.selected_item.screen)
697661

698662
def action_update_screen_spec(self):
699663
self.action_update_frequencies(self.selected_item, self.resolutions.get_value())
@@ -703,9 +667,7 @@ def action_update_screen_spec(self):
703667
def action_update_mode(self):
704668
assert self.selected_item
705669
screen = self.selected_item.screen
706-
screen.mode = find_matching_mode(
707-
screen.available, self.resolutions.get_value(), self.freqs.get_value()
708-
)
670+
screen.mode = find_matching_mode(screen.available, self.resolutions.get_value(), self.freqs.get_value())
709671
self.selected_item.target_rect.width = screen.mode.width // UI_RATIO
710672
self.selected_item.target_rect.height = screen.mode.height // UI_RATIO
711673

@@ -719,14 +681,10 @@ def action_select_screen(self, screen):
719681
cur_mode = screen.screen.mode
720682
# Update resolution
721683
res = sorted_resolutions(screen.screen.available)
722-
self.resolutions.options = [
723-
{"name": f"{r[0]} x {r[1]}", "value": r} for r in res
724-
]
684+
self.resolutions.options = [{"name": f"{r[0]} x {r[1]}", "value": r} for r in res]
725685
self.rotation.selected_index = screen.screen.transform
726686
values = [o["value"] for o in self.scale_ratio.options]
727-
self.scale_ratio.selected_index = values.index(
728-
get_closest_match(values, screen.screen.scale)
729-
)
687+
self.scale_ratio.selected_index = values.index(get_closest_match(values, screen.screen.scale))
730688
i = -1
731689
for i, r in enumerate(res):
732690
if r[0] == cur_mode.width and r[1] == cur_mode.height:

0 commit comments

Comments
 (0)