37eef16e99
* feat: support string login in build_config and add substitute_mapping_values (#61, #62) Extend build_config() to accept login: int | str | None. String logins are coerced via the existing coerce_login() helper (empty/whitespace → None, numeric strings → int, non-numeric → ValueError). When allow_whole_dollar_env=True, ${ENV} and $ENV placeholders are expanded before coercion, consistent with path/password/server behavior. Add substitute_mapping_values(), a generic recursive helper that substitutes environment placeholders in nested dicts/lists only for caller-selected mapping keys. Non-selected fields (including literal dollar signs) are preserved exactly. Supports blank_string_keys_as_none to normalise empty strings to None after substitution. No application- specific key names (e.g. mt5_login) are hard-coded in mt5cli. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Bump version to v0.9.5 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs+test: clarify substitute_mapping_values docstring and pin tuple behaviour - Adds sentence noting list-element strings are never substituted (only immediate dict values are), addressing reviewer finding #1. - Rewrites Returns section to accurately describe scalar pass-through behaviour, addressing reviewer finding #2. - Adds recursion-depth caveat to the generic-utility docstring, addressing reviewer finding #4. - Adds test_tuple_container_not_traversed to pin the existing silent tuple-exclusion contract, addressing reviewer finding #3. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update public contract and README for build_config login coercion and substitute_mapping_values - Expands build_config row to document login: int | str | None, numeric-string coercion, blank-string handling, and env placeholder expansion when allow_whole_dollar_env=True. - Adds substitute_mapping_values to the stable SDK table with a note that key names are never hard-coded in mt5cli. - Extends allow_whole_dollar_env paragraph to list substitute_mapping_values. - README: adds build_config env-placeholder example and imports to the trading lifecycle snippet. - README: extends credential-resolution bullet with a substitute_mapping_values usage example using generic key names. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: agent <agent@localhost> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
183 lines
4.9 KiB
TOML
183 lines
4.9 KiB
TOML
[project]
|
|
name = "mt5cli"
|
|
version = "0.9.5"
|
|
description = "Generic MT5 data and execution infrastructure for Python applications"
|
|
authors = [{name = "dceoy", email = "dceoy@users.noreply.github.com"}]
|
|
maintainers = [{name = "dceoy", email = "dceoy@users.noreply.github.com"}]
|
|
license = "MIT"
|
|
license-files = ["LICENSE"]
|
|
readme = "README.md"
|
|
requires-python = ">= 3.11, < 3.14"
|
|
dependencies = [
|
|
"pdmt5>=0.3.0",
|
|
"click >= 8.1.0",
|
|
"pyarrow >= 19.0.0",
|
|
"typer >= 0.15.0",
|
|
]
|
|
classifiers = [
|
|
"Development Status :: 3 - Alpha",
|
|
"Environment :: Console",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Operating System :: Microsoft :: Windows",
|
|
"Programming Language :: Python",
|
|
"Programming Language :: Python :: 3",
|
|
"Intended Audience :: Financial and Insurance Industry",
|
|
"Topic :: Office/Business :: Financial :: Investment",
|
|
]
|
|
|
|
[project.scripts]
|
|
mt5cli = "mt5cli.cli:main"
|
|
|
|
[project.urls]
|
|
Repository = "https://github.com/dceoy/mt5cli.git"
|
|
|
|
[tool.uv]
|
|
required-environments = ["platform_system == 'Windows'"]
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"ruff >= 0.11.0",
|
|
"pyright >= 1.1.407",
|
|
"pytest>=9.0.3",
|
|
"pytest-mock >= 3.12.0",
|
|
"pytest-cov >= 5.0.0",
|
|
"pandas-stubs >= 2.2.3.250527",
|
|
"mkdocs >= 1.6.1",
|
|
"mkdocs-material >= 9.7.6",
|
|
"mkdocstrings[python] >= 1.0.4",
|
|
"pymdown-extensions >= 10.21.2",
|
|
]
|
|
|
|
[tool.ruff]
|
|
line-length = 88
|
|
exclude = ["build", ".venv"]
|
|
preview = true
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"F", # Pyflakes (F)
|
|
"E", # pycodestyle error (E)
|
|
"W", # pycodestyle warning (W)
|
|
"C90", # mccabe (C90)
|
|
"I", # isort (I)
|
|
"N", # pep8-naming (N)
|
|
"D", # pydocstyle (D)
|
|
"UP", # pyupgrade (UP)
|
|
"S", # flake8-bandit (S)
|
|
"B", # flake8-bugbear (B)
|
|
"C4", # flake8-comprehensions (C4)
|
|
"SIM", # flake8-simplify (SIM)
|
|
"ARG", # flake8-unused-arguments (ARG)
|
|
"PD", # pandas-vet (PD)
|
|
"PLC", # Pylint convention (PLC)
|
|
"PLE", # Pylint error (PLE)
|
|
"PLR", # Pylint refactor (PLR)
|
|
"PLW", # Pylint warning (PLW)
|
|
"FLY", # flynt (FLY)
|
|
"NPY", # NumPy-specific rules (NPY)
|
|
"PERF", # Perflint (PERF)
|
|
"FURB", # refurb (FURB)
|
|
"RUF", # Ruff-specific rules (RUF)
|
|
"YTT", # flake8-2020 (YTT)
|
|
"ANN", # flake8-annotations (ANN)
|
|
"ASYNC", # flake8-async (ASYNC)
|
|
"BLE", # flake8-blind-except (BLE)
|
|
"FBT", # flake8-boolean-trap (FBT)
|
|
"A", # flake8-builtins (A)
|
|
"COM", # flake8-commas (COM)
|
|
"DTZ", # flake8-datetimez (DTZ)
|
|
"T10", # flake8-debugger (T10)
|
|
"DJ", # flake8-django (DJ)
|
|
"EM", # flake8-errmsg (EM)
|
|
"EXE", # flake8-executable (EXE)
|
|
"FA", # flake8-future-annotations (FA)
|
|
"ISC", # flake8-implicit-str-concat (ISC)
|
|
"ICN", # flake8-import-conventions (ICN)
|
|
"LOG", # flake8-logging (LOG)
|
|
"G", # flake8-logging-format (G)
|
|
"INP", # flake8-no-pep420 (INP)
|
|
"PIE", # flake8-pie (PIE)
|
|
"T20", # flake8-print (T20)
|
|
"PYI", # flake8-pyi (PYI)
|
|
"PT", # flake8-pytest-style (PT)
|
|
"Q", # flake8-quotes (Q)
|
|
"RSE", # flake8-raise (RSE)
|
|
"SLF", # flake8-self (SLF)
|
|
"SLOT", # flake8-slots (SLOT)
|
|
"TID", # flake8-tidy-imports (TID)
|
|
"TCH", # flake8-type-checking (TCH)
|
|
"INT", # flake8-gettext (INT)
|
|
"PTH", # flake8-use-pathlib (PTH)
|
|
"TD", # flake8-todos (TD)
|
|
"FIX", # flake8-fixme (FIX)
|
|
"ERA", # eradicate (ERA)
|
|
"PGH", # pygrep-hooks (PGH)
|
|
"TRY", # tryceratops (TRY)
|
|
"FAST", # FastAPI (FAST)
|
|
"AIR", # Airflow (AIR)
|
|
"DOC", # pydoclint (DOC)
|
|
]
|
|
ignore = [
|
|
"COM812", # missing-trailing-comma
|
|
"FBT001", # boolean-type-hint-positional-argument
|
|
"FBT002", # boolean-default-value-positional-argument
|
|
]
|
|
|
|
[tool.ruff.lint.per-file-ignores]
|
|
"tests/**/*.py" = [
|
|
"DOC201", # Missing return documentation
|
|
"DOC501", # Raised exception missing from docstring
|
|
"PLC2701", # Private name import
|
|
"PLR0904", # Too many public methods
|
|
"PLR2004", # Magic value used in comparison
|
|
"PLR6301", # Method could be function/static/classmethod
|
|
"S101", # Use of assert (acceptable in tests)
|
|
"S106", # Possible hardcoded password
|
|
"SLF001", # Private member accessed
|
|
]
|
|
|
|
[tool.ruff.lint.pydocstyle]
|
|
convention = "google"
|
|
|
|
[tool.ruff.lint.pylint]
|
|
max-args = 10
|
|
max-public-methods = 40
|
|
|
|
[tool.pyright]
|
|
exclude = ["build", ".venv"]
|
|
venvPath = "."
|
|
venv = ".venv"
|
|
typeCheckingMode = "strict"
|
|
reportMissingTypeStubs = false
|
|
|
|
[tool.pytest.ini_options]
|
|
addopts = [
|
|
"--cov=mt5cli",
|
|
"--cov-branch",
|
|
"--doctest-modules",
|
|
"--capture=no",
|
|
]
|
|
pythonpath = ["."]
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py", "*_test.py"]
|
|
python_classes = ["Test*"]
|
|
python_functions = ["test_*"]
|
|
minversion = "6.0"
|
|
|
|
[tool.coverage.run]
|
|
source = ["mt5cli"]
|
|
omit = [
|
|
"**/__init__.py",
|
|
"**/__main__.py",
|
|
"tests/**",
|
|
]
|
|
|
|
[tool.coverage.report]
|
|
show_missing = true
|
|
fail_under = 100
|
|
exclude_lines = ["if TYPE_CHECKING:"]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|