Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -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
9 changes: 8 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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
8 changes: 4 additions & 4 deletions ricecooker/chefs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
################################################################################
Expand Down
5 changes: 3 additions & 2 deletions ricecooker/classes/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
12 changes: 8 additions & 4 deletions ricecooker/classes/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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]
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion ricecooker/classes/questions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = (
Expand Down
1 change: 0 additions & 1 deletion ricecooker/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import requests
from requests_file import FileAdapter


UPDATE = False
COMPRESS = False
VIDEO_HEIGHT = None
Expand Down
3 changes: 2 additions & 1 deletion ricecooker/managers/tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down
1 change: 0 additions & 1 deletion ricecooker/utils/caching.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
1 change: 0 additions & 1 deletion ricecooker/utils/corrections.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
4 changes: 3 additions & 1 deletion ricecooker/utils/downloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand Down
4 changes: 2 additions & 2 deletions ricecooker/utils/html.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
1 change: 0 additions & 1 deletion ricecooker/utils/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

from .thumbscropping import scale_and_crop


# SMARTCROP UTILS
################################################################################

Expand Down
1 change: 0 additions & 1 deletion ricecooker/utils/libstudio.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
4 changes: 2 additions & 2 deletions ricecooker/utils/linecook.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
################################################################################
Expand Down
5 changes: 1 addition & 4 deletions ricecooker/utils/metadata_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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))
Expand Down
4 changes: 2 additions & 2 deletions ricecooker/utils/pipeline/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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/
Expand Down
4 changes: 2 additions & 2 deletions ricecooker/utils/pipeline/convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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}

Expand Down
4 changes: 2 additions & 2 deletions ricecooker/utils/pipeline/extract_metadata.py
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
9 changes: 5 additions & 4 deletions ricecooker/utils/pipeline/file_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""
Expand Down
9 changes: 5 additions & 4 deletions ricecooker/utils/pipeline/transfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
1 change: 0 additions & 1 deletion ricecooker/utils/proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 0 additions & 1 deletion ricecooker/utils/subtitles.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
from pycaption import WebVTTWriter
from pycaption.base import DEFAULT_LANGUAGE_CODE


LANGUAGE_CODE_UNKNOWN = DEFAULT_LANGUAGE_CODE


Expand Down
1 change: 0 additions & 1 deletion ricecooker/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

from ricecooker import config


VALID_UUID_REGEX = re.compile("^([a-f0-9]{32})$")


Expand Down
3 changes: 2 additions & 1 deletion ricecooker/utils/videos.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
1 change: 0 additions & 1 deletion ricecooker/utils/youtube.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
from . import proxy
from . import utils


LOGGER = logging.getLogger("YouTubeResource")
LOGGER.setLevel(logging.DEBUG)

Expand Down
1 change: 0 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
from ricecooker.classes.questions import InputQuestion
from ricecooker.classes.questions import SingleSelectQuestion


# GLOBAL TEST SETUP/TEARDOWN UTILS
################################################################################

Expand Down
1 change: 0 additions & 1 deletion tests/media_utils/test_audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down
1 change: 0 additions & 1 deletion tests/media_utils/test_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
Loading
Loading