From 920254b6b2c1df33190f1e80c9c3f475e6e8d814 Mon Sep 17 00:00:00 2001 From: Luke Stebbing Date: Mon, 13 Mar 2023 18:55:31 -0400 Subject: [PATCH] Upgrade reorder_python_imports --- .pre-commit-config.yaml | 4 ++-- ice/agents/approval.py | 1 - ice/agents/fake.py | 1 - ice/agents/openai.py | 1 - ice/agents/ought_inference.py | 1 - ice/apis/openai.py | 1 - ice/cache.py | 1 - ice/cli_utils.py | 1 - ice/datasets/qasper.py | 1 - ice/environment.py | 2 -- ice/evaluation/evaluation_report.py | 1 - ice/evaluation/summarize_experiment_evals.py | 1 - ice/formatter/multi.py | 1 - ice/json_value.py | 1 - ice/metrics/gold_paragraphs.py | 2 -- ice/metrics/gold_standards.py | 1 - ice/metrics/nubia.py | 1 - ice/metrics/qasper.py | 1 - ice/nn/bert_t5_t0_ensemble.py | 2 -- ice/nn/tfew.py | 2 -- ice/paper.py | 2 -- ice/recipe.py | 2 -- ice/recipes/__init__.py | 3 +-- ice/recipes/adherence_tfew_paragraph.py | 6 ++---- ice/recipes/best_completion.py | 1 - ice/recipes/blinding_dynamic.py | 2 -- ice/recipes/consort_flow/baseline_elicit_answer.py | 1 - ice/recipes/consort_flow/golds.py | 1 - ice/recipes/elicit/common.py | 2 -- ice/recipes/elicit/search.py | 1 - ice/recipes/experiments_and_arms/num_utils.py | 1 - .../experiments_and_arms/recipes/experiments_and_arms.py | 1 - ice/recipes/find_best_few_shot_prompt.py | 1 - ice/recipes/meta/eval_paper_qa/quick_list.py | 1 - ice/recipes/meta/eval_text_classification.py | 1 - ice/recipes/placebo_keyword_baseline.py | 1 - ice/recipes/primer/answer_by_search.py | 1 - ice/recipes/primer/answer_by_search_direct.py | 1 - ice/recipes/primer/search_json.py | 1 - ice/recipes/primer/search_string.py | 1 - ice/recipes/primer/sequential_action.py | 1 - .../program_search/nodes/augment_question/prompts.py | 1 - ice/recipes/program_search/nodes/prune/prompts.py | 1 - ice/recipes/program_search/nodes/select/select.py | 1 - ice/recipes/program_search/types.py | 1 - ice/routes/app.py | 1 - ice/server.py | 1 - ice/settings.py | 1 - ice/trace.py | 4 +--- ice/utils.py | 2 -- main.py | 2 -- scripts/update-primer.py | 1 - tests/test_formatter/test_multi.py | 1 - tests/test_main.py | 1 - tests/test_metrics.py | 1 - tests/test_primer_recipes.py | 1 - 56 files changed, 6 insertions(+), 73 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ef602dbb..eae263e7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,10 +15,10 @@ repos: hooks: - id: prettier - repo: https://github.com/asottile/reorder_python_imports - rev: v2.5.0 + rev: v3.9.0 hooks: - id: reorder-python-imports - args: [--py39-plus, --separate-relative, --separate-from-import] + args: [--py39-plus] - repo: https://github.com/psf/black rev: 22.3.0 hooks: diff --git a/ice/agents/approval.py b/ice/agents/approval.py index ae7ec0cc..1c9504f4 100644 --- a/ice/agents/approval.py +++ b/ice/agents/approval.py @@ -1,5 +1,4 @@ import shelve - from contextlib import contextmanager from pathlib import Path from typing import Optional diff --git a/ice/agents/fake.py b/ice/agents/fake.py index 40c25ea4..bd31a59c 100644 --- a/ice/agents/fake.py +++ b/ice/agents/fake.py @@ -1,5 +1,4 @@ import random - from typing import Optional from faker import Faker diff --git a/ice/agents/openai.py b/ice/agents/openai.py index add20e05..31da9d18 100644 --- a/ice/agents/openai.py +++ b/ice/agents/openai.py @@ -1,5 +1,4 @@ import math - from typing import Any from typing import Optional diff --git a/ice/agents/ought_inference.py b/ice/agents/ought_inference.py index e46013fe..0f954dac 100644 --- a/ice/agents/ought_inference.py +++ b/ice/agents/ought_inference.py @@ -1,7 +1,6 @@ from urllib.parse import urljoin import httpx - from tenacity import retry from tenacity.stop import stop_after_attempt from tenacity.wait import wait_random_exponential diff --git a/ice/apis/openai.py b/ice/apis/openai.py index 6927e5b7..428bba13 100644 --- a/ice/apis/openai.py +++ b/ice/apis/openai.py @@ -3,7 +3,6 @@ from typing import Union import httpx - from httpx import Response from httpx import TimeoutException from structlog.stdlib import get_logger diff --git a/ice/cache.py b/ice/cache.py index d7065dd0..4a72ee6f 100644 --- a/ice/cache.py +++ b/ice/cache.py @@ -4,7 +4,6 @@ import asyncio import functools import inspect - from pathlib import Path from ice.settings import CACHE_DIR diff --git a/ice/cli_utils.py b/ice/cli_utils.py index 34cd8178..6f1c7252 100644 --- a/ice/cli_utils.py +++ b/ice/cli_utils.py @@ -1,6 +1,5 @@ import importlib.util import os.path - from typing import Optional from typing import Type diff --git a/ice/datasets/qasper.py b/ice/datasets/qasper.py index 514f7c17..b0774a11 100644 --- a/ice/datasets/qasper.py +++ b/ice/datasets/qasper.py @@ -1,6 +1,5 @@ import json import re - from collections.abc import Sequence from itertools import islice from typing import Optional diff --git a/ice/environment.py b/ice/environment.py index 99791ba8..289cf7db 100644 --- a/ice/environment.py +++ b/ice/environment.py @@ -1,7 +1,6 @@ import abc import re import sys - from contextvars import ContextVar from io import TextIOWrapper from typing import Any @@ -12,7 +11,6 @@ import nest_asyncio import questionary import rich - from rich.console import Console from rich.markdown import Markdown from rich.panel import Panel diff --git a/ice/evaluation/evaluation_report.py b/ice/evaluation/evaluation_report.py index 8a46487e..c41d1791 100644 --- a/ice/evaluation/evaluation_report.py +++ b/ice/evaluation/evaluation_report.py @@ -5,7 +5,6 @@ from typing import Union import pandas as pd - from pydantic import BaseModel from rich import box from rich.table import Table diff --git a/ice/evaluation/summarize_experiment_evals.py b/ice/evaluation/summarize_experiment_evals.py index 6e7fb5d5..7079baa1 100644 --- a/ice/evaluation/summarize_experiment_evals.py +++ b/ice/evaluation/summarize_experiment_evals.py @@ -1,6 +1,5 @@ import ast import asyncio - from sys import argv import pandas as pd diff --git a/ice/formatter/multi.py b/ice/formatter/multi.py index d5fb615c..e0d4ac99 100644 --- a/ice/formatter/multi.py +++ b/ice/formatter/multi.py @@ -1,6 +1,5 @@ import enum import string - from collections import Counter from collections.abc import Mapping from collections.abc import Sequence diff --git a/ice/json_value.py b/ice/json_value.py index dc8b1c2b..5a19d373 100644 --- a/ice/json_value.py +++ b/ice/json_value.py @@ -1,5 +1,4 @@ import dataclasses - from inspect import isfunction from math import isnan from typing import Any diff --git a/ice/metrics/gold_paragraphs.py b/ice/metrics/gold_paragraphs.py index 493a2ae7..300698e9 100644 --- a/ice/metrics/gold_paragraphs.py +++ b/ice/metrics/gold_paragraphs.py @@ -2,12 +2,10 @@ Make a dataframe that contains the paragraphs that contain the gold standard quotes. """ import asyncio - from pathlib import Path from typing import Optional import pandas as pd - from structlog import get_logger from ice.cache import diskcache diff --git a/ice/metrics/gold_standards.py b/ice/metrics/gold_standards.py index aa3a83f6..145856c4 100644 --- a/ice/metrics/gold_standards.py +++ b/ice/metrics/gold_standards.py @@ -13,7 +13,6 @@ from typing import TypeVar import pandas as pd - from pydantic import BaseModel from pydantic.generics import GenericModel from structlog.stdlib import get_logger diff --git a/ice/metrics/nubia.py b/ice/metrics/nubia.py index 91953fdb..2d899e02 100644 --- a/ice/metrics/nubia.py +++ b/ice/metrics/nubia.py @@ -2,7 +2,6 @@ from urllib.parse import urljoin import httpx - from pydantic import BaseModel from ice.metrics.base import Metric diff --git a/ice/metrics/qasper.py b/ice/metrics/qasper.py index 5a3df231..0d4b9e1e 100644 --- a/ice/metrics/qasper.py +++ b/ice/metrics/qasper.py @@ -1,7 +1,6 @@ # Taken from https://github.com/allenai/qasper-led-baseline/blob/main/scripts/evaluator.py import re import string - from collections import Counter diff --git a/ice/nn/bert_t5_t0_ensemble.py b/ice/nn/bert_t5_t0_ensemble.py index 15dfa1c2..318bd538 100644 --- a/ice/nn/bert_t5_t0_ensemble.py +++ b/ice/nn/bert_t5_t0_ensemble.py @@ -1,12 +1,10 @@ import functools import re import time - from enum import IntEnum from typing import Tuple import torch - from structlog.stdlib import get_logger from transformers.models.auto.modeling_auto import AutoModelForSeq2SeqLM from transformers.models.auto.tokenization_auto import AutoTokenizer diff --git a/ice/nn/tfew.py b/ice/nn/tfew.py index 4284921e..df339906 100644 --- a/ice/nn/tfew.py +++ b/ice/nn/tfew.py @@ -1,12 +1,10 @@ import re - from collections.abc import Callable from dataclasses import dataclass from time import perf_counter import torch import torch.nn.functional as F - from structlog.stdlib import get_logger from torch import nn from transformers.models.auto.modeling_auto import AutoModelForSeq2SeqLM diff --git a/ice/paper.py b/ice/paper.py index 2156689b..8dcd9337 100644 --- a/ice/paper.py +++ b/ice/paper.py @@ -1,5 +1,4 @@ import re - from collections.abc import Iterator from functools import cache from pathlib import Path @@ -9,7 +8,6 @@ import nltk import requests - from nltk.tokenize import sent_tokenize from pydantic import BaseModel from pydantic import Field diff --git a/ice/recipe.py b/ice/recipe.py index 8154646b..524f1f22 100644 --- a/ice/recipe.py +++ b/ice/recipe.py @@ -1,7 +1,6 @@ import asyncio import importlib import sys - from abc import abstractmethod from collections.abc import Awaitable from collections.abc import Callable @@ -19,7 +18,6 @@ import defopt import pandas as pd - from merge_args import merge_args from pydantic import BaseSettings from structlog.stdlib import get_logger diff --git a/ice/recipes/__init__.py b/ice/recipes/__init__.py index 68e6ddba..dc5c9114 100644 --- a/ice/recipes/__init__.py +++ b/ice/recipes/__init__.py @@ -1,7 +1,5 @@ from typing import Type -from ice.recipe import Recipe - from .adherence_keyword_baseline import AdherenceKeywordBaseline from .adherence_simple import AdherenceSimpleInstruct from .adherence_tfew_paragraph import AdherenceParagraphTfew @@ -22,6 +20,7 @@ from .program_search.nodes.decontext.decontextualize import PaperDecontext from .rank_paragraphs import RankParagraphs from .subrecipe_example import ExampleMetaRecipe +from ice.recipe import Recipe def get_recipe_classes() -> list[Type[Recipe]]: diff --git a/ice/recipes/adherence_tfew_paragraph.py b/ice/recipes/adherence_tfew_paragraph.py index c70404ea..082f1153 100644 --- a/ice/recipes/adherence_tfew_paragraph.py +++ b/ice/recipes/adherence_tfew_paragraph.py @@ -1,5 +1,4 @@ import re - from collections import Counter from collections.abc import Awaitable from collections.abc import Callable @@ -12,6 +11,8 @@ from transformers.models.auto.tokenization_auto import AutoTokenizer from transformers.models.gpt2.tokenization_gpt2_fast import GPT2TokenizerFast +from ..trace import recorder +from ..trace import trace from ice.apis.openai import openai_complete from ice.evaluation.evaluate_recipe_result import RecipeResult from ice.metrics.gold_standards import list_experiments @@ -23,9 +24,6 @@ from ice.utils import map_async from ice.utils import max_by_value -from ..trace import recorder -from ..trace import trace - gpt2_tokenizer: GPT2TokenizerFast = AutoTokenizer.from_pretrained("gpt2") diff --git a/ice/recipes/best_completion.py b/ice/recipes/best_completion.py index f6aa69a5..dce6baad 100644 --- a/ice/recipes/best_completion.py +++ b/ice/recipes/best_completion.py @@ -1,5 +1,4 @@ import math - from functools import partial from structlog.stdlib import get_logger diff --git a/ice/recipes/blinding_dynamic.py b/ice/recipes/blinding_dynamic.py index 23ef7cc1..31160bbe 100644 --- a/ice/recipes/blinding_dynamic.py +++ b/ice/recipes/blinding_dynamic.py @@ -22,7 +22,6 @@ - vittengl-2009.pdf """ import itertools - from typing import Any from typing import Literal from typing import Optional @@ -30,7 +29,6 @@ import rich import tqdm - from pydantic import BaseModel from rich.panel import Panel from thefuzz import fuzz diff --git a/ice/recipes/consort_flow/baseline_elicit_answer.py b/ice/recipes/consort_flow/baseline_elicit_answer.py index 4d880af2..f43d31a9 100644 --- a/ice/recipes/consort_flow/baseline_elicit_answer.py +++ b/ice/recipes/consort_flow/baseline_elicit_answer.py @@ -1,5 +1,4 @@ import re - from collections.abc import Sequence from typing import Optional diff --git a/ice/recipes/consort_flow/golds.py b/ice/recipes/consort_flow/golds.py index 75c66f62..0fafae77 100644 --- a/ice/recipes/consort_flow/golds.py +++ b/ice/recipes/consort_flow/golds.py @@ -1,5 +1,4 @@ import itertools - from collections.abc import Sequence from typing import Optional diff --git a/ice/recipes/elicit/common.py b/ice/recipes/elicit/common.py index 0bfd29d7..0e1067c6 100644 --- a/ice/recipes/elicit/common.py +++ b/ice/recipes/elicit/common.py @@ -1,10 +1,8 @@ import json - from functools import reduce from pathlib import Path import httpx - from dotenv import dotenv_values from tenacity import retry from tenacity import stop_after_attempt diff --git a/ice/recipes/elicit/search.py b/ice/recipes/elicit/search.py index e4882dd1..12bc161d 100644 --- a/ice/recipes/elicit/search.py +++ b/ice/recipes/elicit/search.py @@ -1,7 +1,6 @@ from typing import Optional import httpx - from structlog import get_logger from ice.recipe import recipe diff --git a/ice/recipes/experiments_and_arms/num_utils.py b/ice/recipes/experiments_and_arms/num_utils.py index 05bbfc20..4a19d179 100644 --- a/ice/recipes/experiments_and_arms/num_utils.py +++ b/ice/recipes/experiments_and_arms/num_utils.py @@ -1,5 +1,4 @@ import re - from collections.abc import Sequence from numerizer import numerize diff --git a/ice/recipes/experiments_and_arms/recipes/experiments_and_arms.py b/ice/recipes/experiments_and_arms/recipes/experiments_and_arms.py index 21711177..75599561 100644 --- a/ice/recipes/experiments_and_arms/recipes/experiments_and_arms.py +++ b/ice/recipes/experiments_and_arms/recipes/experiments_and_arms.py @@ -1,5 +1,4 @@ import json - from collections.abc import Sequence from ice.evaluation.evaluate_recipe_result import RecipeResult diff --git a/ice/recipes/find_best_few_shot_prompt.py b/ice/recipes/find_best_few_shot_prompt.py index c80e9d31..899df160 100644 --- a/ice/recipes/find_best_few_shot_prompt.py +++ b/ice/recipes/find_best_few_shot_prompt.py @@ -4,7 +4,6 @@ from typing import TypeVar import numpy as np - from structlog.stdlib import get_logger from tqdm import tqdm diff --git a/ice/recipes/meta/eval_paper_qa/quick_list.py b/ice/recipes/meta/eval_paper_qa/quick_list.py index 17ea90ac..7b267c10 100644 --- a/ice/recipes/meta/eval_paper_qa/quick_list.py +++ b/ice/recipes/meta/eval_paper_qa/quick_list.py @@ -1,5 +1,4 @@ import re - from collections.abc import Sequence from ice.formatter.multi import format_multi diff --git a/ice/recipes/meta/eval_text_classification.py b/ice/recipes/meta/eval_text_classification.py index 0892e481..c77c1482 100644 --- a/ice/recipes/meta/eval_text_classification.py +++ b/ice/recipes/meta/eval_text_classification.py @@ -8,7 +8,6 @@ import matplotlib.pyplot as plt import numpy as np - from sklearn.metrics import precision_recall_curve from sklearn.metrics import PrecisionRecallDisplay from sklearn.metrics import roc_auc_score diff --git a/ice/recipes/placebo_keyword_baseline.py b/ice/recipes/placebo_keyword_baseline.py index b2189e06..d13ab3d5 100644 --- a/ice/recipes/placebo_keyword_baseline.py +++ b/ice/recipes/placebo_keyword_baseline.py @@ -1,5 +1,4 @@ import re - from dataclasses import dataclass from typing import Literal diff --git a/ice/recipes/primer/answer_by_search.py b/ice/recipes/primer/answer_by_search.py index 5edd561e..c2fa03a4 100644 --- a/ice/recipes/primer/answer_by_search.py +++ b/ice/recipes/primer/answer_by_search.py @@ -1,5 +1,4 @@ import httpx - from fvalues import F from ice.recipe import recipe diff --git a/ice/recipes/primer/answer_by_search_direct.py b/ice/recipes/primer/answer_by_search_direct.py index ef38e8dd..406aba41 100644 --- a/ice/recipes/primer/answer_by_search_direct.py +++ b/ice/recipes/primer/answer_by_search_direct.py @@ -1,5 +1,4 @@ import httpx - from fvalues import F from ice.recipe import recipe diff --git a/ice/recipes/primer/search_json.py b/ice/recipes/primer/search_json.py index 53b36f0e..734bd741 100644 --- a/ice/recipes/primer/search_json.py +++ b/ice/recipes/primer/search_json.py @@ -1,5 +1,4 @@ import httpx - from fvalues import F from ice.recipe import recipe diff --git a/ice/recipes/primer/search_string.py b/ice/recipes/primer/search_string.py index 55755af4..0ef1da63 100644 --- a/ice/recipes/primer/search_string.py +++ b/ice/recipes/primer/search_string.py @@ -1,5 +1,4 @@ import httpx - from fvalues import F from ice.recipe import recipe diff --git a/ice/recipes/primer/sequential_action.py b/ice/recipes/primer/sequential_action.py index 9181e6fb..7f72cc7b 100644 --- a/ice/recipes/primer/sequential_action.py +++ b/ice/recipes/primer/sequential_action.py @@ -1,5 +1,4 @@ import math # noqa: F401 - from abc import ABC from abc import abstractmethod from collections.abc import Sequence diff --git a/ice/recipes/program_search/nodes/augment_question/prompts.py b/ice/recipes/program_search/nodes/augment_question/prompts.py index ae7120a0..70e1f144 100644 --- a/ice/recipes/program_search/nodes/augment_question/prompts.py +++ b/ice/recipes/program_search/nodes/augment_question/prompts.py @@ -1,5 +1,4 @@ import re - from collections.abc import Sequence from typing import Optional from typing import TypedDict diff --git a/ice/recipes/program_search/nodes/prune/prompts.py b/ice/recipes/program_search/nodes/prune/prompts.py index a869d3df..870e7b70 100644 --- a/ice/recipes/program_search/nodes/prune/prompts.py +++ b/ice/recipes/program_search/nodes/prune/prompts.py @@ -1,5 +1,4 @@ import math - from collections.abc import Mapping from collections.abc import Sequence from typing import cast diff --git a/ice/recipes/program_search/nodes/select/select.py b/ice/recipes/program_search/nodes/select/select.py index 7bbf106b..7107cf5a 100644 --- a/ice/recipes/program_search/nodes/select/select.py +++ b/ice/recipes/program_search/nodes/select/select.py @@ -4,7 +4,6 @@ from typing import Optional import numpy as np - from anyio import ExceptionGroup from structlog.stdlib import get_logger diff --git a/ice/recipes/program_search/types.py b/ice/recipes/program_search/types.py index b25aba9b..928251ba 100644 --- a/ice/recipes/program_search/types.py +++ b/ice/recipes/program_search/types.py @@ -1,5 +1,4 @@ import typing as t - from typing import Optional from typing import Union diff --git a/ice/routes/app.py b/ice/routes/app.py index f895da31..5b26e082 100644 --- a/ice/routes/app.py +++ b/ice/routes/app.py @@ -2,7 +2,6 @@ import os import re import signal - from collections.abc import Awaitable from collections.abc import Callable from pathlib import Path diff --git a/ice/server.py b/ice/server.py index 4655c679..ee9727dc 100644 --- a/ice/server.py +++ b/ice/server.py @@ -4,7 +4,6 @@ import time import httpx - from structlog import get_logger from ice.settings import server_url diff --git a/ice/settings.py b/ice/settings.py index b30d4887..234a1d4b 100644 --- a/ice/settings.py +++ b/ice/settings.py @@ -1,5 +1,4 @@ import json - from os import environ from pathlib import Path from typing import Any diff --git a/ice/trace.py b/ice/trace.py index 51873e38..33a28a29 100644 --- a/ice/trace.py +++ b/ice/trace.py @@ -1,7 +1,6 @@ import hashlib import json import threading - from abc import ABCMeta from asyncio import create_task from collections.abc import Callable @@ -25,6 +24,7 @@ from structlog import get_logger +from .logging import log_lock from ice.json_value import JSONValue from ice.json_value import to_json_value from ice.server import ensure_server_running @@ -34,8 +34,6 @@ from ice.settings import settings from ice.utils import make_id -from .logging import log_lock - log = get_logger() diff --git a/ice/utils.py b/ice/utils.py index 9a51694a..4bfc91c8 100644 --- a/ice/utils.py +++ b/ice/utils.py @@ -3,7 +3,6 @@ import subprocess import threading as td import time - from collections import defaultdict from collections.abc import Awaitable from collections.abc import Callable @@ -22,7 +21,6 @@ import anyio import tqdm import ulid - from more_itertools import windowed from structlog.stdlib import get_logger from transformers import GPT2TokenizerFast diff --git a/main.py b/main.py index 1b40b121..0c553e88 100644 --- a/main.py +++ b/main.py @@ -1,12 +1,10 @@ #! /usr/bin/env python import asyncio import json - from pathlib import Path from typing import Optional import defopt - from structlog.stdlib import get_logger from ice import execution_context diff --git a/scripts/update-primer.py b/scripts/update-primer.py index 83cc3be3..f30defdf 100755 --- a/scripts/update-primer.py +++ b/scripts/update-primer.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import argparse import re - from pathlib import Path root_dir = Path(__file__).parent.parent.parent diff --git a/tests/test_formatter/test_multi.py b/tests/test_formatter/test_multi.py index b11e813a..88ba6a6a 100644 --- a/tests/test_formatter/test_multi.py +++ b/tests/test_formatter/test_multi.py @@ -1,5 +1,4 @@ import pytest - from structlog.testing import capture_logs from ice.formatter.multi import _parse diff --git a/tests/test_main.py b/tests/test_main.py index be019887..85efd8e3 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,5 +1,4 @@ import inspect - from typing import Type import nest_asyncio diff --git a/tests/test_metrics.py b/tests/test_metrics.py index 4eec2bf2..7184c805 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -1,5 +1,4 @@ import numpy as np - from pytest import mark from ice.metrics.base import reduce_scores_dict diff --git a/tests/test_primer_recipes.py b/tests/test_primer_recipes.py index dcf4cae4..8fdebf82 100644 --- a/tests/test_primer_recipes.py +++ b/tests/test_primer_recipes.py @@ -3,7 +3,6 @@ from pathlib import Path import pytest - from faker import Faker from ice.paper import Paper