Skip to content

Commit 11b590c

Browse files
feat: use hosted ruff configuration
1 parent 0596578 commit 11b590c

File tree

2 files changed

+23
-11294
lines changed

2 files changed

+23
-11294
lines changed

monty/exts/info/ruff.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import datetime
33
import itertools
44
import json
5-
import pathlib
65
import random
76
import re
87
from functools import cache
@@ -14,7 +13,6 @@
1413
import rapidfuzz.process
1514
from disnake.ext import commands, tasks
1615

17-
import monty.resources
1816
from monty import constants
1917
from monty.bot import Monty
2018
from monty.log import get_logger
@@ -25,7 +23,7 @@
2523
logger = get_logger(__name__)
2624

2725

28-
RUFF_RULES = monty.resources.folder / "ruff_rules.json"
26+
RUFF_RULES = "https://raw.githubusercontent.com/onerandomusername/ruff-rules/refs/heads/main/rules.json"
2927

3028
RUFF_RULES_BASE_URL = "https://docs.astral.sh/ruff/rules"
3129

@@ -136,23 +134,22 @@ def cog_unload(self) -> None:
136134
self.update_rules.cancel()
137135

138136
async def _fetch_rules(self) -> Any:
139-
if isinstance(RUFF_RULES, pathlib.Path):
140-
with open(RUFF_RULES, "r") as f:
141-
return json.load(f)
142137
async with self.bot.http_session.get(RUFF_RULES) as response:
143-
if response.status == 200 and response.content_type == "application/json":
144-
return await response.json()
138+
if response.status == 200:
139+
return json.loads(await response.text())
145140
return None
146141

147-
@tasks.loop(hours=1)
142+
@tasks.loop(minutes=10)
148143
# @async_cached(cache=LRUMemoryCache(25, timeout=int(datetime.timedelta(hours=2).total_seconds())))
149144
async def update_rules(self) -> Optional[dict[str, Any]]:
150145
"""Fetch Ruff rules."""
151146
raw_rules = await self._fetch_rules()
152-
new_rules = dict[str, Rule]()
153147
if not raw_rules:
154148
logger.error("Failed to fetch rules, something went wrong")
149+
self.last_fetched = utcnow() # don't try again for an hour
155150
return
151+
152+
new_rules = dict[str, Rule]()
156153
for unparsed_rule in raw_rules:
157154
parsed_rule = Rule(**unparsed_rule)
158155
new_rules[parsed_rule.code] = parsed_rule
@@ -279,8 +276,10 @@ async def _legacy_embed(self, inter: disnake.ApplicationCommandInteraction, rule
279276
async def ruff_rule_autocomplete(self, inter: disnake.ApplicationCommandInteraction, option: str) -> dict[str, str]:
280277
"""Provide autocomplete for ruff rules."""
281278
# return dict(sorted([[code, code] for code, rule in self.rules.items()])[:25])
282-
option = option.upper().strip()
279+
if not self.rules:
280+
return {}
283281

282+
option = option.upper().strip()
284283
if not option:
285284
return {rule.code_with_name: rule.code for rule in random.choices(list(self.rules.values()), k=12)}
286285

@@ -316,6 +315,19 @@ class Fake:
316315

317316
return matches
318317

318+
def check_ruff_rules_loaded(self, inter: disnake.ApplicationCommandInteraction) -> bool:
319+
"""A check for all commands in this cog."""
320+
if not self.rules:
321+
raise commands.CommandError("Ruff rules have not been loaded yet, please try again later.")
322+
return True
323+
324+
def cog_slash_command_check(self, inter: disnake.ApplicationCommandInteraction) -> bool:
325+
"""A check for all commands in this cog."""
326+
if inter.application_command.qualified_name.startswith("ruff rule"):
327+
return self.check_ruff_rules_loaded(inter)
328+
329+
return True
330+
319331

320332
def setup(bot: Monty) -> None:
321333
"""Load the Ruff cog."""

0 commit comments

Comments
 (0)