diff --git a/CHANGELOG.md b/CHANGELOG.md index 5003533..ff96cf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [0.6.2] - 2026-06-15 + +### Added +- Richer PyPI metadata: search **keywords**, trove **classifiers** (audience, + topic, supported Python versions), and `Documentation`/`Changelog`/`Source` + project URLs. Improves discoverability on PyPI and Libraries.io. No API or + behavior changes. + ## [0.6.1] - 2026-06-15 ### Changed @@ -130,7 +138,8 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Persistent state for trade previews and the daily order counter. - Documentation: getting-started, use cases, troubleshooting, contributing. -[Unreleased]: https://github.com/SimonTarara62/capitalcom-cli/compare/v0.4.0...HEAD +[Unreleased]: https://github.com/SimonTarara62/capitalcom-cli/compare/v0.6.2...HEAD +[0.6.2]: https://github.com/SimonTarara62/capitalcom-cli/compare/v0.6.1...v0.6.2 [0.4.0]: https://github.com/SimonTarara62/capitalcom-cli/compare/v0.3.0...v0.4.0 [0.3.0]: https://github.com/SimonTarara62/capitalcom-cli/compare/v0.2.0...v0.3.0 [0.2.0]: https://github.com/SimonTarara62/capitalcom-cli/compare/v0.1.0...v0.2.0 diff --git a/capital_cli/__init__.py b/capital_cli/__init__.py index b6a6b22..a2a5ee0 100644 --- a/capital_cli/__init__.py +++ b/capital_cli/__init__.py @@ -1,3 +1,3 @@ """Capital.com command-line client.""" -__version__ = "0.6.1" +__version__ = "0.6.2" diff --git a/docs/distribution.md b/docs/distribution.md new file mode 100644 index 0000000..e8f31f9 --- /dev/null +++ b/docs/distribution.md @@ -0,0 +1,38 @@ +# Distribution & registries + +Where `capitalcom-cli` is published, and prepared text for directories that need +a manual/editorial submission. Curated *awesome-list* targets live separately in +[awesome-submission.md](awesome-submission.md). + +## Live channels +- **PyPI** — https://pypi.org/project/capitalcom-cli/ (`pipx install capitalcom-cli`) +- **Homebrew tap** — `brew install SimonTarara62/tap/capctl` + (repo: https://github.com/SimonTarara62/homebrew-tap) +- **Libraries.io** — passive; ingests PyPI metadata automatically. + +## Terminal Trove — prepared submission (submit manually) + +Terminal Trove (https://terminaltrove.com) is an editorial directory of terminal +tools. Submit via its "Submit a tool" form. **This is an outward-facing post — +done by the maintainer, not automated.** Ready-to-paste content: + +- **Name:** capctl +- **Category:** CLI +- **Tagline:** Unofficial, safety-first command-line client (and async Python + SDK) for the Capital.com Open API — market data, guarded order execution, and + real-time streaming. +- **Homepage / repo:** https://github.com/SimonTarara62/capitalcom-cli +- **Docs:** https://github.com/SimonTarara62/capitalcom-cli#readme +- **Install:** + - `pipx install capitalcom-cli` + - `brew install SimonTarara62/tap/capctl` +- **License:** Apache-2.0 +- **Language:** Python (3.10+) +- **Demo/screenshot:** reuse the `capctl market search "gold"` table from the + README, or record an asciinema of `market search` → `trade preview-position`. +- **Disclaimer (include verbatim):** Unofficial. Not affiliated with, endorsed + by, or sponsored by Capital.com. + +## Deferred (per spec — revisit on demand/traction) +Homebrew-core, Docker/GHCR/Docker Hub, conda-forge, AUR, Nixpkgs, winget, Scoop, +Chocolatey, best-of-python, awesome-fintech. diff --git a/pyproject.toml b/pyproject.toml index d06c100..5c21368 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,33 @@ authors = [{name = "Simon Tarara"}] readme = "README.md" requires-python = ">=3.10" license = {text = "Apache-2.0"} +keywords = [ + "capital.com", + "trading", + "cfd", + "broker", + "fintech", + "market-data", + "cli", + "sdk", + "async", + "websocket", + "finance", +] +classifiers = [ + "Development Status :: 4 - Beta", + "Environment :: Console", + "Intended Audience :: Developers", + "Intended Audience :: Financial and Insurance Industry", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business :: Financial :: Investment", + "Topic :: Utilities", +] dependencies = [ "typer>=0.12.0", @@ -33,6 +60,9 @@ capctl = "capital_cli.cli.app:run_cli" [project.urls] Homepage = "https://github.com/SimonTarara62/capitalcom-cli" +Documentation = "https://github.com/SimonTarara62/capitalcom-cli#readme" +Changelog = "https://github.com/SimonTarara62/capitalcom-cli/blob/main/CHANGELOG.md" +Source = "https://github.com/SimonTarara62/capitalcom-cli" Issues = "https://github.com/SimonTarara62/capitalcom-cli/issues" [build-system] diff --git a/tests/test_packaging_metadata.py b/tests/test_packaging_metadata.py new file mode 100644 index 0000000..932ea07 --- /dev/null +++ b/tests/test_packaging_metadata.py @@ -0,0 +1,33 @@ +"""The published distribution must carry discovery metadata (classifiers, +keywords). These feed PyPI search and Libraries.io. Reads the *installed* +distribution metadata, so run `pip install -e .` after changing pyproject.toml +to refresh editable metadata before this test will see new fields.""" + +from importlib import metadata + +DIST = "capitalcom-cli" + +EXPECTED_CLASSIFIERS = { + "Environment :: Console", + "Intended Audience :: Financial and Insurance Industry", + "Topic :: Office/Business :: Financial :: Investment", + "Programming Language :: Python :: 3.12", +} + + +def test_expected_classifiers_present() -> None: + classifiers = set(metadata.metadata(DIST).get_all("Classifier") or []) + missing = EXPECTED_CLASSIFIERS - classifiers + assert not missing, f"missing classifiers: {sorted(missing)}" + + +def test_expected_keywords_present() -> None: + keywords = metadata.metadata(DIST).get("Keywords", "") + assert "capital.com" in keywords + assert "trading" in keywords + + +def test_expected_project_urls_present() -> None: + urls = metadata.metadata(DIST).get_all("Project-URL") or [] + labels = {entry.split(",", 1)[0].strip().lower() for entry in urls} + assert {"documentation", "changelog", "source"} <= labels