From ba51a25dac26da2b52b3e686697e8aef1c264869 Mon Sep 17 00:00:00 2001 From: Richard Tibbles Date: Thu, 11 Jun 2026 15:23:56 -0700 Subject: [PATCH 1/3] Enable ruff isort import rules Add the "I" rule category to ruff's lint selection so import ordering is enforced again after the uv migration dropped reorder-python-imports. Configure isort to match the prior reorder-python-imports behaviour: force-single-line (one import per line) and order-by-type=false (case-insensitive alphabetical, not CapWords-first). Co-Authored-By: Claude Opus 4.8 (1M context) --- pyproject.toml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0a420c74..861d01aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -99,7 +99,7 @@ target-version = "py39" exclude = ["docs", "examples"] [tool.ruff.lint] -select = ["E", "F", "W", "C90"] +select = ["E", "F", "W", "C90", "I"] ignore = ["E226", "E203", "E741"] [tool.ruff.lint.pycodestyle] @@ -108,3 +108,10 @@ max-line-length = 160 [tool.ruff.lint.per-file-ignores] "tests/**" = ["F811"] "ricecooker/utils/downloader.py" = ["C901"] + +[tool.ruff.lint.isort] +known-first-party = ["ricecooker"] +# Match the prior reorder-python-imports style: one import per line, +# sorted case-insensitively rather than grouped by type. +force-single-line = true +order-by-type = false From 4a50b65bf9a2e784b773f8cdcc2278d115b3c67d Mon Sep 17 00:00:00 2001 From: Richard Tibbles Date: Thu, 11 Jun 2026 15:24:48 -0700 Subject: [PATCH 2/3] Reformat imports with ruff isort MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One-time mechanical reformat from enabling the "I" rule category. No logic changes — only import ordering, force-single-line splitting, and normalised blank lines after import blocks. Co-Authored-By: Claude Opus 4.8 (1M context) --- ricecooker/chefs.py | 8 ++++---- ricecooker/classes/files.py | 5 +++-- ricecooker/classes/nodes.py | 12 ++++++++---- ricecooker/classes/questions.py | 3 ++- ricecooker/config.py | 1 - ricecooker/managers/tree.py | 3 ++- ricecooker/utils/caching.py | 1 - ricecooker/utils/corrections.py | 1 - ricecooker/utils/downloader.py | 4 +++- ricecooker/utils/html.py | 4 ++-- ricecooker/utils/images.py | 1 - ricecooker/utils/libstudio.py | 1 - ricecooker/utils/linecook.py | 4 ++-- ricecooker/utils/metadata_provider.py | 5 +---- ricecooker/utils/pipeline/__init__.py | 4 ++-- ricecooker/utils/pipeline/convert.py | 4 ++-- ricecooker/utils/pipeline/extract_metadata.py | 4 ++-- ricecooker/utils/pipeline/file_handler.py | 9 +++++---- ricecooker/utils/pipeline/transfer.py | 9 +++++---- ricecooker/utils/proxy.py | 1 - ricecooker/utils/subtitles.py | 1 - ricecooker/utils/utils.py | 1 - ricecooker/utils/videos.py | 3 ++- ricecooker/utils/youtube.py | 1 - tests/conftest.py | 1 - tests/media_utils/test_audio.py | 1 - tests/media_utils/test_proxy.py | 1 - tests/media_utils/test_thumbnails.py | 6 +++--- tests/media_utils/test_videos.py | 1 - tests/test_data.py | 1 - tests/test_files.py | 2 +- tests/test_licenses.py | 1 - tests/test_requests.py | 1 - tests/test_settings.py | 1 - tests/test_thumbnails.py | 1 - tests/test_tree.py | 1 - tests/test_zip.py | 1 - 37 files changed, 49 insertions(+), 60 deletions(-) diff --git a/ricecooker/chefs.py b/ricecooker/chefs.py index 9b75a247..5ca8283c 100644 --- a/ricecooker/chefs.py +++ b/ricecooker/chefs.py @@ -10,6 +10,10 @@ import requests +from ricecooker.utils.images import convert_image +from ricecooker.utils.pipeline import FilePipeline +from ricecooker.utils.request_utils import DomainSpecificAuth + from . import config from .classes import files from .classes import nodes @@ -31,10 +35,6 @@ from .utils.tokens import get_content_curation_token from .utils.youtube import YouTubePlaylistUtils from .utils.youtube import YouTubeVideoUtils -from ricecooker.utils.images import convert_image -from ricecooker.utils.pipeline import FilePipeline -from ricecooker.utils.request_utils import DomainSpecificAuth - # SUSHI CHEF BASE CLASS ################################################################################ diff --git a/ricecooker/classes/files.py b/ricecooker/classes/files.py index c824a829..54df5c50 100644 --- a/ricecooker/classes/files.py +++ b/ricecooker/classes/files.py @@ -8,8 +8,6 @@ from le_utils.constants import languages from requests import HTTPError -from .. import config -from ..exceptions import UnknownFileTypeError from ricecooker.utils.caching import FILECACHE from ricecooker.utils.caching import get_cache_filename from ricecooker.utils.images import create_image_from_epub @@ -30,6 +28,9 @@ from ricecooker.utils.videos import extract_thumbnail_from_video from ricecooker.utils.youtube import get_language_with_alpha2_fallback +from .. import config +from ..exceptions import UnknownFileTypeError + fallback_pipeline = FilePipeline() # Lookup table for convertible file formats for a given preset diff --git a/ricecooker/classes/nodes.py b/ricecooker/classes/nodes.py index ea3dd33b..43731d66 100644 --- a/ricecooker/classes/nodes.py +++ b/ricecooker/classes/nodes.py @@ -18,6 +18,9 @@ from le_utils.constants.labels import resource_type from le_utils.constants.labels import subjects +from ricecooker.utils.pipeline.exceptions import ExpectedFileException +from ricecooker.utils.pipeline.exceptions import InvalidFileException + from .. import __version__ from .. import config from ..exceptions import InvalidNodeException @@ -32,8 +35,6 @@ from .licenses import License from .questions import VARIANT_A from .questions import VARIANT_B -from ricecooker.utils.pipeline.exceptions import ExpectedFileException -from ricecooker.utils.pipeline.exceptions import InvalidFileException MASTERY_MODELS = [id for id, name in exercises.MASTERY_MODELS] ROLES = [id for id, name in roles.choices] @@ -991,7 +992,9 @@ class VideoNode(ContentNode): required_presets = (format_presets.VIDEO_HIGH_RES, format_presets.VIDEO_LOW_RES) def generate_thumbnail(self): - from .files import VideoFile, WebVideoFile, ExtractedVideoThumbnailFile + from .files import ExtractedVideoThumbnailFile + from .files import VideoFile + from .files import WebVideoFile video_files = [ f @@ -1315,7 +1318,8 @@ def add_file(self, file_to_add): Args: file (SlideshowNode or ThumbnailFile): file model to add to node Returns: None """ - from .files import ThumbnailFile, SlideImageFile + from .files import SlideImageFile + from .files import ThumbnailFile assert isinstance(file_to_add, ThumbnailFile) or isinstance( file_to_add, SlideImageFile diff --git a/ricecooker/classes/questions.py b/ricecooker/classes/questions.py index b4e49e39..742b7fe6 100644 --- a/ricecooker/classes/questions.py +++ b/ricecooker/classes/questions.py @@ -7,12 +7,13 @@ from bs4 import BeautifulSoup from le_utils.constants import exercises +from ricecooker.utils.encodings import get_base64_encoding + from .. import config from ..exceptions import InvalidQuestionException from .files import _ExerciseBase64ImageFile from .files import _ExerciseGraphieFile from .files import _ExerciseImageFile -from ricecooker.utils.encodings import get_base64_encoding # Reusable protocol and path pattern for Perseus questions PERSEUS_PROTOCOL_PATH = ( diff --git a/ricecooker/config.py b/ricecooker/config.py index 9d4aeca9..00576638 100644 --- a/ricecooker/config.py +++ b/ricecooker/config.py @@ -13,7 +13,6 @@ import requests from requests_file import FileAdapter - UPDATE = False COMPRESS = False VIDEO_HEIGHT = None diff --git a/ricecooker/managers/tree.py b/ricecooker/managers/tree.py index 1bd6c8db..86e778f4 100644 --- a/ricecooker/managers/tree.py +++ b/ricecooker/managers/tree.py @@ -6,9 +6,10 @@ from requests.exceptions import RequestException -from .. import config from ricecooker.exceptions import InvalidNodeException +from .. import config + class InsufficientStorageException(Exception): """Raised when there is not enough storage space.""" diff --git a/ricecooker/utils/caching.py b/ricecooker/utils/caching.py index c7007d5f..0b1b7695 100644 --- a/ricecooker/utils/caching.py +++ b/ricecooker/utils/caching.py @@ -13,7 +13,6 @@ from ricecooker.utils.utils import get_hash from ricecooker.utils.utils import is_valid_url - # Cache for filenames FILECACHE = FileCache(config.FILECACHE_DIRECTORY, forever=True) diff --git a/ricecooker/utils/corrections.py b/ricecooker/utils/corrections.py index 299a9806..9279b5f7 100755 --- a/ricecooker/utils/corrections.py +++ b/ricecooker/utils/corrections.py @@ -12,7 +12,6 @@ from ricecooker.config import LOGGER from ricecooker.utils.libstudio import StudioApi - # CONFIG CONSTANTS for data directories ################################################################################ STUDIO_CREDENTIALS = "credentials/studio.json" diff --git a/ricecooker/utils/downloader.py b/ricecooker/utils/downloader.py index c9af606d..859ff26e 100644 --- a/ricecooker/utils/downloader.py +++ b/ricecooker/utils/downloader.py @@ -58,7 +58,9 @@ # Flake8 thinks this is too complex. try: # noqa: C901 import asyncio - from pyppeteer import launch, errors + + from pyppeteer import errors + from pyppeteer import launch async def load_page(path, timeout=30, strict=True): browser = await launch({"headless": True}) diff --git a/ricecooker/utils/html.py b/ricecooker/utils/html.py index 77f4e618..8f7026ed 100644 --- a/ricecooker/utils/html.py +++ b/ricecooker/utils/html.py @@ -11,12 +11,12 @@ import requests from selenium import webdriver -from .caching import CacheControlAdapter -from .caching import FileCache from ricecooker.config import LOGGER from ricecooker.config import PHANTOMJS_PATH from ricecooker.config import STRICT +from .caching import CacheControlAdapter +from .caching import FileCache # create a default session with basic caching mechanisms (similar to what a browser would do) sess = requests.Session() diff --git a/ricecooker/utils/images.py b/ricecooker/utils/images.py index d5697488..6de800c2 100644 --- a/ricecooker/utils/images.py +++ b/ricecooker/utils/images.py @@ -8,7 +8,6 @@ from .thumbscropping import scale_and_crop - # SMARTCROP UTILS ################################################################################ diff --git a/ricecooker/utils/libstudio.py b/ricecooker/utils/libstudio.py index 6b55450d..6f06356f 100644 --- a/ricecooker/utils/libstudio.py +++ b/ricecooker/utils/libstudio.py @@ -2,7 +2,6 @@ from ricecooker.config import LOGGER - # DEFAULT_STUDIO_URL = 'https://develop.studio.learningequality.org' # DEFAULT_STUDIO_URL = 'http://127.0.0.1:8080' DEFAULT_STUDIO_URL = "https://studio.learningequality.org" diff --git a/ricecooker/utils/linecook.py b/ricecooker/utils/linecook.py index 66301e27..8ed66845 100644 --- a/ricecooker/utils/linecook.py +++ b/ricecooker/utils/linecook.py @@ -3,6 +3,8 @@ from le_utils.constants import content_kinds +from ricecooker.config import LOGGER + from .jsontrees import AUDIO_FILE from .jsontrees import AUDIO_NODE from .jsontrees import DOCUMENT_FILE @@ -16,8 +18,6 @@ from .jsontrees import VIDEO_NODE from .jsontrees import write_tree_to_json_tree from .metadata_provider import path_to_tuple -from ricecooker.config import LOGGER - # LINECOOK CONFIGS ################################################################################ diff --git a/ricecooker/utils/metadata_provider.py b/ricecooker/utils/metadata_provider.py index 177c495e..d9beccae 100644 --- a/ricecooker/utils/metadata_provider.py +++ b/ricecooker/utils/metadata_provider.py @@ -13,7 +13,6 @@ from ricecooker.config import LOGGER from ricecooker.utils.libstudio import StudioApi - # CONSTANTS ################################################################################ DEFAULT_EXTRA_ITEMS_SEPARATOR = "🍣" # used to separate list-like data in CSV @@ -893,9 +892,7 @@ def generate_contentinfo_from_folder(self, csvwriter, rel_path, filenames): add content node rows for all the files in the `rel_path` folder. """ LOGGER.debug("IN process_folder " + str(rel_path) + " " + str(filenames)) - from ricecooker.utils.linecook import ( - filter_filenames, - ) + from ricecooker.utils.linecook import filter_filenames # WRITE TOPIC ROW topicrow = self.channeldir_node_to_row(rel_path.split(os.path.sep)) diff --git a/ricecooker/utils/pipeline/__init__.py b/ricecooker/utils/pipeline/__init__.py index f73386d0..cf6c3050 100644 --- a/ricecooker/utils/pipeline/__init__.py +++ b/ricecooker/utils/pipeline/__init__.py @@ -4,12 +4,12 @@ from typing import Dict from typing import Optional +from ricecooker.utils.pipeline.context import FileMetadata + from .convert import ConversionStageHandler from .extract_metadata import ExtractMetadataStageHandler from .file_handler import CompositeHandler from .transfer import DownloadStageHandler -from ricecooker.utils.pipeline.context import FileMetadata - # Do this to prevent import of broken Windows filetype registry that makes guesstype not work. # https://www.thecodingforums.com/threads/mimetypes-guess_type-broken-in-windows-on-py2-7-and-python-3-x.952693/ diff --git a/ricecooker/utils/pipeline/convert.py b/ricecooker/utils/pipeline/convert.py index f1dab505..36530ba5 100644 --- a/ricecooker/utils/pipeline/convert.py +++ b/ricecooker/utils/pipeline/convert.py @@ -28,8 +28,6 @@ from PyPDF2 import PdfFileReader from PyPDF2.utils import PdfReadError -from .file_handler import ExtensionMatchingHandler -from .file_handler import StageHandler from ricecooker import config from ricecooker.exceptions import UnknownFileTypeError from ricecooker.utils.audio import AudioCompressionError @@ -49,6 +47,8 @@ from ricecooker.utils.youtube import get_language_with_alpha2_fallback from ricecooker.utils.zip import create_predictable_zip +from .file_handler import ExtensionMatchingHandler +from .file_handler import StageHandler CONVERTIBLE_FORMATS = {p.id: p.convertible_formats for p in format_presets.PRESETLIST} diff --git a/ricecooker/utils/pipeline/extract_metadata.py b/ricecooker/utils/pipeline/extract_metadata.py index 13d3db9c..004717e8 100644 --- a/ricecooker/utils/pipeline/extract_metadata.py +++ b/ricecooker/utils/pipeline/extract_metadata.py @@ -1,14 +1,14 @@ from le_utils.constants import file_formats from le_utils.constants import format_presets -from .file_handler import ExtensionMatchingHandler -from .file_handler import StageHandler from ricecooker.utils.pipeline.context import ContentNodeMetadata from ricecooker.utils.pipeline.context import FileMetadata from ricecooker.utils.utils import extract_path_ext from ricecooker.utils.videos import extract_duration_of_media from ricecooker.utils.videos import guess_video_preset_by_resolution +from .file_handler import ExtensionMatchingHandler +from .file_handler import StageHandler PRESETS_FROM_EXTENSIONS = { file_formats.MP3: format_presets.AUDIO, diff --git a/ricecooker/utils/pipeline/file_handler.py b/ricecooker/utils/pipeline/file_handler.py index 8acfcf38..c92c5a49 100644 --- a/ricecooker/utils/pipeline/file_handler.py +++ b/ricecooker/utils/pipeline/file_handler.py @@ -15,16 +15,17 @@ from typing import Type from typing import Union -from .context import ContextMetadata -from .context import FileMetadata -from .exceptions import ExpectedFileException -from .exceptions import InvalidFileException from ricecooker import config from ricecooker.utils.caching import get_cache_data from ricecooker.utils.caching import set_cache_data from ricecooker.utils.utils import copy_file_to_storage from ricecooker.utils.utils import extract_path_ext +from .context import ContextMetadata +from .context import FileMetadata +from .exceptions import ExpectedFileException +from .exceptions import InvalidFileException + class Handler(ABC): """Base class for handling file fetching and processing""" diff --git a/ricecooker/utils/pipeline/transfer.py b/ricecooker/utils/pipeline/transfer.py index eb56e970..300edeb9 100644 --- a/ricecooker/utils/pipeline/transfer.py +++ b/ricecooker/utils/pipeline/transfer.py @@ -19,10 +19,6 @@ from requests.exceptions import InvalidURL from requests.exceptions import Timeout -from .context import ContextMetadata -from .context import FileMetadata -from .file_handler import FileHandler -from .file_handler import StageHandler from ricecooker import config from ricecooker.utils.caching import generate_key from ricecooker.utils.encodings import get_base64_encoding @@ -32,6 +28,11 @@ from ricecooker.utils.youtube import get_language_with_alpha2_fallback from ricecooker.utils.youtube import YouTubeResource +from .context import ContextMetadata +from .context import FileMetadata +from .file_handler import FileHandler +from .file_handler import StageHandler + class GenericFileContextMetadata(ContextMetadata): default_ext: Optional[str] = None diff --git a/ricecooker/utils/proxy.py b/ricecooker/utils/proxy.py index b5206251..f85f8a46 100644 --- a/ricecooker/utils/proxy.py +++ b/ricecooker/utils/proxy.py @@ -12,7 +12,6 @@ import requests - PROXY_LIST = [] # Current list of proxy servers to choose from RECENT_PROXIES = [] # Recently used proxies (to avoid using too often) diff --git a/ricecooker/utils/subtitles.py b/ricecooker/utils/subtitles.py index 219d2125..24a547be 100644 --- a/ricecooker/utils/subtitles.py +++ b/ricecooker/utils/subtitles.py @@ -12,7 +12,6 @@ from pycaption import WebVTTWriter from pycaption.base import DEFAULT_LANGUAGE_CODE - LANGUAGE_CODE_UNKNOWN = DEFAULT_LANGUAGE_CODE diff --git a/ricecooker/utils/utils.py b/ricecooker/utils/utils.py index cf8d1aef..1209b979 100644 --- a/ricecooker/utils/utils.py +++ b/ricecooker/utils/utils.py @@ -6,7 +6,6 @@ from ricecooker import config - VALID_UUID_REGEX = re.compile("^([a-f0-9]{32})$") diff --git a/ricecooker/utils/videos.py b/ricecooker/utils/videos.py index 3b10551f..079c12d2 100644 --- a/ricecooker/utils/videos.py +++ b/ricecooker/utils/videos.py @@ -6,9 +6,10 @@ from le_utils.constants import format_presets -from .images import ThumbnailGenerationError from ricecooker import config +from .images import ThumbnailGenerationError + LOGGER = logging.getLogger("VideoResource") LOGGER.setLevel(logging.DEBUG) diff --git a/ricecooker/utils/youtube.py b/ricecooker/utils/youtube.py index c3329de1..c40be62d 100644 --- a/ricecooker/utils/youtube.py +++ b/ricecooker/utils/youtube.py @@ -14,7 +14,6 @@ from . import proxy from . import utils - LOGGER = logging.getLogger("YouTubeResource") LOGGER.setLevel(logging.DEBUG) diff --git a/tests/conftest.py b/tests/conftest.py index 7790612b..c80f08bf 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -43,7 +43,6 @@ from ricecooker.classes.questions import InputQuestion from ricecooker.classes.questions import SingleSelectQuestion - # GLOBAL TEST SETUP/TEARDOWN UTILS ################################################################################ diff --git a/tests/media_utils/test_audio.py b/tests/media_utils/test_audio.py index cc119519..61fbc231 100644 --- a/tests/media_utils/test_audio.py +++ b/tests/media_utils/test_audio.py @@ -11,7 +11,6 @@ from ricecooker.utils import audio from ricecooker.utils import videos - # cache, so we don't keep requesting the full audio requests_cache.install_cache("audio_cache") diff --git a/tests/media_utils/test_proxy.py b/tests/media_utils/test_proxy.py index 047c81b9..2cca17bf 100644 --- a/tests/media_utils/test_proxy.py +++ b/tests/media_utils/test_proxy.py @@ -5,7 +5,6 @@ from ricecooker.utils import proxy from ricecooker.utils.youtube import YouTubeResource - YOUTUBE_TEST_VIDEO = "https://www.youtube.com/watch?v=C0DPdy98e4c" YOUTUBE_TEST_PLAYLIST = "https://www.youtube.com/playlist?list=PL472BC6F4F2C3ABEF" diff --git a/tests/media_utils/test_thumbnails.py b/tests/media_utils/test_thumbnails.py index 88691c4c..6b8f13fa 100644 --- a/tests/media_utils/test_thumbnails.py +++ b/tests/media_utils/test_thumbnails.py @@ -3,13 +3,13 @@ import PIL import pytest +from ricecooker.utils import images +from ricecooker.utils import videos + from .test_videos import bad_video # noqa F401 from .test_videos import high_res_video # noqa F401 from .test_videos import low_res_video # noqa F401 from .test_videos import TempFile # noqa F401 -from ricecooker.utils import images -from ricecooker.utils import videos - tests_dir = os.path.dirname(os.path.abspath(__file__)) files_dir = os.path.join(tests_dir, "files") diff --git a/tests/media_utils/test_videos.py b/tests/media_utils/test_videos.py index 836192ec..666b977a 100644 --- a/tests/media_utils/test_videos.py +++ b/tests/media_utils/test_videos.py @@ -14,7 +14,6 @@ from ricecooker.utils import videos - # cache, so we don't keep requesting the full videos if sys.version_info[0] == 3: requests_cache.install_cache("video_cache_py3") diff --git a/tests/test_data.py b/tests/test_data.py index cf65d755..7e1975a8 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -11,7 +11,6 @@ from ricecooker.exceptions import InvalidNodeException from ricecooker.exceptions import InvalidQuestionException - """ *********** CHANNEL TESTS *********** """ diff --git a/tests/test_files.py b/tests/test_files.py index 99e470d4..6cab762b 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -11,6 +11,7 @@ from unittest.mock import patch import pytest +from conftest import download_fixture_file from le_utils.constants import file_formats from le_utils.constants import format_presets from le_utils.constants import languages @@ -19,7 +20,6 @@ from PyPDF2 import PdfFileWriter from requests import ConnectionError from requests import HTTPError -from conftest import download_fixture_file from vcr_config import my_vcr from ricecooker import config diff --git a/tests/test_licenses.py b/tests/test_licenses.py index 97889b48..9d3e8302 100644 --- a/tests/test_licenses.py +++ b/tests/test_licenses.py @@ -15,7 +15,6 @@ from ricecooker.classes.licenses import get_license - """ *********** LICENSE FIXTURES *********** """ diff --git a/tests/test_requests.py b/tests/test_requests.py index ee03ab65..997c97c5 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -11,7 +11,6 @@ from ricecooker.exceptions import InvalidNodeException from ricecooker.managers.tree import ChannelManager - """ *********** TOPIC FIXTURES *********** """ diff --git a/tests/test_settings.py b/tests/test_settings.py index b61e958e..c321bd5a 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -8,7 +8,6 @@ from ricecooker import chefs from ricecooker.utils.request_utils import DomainSpecificAuth - settings = {"thumbnails": True, "compress": True} diff --git a/tests/test_thumbnails.py b/tests/test_thumbnails.py index d700d98e..da4c67ec 100644 --- a/tests/test_thumbnails.py +++ b/tests/test_thumbnails.py @@ -21,7 +21,6 @@ from ricecooker.classes.nodes import TopicNode from ricecooker.classes.nodes import VideoNode - SHOW_THUMBS = False # set to True to show outputs when running tests locally diff --git a/tests/test_tree.py b/tests/test_tree.py index ac612b02..1aea7f11 100644 --- a/tests/test_tree.py +++ b/tests/test_tree.py @@ -42,7 +42,6 @@ from ricecooker.utils.pipeline import FilePipeline from ricecooker.utils.zip import create_predictable_zip - """ *********** TOPIC FIXTURES *********** """ diff --git a/tests/test_zip.py b/tests/test_zip.py index 2b7d044e..630d2cad 100644 --- a/tests/test_zip.py +++ b/tests/test_zip.py @@ -6,7 +6,6 @@ from ricecooker.utils.zip import create_predictable_zip - # The MD5s in this object are generated by running this file as a script # they should not be updated as they are now our baseline for what our predictable zip should produce # so any changes to the implementation should not change these values, if they do, it's a bug. From ef3850966b538504636ec4d2b5d595b95bb9168f Mon Sep 17 00:00:00 2001 From: Richard Tibbles Date: Thu, 11 Jun 2026 15:25:05 -0700 Subject: [PATCH 3/3] Ignore import-reformat commit in git blame Co-Authored-By: Claude Opus 4.8 (1M context) --- .git-blame-ignore-revs | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 00000000..a7a5b048 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,5 @@ +# Run this command to always ignore formatting commits in `git blame` +# git config blame.ignoreRevsFile .git-blame-ignore-revs + +# Reformatted imports after enabling ruff isort rules +4a50b65bf9a2e784b773f8cdcc2278d115b3c67d