Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion capital_cli/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""Capital.com command-line client."""

__version__ = "0.6.1"
__version__ = "0.6.2"
38 changes: 38 additions & 0 deletions docs/distribution.md
Original file line number Diff line number Diff line change
@@ -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.
30 changes: 30 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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]
Expand Down
33 changes: 33 additions & 0 deletions tests/test_packaging_metadata.py
Original file line number Diff line number Diff line change
@@ -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
Loading