From 8211e57b6123ff800b344f160519132bd005ac73 Mon Sep 17 00:00:00 2001 From: Patrick Selamy Date: Sun, 4 Jan 2026 14:34:37 -0500 Subject: [PATCH] feat: set up Python project structure with pyproject.toml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add pyproject.toml with core and dev dependencies - Configure Ruff for linting and formatting - Configure MyPy for strict type checking - Configure pytest with asyncio support - Create src/polymarket_insider_tracker package structure - Add py.typed marker for PEP 561 compliance - Add pre-commit hooks configuration - Add comprehensive .gitignore - Create test directory structure with basic tests Closes #25 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .gitignore | 118 ++++++++++++++++++ .pre-commit-config.yaml | 23 ++++ pyproject.toml | 96 ++++++++++++++ src/polymarket_insider_tracker/__init__.py | 3 + .../alerter/__init__.py | 1 + .../detector/__init__.py | 1 + .../ingestor/__init__.py | 1 + .../profiler/__init__.py | 1 + src/polymarket_insider_tracker/py.typed | 0 .../storage/__init__.py | 1 + tests/__init__.py | 1 + tests/alerter/__init__.py | 1 + tests/conftest.py | 9 ++ tests/detector/__init__.py | 1 + tests/ingestor/__init__.py | 1 + tests/profiler/__init__.py | 1 + tests/storage/__init__.py | 1 + tests/test_setup.py | 24 ++++ 18 files changed, 284 insertions(+) create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 pyproject.toml create mode 100644 src/polymarket_insider_tracker/__init__.py create mode 100644 src/polymarket_insider_tracker/alerter/__init__.py create mode 100644 src/polymarket_insider_tracker/detector/__init__.py create mode 100644 src/polymarket_insider_tracker/ingestor/__init__.py create mode 100644 src/polymarket_insider_tracker/profiler/__init__.py create mode 100644 src/polymarket_insider_tracker/py.typed create mode 100644 src/polymarket_insider_tracker/storage/__init__.py create mode 100644 tests/__init__.py create mode 100644 tests/alerter/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/detector/__init__.py create mode 100644 tests/ingestor/__init__.py create mode 100644 tests/profiler/__init__.py create mode 100644 tests/storage/__init__.py create mode 100644 tests/test_setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b51c728 --- /dev/null +++ b/.gitignore @@ -0,0 +1,118 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# PEP 582 +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# Environment +.env +.env.local +.venv +env/ +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# Ruff +.ruff_cache/ + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Local development +*.local +.direnv/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0f896fa --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,23 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - id: check-merge-conflict + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.9 + hooks: + - id: ruff + args: [--fix] + - id: ruff-format + + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.8.0 + hooks: + - id: mypy + additional_dependencies: + - pydantic>=2.0.0 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b0a8539 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,96 @@ +[project] +name = "polymarket-insider-tracker" +version = "0.1.0" +description = "Detect insider activity on Polymarket" +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "py-clob-client>=0.1.0", + "web3>=6.0.0", + "httpx>=0.25.0", + "redis>=5.0.0", + "sqlalchemy>=2.0.0", + "alembic>=1.13.0", + "pydantic>=2.0.0", + "python-dotenv>=1.0.0", +] + +[project.optional-dependencies] +dev = [ + "pytest>=7.0.0", + "pytest-asyncio>=0.21.0", + "pytest-cov>=4.0.0", + "ruff>=0.1.0", + "mypy>=1.7.0", + "pre-commit>=3.0.0", +] + +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.ruff] +line-length = 100 +target-version = "py311" +src = ["src", "tests"] + +[tool.ruff.lint] +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # Pyflakes + "I", # isort + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "UP", # pyupgrade + "ARG", # flake8-unused-arguments + "SIM", # flake8-simplify +] +ignore = [ + "E501", # line too long (handled by formatter) +] + +[tool.ruff.lint.isort] +known-first-party = ["polymarket_insider_tracker"] + +[tool.mypy] +python_version = "3.11" +strict = true +warn_return_any = true +warn_unused_ignores = true +disallow_untyped_defs = true +disallow_incomplete_defs = true +check_untyped_defs = true +disallow_untyped_decorators = true +no_implicit_optional = true +warn_redundant_casts = true +warn_unused_configs = true +plugins = ["pydantic.mypy"] + +[[tool.mypy.overrides]] +module = ["py_clob_client.*", "web3.*", "redis.*"] +ignore_missing_imports = true + +[tool.pytest.ini_options] +asyncio_mode = "auto" +testpaths = ["tests"] +addopts = "-v --tb=short" +markers = [ + "slow: marks tests as slow (deselect with '-m \"not slow\"')", + "integration: marks tests as integration tests", +] + +[tool.coverage.run] +source = ["src"] +branch = true + +[tool.coverage.report] +exclude_lines = [ + "pragma: no cover", + "def __repr__", + "raise NotImplementedError", + "if TYPE_CHECKING:", +] diff --git a/src/polymarket_insider_tracker/__init__.py b/src/polymarket_insider_tracker/__init__.py new file mode 100644 index 0000000..d5de2de --- /dev/null +++ b/src/polymarket_insider_tracker/__init__.py @@ -0,0 +1,3 @@ +"""Polymarket Insider Tracker - Detect insider activity on Polymarket.""" + +__version__ = "0.1.0" diff --git a/src/polymarket_insider_tracker/alerter/__init__.py b/src/polymarket_insider_tracker/alerter/__init__.py new file mode 100644 index 0000000..cadaca3 --- /dev/null +++ b/src/polymarket_insider_tracker/alerter/__init__.py @@ -0,0 +1 @@ +"""Alerting layer - Real-time notification delivery.""" diff --git a/src/polymarket_insider_tracker/detector/__init__.py b/src/polymarket_insider_tracker/detector/__init__.py new file mode 100644 index 0000000..22a52b1 --- /dev/null +++ b/src/polymarket_insider_tracker/detector/__init__.py @@ -0,0 +1 @@ +"""Anomaly detection layer - Suspicious activity identification.""" diff --git a/src/polymarket_insider_tracker/ingestor/__init__.py b/src/polymarket_insider_tracker/ingestor/__init__.py new file mode 100644 index 0000000..67a7f7a --- /dev/null +++ b/src/polymarket_insider_tracker/ingestor/__init__.py @@ -0,0 +1 @@ +"""Data ingestion layer - Real-time Polymarket trade streaming.""" diff --git a/src/polymarket_insider_tracker/profiler/__init__.py b/src/polymarket_insider_tracker/profiler/__init__.py new file mode 100644 index 0000000..f494443 --- /dev/null +++ b/src/polymarket_insider_tracker/profiler/__init__.py @@ -0,0 +1 @@ +"""Wallet profiler layer - Blockchain analysis for trader intelligence.""" diff --git a/src/polymarket_insider_tracker/py.typed b/src/polymarket_insider_tracker/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/src/polymarket_insider_tracker/storage/__init__.py b/src/polymarket_insider_tracker/storage/__init__.py new file mode 100644 index 0000000..41ea10c --- /dev/null +++ b/src/polymarket_insider_tracker/storage/__init__.py @@ -0,0 +1 @@ +"""Storage layer - Database schemas and repositories.""" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..fb5d43a --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Test suite for Polymarket Insider Tracker.""" diff --git a/tests/alerter/__init__.py b/tests/alerter/__init__.py new file mode 100644 index 0000000..e1c2200 --- /dev/null +++ b/tests/alerter/__init__.py @@ -0,0 +1 @@ +"""Tests for alerter module.""" diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..883a452 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,9 @@ +"""Pytest configuration and fixtures.""" + +import pytest + + +@pytest.fixture +def sample_market_id() -> str: + """Sample market ID for testing.""" + return "0x1234567890abcdef1234567890abcdef12345678" diff --git a/tests/detector/__init__.py b/tests/detector/__init__.py new file mode 100644 index 0000000..fd32d67 --- /dev/null +++ b/tests/detector/__init__.py @@ -0,0 +1 @@ +"""Tests for detector module.""" diff --git a/tests/ingestor/__init__.py b/tests/ingestor/__init__.py new file mode 100644 index 0000000..a85a8a6 --- /dev/null +++ b/tests/ingestor/__init__.py @@ -0,0 +1 @@ +"""Tests for ingestor module.""" diff --git a/tests/profiler/__init__.py b/tests/profiler/__init__.py new file mode 100644 index 0000000..c82fb46 --- /dev/null +++ b/tests/profiler/__init__.py @@ -0,0 +1 @@ +"""Tests for profiler module.""" diff --git a/tests/storage/__init__.py b/tests/storage/__init__.py new file mode 100644 index 0000000..9785e36 --- /dev/null +++ b/tests/storage/__init__.py @@ -0,0 +1 @@ +"""Tests for storage module.""" diff --git a/tests/test_setup.py b/tests/test_setup.py new file mode 100644 index 0000000..b5c77c6 --- /dev/null +++ b/tests/test_setup.py @@ -0,0 +1,24 @@ +"""Test that the project setup is working correctly.""" + +import polymarket_insider_tracker + + +def test_version() -> None: + """Test that version is defined.""" + assert polymarket_insider_tracker.__version__ == "0.1.0" + + +def test_import_modules() -> None: + """Test that all submodules can be imported.""" + from polymarket_insider_tracker import ingestor + from polymarket_insider_tracker import profiler + from polymarket_insider_tracker import detector + from polymarket_insider_tracker import alerter + from polymarket_insider_tracker import storage + + # Just verify imports work + assert ingestor is not None + assert profiler is not None + assert detector is not None + assert alerter is not None + assert storage is not None