pdmt5 0.2.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. {pdmt5-0.2.0 → pdmt5-0.2.1}/.github/dependabot.yml +4 -0
  2. {pdmt5-0.2.0 → pdmt5-0.2.1/.github}/renovate.json +2 -3
  3. {pdmt5-0.2.0 → pdmt5-0.2.1}/.github/workflows/ci.yml +18 -15
  4. {pdmt5-0.2.0 → pdmt5-0.2.1}/.gitignore +3 -0
  5. pdmt5-0.2.0/CLAUDE.md → pdmt5-0.2.1/AGENTS.md +8 -25
  6. pdmt5-0.2.1/CLAUDE.md +1 -0
  7. {pdmt5-0.2.0 → pdmt5-0.2.1}/PKG-INFO +2 -2
  8. {pdmt5-0.2.0 → pdmt5-0.2.1}/pdmt5/trading.py +11 -1
  9. {pdmt5-0.2.0 → pdmt5-0.2.1}/pyproject.toml +7 -4
  10. {pdmt5-0.2.0 → pdmt5-0.2.1}/uv.lock +2 -3
  11. pdmt5-0.2.0/.github/copilot-instructions.md +0 -1
  12. pdmt5-0.2.0/.github/workflows/claude.yml +0 -59
  13. pdmt5-0.2.0/.github/workflows/pr-agent.yml +0 -34
  14. {pdmt5-0.2.0 → pdmt5-0.2.1}/.claude/settings.json +0 -0
  15. {pdmt5-0.2.0 → pdmt5-0.2.1}/.github/FUNDING.yml +0 -0
  16. {pdmt5-0.2.0 → pdmt5-0.2.1}/LICENSE +0 -0
  17. {pdmt5-0.2.0 → pdmt5-0.2.1}/README.md +0 -0
  18. {pdmt5-0.2.0 → pdmt5-0.2.1}/docs/api/dataframe.md +0 -0
  19. {pdmt5-0.2.0 → pdmt5-0.2.1}/docs/api/index.md +0 -0
  20. {pdmt5-0.2.0 → pdmt5-0.2.1}/docs/api/mt5.md +0 -0
  21. {pdmt5-0.2.0 → pdmt5-0.2.1}/docs/api/trading.md +0 -0
  22. {pdmt5-0.2.0 → pdmt5-0.2.1}/docs/api/utils.md +0 -0
  23. {pdmt5-0.2.0 → pdmt5-0.2.1}/docs/index.md +0 -0
  24. {pdmt5-0.2.0 → pdmt5-0.2.1}/mkdocs.yml +0 -0
  25. {pdmt5-0.2.0 → pdmt5-0.2.1}/pdmt5/__init__.py +0 -0
  26. {pdmt5-0.2.0 → pdmt5-0.2.1}/pdmt5/dataframe.py +0 -0
  27. {pdmt5-0.2.0 → pdmt5-0.2.1}/pdmt5/mt5.py +0 -0
  28. {pdmt5-0.2.0 → pdmt5-0.2.1}/pdmt5/utils.py +0 -0
  29. {pdmt5-0.2.0 → pdmt5-0.2.1}/tests/__init__.py +0 -0
  30. {pdmt5-0.2.0 → pdmt5-0.2.1}/tests/test_dataframe.py +0 -0
  31. {pdmt5-0.2.0 → pdmt5-0.2.1}/tests/test_init.py +0 -0
  32. {pdmt5-0.2.0 → pdmt5-0.2.1}/tests/test_mt5.py +0 -0
  33. {pdmt5-0.2.0 → pdmt5-0.2.1}/tests/test_trading.py +0 -0
  34. {pdmt5-0.2.0 → pdmt5-0.2.1}/tests/test_utils.py +0 -0
@@ -5,9 +5,13 @@ updates:
5
5
  directory: /
6
6
  schedule:
7
7
  interval: daily
8
+ cooldown:
9
+ default-days: 7
8
10
  open-pull-requests-limit: 10
9
11
  - package-ecosystem: pip
10
12
  directory: /
11
13
  schedule:
12
14
  interval: daily
15
+ cooldown:
16
+ default-days: 7
13
17
  open-pull-requests-limit: 10
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
- "extends": [
4
- "config:recommended"
5
- ],
3
+ "extends": ["config:recommended"],
4
+ "minimumReleaseAge": "7 days",
6
5
  "packageRules": [
7
6
  {
8
7
  "description": "Automatically merge minor and patch-level updates",
@@ -27,6 +27,8 @@ jobs:
27
27
  github.event_name == 'push'
28
28
  || github.event_name == 'pull_request'
29
29
  || (github.event_name == 'workflow_dispatch' && inputs.workflow == 'lint-and-test')
30
+ permissions:
31
+ contents: read
30
32
  uses: dceoy/gh-actions-for-devops/.github/workflows/python-package-lint-and-scan.yml@main
31
33
  with:
32
34
  package-path: .
@@ -36,23 +38,12 @@ jobs:
36
38
  github.event_name == 'push'
37
39
  || github.event_name == 'pull_request'
38
40
  || (github.event_name == 'workflow_dispatch' && inputs.workflow == 'lint-and-test')
41
+ permissions:
42
+ contents: read
39
43
  uses: dceoy/gh-actions-for-devops/.github/workflows/python-package-test.yml@main
40
44
  with:
41
45
  package-path: .
42
46
  runs-on: windows-latest
43
- dependabot-auto-merge:
44
- if: >
45
- github.event_name == 'pull_request' && github.actor == 'dependabot[bot]'
46
- needs:
47
- - python-lint-and-scan
48
- - python-test
49
- uses: dceoy/gh-actions-for-devops/.github/workflows/dependabot-auto-merge.yml@main
50
- permissions:
51
- contents: write
52
- pull-requests: write
53
- actions: read
54
- with:
55
- unconditional: true
56
47
  python-package-release:
57
48
  if: >
58
49
  github.event_name == 'push'
@@ -60,14 +51,26 @@ jobs:
60
51
  github.event_name == 'workflow_dispatch'
61
52
  && (inputs.workflow == 'release' || inputs.workflow == 'lint-and-test')
62
53
  )
63
- uses: dceoy/gh-actions-for-devops/.github/workflows/python-package-release-on-pypi-and-github.yml@main
64
54
  permissions:
65
55
  contents: write
66
56
  id-token: write
57
+ uses: dceoy/gh-actions-for-devops/.github/workflows/python-package-release-on-pypi-and-github.yml@main
67
58
  with:
68
59
  package-path: .
69
60
  create-releases: ${{ github.event_name == 'workflow_dispatch' && inputs.workflow == 'release' }}
70
- python-version: 3.x
71
61
  secrets:
72
62
  PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
73
63
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
64
+ dependabot-auto-merge:
65
+ if: >
66
+ github.event_name == 'pull_request' && github.actor == 'dependabot[bot]'
67
+ needs:
68
+ - python-lint-and-scan
69
+ - python-test
70
+ uses: dceoy/gh-actions-for-devops/.github/workflows/dependabot-auto-merge.yml@main
71
+ permissions:
72
+ contents: write
73
+ pull-requests: write
74
+ actions: read
75
+ with:
76
+ unconditional: true
@@ -205,3 +205,6 @@ cython_debug/
205
205
  marimo/_static/
206
206
  marimo/_lsp/
207
207
  __marimo__/
208
+
209
+ # Serena MCP
210
+ .serena/
@@ -1,6 +1,4 @@
1
- # CLAUDE.md
2
-
3
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
1
+ # Repository Guidelines
4
2
 
5
3
  ## Commands
6
4
 
@@ -111,29 +109,14 @@ Uses MkDocs with Material theme for API documentation built from Google-style do
111
109
  3. Build: `uv run mkdocs build`
112
110
  4. Deploy: `uv run mkdocs gh-deploy`
113
111
 
114
- ## Web Search Instructions
115
-
116
- For tasks requiring web search, always use Gemini CLI (`gemini` command) instead of the built-in web search tools (WebFetch and WebSearch).
117
- Gemini CLI is an AI workflow tool that provides reliable web search capabilities.
118
-
119
- ### Usage
120
-
121
- ```sh
122
- # Basic search query
123
- gemini --sandbox --prompt "WebSearch: <query>"
124
-
125
- # Example: Search for latest news
126
- gemini --sandbox --prompt "WebSearch: What are the latest developments in AI?"
127
- ```
128
-
129
- ### Policy
130
-
131
- When users request information that requires web search:
132
-
133
- 1. Use `gemini --sandbox --prompt` command via terminal
134
- 2. Parse and present the Gemini response appropriately
112
+ ## Serena MCP Usage (Prioritize When Available)
135
113
 
136
- This ensures consistent and reliable web search results through the Gemini API.
114
+ - **If Serena MCP is available, use it first.** Treat Serena MCP tools as the primary interface over local commands or ad-hoc scripts.
115
+ - **Glance at the Serena MCP docs/help before calling a tool** to confirm tool names, required args, and limits.
116
+ - **Use the MCP-exposed tools for supported actions** (e.g., reading/writing files, running tasks, fetching data) instead of re-implementing workflows.
117
+ - **Never hardcode secrets.** Reference environment variables or the MCP’s configured credential store; avoid printing tokens or sensitive paths.
118
+ - **If Serena MCP isn’t enabled or lacks a needed capability, say so and propose a safe fallback.** Mention enabling it via `.mcp.json` when relevant.
119
+ - **Be explicit and reproducible.** Name the exact MCP tool and arguments you intend to use in your steps.
137
120
 
138
121
  ## Code Design Principles
139
122
 
pdmt5-0.2.1/CLAUDE.md ADDED
@@ -0,0 +1 @@
1
+ AGENTS.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pdmt5
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Pandas-based data handler for MetaTrader 5
5
5
  Project-URL: Repository, https://github.com/dceoy/pdmt5.git
6
6
  Author-email: dceoy <dceoy@users.noreply.github.com>
@@ -15,7 +15,7 @@ Classifier: Operating System :: Microsoft :: Windows
15
15
  Classifier: Programming Language :: Python
16
16
  Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Topic :: Office/Business :: Financial :: Investment
18
- Requires-Python: >=3.11
18
+ Requires-Python: <3.14,>=3.11
19
19
  Requires-Dist: metatrader5>=5.0.4424; sys_platform == 'win32'
20
20
  Requires-Dist: pandas>=2.2.2
21
21
  Requires-Dist: pydantic>=2.9.0
@@ -131,6 +131,7 @@ class Mt5TradingClient(Mt5DataClient):
131
131
  self,
132
132
  symbol: str | None = None,
133
133
  order_filling_mode: Literal["IOC", "FOK", "RETURN"] = "IOC",
134
+ raise_on_error: bool = False,
134
135
  dry_run: bool = False,
135
136
  **kwargs: Any, # noqa: ANN401
136
137
  ) -> list[dict[str, Any]]:
@@ -139,6 +140,7 @@ class Mt5TradingClient(Mt5DataClient):
139
140
  Args:
140
141
  symbol: Optional symbol filter.
141
142
  order_filling_mode: Order filling mode, either "IOC", "FOK", or "RETURN".
143
+ raise_on_error: If True, raise an exception on error.
142
144
  dry_run: If True, only check the order without sending it.
143
145
  **kwargs: Additional keyword arguments for request parameters.
144
146
 
@@ -170,6 +172,7 @@ class Mt5TradingClient(Mt5DataClient):
170
172
  "position": p["ticket"],
171
173
  **kwargs,
172
174
  },
175
+ raise_on_error=raise_on_error,
173
176
  dry_run=dry_run,
174
177
  )
175
178
  for p in positions_dict
@@ -225,6 +228,7 @@ class Mt5TradingClient(Mt5DataClient):
225
228
  order_side: Literal["BUY", "SELL"],
226
229
  order_filling_mode: Literal["IOC", "FOK", "RETURN"] = "IOC",
227
230
  order_time_mode: Literal["GTC", "DAY", "SPECIFIED", "SPECIFIED_DAY"] = "GTC",
231
+ raise_on_error: bool = False,
228
232
  dry_run: bool = False,
229
233
  **kwargs: Any, # noqa: ANN401
230
234
  ) -> dict[str, Any]:
@@ -237,6 +241,7 @@ class Mt5TradingClient(Mt5DataClient):
237
241
  order_filling_mode: Order filling mode, either "IOC", "FOK", or "RETURN".
238
242
  order_time_mode: Order time mode, either "GTC", "DAY", "SPECIFIED",
239
243
  or "SPECIFIED_DAY".
244
+ raise_on_error: If True, raise an error on operation failure.
240
245
  dry_run: If True, only check the order without sending it.
241
246
  **kwargs: Additional keyword arguments for request parameters.
242
247
 
@@ -256,6 +261,7 @@ class Mt5TradingClient(Mt5DataClient):
256
261
  "type_time": getattr(self.mt5, f"ORDER_TIME_{order_time_mode.upper()}"),
257
262
  **kwargs,
258
263
  },
264
+ raise_on_error=raise_on_error,
259
265
  dry_run=dry_run,
260
266
  )
261
267
 
@@ -265,6 +271,7 @@ class Mt5TradingClient(Mt5DataClient):
265
271
  stop_loss: float | None = None,
266
272
  take_profit: float | None = None,
267
273
  tickets: list[int] | None = None,
274
+ raise_on_error: bool = False,
268
275
  dry_run: bool = False,
269
276
  **kwargs: Any, # noqa: ANN401
270
277
  ) -> list[dict[str, Any]]:
@@ -276,6 +283,7 @@ class Mt5TradingClient(Mt5DataClient):
276
283
  take_profit: New Take Profit price. If None, it will not be changed.
277
284
  tickets: List of position tickets to filter positions. If None, all open
278
285
  positions for the symbol will be considered.
286
+ raise_on_error: If True, raise an error on operation failure.
279
287
  dry_run: If True, only check the order without sending it.
280
288
  **kwargs: Additional keyword arguments for request parameters.
281
289
 
@@ -324,7 +332,9 @@ class Mt5TradingClient(Mt5DataClient):
324
332
  tp,
325
333
  )
326
334
  return [
327
- self._send_or_check_order(request=r, dry_run=dry_run)
335
+ self._send_or_check_order(
336
+ request=r, raise_on_error=raise_on_error, dry_run=dry_run
337
+ )
328
338
  for r in order_requests
329
339
  ]
330
340
  else:
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "pdmt5"
3
- version = "0.2.0"
3
+ version = "0.2.1"
4
4
  description = "Pandas-based data handler for MetaTrader 5"
5
5
  authors = [{name = "dceoy", email = "dceoy@users.noreply.github.com"}]
6
6
  maintainers = [{name = "dceoy", email = "dceoy@users.noreply.github.com"}]
7
7
  license = "MIT"
8
8
  license-files = ["LICENSE"]
9
9
  readme = "README.md"
10
- requires-python = ">= 3.11"
10
+ requires-python = ">= 3.11, < 3.14"
11
11
  dependencies = [
12
12
  "MetaTrader5 >= 5.0.4424; sys_platform == 'win32'",
13
13
  "pandas >= 2.2.2",
@@ -28,7 +28,10 @@ classifiers = [
28
28
  Repository = "https://github.com/dceoy/pdmt5.git"
29
29
 
30
30
  [tool.uv]
31
- dev-dependencies = [
31
+ required-environments = ["platform_system == 'Windows'"]
32
+
33
+ [dependency-groups]
34
+ dev = [
32
35
  "ruff >= 0.11.0",
33
36
  "pyright >= 1.1.402",
34
37
  "pytest >= 8.0.0",
@@ -42,7 +45,6 @@ dev-dependencies = [
42
45
  "mkdocs-material >= 9.6.15",
43
46
  "mkdocstrings[python] >= 0.29.1",
44
47
  ]
45
- required-environments = ["platform_system == 'Windows'"]
46
48
 
47
49
  [tool.uv.build-backend]
48
50
  source-include = ["pdmt5/**", "LICENSE"]
@@ -150,6 +152,7 @@ exclude = ["build", ".venv"]
150
152
  venvPath = "."
151
153
  venv = ".venv"
152
154
  typeCheckingMode = "strict"
155
+ threads = 0
153
156
  reportUnknownArgumentType = "none"
154
157
  reportUnknownMemberType = "none"
155
158
  reportUnknownVariableType = "none"
@@ -1,6 +1,6 @@
1
1
  version = 1
2
2
  revision = 3
3
- requires-python = ">=3.11"
3
+ requires-python = ">=3.11, <3.14"
4
4
  resolution-markers = [
5
5
  "python_full_version >= '3.12'",
6
6
  "python_full_version < '3.12'",
@@ -37,7 +37,6 @@ wheels = [
37
37
  { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" },
38
38
  { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" },
39
39
  { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" },
40
- { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" },
41
40
  { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" },
42
41
  ]
43
42
 
@@ -613,7 +612,7 @@ wheels = [
613
612
 
614
613
  [[package]]
615
614
  name = "pdmt5"
616
- version = "0.2.0"
615
+ version = "0.2.1"
617
616
  source = { editable = "." }
618
617
  dependencies = [
619
618
  { name = "metatrader5", marker = "sys_platform == 'win32'" },
@@ -1 +0,0 @@
1
- ../CLAUDE.md
@@ -1,59 +0,0 @@
1
- ---
2
- name: Claude Code
3
- on:
4
- issue_comment:
5
- types:
6
- - created
7
- pull_request_review_comment:
8
- types:
9
- - created
10
- issues:
11
- types:
12
- - opened
13
- - assigned
14
- pull_request_review:
15
- types:
16
- - submitted
17
- jobs:
18
- claude:
19
- if: >
20
- (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude'))
21
- || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude'))
22
- || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude'))
23
- || (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
24
- permissions:
25
- contents: read
26
- pull-requests: read
27
- issues: read
28
- id-token: write
29
- actions: read # Required for Claude to read CI results on PRs
30
- uses: dceoy/gh-actions-for-devops/.github/workflows/claude-code-action.yml@main
31
- with:
32
- # This is an optional setting that allows Claude to read CI results on PRs
33
- additional-permissions: |
34
- actions: read
35
-
36
- # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4)
37
- # model: "claude-opus-4-20250514"
38
-
39
- # Optional: Customize the trigger phrase (default: @claude)
40
- # trigger-phrase: "/claude"
41
-
42
- # Optional: Trigger when specific user is assigned to an issue
43
- # assignee-trigger: "claude-bot"
44
-
45
- # Optional: Allow Claude to run specific commands
46
- # allowed-tools: "Bash(npm install),Bash(npm run build),Bash(npm run test:*),Bash(npm run lint:*)"
47
-
48
- # Optional: Add custom instructions for Claude to customize its behavior for your project
49
- # custom-instructions: |
50
- # Follow our coding standards
51
- # Ensure all new code has tests
52
- # Use TypeScript for new files
53
-
54
- # Optional: Custom environment variables for Claude
55
- # claude-env: |
56
- # NODE_ENV: test
57
- secrets:
58
- CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
59
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -1,34 +0,0 @@
1
- ---
2
- name: PR-agent
3
- on:
4
- pull_request:
5
- types:
6
- - opened
7
- - reopened
8
- - ready_for_review
9
- issue_comment:
10
- types:
11
- - created
12
- - edited
13
- - deleted
14
- jobs:
15
- pr-agent:
16
- if: >
17
- github.event.sender.type != 'Bot'
18
- && (
19
- github.event_name == 'pull_request'
20
- || github.event_name == 'issue_comment'
21
- )
22
- uses: dceoy/gh-actions-for-devops/.github/workflows/pr-agent.yml@main
23
- permissions:
24
- contents: write
25
- pull-requests: write
26
- issues: write
27
- id-token: write
28
- with:
29
- auto-describe: true
30
- auto-review: true
31
- auto-improve: true
32
- secrets:
33
- GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
34
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes