diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 1a62b67..1afb482 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -43,7 +43,7 @@ Slack Při psaní lze psát ``:slack:`#pyladies`` nebo i jenom ``:slack:`pyladies``, což vytvoří odkaz na kanál :slack:`#pyladies` na Pyvec Slacku. Funguje to díky vlastnímu rozšíření Sphinxu, které lze najít v souboru ``_extensions/slack.py``. -Všechny odkazy na kanál ``:slack:`#pyvec-board``, ať už je to ``:slack:`#pyvec-board`` nebo ``:slack:`#pyvec-board-2019-2021`` jsou automaticky předělány na odkaz na aktuální tajný kanál výboru. K určení správných roků se využívá soubor ``board.yml``. +Všechny odkazy na kanál ``:slack:`#pyvec-board``, ať už je to ``:slack:`#pyvec-board`` nebo ``:slack:`#pyvec-board-2019-2021`` jsou automaticky předělány na odkaz na aktuální tajný kanál výboru. K určení správných roků se využívá `soubor boards.toml `_. .. _docs-pyvec-rtd: @@ -90,6 +90,19 @@ Na repozitáři je zapojená `GitHub Action `_ jednou denně spustí, +* vygeneruje soubor ``operations/boards.rst`` ze `souboru boards.toml `_ a ze šablony ``operations/boards.rst``, +* commitne a pushne jej přes Git do repozitáře. + +Výsledná stránka je pouze informační, kanonickým zdrojem pravdy jsou v tomto případě státní registry. + .. _generate_grants: Skript na generování zápisů hlasování o grantech @@ -101,4 +114,4 @@ V adresáři ``scripts`` je skript ``generate_grants.py``, který: * vygeneruje soubor ``operations/grants.rst`` z dat na `pyvec/money `_ a ze šablony ``operations/grants.rst``, * commitne a pushne jej přes Git do repozitáře. -Hlasování o grantech probíhá :ref:`pomocí reakcí ` na GitHub Issues a tento skript hlasování archivuje sem do dokumentace pro účely jednoduššího vyhledávání, zálohy, kdyby se s `pyvec/money `_ něco stalo, a pro nějakou historickou evidenci. Kanonickým zdrojem pravdy ale zůstává hlasování přímo na GitHub Issues, toto je jen automatizovaný přepis. Skript započítává pouze hlasy od členů výboru (podle souboru ``src/pyvec_docs/board.yml``). +Hlasování o grantech probíhá :ref:`pomocí reakcí ` na GitHub Issues a tento skript hlasování archivuje sem do dokumentace pro účely jednoduššího vyhledávání, zálohy, kdyby se s `pyvec/money `_ něco stalo, a pro nějakou historickou evidenci. Kanonickým zdrojem pravdy ale zůstává hlasování přímo na GitHub Issues, toto je jen automatizovaný přepis. Skript započítává pouze hlasy od členů výboru (podle `souboru boards.toml `_). diff --git a/docs/operations/boards.rst b/docs/operations/boards.rst new file mode 100644 index 0000000..6eabf5b --- /dev/null +++ b/docs/operations/boards.rst @@ -0,0 +1,48 @@ +Výbory spolku +============= + +Historie složení :term:`výboru `. Kanonickým zdrojem pravdy je `výpis na justice.cz `_. Historii výborů si pro vlastní potřeby zaznamenáváme do `souboru boards.toml `_ a z něj se generuje i tato stránka. + +Kdyby něco nesedělo, ověřte `historii zdrojáku této stránky `_ a funkčnost :ref:`přepisů `. + +.. Soubor docs/operations/boards.rst je generován skriptem scripts/generate_boards.py ze šablony docs/operations/boards.rst.jinja. Neupravovat ručně! + + +Mandát od 9.4.2022 +------------------------------------------------- + +.. csv-table:: + :header: "Jméno", "GitHub", "Funkce" + + Barbora Drbohlavová, `@baradrb `_, |:crown:| + Anežka Müller, `@anezkamll `_, + Jan Javorek, `@honzajavorek `_, + Jakub Vysoký, `@kvbik `_, + Jan Čermák, `@sairon `_, |:moneybag:| + +Mandát od 8.4.2019 +------------------------------------------------- + +.. csv-table:: + :header: "Jméno", "GitHub", "Funkce" + + Martin Bílek, `@martinbilek `_, |:crown:| |:moneybag:| + Aleš Zoulek, `@aleszoulek `_, + Jan Javorek, `@honzajavorek `_, + Jakub Vysoký, `@kvbik `_, + Jiří Bartoň, `@whiskybar `_, + +Mandát od 27.3.2012 +------------------------------------------------- + +.. csv-table:: + :header: "Jméno", "GitHub", "Funkce" + + Martin Bílek, `@martinbilek `_, |:crown:| |:moneybag:| + Aleš Zoulek, `@aleszoulek `_, + Robin Gottfried, `@czervenka `_, + Jan Král, `@honzakral `_, + Jakub Vysoký, `@kvbik `_, + Jiří Bartoň, `@whiskybar `_, + Vítězslav Pliska, `@whit `_, + diff --git a/docs/operations/boards.rst.jinja b/docs/operations/boards.rst.jinja new file mode 100644 index 0000000..47e803a --- /dev/null +++ b/docs/operations/boards.rst.jinja @@ -0,0 +1,19 @@ +Výbory spolku +============= + +Historie složení :term:`výboru `. Kanonickým zdrojem pravdy je `výpis na justice.cz `_. Historii výborů si pro vlastní potřeby zaznamenáváme do `souboru boards.toml `_ a z něj se generuje i tato stránka. + +Kdyby něco nesedělo, ověřte `historii zdrojáku této stránky `_ a funkčnost :ref:`přepisů `. + +.. Soubor docs/operations/boards.rst je generován skriptem scripts/generate_boards.py ze šablony docs/operations/boards.rst.jinja. Neupravovat ručně! + +{% for board in boards %} +Mandát od {{ board.start_on.strftime("%-d.%-m.%Y") }} +------------------------------------------------- + +.. csv-table:: + :header: "Jméno", "GitHub", "Funkce" +{% for member in board.members %} + {{ member.name }}, `@{{ member.github }} `_, {% if member.is_chair %}|:crown:| {% endif %}{% if member.is_treasurer %}|:moneybag:| {% endif %} +{%- endfor %} +{% endfor %} diff --git a/docs/operations/elections.rst b/docs/operations/elections.rst index b881449..5934b01 100644 --- a/docs/operations/elections.rst +++ b/docs/operations/elections.rst @@ -62,7 +62,7 @@ Předání moci - Nový výbor oznámí své zvolení v :slack:`#announcements`. - Starý výbor zajistí vyhotovení zápisů ze zasedání členské schůze a z předání moci: - Vyhotoví :ref:`zápisy do této dokumentace `, - - aktualizuje `soubor board.yml `_, + - aktualizuje `soubor boards.toml `_, - aktualizuje role členů v `seznamu členů `__, čímž by se měl aktualizovat i web Pyvce - Starý výbor předá novému vše ze seznamu níže. diff --git a/docs/operations/grants.rst b/docs/operations/grants.rst index 106048b..4090eac 100644 --- a/docs/operations/grants.rst +++ b/docs/operations/grants.rst @@ -1,7 +1,7 @@ Elektronická hlasování o grantech ================================= -Od roku 2020 o grantech :term:`výbor ` hlasuje prostřednictvím repozitáře `pyvec/money `_. Zde je strojový přepis proběhlých hlasování. Kanonickým zdrojem pravdy je hlasování přímo na GitHub Issues. Kdyby něco nesedělo, ověřte `historii tohoto souboru `_ a funkčnost :ref:`přepisů `. +Od roku 2020 o grantech :term:`výbor ` hlasuje prostřednictvím repozitáře `pyvec/money `_. Zde je strojový přepis proběhlých hlasování. Kanonickým zdrojem pravdy je hlasování přímo na GitHub Issues. Kdyby něco nesedělo, ověřte `historii tohoto souboru `_ a funkčnost :ref:`přepisů `. .. Soubor operations/grants.rst je generován skriptem scripts/generate_grants.py ze šablony operations/grants.rst.jinja. Neupravovat ručně! diff --git a/docs/operations/grants.rst.jinja b/docs/operations/grants.rst.jinja index 4a88c8c..a2c938b 100644 --- a/docs/operations/grants.rst.jinja +++ b/docs/operations/grants.rst.jinja @@ -1,9 +1,9 @@ Elektronická hlasování o grantech ================================= -Od roku 2020 o grantech :term:`výbor ` hlasuje prostřednictvím repozitáře `pyvec/money `_. Zde je strojový přepis proběhlých hlasování. Kanonickým zdrojem pravdy je hlasování přímo na GitHub Issues. Kdyby něco nesedělo, ověřte `historii tohoto souboru `_ a funkčnost :ref:`přepisů `. +Od roku 2020 o grantech :term:`výbor ` hlasuje prostřednictvím repozitáře `pyvec/money `_. Zde je strojový přepis proběhlých hlasování. Kanonickým zdrojem pravdy je hlasování přímo na GitHub Issues. Kdyby něco nesedělo, ověřte `historii zdrojáku této stránky `_ a funkčnost :ref:`přepisů `. -.. Soubor operations/grants.rst je generován skriptem scripts/generate_grants.py ze šablony operations/grants.rst.jinja. Neupravovat ručně! +.. Soubor docs/operations/grants.rst je generován skriptem scripts/generate_grants.py ze šablony docs/operations/grants.rst.jinja. Neupravovat ručně! {% for grant in grants %} {{ grant.voted_at.day }}. {{ grant.voted_at.month }}. {{ grant.voted_at.year }} - elektronické hlasování výboru diff --git a/docs/operations/index.rst b/docs/operations/index.rst index 0f29383..e5f5dce 100644 --- a/docs/operations/index.rst +++ b/docs/operations/index.rst @@ -15,6 +15,7 @@ kolem `programovacího jazyka Python `__. Její cíle jsou fo domains web-apps twitter + boards meeting-notes grants bylaws diff --git a/pyproject.toml b/pyproject.toml index f5be839..2ba89ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,11 +5,11 @@ requires-python = "==3.12.*" dependencies = [ "jinja2==3.1.6", "myst-parser==4.0.1", + "pydantic==2.11.4", "requests==2.32.3", "sphinx-rtd-theme==3.0.2", "sphinx==8.2.3", "sphinxemoji==0.3.1", - "strictyaml==1.7.3", ] [dependency-groups] @@ -26,10 +26,6 @@ build-backend = "uv_build" [tool.pytest.ini_options] testpaths = "tests" addopts = "--ff --ruff --ruff-format" -norecursedirs = "_build _static _templates" - -[tool.ruff] -target-version = "py312" [tool.ruff.lint] extend-select = ["I"] diff --git a/scripts/generate_boards.py b/scripts/generate_boards.py new file mode 100644 index 0000000..adbfb59 --- /dev/null +++ b/scripts/generate_boards.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from jinja2 import Template + +from pyvec_docs.board import load_boards + + +CONTENT_PATH = Path(__file__).parent.parent / "docs" + + +if __name__ == "__main__": + tpl_path = CONTENT_PATH / "operations" / "boards.rst.jinja" + tpl = Template(tpl_path.read_text()) + print(tpl.render(boards=load_boards())) diff --git a/scripts/generate_grants.py b/scripts/generate_grants.py index 6a55118..a4dde59 100644 --- a/scripts/generate_grants.py +++ b/scripts/generate_grants.py @@ -5,7 +5,7 @@ import requests from jinja2 import Template -from pyvec_docs.board import BOARD_HISTORY +from pyvec_docs.board import load_boards from pyvec_docs.grants import get_lock_date, get_votes, remove_comments, to_date @@ -19,6 +19,8 @@ if __name__ == "__main__": + boards = load_boards() + res = requests.get( GITHUB_API_URL, headers=GITHUB_API_HEADERS, @@ -54,7 +56,7 @@ res = requests.get(issue["reactions"]["url"], headers=GITHUB_API_HEADERS) res.raise_for_status() - votes = list(get_votes(res.json(), voted_at, BOARD_HISTORY)) + votes = list(get_votes(res.json(), voted_at, boards)) grants.append( { diff --git a/src/pyvec_docs/board.py b/src/pyvec_docs/board.py index d1ee74b..f7eafa2 100644 --- a/src/pyvec_docs/board.py +++ b/src/pyvec_docs/board.py @@ -1,20 +1,60 @@ -from operator import itemgetter +import tomllib +from datetime import date +from enum import StrEnum +from functools import cache +from operator import attrgetter from pathlib import Path -import strictyaml as yaml +from pydantic import BaseModel -BOARD_HISTORY_SCHEMA = yaml.Seq( - yaml.Map( - { - "from": yaml.Datetime(), - "members": yaml.MapPattern(yaml.Str(), yaml.Str()), - } +BOARDS_CONFIG_PATH = Path(__file__).parent / "boards.toml" + +BOARDS_MANDATE_LENGTH = 3 + + +class BoardRole(StrEnum): + chair = "chair" + treasurer = "treasurer" + + +class BoardMember(BaseModel): + name: str + github: str + roles: set[BoardRole] | None = set() + + model_config = {"extra": "forbid", "frozen": True} + + @property + def is_chair(self) -> bool: + if self.roles is None: + return False + return BoardRole.chair in self.roles + + @property + def is_treasurer(self) -> bool: + if self.roles is None: + return False + return BoardRole.treasurer in self.roles + + +class Board(BaseModel): + start_on: date + members: list[BoardMember] + + model_config = {"extra": "forbid", "frozen": True} + + @property + def years(self) -> tuple[int, int]: + start_year = self.start_on.year + return (start_year, start_year + BOARDS_MANDATE_LENGTH) + + +@cache +def load_boards(path: Path | str = BOARDS_CONFIG_PATH) -> list[Board]: + data = tomllib.loads(Path(path).read_text()) + return sorted( + (Board(**board) for board in data["board"]), + key=attrgetter("start_on"), + reverse=True, ) -) -BOARD_HISTORY_PATH = Path(__file__).parent / "board.yml" -BOARD_HISTORY = sorted( - yaml.load(BOARD_HISTORY_PATH.read_text(), BOARD_HISTORY_SCHEMA).data, - key=itemgetter("from"), - reverse=True, -) diff --git a/src/pyvec_docs/board.yml b/src/pyvec_docs/board.yml deleted file mode 100644 index 2d1cae4..0000000 --- a/src/pyvec_docs/board.yml +++ /dev/null @@ -1,27 +0,0 @@ -# The Pyvec board members in time -# The current board is first, previous boards are listed in descending order -# Keys are GitHub handles, values legal names -# Members start with chair, others are sorted by GitHub handles -- from: 2022-04-09 - members: - baradrb: Barbora Drbohlavová - anezkamll: Anežka Müller - honzajavorek: Jan Javorek - kvbik: Jakub Vysoký - sairon: Jan Čermák -- from: 2019-04-08 - members: - martinbilek: Martin Bílek - aleszoulek: Aleš Zoulek - honzajavorek: Jan Javorek - kvbik: Jakub Vysoký - whiskybar: Jiří Bartoň -- from: 2012-03-27 - members: - martinbilek: Martin Bílek - aleszoulek: Aleš Zoulek - czervenka: Robin Gottfried - honzakral: Jan Král - kvbik: Jakub Vysoký - whiskybar: Jiří Bartoň - whit: Vítězslav Pliska diff --git a/src/pyvec_docs/boards.toml b/src/pyvec_docs/boards.toml new file mode 100644 index 0000000..c68bcd3 --- /dev/null +++ b/src/pyvec_docs/boards.toml @@ -0,0 +1,88 @@ +# The Pyvec board members in time +# The current board is first, previous boards are listed in descending order +# Each member has a `name`, `github`, and optionally a `roles` array + +[[board]] +start_on = "2022-04-09" + +[[board.members]] +name = "Barbora Drbohlavová" +github = "baradrb" +roles = ["chair"] + +[[board.members]] +name = "Anežka Müller" +github = "anezkamll" + +[[board.members]] +name = "Jan Javorek" +github = "honzajavorek" + +[[board.members]] +name = "Jakub Vysoký" +github = "kvbik" + +[[board.members]] +name = "Jan Čermák" +github = "sairon" +roles = ["treasurer"] + + + +[[board]] +start_on = "2019-04-08" + +[[board.members]] +name = "Martin Bílek" +github = "martinbilek" +roles = ["chair", "treasurer"] + +[[board.members]] +name = "Aleš Zoulek" +github = "aleszoulek" + +[[board.members]] +name = "Jan Javorek" +github = "honzajavorek" + +[[board.members]] +name = "Jakub Vysoký" +github = "kvbik" + +[[board.members]] +name = "Jiří Bartoň" +github = "whiskybar" + + + +[[board]] +start_on = "2012-03-27" + +[[board.members]] +name = "Martin Bílek" +github = "martinbilek" +roles = ["chair", "treasurer"] + +[[board.members]] +name = "Aleš Zoulek" +github = "aleszoulek" + +[[board.members]] +name = "Robin Gottfried" +github = "czervenka" + +[[board.members]] +name = "Jan Král" +github = "honzakral" + +[[board.members]] +name = "Jakub Vysoký" +github = "kvbik" + +[[board.members]] +name = "Jiří Bartoň" +github = "whiskybar" + +[[board.members]] +name = "Vítězslav Pliska" +github = "whit" diff --git a/src/pyvec_docs/ext/slack.py b/src/pyvec_docs/ext/slack.py index 2ba0118..9d837b6 100644 --- a/src/pyvec_docs/ext/slack.py +++ b/src/pyvec_docs/ext/slack.py @@ -9,7 +9,7 @@ from docutils import nodes -from pyvec_docs.board import BOARD_HISTORY +from pyvec_docs.board import load_boards # https://docutils.readthedocs.io/en/sphinx-docs/howto/rst-roles.html @@ -34,8 +34,6 @@ def slack( def setup(app): - board_year_from = BOARD_HISTORY[0]["from"].year - board_years = (board_year_from, board_year_from + 3) - - app.add_role("slack", functools.partial(slack, pyvec_board_years=board_years)) + pyvec_board_years = load_boards()[0].years + app.add_role("slack", functools.partial(slack, pyvec_board_years=pyvec_board_years)) return {"version": "1.0", "parallel_read_safe": True} diff --git a/src/pyvec_docs/grants.py b/src/pyvec_docs/grants.py index 75b46bf..6b7b75a 100644 --- a/src/pyvec_docs/grants.py +++ b/src/pyvec_docs/grants.py @@ -1,6 +1,8 @@ import re from datetime import date +from pyvec_docs.board import Board + REACTIONS_MAPPING = {"+1": "ano", "-1": "ne", "eyes": "zdržel(a) se"} @@ -14,17 +16,21 @@ def remove_comments(html): return re.sub(r"", "", html).strip() -def get_board_member_name(username, voted_at, board_history): - for board in board_history: # sorted from the most recent - if voted_at > board["from"].date(): - return board["members"].get(username) +def get_board_member_name(username, voted_at, boards: list[Board]): + print(username, voted_at) + for board in boards: # sorted from the most recent + if voted_at > board.start_on: + for member in board.members: + if member.github == username: + return member.name + return None return None -def get_votes(reactions, voted_at, board_history): +def get_votes(reactions, voted_at, boards: list[Board]): for reaction in reactions: username = reaction["user"]["login"] - name = get_board_member_name(username, voted_at, board_history) + name = get_board_member_name(username, voted_at, boards) if name: # else not reaction from a board member text = REACTIONS_MAPPING.get(reaction["content"]) if text: diff --git a/tests/test_scripts_generate_grants.py b/tests/test_scripts_generate_grants.py index fa5553b..3194671 100644 --- a/tests/test_scripts_generate_grants.py +++ b/tests/test_scripts_generate_grants.py @@ -1,7 +1,8 @@ -from datetime import date, datetime +from datetime import date import pytest +from pyvec_docs.board import Board from pyvec_docs.grants import ( get_board_member_name, get_votes, @@ -11,13 +12,25 @@ @pytest.fixture -def board_history(): +def boards(): return [ # sorted! - { - "from": datetime(2020, 1, 1), - "members": {"alice": "Alice", "doubravka": "Doubravka"}, - }, - {"from": datetime(2019, 1, 1), "members": {"bobby": "Bob"}}, + Board( + **{ + "start_on": date(2020, 1, 1), + "members": [ + {"name": "Alice", "github": "alice"}, + {"name": "Doubravka", "github": "doubravka"}, + ], + } + ), + Board( + **{ + "start_on": date(2019, 1, 1), + "members": [ + {"name": "Bob", "github": "bobby"}, + ], + } + ), ] @@ -39,7 +52,7 @@ def test_remove_comments(): @pytest.mark.parametrize( - "username,voted_at,expected", + "username, voted_at, expected", [ pytest.param("bobby", date(2019, 8, 30), "Bob", id="bob-board-y"), pytest.param("alice", date(2019, 8, 30), None, id="alice-board-n"), @@ -47,30 +60,30 @@ def test_remove_comments(): pytest.param("alice", date(2020, 8, 30), "Alice", id="alice-board-y"), ], ) -def test_get_board_member_name(username, voted_at, board_history, expected): - assert get_board_member_name(username, voted_at, board_history) == expected +def test_get_board_member_name(username, voted_at, boards, expected): + assert get_board_member_name(username, voted_at, boards) == expected -def test_get_votes_returns_only_board_members_votes(board_history): +def test_get_votes_returns_only_board_members_votes(boards): reactions = [ {"user": {"login": "bobby"}, "content": "+1"}, {"user": {"login": "alice"}, "content": "+1"}, {"user": {"login": "doubravka"}, "content": "+1"}, ] - assert list(get_votes(reactions, date(2020, 8, 30), board_history)) == [ + assert list(get_votes(reactions, date(2020, 8, 30), boards)) == [ {"name": "Alice", "text": "ano"}, {"name": "Doubravka", "text": "ano"}, ] -def test_get_votes_returns_only_relevant_emojis(board_history): +def test_get_votes_returns_only_relevant_emojis(boards): reactions = [ {"user": {"login": "alice"}, "content": "+1"}, {"user": {"login": "doubravka"}, "content": "heart"}, ] - assert list(get_votes(reactions, date(2020, 8, 30), board_history)) == [ + assert list(get_votes(reactions, date(2020, 8, 30), boards)) == [ {"name": "Alice", "text": "ano"}, ] @@ -83,12 +96,12 @@ def test_get_votes_returns_only_relevant_emojis(board_history): ("eyes", "zdržel(a) se"), ], ) -def test_get_votes_understands_all_relevant_emojis(content, board_history, expected): +def test_get_votes_understands_all_relevant_emojis(content, boards, expected): reactions = [ {"user": {"login": "alice"}, "content": content}, {"user": {"login": "doubravka"}, "content": "heart"}, ] - assert list(get_votes(reactions, date(2020, 8, 30), board_history)) == [ + assert list(get_votes(reactions, date(2020, 8, 30), boards)) == [ {"name": "Alice", "text": expected}, ] diff --git a/uv.lock b/uv.lock index b14d874..1f910d5 100644 --- a/uv.lock +++ b/uv.lock @@ -11,6 +11,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, ] +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + [[package]] name = "anyio" version = "4.9.0" @@ -229,6 +238,46 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, ] +[[package]] +name = "pydantic" +version = "2.11.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540, upload-time = "2025-04-29T20:38:55.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900, upload-time = "2025-04-29T20:38:52.724Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, +] + [[package]] name = "pygments" version = "2.19.1" @@ -266,18 +315,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0f/7a/ed1015e97fadfde96b2c439390dc5a75542a77982d775baf2ada9f536cac/pytest_ruff-0.4.1-py3-none-any.whl", hash = "sha256:69acd5b2ba68d65998c730b5b4d656788193190e45f61a53aa66ef8b390634a4", size = 4589, upload-time = "2024-07-21T08:01:28.997Z" }, ] -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, -] - [[package]] name = "pyvec-docs" version = "0" @@ -285,11 +322,11 @@ source = { editable = "." } dependencies = [ { name = "jinja2" }, { name = "myst-parser" }, + { name = "pydantic" }, { name = "requests" }, { name = "sphinx" }, { name = "sphinx-rtd-theme" }, { name = "sphinxemoji" }, - { name = "strictyaml" }, ] [package.dev-dependencies] @@ -303,11 +340,11 @@ dev = [ requires-dist = [ { name = "jinja2", specifier = "==3.1.6" }, { name = "myst-parser", specifier = "==4.0.1" }, + { name = "pydantic", specifier = "==2.11.4" }, { name = "requests", specifier = "==2.32.3" }, { name = "sphinx", specifier = "==8.2.3" }, { name = "sphinx-rtd-theme", specifier = "==3.0.2" }, { name = "sphinxemoji", specifier = "==0.3.1" }, - { name = "strictyaml", specifier = "==1.7.3" }, ] [package.metadata.requires-dev] @@ -383,15 +420,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cd/be/f6b790d6ae98f1f32c645f8540d5c96248b72343b0a56fab3a07f2941897/ruff-0.11.8-py3-none-win_arm64.whl", hash = "sha256:304432e4c4a792e3da85b7699feb3426a0908ab98bf29df22a31b0cdd098fac2", size = 10713129, upload-time = "2025-05-01T14:53:22.27Z" }, ] -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, -] - [[package]] name = "sniffio" version = "1.3.1" @@ -560,24 +588,24 @@ wheels = [ ] [[package]] -name = "strictyaml" -version = "1.7.3" +name = "typing-extensions" +version = "4.13.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/08/efd28d49162ce89c2ad61a88bd80e11fb77bc9f6c145402589112d38f8af/strictyaml-1.7.3.tar.gz", hash = "sha256:22f854a5fcab42b5ddba8030a0e4be51ca89af0267961c8d6cfa86395586c407", size = 115206, upload-time = "2023-03-10T12:50:27.062Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/7c/a81ef5ef10978dd073a854e0fa93b5d8021d0594b639cc8f6453c3c78a1d/strictyaml-1.7.3-py3-none-any.whl", hash = "sha256:fb5c8a4edb43bebb765959e420f9b3978d7f1af88c80606c03fb420888f5d1c7", size = 123917, upload-time = "2023-03-10T12:50:17.242Z" }, + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, ] [[package]] -name = "typing-extensions" -version = "4.13.2" +name = "typing-inspection" +version = "0.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload-time = "2025-02-25T17:27:59.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, ] [[package]]