diff --git a/pyproject.toml b/pyproject.toml index 9a4a91a7e..131684724 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -246,6 +246,8 @@ extend-select = [ "Q", # flake8-return "RET", + # flake8-raise + "RSE", # flake8-bandit "S", # flake8-slots diff --git a/scrapy/commands/crawl.py b/scrapy/commands/crawl.py index 0d71ab6c6..86d4cc41c 100644 --- a/scrapy/commands/crawl.py +++ b/scrapy/commands/crawl.py @@ -22,7 +22,7 @@ class Command(BaseRunSpiderCommand): def run(self, args: list[str], opts: argparse.Namespace) -> None: if len(args) < 1: - raise UsageError() + raise UsageError if len(args) > 1: raise UsageError( "running 'scrapy crawl' with more than one spider is not supported" diff --git a/scrapy/commands/edit.py b/scrapy/commands/edit.py index 0e046cece..d153a5271 100644 --- a/scrapy/commands/edit.py +++ b/scrapy/commands/edit.py @@ -28,7 +28,7 @@ class Command(ScrapyCommand): def run(self, args: list[str], opts: argparse.Namespace) -> None: if len(args) != 1: - raise UsageError() + raise UsageError editor = self.settings["EDITOR"] assert self.crawler_process diff --git a/scrapy/commands/fetch.py b/scrapy/commands/fetch.py index 05e5e53e9..8a8d04ff6 100644 --- a/scrapy/commands/fetch.py +++ b/scrapy/commands/fetch.py @@ -68,7 +68,7 @@ class Command(ScrapyCommand): def run(self, args: list[str], opts: Namespace) -> None: if len(args) != 1 or not is_url(args[0]): - raise UsageError() + raise UsageError request = Request( args[0], callback=self._print_response, diff --git a/scrapy/commands/genspider.py b/scrapy/commands/genspider.py index 38f917c7e..d7dc104c2 100644 --- a/scrapy/commands/genspider.py +++ b/scrapy/commands/genspider.py @@ -101,7 +101,7 @@ class Command(ScrapyCommand): print(template_file.read_text(encoding="utf-8")) return if len(args) != 2: - raise UsageError() + raise UsageError name, url = args[0:2] url = verify_url_scheme(url) diff --git a/scrapy/commands/parse.py b/scrapy/commands/parse.py index 62d094411..cc5c1350b 100644 --- a/scrapy/commands/parse.py +++ b/scrapy/commands/parse.py @@ -399,7 +399,7 @@ class Command(BaseRunSpiderCommand): def run(self, args: list[str], opts: argparse.Namespace) -> None: # parse arguments if not len(args) == 1 or not is_url(args[0]): - raise UsageError() + raise UsageError url = args[0] # prepare spidercls diff --git a/scrapy/commands/runspider.py b/scrapy/commands/runspider.py index 55211f8d7..bf8e41020 100644 --- a/scrapy/commands/runspider.py +++ b/scrapy/commands/runspider.py @@ -43,7 +43,7 @@ class Command(BaseRunSpiderCommand): def run(self, args: list[str], opts: argparse.Namespace) -> None: if len(args) != 1: - raise UsageError() + raise UsageError filename = Path(args[0]) if not filename.exists(): raise UsageError(f"File not found: {filename}\n") diff --git a/scrapy/commands/startproject.py b/scrapy/commands/startproject.py index 6da877610..5cb73f0d2 100644 --- a/scrapy/commands/startproject.py +++ b/scrapy/commands/startproject.py @@ -92,7 +92,7 @@ class Command(ScrapyCommand): def run(self, args: list[str], opts: argparse.Namespace) -> None: if len(args) not in (1, 2): - raise UsageError() + raise UsageError project_name = args[0] diff --git a/scrapy/core/scheduler.py b/scrapy/core/scheduler.py index f09d1903c..823677175 100644 --- a/scrapy/core/scheduler.py +++ b/scrapy/core/scheduler.py @@ -98,7 +98,7 @@ class BaseScheduler(metaclass=BaseSchedulerMeta): """ ``True`` if the scheduler has enqueued requests, ``False`` otherwise """ - raise NotImplementedError() + raise NotImplementedError @abstractmethod def enqueue_request(self, request: Request) -> bool: @@ -112,7 +112,7 @@ class BaseScheduler(metaclass=BaseSchedulerMeta): For reference, the default Scrapy scheduler returns ``False`` when the request is rejected by the dupefilter. """ - raise NotImplementedError() + raise NotImplementedError @abstractmethod def next_request(self) -> Request | None: @@ -124,7 +124,7 @@ class BaseScheduler(metaclass=BaseSchedulerMeta): to the downloader in the current reactor cycle. The engine will continue calling ``next_request`` until ``has_pending_requests`` is ``False``. """ - raise NotImplementedError() + raise NotImplementedError class Scheduler(BaseScheduler): diff --git a/scrapy/pipelines/media.py b/scrapy/pipelines/media.py index 691a1cbf2..b16f1cb84 100644 --- a/scrapy/pipelines/media.py +++ b/scrapy/pipelines/media.py @@ -293,12 +293,12 @@ class MediaPipeline(ABC): self, request: Request, info: SpiderInfo, *, item: Any = None ) -> Deferred[FileInfo | None]: """Check request before starting download""" - raise NotImplementedError() + raise NotImplementedError @abstractmethod def get_media_requests(self, item: Any, info: SpiderInfo) -> list[Request]: """Returns the media requests to download""" - raise NotImplementedError() + raise NotImplementedError @abstractmethod def media_downloaded( @@ -310,14 +310,14 @@ class MediaPipeline(ABC): item: Any = None, ) -> FileInfo: """Handler for success downloads""" - raise NotImplementedError() + raise NotImplementedError @abstractmethod def media_failed( self, failure: Failure, request: Request, info: SpiderInfo ) -> NoReturn: """Handler for failed downloads""" - raise NotImplementedError() + raise NotImplementedError def item_completed( self, results: list[FileInfoOrError], item: Any, info: SpiderInfo @@ -345,4 +345,4 @@ class MediaPipeline(ABC): item: Any = None, ) -> str: """Returns the path where downloaded media should be stored""" - raise NotImplementedError() + raise NotImplementedError diff --git a/scrapy/resolver.py b/scrapy/resolver.py index 0e8260736..f5f00ab0f 100644 --- a/scrapy/resolver.py +++ b/scrapy/resolver.py @@ -76,7 +76,7 @@ class HostResolution: self.name: str = name def cancel(self) -> None: - raise NotImplementedError() + raise NotImplementedError @provider(IResolutionReceiver) diff --git a/scrapy/spidermiddlewares/referer.py b/scrapy/spidermiddlewares/referer.py index 720217c97..93b7fcf17 100644 --- a/scrapy/spidermiddlewares/referer.py +++ b/scrapy/spidermiddlewares/referer.py @@ -51,7 +51,7 @@ class ReferrerPolicy: name: str def referrer(self, response_url: str, request_url: str) -> str | None: - raise NotImplementedError() + raise NotImplementedError def stripped_referrer(self, url: str) -> str | None: if urlparse(url).scheme not in self.NOREFERRER_SCHEMES: diff --git a/tests/test_addons.py b/tests/test_addons.py index 775f629b3..17949997c 100644 --- a/tests/test_addons.py +++ b/tests/test_addons.py @@ -64,7 +64,7 @@ class AddonManagerTest(unittest.TestCase): def test_notconfigured(self): class NotConfiguredAddon: def update_settings(self, settings): - raise NotConfigured() + raise NotConfigured settings_dict = { "ADDONS": {NotConfiguredAddon: 0}, diff --git a/tests/test_downloader_handlers.py b/tests/test_downloader_handlers.py index 6a7597e9f..3fcba4ef2 100644 --- a/tests/test_downloader_handlers.py +++ b/tests/test_downloader_handlers.py @@ -894,7 +894,7 @@ class S3TestCase(unittest.TestCase): except Exception as e: self.assertIsInstance(e, (TypeError, NotConfigured)) else: - raise AssertionError() + raise AssertionError def test_request_signing1(self): # gets an object from the johnsmith bucket. diff --git a/tests/test_downloadermiddleware.py b/tests/test_downloadermiddleware.py index 8987a76fb..e650b4936 100644 --- a/tests/test_downloadermiddleware.py +++ b/tests/test_downloadermiddleware.py @@ -178,7 +178,7 @@ class ProcessExceptionInvalidOutput(ManagerTestCase): class InvalidProcessExceptionMiddleware: def process_request(self, request, spider): - raise Exception() + raise Exception def process_exception(self, request, exception, spider): return 1 diff --git a/tests/test_downloadermiddleware_httpcompression.py b/tests/test_downloadermiddleware_httpcompression.py index 934af6590..78d0dd99d 100644 --- a/tests/test_downloadermiddleware_httpcompression.py +++ b/tests/test_downloadermiddleware_httpcompression.py @@ -59,7 +59,7 @@ class HttpCompressionTest(TestCase): def _getresponse(self, coding): if coding not in FORMAT: - raise ValueError() + raise ValueError samplefile, contentencoding = FORMAT[coding] diff --git a/tests/test_spidermiddleware.py b/tests/test_spidermiddleware.py index 1aca0fe54..af3b7543d 100644 --- a/tests/test_spidermiddleware.py +++ b/tests/test_spidermiddleware.py @@ -78,7 +78,7 @@ class ProcessSpiderExceptionInvalidOutput(SpiderMiddlewareTestCase): class RaiseExceptionProcessSpiderOutputMiddleware: def process_spider_output(self, response, result, spider): - raise Exception() + raise Exception self.mwman._add_middleware(InvalidProcessSpiderOutputExceptionMiddleware()) self.mwman._add_middleware(RaiseExceptionProcessSpiderOutputMiddleware()) diff --git a/tests/test_spidermiddleware_output_chain.py b/tests/test_spidermiddleware_output_chain.py index 670c41f2b..4c19d167f 100644 --- a/tests/test_spidermiddleware_output_chain.py +++ b/tests/test_spidermiddleware_output_chain.py @@ -43,7 +43,7 @@ class RecoverySpider(Spider): yield {"test": 1} self.logger.info("DONT_FAIL: %s", response.meta.get("dont_fail")) if not response.meta.get("dont_fail"): - raise TabError() + raise TabError class RecoveryAsyncGenSpider(RecoverySpider): @@ -59,7 +59,7 @@ class RecoveryAsyncGenSpider(RecoverySpider): class FailProcessSpiderInputMiddleware: def process_spider_input(self, response, spider): spider.logger.info("Middleware: will raise IndexError") - raise IndexError() + raise IndexError class ProcessSpiderInputSpiderWithoutErrback(Spider): @@ -109,14 +109,14 @@ class GeneratorCallbackSpider(Spider): def parse(self, response): yield {"test": 1} yield {"test": 2} - raise ImportError() + raise ImportError class AsyncGeneratorCallbackSpider(GeneratorCallbackSpider): async def parse(self, response): yield {"test": 1} yield {"test": 2} - raise ImportError() + raise ImportError # ================================================================================ @@ -176,7 +176,7 @@ class GeneratorFailMiddleware: for r in result: r["processed"].append(f"{self.__class__.__name__}.process_spider_output") yield r - raise LookupError() + raise LookupError def process_spider_exception(self, response, exception, spider): method = f"{self.__class__.__name__}.process_spider_exception" @@ -246,7 +246,7 @@ class NotGeneratorFailMiddleware: for r in result: r["processed"].append(f"{self.__class__.__name__}.process_spider_output") out.append(r) - raise ReferenceError() + raise ReferenceError return out def process_spider_exception(self, response, exception, spider): diff --git a/tests/test_squeues_request.py b/tests/test_squeues_request.py index 499ca46b8..02ea8027f 100644 --- a/tests/test_squeues_request.py +++ b/tests/test_squeues_request.py @@ -41,7 +41,7 @@ class BaseQueueTestCase(unittest.TestCase): class RequestQueueTestMixin: def queue(self): - raise NotImplementedError() + raise NotImplementedError def test_one_element_with_peek(self): if not hasattr(queuelib.queue.FifoMemoryQueue, "peek"): diff --git a/tests/test_utils_misc/test_return_with_argument_inside_generator.py b/tests/test_utils_misc/test_return_with_argument_inside_generator.py index 484757035..c7774751e 100644 --- a/tests/test_utils_misc/test_return_with_argument_inside_generator.py +++ b/tests/test_utils_misc/test_return_with_argument_inside_generator.py @@ -10,7 +10,7 @@ from scrapy.utils.misc import ( def _indentation_error(*args, **kwargs): - raise IndentationError() + raise IndentationError def top_level_return_something():