Compare commits

...

6 Commits

Author SHA1 Message Date
f35b1c5d0b connect patterns with single link
All checks were successful
CI/CD / wol (push) Successful in 0s
CI/CD / build (push) Successful in 14s
2025-09-12 23:05:28 +02:00
5a3b637582 switch CI to uv
All checks were successful
CI/CD / wol (push) Successful in 0s
CI/CD / build (push) Successful in 35s
2025-09-12 22:20:29 +02:00
d89c296d36 add center sphere to small z pattern
Some checks failed
CI/CD / wol (push) Successful in 0s
CI/CD / build (push) Failing after 4m44s
2025-09-06 16:01:41 +02:00
6902f07161 uv build local project dev 2025-09-06 15:43:58 +02:00
2929064f4d use uv
Some checks failed
CI/CD / wol (push) Successful in 0s
CI/CD / build (push) Failing after 4m42s
2025-09-06 15:28:15 +02:00
a4707c6423 fix ultima pattern upper line 2025-09-06 15:17:03 +02:00
11 changed files with 254 additions and 43 deletions

View File

@@ -16,17 +16,19 @@ jobs:
sleep 5 sleep 5
done done
build: build:
runs-on: ubuntu-latest runs-on: galactica
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up Python - name: Set up Python 3.12
uses: actions/setup-python@v5 uses: actions/setup-python@v4
with: with:
python-version: '3.12' python-version: "3.12"
cache: 'pip' - name: Install uv
- run: pip install -r requirements.txt uses: astral-sh/setup-uv@v5
- name: Set up Python
run: uv python install
- name: Install the code linting and formatting tool Ruff - name: Install the code linting and formatting tool Ruff
run: pip install ruff run: uv build
- name: Lint code with Ruff - name: Lint code with Ruff
run: ruff check --output-format=github --target-version=py39 run: ruff check --output-format=github --target-version=py39
- name: Check code formatting with Ruff - name: Check code formatting with Ruff

1
.python-version Normal file
View File

@@ -0,0 +1 @@
3.12

View File

@@ -60,11 +60,13 @@ class AgilitySphereGraphicsItem(SphereGraphicsItem):
def __init__(self, x_pos: int, y_pos: int) -> None: def __init__(self, x_pos: int, y_pos: int) -> None:
super().__init__(x_pos, y_pos, Qt.GlobalColor.darkYellow) super().__init__(x_pos, y_pos, Qt.GlobalColor.darkYellow)
class EmptySphereGraphicsItem(SphereGraphicsItem): class EmptySphereGraphicsItem(SphereGraphicsItem):
def __init__(self, x_pos: int, y_pos: int) -> None: def __init__(self, x_pos: int, y_pos: int) -> None:
self.SPHERE_WIDTH = 20 self.SPHERE_WIDTH = 20
super().__init__(x_pos, y_pos, Qt.GlobalColor.black) super().__init__(x_pos, y_pos, Qt.GlobalColor.black)
@staticmethod @staticmethod
def random_sphere_factory(x_pos: int, y_pos: int) -> SphereGraphicsItem: def random_sphere_factory(x_pos: int, y_pos: int) -> SphereGraphicsItem:
rand = random.random() rand = random.random()
@@ -78,6 +80,7 @@ def random_sphere_factory(x_pos: int, y_pos: int) -> SphereGraphicsItem:
obj = EmptySphereGraphicsItem(x_pos, y_pos) obj = EmptySphereGraphicsItem(x_pos, y_pos)
return obj return obj
class ArcGraphicsItem(QGraphicsItem): class ArcGraphicsItem(QGraphicsItem):
"""Circle arc.""" """Circle arc."""
@@ -111,7 +114,7 @@ class ArcGraphicsItem(QGraphicsItem):
# must a more elegant way but it works # must a more elegant way but it works
if angle_end == 0: if angle_end == 0:
angle_end = 360 angle_end = 360
self.draw_angle_end = int(abs(angle_end-angle_start) * 16) self.draw_angle_end = int(abs(angle_end - angle_start) * 16)
logging.debug( logging.debug(
"arc from %s:%s of %s from %s° to %s°", "arc from %s:%s of %s from %s° to %s°",
self.x_pos, self.x_pos,

View File

@@ -2,9 +2,8 @@ import math
from typing import List, Tuple from typing import List, Tuple
from PySide6.QtCore import Qt
from PySide6.QtGui import QBrush, QPainter from PySide6.QtGui import QPainter
from PySide6.QtWidgets import QGraphicsItemGroup from PySide6.QtWidgets import QGraphicsItemGroup
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
@@ -16,6 +15,7 @@ from grid.ui.items import (
HPSphereGraphicsItem, HPSphereGraphicsItem,
ArcGraphicsItem, ArcGraphicsItem,
LineGraphicsItem, LineGraphicsItem,
SphereGraphicsItem,
random_sphere_factory, random_sphere_factory,
) )
@@ -31,6 +31,26 @@ class Pattern(QGraphicsItemGroup):
# center coordinates of the pattern # center coordinates of the pattern
self.center_x = top_left_corner_x + int(self.PATTERN_WIDTH / 2) self.center_x = top_left_corner_x + int(self.PATTERN_WIDTH / 2)
self.center_y = top_left_corner_y + int(self.PATTERN_WIDTH / 2) self.center_y = top_left_corner_y + int(self.PATTERN_WIDTH / 2)
self.external_connectors: List[SphereGraphicsItem] = []
def get_external_connectors(self) -> List[SphereGraphicsItem]:
"""Candidate spheres to connect with other patterns.
Returns:
List[SphereGraphicsItem]: List of spheres
"""
return self.external_connectors
def connect(self, other: "Pattern") -> None:
s1 = self.external_connectors[0]
s2 = other.external_connectors[1]
line_start_x = s1.x_pos + s1.SPHERE_WIDTH / 2
line_start_y = s1.y_pos + s1.SPHERE_WIDTH / 2
line_end_x = s2.x_pos + s2.SPHERE_WIDTH / 2
line_end_y = s2.y_pos + s2.SPHERE_WIDTH / 2
self.addToGroup(
LineGraphicsItem(line_start_x, line_start_y, line_end_x, line_end_y, self)
)
def paint( def paint(
self, self,
@@ -39,8 +59,8 @@ class Pattern(QGraphicsItemGroup):
widget: QWidget | None = ..., widget: QWidget | None = ...,
): ):
super().paint(painter, option, widget) super().paint(painter, option, widget)
brush = QBrush(Qt.GlobalColor.gray) # brush = QBrush(Qt.GlobalColor.gray)
painter.setBrush(brush) # painter.setBrush(brush)
painter.drawRect( painter.drawRect(
self.top_left_corner_x, self.top_left_corner_x,
self.top_left_corner_y, self.top_left_corner_y,
@@ -94,9 +114,9 @@ class LargeUltimaPattern(Pattern):
) )
line_start_x = self.center_x line_start_x = self.center_x
line_start_y = top_left_corner_y + self.SPACE_BETWEEN_SPHERE * 1.5 line_start_y = top_left_corner_y + self.SPACE_BETWEEN_SPHERE
line_end_x = self.center_x line_end_x = self.center_x
line_end_y = top_left_corner_y + self.SPACE_BETWEEN_SPHERE # * 2.5 line_end_y = line_start_y + self.SPACE_BETWEEN_SPHERE
self.addToGroup( self.addToGroup(
LineGraphicsItem(line_start_x, line_start_y, line_end_x, line_end_y, self) LineGraphicsItem(line_start_x, line_start_y, line_end_x, line_end_y, self)
) )
@@ -112,8 +132,8 @@ class LargeUltimaPattern(Pattern):
y_pos=self.center_y, y_pos=self.center_y,
width=self.SPACE_BETWEEN_SPHERE * 2, width=self.SPACE_BETWEEN_SPHERE * 2,
angle_start=(i * 360 / sphere_on_circle) % 360, angle_start=(i * 360 / sphere_on_circle) % 360,
#angle_end=((i + 1) * 360 / sphere_on_circle) % 360, # angle_end=((i + 1) * 360 / sphere_on_circle) % 360,
angle_end=(360 / sphere_on_circle ), angle_end=(360 / sphere_on_circle),
parent=self, parent=self,
) )
) )
@@ -143,7 +163,9 @@ class LargeUltimaPattern(Pattern):
) )
) )
for x, y in points: for x, y in points:
self.addToGroup(random_sphere_factory(x, y)) external_sphere = random_sphere_factory(x, y)
self.addToGroup(external_sphere)
self.external_connectors.append(external_sphere)
# self.addToGroup( # self.addToGroup(
# ArcGraphicsItem( # ArcGraphicsItem(
# self.center_x, self.center_y, self.SPACE_BETWEEN_SPHERE * 2, 0, 90, self # self.center_x, self.center_y, self.SPACE_BETWEEN_SPHERE * 2, 0, 90, self
@@ -161,7 +183,7 @@ class SmallZPattern(Pattern):
sphere_on_circle = 6 sphere_on_circle = 6
for i in range(sphere_on_circle): for i in range(sphere_on_circle):
if i == 2 or i == 3: if i == 2 or i == 3 or i == 5 or i == 0:
continue continue
else: else:
self.addToGroup( self.addToGroup(
@@ -177,8 +199,22 @@ class SmallZPattern(Pattern):
points = self.generate_circle_points( points = self.generate_circle_points(
self.center_x, self.center_y, self.SPACE_BETWEEN_SPHERE, sphere_on_circle self.center_x, self.center_y, self.SPACE_BETWEEN_SPHERE, sphere_on_circle
) )
self.addToGroup(
LineGraphicsItem(
self.center_x, self.center_y, points[1][0], points[1][1], self
)
)
self.addToGroup(
LineGraphicsItem(
self.center_x, self.center_y, points[4][0], points[4][1], self
)
)
# Remove left and right sphere # Remove left and right sphere
del points[0] del points[0]
del points[2] del points[2]
for x, y in points: for x, y in points:
self.addToGroup(random_sphere_factory(x, y)) external_sphere = random_sphere_factory(x, y)
self.addToGroup(external_sphere)
self.external_connectors.append(external_sphere)
self.addToGroup(HPSphereGraphicsItem(self.center_x, self.center_y))

View File

@@ -1,9 +1,5 @@
import logging
import sys
from PySide6.QtGui import QPainter from PySide6.QtGui import QPainter
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QApplication,
QGraphicsScene, QGraphicsScene,
QGraphicsView, QGraphicsView,
QHBoxLayout, QHBoxLayout,
@@ -22,7 +18,8 @@ class Window(QWidget):
self.scene = QGraphicsScene(0, 0, 400, 400) self.scene = QGraphicsScene(0, 0, 400, 400)
pp1 = LargeUltimaPattern(0, 0) pp1 = LargeUltimaPattern(0, 0)
pp2 = SmallZPattern(401, 0) pp2 = SmallZPattern(351, 0)
pp1.connect(pp2)
self.scene.addItem(pp1) self.scene.addItem(pp1)
self.scene.addItem(pp2) self.scene.addItem(pp2)
@@ -34,12 +31,3 @@ class Window(QWidget):
self.setLayout(vbox) self.setLayout(vbox)
self.show() self.show()
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
app = QApplication(sys.argv)
w = Window()
app.exec()

19
main.py Normal file
View File

@@ -0,0 +1,19 @@
import logging
import sys
from grid.ui.window import Window
from PySide6.QtWidgets import QApplication
def main():
print("Hello from sphere-grid!")
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
app = QApplication(sys.argv)
w = Window() # noqa: F841
app.exec()
if __name__ == "__main__":
main()

15
pyproject.toml Normal file
View File

@@ -0,0 +1,15 @@
[project]
name = "sphere-grid"
version = "0.1.0"
description = ""
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"pyside6>=6.6.1",
"pytest==8.3.3",
"ruff==0.12.10",
]
[build-system]
requires = ["setuptools>=42"]
build-backend = "setuptools.build_meta"

View File

@@ -1,3 +0,0 @@
pyside6>=6.6.1
pytest==8.3.3
ruff==0.12.10

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -1,7 +0,0 @@
from setuptools import find_packages, setup
setup(
name="sphere_grid",
version="1.0",
packages=find_packages("."),
)

157
uv.lock generated Normal file
View File

@@ -0,0 +1,157 @@
version = 1
revision = 3
requires-python = ">=3.12"
[[package]]
name = "colorama"
version = "0.4.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
[[package]]
name = "iniconfig"
version = "2.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" },
]
[[package]]
name = "packaging"
version = "25.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
]
[[package]]
name = "pluggy"
version = "1.6.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
[[package]]
name = "pyside6"
version = "6.9.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pyside6-addons" },
{ name = "pyside6-essentials" },
{ name = "shiboken6" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/43/42/43577413bd5ab26f5f21e7a43c9396aac158a5d01900c87e4609c0e96278/pyside6-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:71245c76bfbe5c41794ffd8546730ec7cc869d4bbe68535639e026e4ef8a7714", size = 558102, upload-time = "2025-08-26T07:52:57.302Z" },
{ url = "https://files.pythonhosted.org/packages/12/df/cb84f802df3dcc1d196d2f9f37dbb8227761826f936987c9386b8ae1ffcc/pyside6-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:64a9e2146e207d858e00226f68d7c1b4ab332954742a00dcabb721bb9e4aa0cd", size = 558243, upload-time = "2025-08-26T07:52:59.272Z" },
{ url = "https://files.pythonhosted.org/packages/94/2d/715db9da437b4632d06e2c4718aee9937760b84cf36c23d5441989e581b0/pyside6-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:a78fad16241a1f2ed0fa0098cf3d621f591fc75b4badb7f3fa3959c9d861c806", size = 558245, upload-time = "2025-08-26T07:53:00.838Z" },
{ url = "https://files.pythonhosted.org/packages/59/90/2e75cbff0e17f16b83d2b7e8434ae9175cae8d6ff816c9b56d307cf53c86/pyside6-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:d1afbf48f9a5612b9ee2dc7c384c1a65c08b5830ba5e7d01f66d82678e5459df", size = 564604, upload-time = "2025-08-26T07:53:02.402Z" },
{ url = "https://files.pythonhosted.org/packages/dc/34/e3dd4e046673efcbcfbe0aa2760df06b2877739b8f4da60f0229379adebd/pyside6-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:1499b1d7629ab92119118e2636b4ace836b25e457ddf01003fdca560560b8c0a", size = 401833, upload-time = "2025-08-26T07:53:03.742Z" },
]
[[package]]
name = "pyside6-addons"
version = "6.9.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pyside6-essentials" },
{ name = "shiboken6" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/47/39/a8f4a55001b6a0aaee042e706de2447f21c6dc2a610f3d3debb7d04db821/pyside6_addons-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:7019fdcc0059626eb1608b361371f4dc8cb7f2d02f066908fd460739ff5a07cd", size = 316693692, upload-time = "2025-08-26T07:33:31.529Z" },
{ url = "https://files.pythonhosted.org/packages/14/48/0b16e9dabd4cafe02d59531832bc30b6f0e14c92076e90dd02379d365cb2/pyside6_addons-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:24350e5415317f269e743d1f7b4933fe5f59d90894aa067676c9ce6bfe9e7988", size = 166984613, upload-time = "2025-08-26T07:33:47.569Z" },
{ url = "https://files.pythonhosted.org/packages/f4/55/dc42a73387379bae82f921b7659cd2006ec0e80f7052f83ddc07e9eb9cca/pyside6_addons-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:af8dee517de8d336735a6543f7dd496eb580e852c14b4d2304b890e2a29de499", size = 162908466, upload-time = "2025-08-26T07:39:49.331Z" },
{ url = "https://files.pythonhosted.org/packages/14/fa/396a2e86230c493b565e2dc89dc64e4b1c63582ac69afe77b693c3817a53/pyside6_addons-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:98d2413904ee4b2b754b077af7875fa6ec08468c01a6628a2c9c3d2cece4874f", size = 160216647, upload-time = "2025-08-26T07:42:18.903Z" },
{ url = "https://files.pythonhosted.org/packages/a7/fe/25f61259f1d5ec4648c9f6d2abd8e2cba2188f10735a57abafda719958e5/pyside6_addons-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:b430cae782ff1a99fb95868043557f22c31b30c94afb9cf73278584e220a2ab6", size = 27126649, upload-time = "2025-08-26T07:42:37.696Z" },
]
[[package]]
name = "pyside6-essentials"
version = "6.9.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "shiboken6" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/08/21/41960c03721a99e7be99a96ebb8570bdfd6f76f512b5d09074365e27ce28/pyside6_essentials-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:713eb8dcbb016ff10e6fca129c1bf2a0fd8cfac979e689264e0be3b332f9398e", size = 133092348, upload-time = "2025-08-26T07:43:57.231Z" },
{ url = "https://files.pythonhosted.org/packages/3e/02/e38ff18f3d2d8d3071aa6823031aad6089267aa4668181db65ce9948bfc0/pyside6_essentials-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:84b8ca4fa56506e2848bdb4c7a0851a5e7adcb916bef9bce25ce2eeb6c7002cc", size = 96569791, upload-time = "2025-08-26T07:44:41.392Z" },
{ url = "https://files.pythonhosted.org/packages/9a/a1/1203d4db6919b42a937d9ac5ddb84b20ea42eb119f7c1ddeb77cb8fdb00c/pyside6_essentials-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:d0f701503974bd51b408966539aa6956f3d8536e547ea8002fbfb3d77796bbc3", size = 94311809, upload-time = "2025-08-26T07:46:44.924Z" },
{ url = "https://files.pythonhosted.org/packages/a8/e3/3b3e869d3e332b6db93f6f64fac3b12f5c48b84f03f2aa50ee5c044ec0de/pyside6_essentials-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:b2f746f795138ac63eb173f9850a6db293461a1b6ce22cf6dafac7d194a38951", size = 72624566, upload-time = "2025-08-26T07:48:04.64Z" },
{ url = "https://files.pythonhosted.org/packages/91/70/db78afc8b60b2e53f99145bde2f644cca43924a4dd869ffe664e0792730a/pyside6_essentials-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:ecd7b5cd9e271f397fb89a6357f4ec301d8163e50869c6c557f9ccc6bed42789", size = 49561720, upload-time = "2025-08-26T07:49:43.708Z" },
]
[[package]]
name = "pytest"
version = "8.3.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "iniconfig" },
{ name = "packaging" },
{ name = "pluggy" },
]
sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487, upload-time = "2024-09-10T10:52:15.003Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341, upload-time = "2024-09-10T10:52:12.54Z" },
]
[[package]]
name = "ruff"
version = "0.12.10"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/3b/eb/8c073deb376e46ae767f4961390d17545e8535921d2f65101720ed8bd434/ruff-0.12.10.tar.gz", hash = "sha256:189ab65149d11ea69a2d775343adf5f49bb2426fc4780f65ee33b423ad2e47f9", size = 5310076, upload-time = "2025-08-21T18:23:22.595Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/24/e7/560d049d15585d6c201f9eeacd2fd130def3741323e5ccf123786e0e3c95/ruff-0.12.10-py3-none-linux_armv6l.whl", hash = "sha256:8b593cb0fb55cc8692dac7b06deb29afda78c721c7ccfed22db941201b7b8f7b", size = 11935161, upload-time = "2025-08-21T18:22:26.965Z" },
{ url = "https://files.pythonhosted.org/packages/d1/b0/ad2464922a1113c365d12b8f80ed70fcfb39764288ac77c995156080488d/ruff-0.12.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ebb7333a45d56efc7c110a46a69a1b32365d5c5161e7244aaf3aa20ce62399c1", size = 12660884, upload-time = "2025-08-21T18:22:30.925Z" },
{ url = "https://files.pythonhosted.org/packages/d7/f1/97f509b4108d7bae16c48389f54f005b62ce86712120fd8b2d8e88a7cb49/ruff-0.12.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d59e58586829f8e4a9920788f6efba97a13d1fa320b047814e8afede381c6839", size = 11872754, upload-time = "2025-08-21T18:22:34.035Z" },
{ url = "https://files.pythonhosted.org/packages/12/ad/44f606d243f744a75adc432275217296095101f83f966842063d78eee2d3/ruff-0.12.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:822d9677b560f1fdeab69b89d1f444bf5459da4aa04e06e766cf0121771ab844", size = 12092276, upload-time = "2025-08-21T18:22:36.764Z" },
{ url = "https://files.pythonhosted.org/packages/06/1f/ed6c265e199568010197909b25c896d66e4ef2c5e1c3808caf461f6f3579/ruff-0.12.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b4a64f4062a50c75019c61c7017ff598cb444984b638511f48539d3a1c98db", size = 11734700, upload-time = "2025-08-21T18:22:39.822Z" },
{ url = "https://files.pythonhosted.org/packages/63/c5/b21cde720f54a1d1db71538c0bc9b73dee4b563a7dd7d2e404914904d7f5/ruff-0.12.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c6f4064c69d2542029b2a61d39920c85240c39837599d7f2e32e80d36401d6e", size = 13468783, upload-time = "2025-08-21T18:22:42.559Z" },
{ url = "https://files.pythonhosted.org/packages/02/9e/39369e6ac7f2a1848f22fb0b00b690492f20811a1ac5c1fd1d2798329263/ruff-0.12.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:059e863ea3a9ade41407ad71c1de2badfbe01539117f38f763ba42a1206f7559", size = 14436642, upload-time = "2025-08-21T18:22:45.612Z" },
{ url = "https://files.pythonhosted.org/packages/e3/03/5da8cad4b0d5242a936eb203b58318016db44f5c5d351b07e3f5e211bb89/ruff-0.12.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bef6161e297c68908b7218fa6e0e93e99a286e5ed9653d4be71e687dff101cf", size = 13859107, upload-time = "2025-08-21T18:22:48.886Z" },
{ url = "https://files.pythonhosted.org/packages/19/19/dd7273b69bf7f93a070c9cec9494a94048325ad18fdcf50114f07e6bf417/ruff-0.12.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f1345fbf8fb0531cd722285b5f15af49b2932742fc96b633e883da8d841896b", size = 12886521, upload-time = "2025-08-21T18:22:51.567Z" },
{ url = "https://files.pythonhosted.org/packages/c0/1d/b4207ec35e7babaee62c462769e77457e26eb853fbdc877af29417033333/ruff-0.12.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f68433c4fbc63efbfa3ba5db31727db229fa4e61000f452c540474b03de52a9", size = 13097528, upload-time = "2025-08-21T18:22:54.609Z" },
{ url = "https://files.pythonhosted.org/packages/ff/00/58f7b873b21114456e880b75176af3490d7a2836033779ca42f50de3b47a/ruff-0.12.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:141ce3d88803c625257b8a6debf4a0473eb6eed9643a6189b68838b43e78165a", size = 13080443, upload-time = "2025-08-21T18:22:57.413Z" },
{ url = "https://files.pythonhosted.org/packages/12/8c/9e6660007fb10189ccb78a02b41691288038e51e4788bf49b0a60f740604/ruff-0.12.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f3fc21178cd44c98142ae7590f42ddcb587b8e09a3b849cbc84edb62ee95de60", size = 11896759, upload-time = "2025-08-21T18:23:00.473Z" },
{ url = "https://files.pythonhosted.org/packages/67/4c/6d092bb99ea9ea6ebda817a0e7ad886f42a58b4501a7e27cd97371d0ba54/ruff-0.12.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7d1a4e0bdfafcd2e3e235ecf50bf0176f74dd37902f241588ae1f6c827a36c56", size = 11701463, upload-time = "2025-08-21T18:23:03.211Z" },
{ url = "https://files.pythonhosted.org/packages/59/80/d982c55e91df981f3ab62559371380616c57ffd0172d96850280c2b04fa8/ruff-0.12.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e67d96827854f50b9e3e8327b031647e7bcc090dbe7bb11101a81a3a2cbf1cc9", size = 12691603, upload-time = "2025-08-21T18:23:06.935Z" },
{ url = "https://files.pythonhosted.org/packages/ad/37/63a9c788bbe0b0850611669ec6b8589838faf2f4f959647f2d3e320383ae/ruff-0.12.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ae479e1a18b439c59138f066ae79cc0f3ee250712a873d00dbafadaad9481e5b", size = 13164356, upload-time = "2025-08-21T18:23:10.225Z" },
{ url = "https://files.pythonhosted.org/packages/47/d4/1aaa7fb201a74181989970ebccd12f88c0fc074777027e2a21de5a90657e/ruff-0.12.10-py3-none-win32.whl", hash = "sha256:9de785e95dc2f09846c5e6e1d3a3d32ecd0b283a979898ad427a9be7be22b266", size = 11896089, upload-time = "2025-08-21T18:23:14.232Z" },
{ url = "https://files.pythonhosted.org/packages/ad/14/2ad38fd4037daab9e023456a4a40ed0154e9971f8d6aed41bdea390aabd9/ruff-0.12.10-py3-none-win_amd64.whl", hash = "sha256:7837eca8787f076f67aba2ca559cefd9c5cbc3a9852fd66186f4201b87c1563e", size = 13004616, upload-time = "2025-08-21T18:23:17.422Z" },
{ url = "https://files.pythonhosted.org/packages/24/3c/21cf283d67af33a8e6ed242396863af195a8a6134ec581524fd22b9811b6/ruff-0.12.10-py3-none-win_arm64.whl", hash = "sha256:cc138cc06ed9d4bfa9d667a65af7172b47840e1a98b02ce7011c391e54635ffc", size = 12074225, upload-time = "2025-08-21T18:23:20.137Z" },
]
[[package]]
name = "shiboken6"
version = "6.9.2"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/1a/1e/62a8757aa0aa8d5dbf876f6cb6f652a60be9852e7911b59269dd983a7fb5/shiboken6-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:8bb1c4326330e53adeac98bfd9dcf57f5173a50318a180938dcc4825d9ca38da", size = 406337, upload-time = "2025-08-26T07:52:39.614Z" },
{ url = "https://files.pythonhosted.org/packages/3b/bb/72a8ed0f0542d9ea935f385b396ee6a4bbd94749c817cbf2be34e80a16d3/shiboken6-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3b54c0a12ea1b03b9dc5dcfb603c366e957dc75341bf7cb1cc436d0d848308ee", size = 206733, upload-time = "2025-08-26T07:52:41.768Z" },
{ url = "https://files.pythonhosted.org/packages/52/c4/09e902f5612a509cef2c8712c516e4fe44f3a1ae9fcd8921baddb5e6bae4/shiboken6-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:a5f5985938f5acb604c23536a0ff2efb3cccb77d23da91fbaff8fd8ded3dceb4", size = 202784, upload-time = "2025-08-26T07:52:43.172Z" },
{ url = "https://files.pythonhosted.org/packages/a4/ea/a56b094a4bf6facf89f52f58e83684e168b1be08c14feb8b99969f3d4189/shiboken6-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:68c33d565cd4732be762d19ff67dfc53763256bac413d392aa8598b524980bc4", size = 1152089, upload-time = "2025-08-26T07:52:45.162Z" },
{ url = "https://files.pythonhosted.org/packages/48/64/562a527fc55fbf41fa70dae735929988215505cb5ec0809fb0aef921d4a0/shiboken6-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:c5b827797b3d89d9b9a3753371ff533fcd4afc4531ca51a7c696952132098054", size = 1708948, upload-time = "2025-08-26T07:52:48.016Z" },
]
[[package]]
name = "sphere-grid"
version = "0.1.0"
source = { editable = "." }
dependencies = [
{ name = "pyside6" },
{ name = "pytest" },
{ name = "ruff" },
]
[package.metadata]
requires-dist = [
{ name = "pyside6", specifier = ">=6.6.1" },
{ name = "pytest", specifier = "==8.3.3" },
{ name = "ruff", specifier = "==0.12.10" },
]