[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "openoutreach" # **The base, not the released version.** Major and minor are declared here and bumped by # hand when a change deserves it; the patch is derived at publish time from the number of # commits since `v0.1.0` (`.github/workflows/deploy.yml`, job `publish-pypi`), because # every green push to `main` releases and PyPI version numbers are single-use. A local # install reports this literal — `core/version.py` is what identifies a build precisely. version = "0.1.0" description = "Open-source AI lead finder: describe your product, get qualified leads with the reason each one fits." readme = "README.md" requires-python = ">=3.12" license = "GPL-3.0-or-later" license-files = ["LICENCE.md"] authors = [{ name = "OpenOutreach", email = "hello@openoutreach.app" }] keywords = [ "lead-generation", "b2b", "outreach", "cold-email", "sales-automation", "self-hosted", "open-source", "crm", ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Topic :: Office/Business", ] # Both children are required, not extras: `pip install openoutreach` alone has to be the # whole find-then-send flow, or the second install is the friction this package exists to # remove. Everything the finding and the sending need — pydantic-ai, fastembed, sklearn, # the mail transport — arrives through them; what is declared here is what *this* package # imports directly. # # **The pins are exact, and the cost is known.** This project hosts both children's Django # apps in one registry and owns the one migration graph over them, so a model change in # either child needs a matching release here. Three repos that move together is the price # of one install, and of a wizard that hands each child the environment it reads. dependencies = [ "Django>=5.2,<7.0", "openoutfind==0.1.78", "openoutsend==0.1.72", # The wizard validates a country code against a real list of them. Declared rather # than inherited from the finder: the rule above is that this file names what *this* # package imports directly. "pytz>=2024.1", ] [project.optional-dependencies] dev = [ "pytest>=8", "pytest-django>=4.8", "pytest-mock>=3.14", "pytest-cov>=5", ] [project.scripts] openoutreach = "openoutreach.__main__:main" [project.urls] Homepage = "https://openoutreach.app" Source = "https://github.com/eracle/OpenOutreach" Issues = "https://github.com/eracle/OpenOutreach/issues" [tool.hatch.build.targets.wheel] packages = ["openoutreach"] [tool.hatch.build.targets.sdist] include = ["openoutreach", "README.md", "LICENCE.md", "LEGAL_NOTICE.md", "pyproject.toml"]