9.9 KiB
Промт: болт ГОСТ 7805-70 в каталоге standard_products
Адаптация исходного промта «C++/Qt/OCCT desktop-приложение» под текущий проект: Python 3.10+, SQLite, пакет
standard_products, CLIstdparts. 3D/STEP вынесены в опциональную фазу (см. приложение).
РОЛЬ И КОНТЕКСТ
Ты — senior Python-разработчик. Работаешь в репозитории
библиотека-стандартных-изделий: каталог стандартных изделий на SQLite.
Уже есть пакет src/standard_products/ (db.py, cli.py), тесты
tests/, примеры examples/, документация docs/. Зависимостей в
рантайме нет — только стандартная библиотека.
Задача — добавить в каталог болты с шестигранной головкой по ГОСТ 7805-70 (класс точности А) как параметрическое семейство: таблица размеров, валидация, генерация изделий и загрузка в базу.
ЗАДАЧА (MVP)
- Новый модуль
src/standard_products/gost_7805.py:BoltSize(frozen dataclass), таблица размеров, допустимые длины;- функции получения размера, проверки длины, формирования
Product; - идемпотентная загрузка всего семейства в БД.
- Команды CLI в
src/standard_products/cli.py:stdparts bolts— таблица размеров;stdparts bolts --size M10 --length 40— параметры одного болта в JSON;stdparts seed-bolts— загрузить все комбинации M×L в каталог.
- Тесты
tests/test_gost_7805.py. - Документация
docs/gost-7805.md. - Экспорт
examples/gost_7805.json(сгенерировать из таблицы, не руками).
СТЕК (строго соблюдать)
- Python 3.10+, только стандартная библиотека в рантайме.
- SQLite через существующий
db.py(Product,upsert_product,connect). - pytest / ruff / mypy — dev-зависимости, уже настроены в
pyproject.toml. - Никаких новых обязательных зависимостей.
ТАБЛИЦА ПАРАМЕТРОВ (ГОСТ 7805-70, класс точности А)
Захардкодь в gost_7805.py:
@dataclass(frozen=True, slots=True)
class BoltSize:
d: float # номинальный диаметр резьбы, мм
P: float # шаг резьбы, мм
S: float # размер под ключ (между гранями), мм
k: float # высота головки, мм
e: float # размер по углам (справочно), мм
b: float | None = None # длина резьбы, мм (в источнике не задана)
Данные (только эти строки, не выдумывай свои):
| Размер | d | P | S | k | e |
|---|---|---|---|---|---|
| M6 | 6 | 1.0 | 10 | 4.0 | 11.05 |
| M8 | 8 | 1.25 | 13 | 5.3 | 14.38 |
| M10 | 10 | 1.5 | 16 | 6.4 | 17.77 |
| M12 | 12 | 1.75 | 18 | 7.5 | 19.85 |
| M16 | 16 | 2.0 | 24 | 10.0 | 26.75 |
Доступные длины стержня L (мм): 20, 25, 30, 35, 40, 50, 60, 70, 80.
Значение b в источнике не приведено — оставь None, не подставляй
расчётные или справочные значения из головы.
ТРЕБОВАНИЯ К МОДУЛЮ
Публичный API (имена можно уточнить, но смысл сохранить):
BOLT_SIZES: dict[str, BoltSize] # ключи: "M6", "M8", "M10", "M12", "M16"
ALLOWED_LENGTHS_MM: tuple[int, ...] # (20, 25, ..., 80)
def get_size(label: str) -> BoltSize: ...
def validate_length(length: int) -> None: ...
def bolt_designation(size: BoltSize, length: int) -> str: ...
def build_product(size: BoltSize, length: int) -> Product: ...
def iter_products() -> Iterator[Product]: ...
def seed_bolts(connection: sqlite3.Connection) -> int: ...
Правила:
designation:"Болт M10x40 ГОСТ 7805-70"(диаметр — целое без.0).name:"Болт с шестигранной головкой".standard:"ГОСТ 7805-70",category:"Крепёж",unit:"шт".materialиmass_kgне заданы в источнике —None.- Параметры ГОСТ кладутся в
attributes(ключи на русском, как в проекте):диаметр,шаг_резьбы,размер_под_ключ,высота_головки,размер_по_углам,длина,длина_резьбы(еслиb is None— не добавлять). seed_boltsиспользуетupsert_product, поэтому повторный запуск не создаёт дубликатов и возвращает число обработанных записей (5 × 9 = 45).- Ошибки —
ValueErrorс перечислением допустимых значений:get_size("M7"),validate_length(45). - Никаких изменений схемы БД и сигнатур существующих функций
db.py.
ТРЕБОВАНИЯ К CLI
Добавить подкоманды, не ломая существующие:
stdparts bolts # таблица размеров
stdparts bolts --size M10 --length 40 # JSON одного изделия
stdparts seed-bolts # загрузить 45 изделий (идемпотентно)
--sizeи--lengthвалидируются теми же функциями; при ошибке — сообщение вstderrи код возврата 1.seed-boltsпечатает число загруженных записей.- Работает с глобальным
--db, как остальные команды.
ТЕСТЫ (обязательно)
tests/test_gost_7805.py:
- Таблица содержит ровно 5 размеров, значения совпадают с промтом.
bolt_designationдаёт"Болт M10x40 ГОСТ 7805-70"и не даётM10.0.build_productзаполняетstandard/category/unit/attributes.get_sizeиvalidate_lengthкидаютValueErrorна недопустимых входах.seed_boltsв temp-БД создаёт 45 записей; повторный вызов — всё ещё 45.- Несколько записей находятся через
search_products(conn, "ГОСТ 7805-70"). - CLI:
bolts --size M10 --length 40возвращает 0 и валидный JSON.
ДОКУМЕНТАЦИЯ
docs/gost-7805.md: таблица размеров, допустимые длины, формат
designation, соответствие полей Product ↔ attributes, примеры команд.
Ссылка из README.md в разделе про данные.
ОГРАНИЧЕНИЯ (ЧТО НЕ ДЕЛАТЬ — строго)
- ❌ Не добавлять C++, Qt, OpenCASCADE, CMake — это другой стек и его нет в проекте.
- ❌ Не делать 3D-геометрию, резьбу, спирали, вырезы и экспорт STEP в MVP.
- ❌ Не менять схему SQLite и не добавлять миграции.
- ❌ Не добавлять другие типы изделий (гайки, шайбы) — только болт 7805-70.
- ❌ Не добавлять обязательные зависимости, логирование, настройки, темы.
- ❌ Не выдумывать размеры, длины, массу и
b, которых нет в источнике. - ❌ Не дублировать логику
db.py— использоватьProductиupsert_product.
ФОРМАТ ОТВЕТА
Код каждого файла — отдельным блоком с полным путём:
# File: src/standard_products/gost_7805.py
...
Затем — короткая инструкция (3–5 команд): установка, тесты, линтеры, пример запуска. В конце — отчёт: какие файлы изменены и почему.
КРИТЕРИИ ПРИЁМКИ
pytest— зелёный, включая новые тесты.ruff check .иmypy src— без ошибок.stdparts seed-boltsсоздаёт 45 изделий; повторный запуск — те же 45.stdparts search "ГОСТ 7805-70"находит загруженные болты.stdparts bolts --size M16 --length 80печатает корректный JSON.- Существующие команды и тесты не сломаны.
- Новых обязательных зависимостей нет.
ПРИЛОЖЕНИЕ (вне MVP): STEP-экспорт
Если позже понадобится STEP, это отдельная задача и отдельный модуль
step_export.py с опциональной зависимостью (cadquery/OCP), не
входящей в базовую установку. Геометрия строится из тех же BoltSize:
шестигранная призма S × k, цилиндр d/2 × L, фаска 0.3×45° на торце.
Резьба не моделируется. До появления зависимости модуль не добавлять.