mcp-dbutils 0.11.0__tar.gz → 0.13.0__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 (50) hide show
  1. mcp_dbutils-0.11.0/.github/workflows/test.yml → mcp_dbutils-0.13.0/.github/workflows/quality-assurance.yml +35 -2
  2. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/CHANGELOG.md +14 -0
  3. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/PKG-INFO +36 -4
  4. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/README.md +35 -3
  5. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/README_CN.md +3 -3
  6. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/pyproject.toml +1 -1
  7. mcp_dbutils-0.13.0/sonar-project.properties +6 -0
  8. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/__init__.py +3 -3
  9. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/base.py +6 -3
  10. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/mysql/server.py +2 -2
  11. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/postgres/server.py +3 -2
  12. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/sqlite/server.py +2 -2
  13. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/.coveragerc +0 -0
  14. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/.github/workflows/release.yml +0 -0
  15. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/.gitignore +0 -0
  16. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/.releaserc.json +0 -0
  17. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/Dockerfile +0 -0
  18. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/LICENSE +0 -0
  19. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/config.yaml.example +0 -0
  20. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/smithery.yaml +0 -0
  21. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/config.py +0 -0
  22. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/log.py +0 -0
  23. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/mysql/__init__.py +0 -0
  24. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/mysql/config.py +0 -0
  25. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/mysql/handler.py +0 -0
  26. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/postgres/__init__.py +0 -0
  27. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/postgres/config.py +0 -0
  28. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/postgres/handler.py +0 -0
  29. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/sqlite/__init__.py +0 -0
  30. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/sqlite/config.py +0 -0
  31. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/sqlite/handler.py +0 -0
  32. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/src/mcp_dbutils/stats.py +0 -0
  33. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/conftest.py +0 -0
  34. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/__init__.py +0 -0
  35. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/conftest.py +0 -0
  36. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/fixtures.py +0 -0
  37. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_logging.py +0 -0
  38. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_monitoring.py +0 -0
  39. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_monitoring_enhanced.py +0 -0
  40. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_mysql.py +0 -0
  41. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_mysql_config.py +0 -0
  42. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_postgres.py +0 -0
  43. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_postgres_config.py +0 -0
  44. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_prompts.py +0 -0
  45. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_sqlite.py +0 -0
  46. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_sqlite_config.py +0 -0
  47. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_tools.py +0 -0
  48. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/integration/test_tools_advanced.py +0 -0
  49. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/unit/test_log.py +0 -0
  50. {mcp_dbutils-0.11.0 → mcp_dbutils-0.13.0}/tests/unit/test_stats.py +0 -0
@@ -1,4 +1,4 @@
1
- name: Tests
1
+ name: Quality Assurance
2
2
 
3
3
  on:
4
4
  push:
@@ -7,7 +7,7 @@ on:
7
7
  branches: [ main ]
8
8
 
9
9
  jobs:
10
- test:
10
+ pytest:
11
11
  runs-on: ubuntu-latest
12
12
 
13
13
  services:
@@ -49,8 +49,15 @@ jobs:
49
49
  --cov-report=html \
50
50
  --cov-report=term-missing \
51
51
  --cov-report=json:coverage.json \
52
+ --cov-report=xml:coverage.xml \
52
53
  tests/
53
54
 
55
+ - name: Upload coverage report
56
+ uses: actions/upload-artifact@v4
57
+ with:
58
+ name: coverage-report
59
+ path: coverage.xml
60
+
54
61
  - name: Calculate coverage percentage
55
62
  id: calc_coverage
56
63
  run: |
@@ -75,3 +82,29 @@ jobs:
75
82
  message: "${{ steps.calc_coverage.outputs.percentage }}%"
76
83
  color: "${{ steps.calc_coverage.outputs.color }}"
77
84
  namedLogo: python
85
+
86
+ sonarcloud:
87
+ name: SonarCloud
88
+ needs: pytest
89
+ runs-on: ubuntu-latest
90
+ steps:
91
+ - uses: actions/checkout@v4
92
+ with:
93
+ fetch-depth: 0
94
+ - name: Download coverage report
95
+ uses: actions/download-artifact@v4
96
+ with:
97
+ name: coverage-report
98
+ - name: SonarCloud Scan
99
+ uses: SonarSource/sonarqube-scan-action@v5.0.0
100
+ env:
101
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
102
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
103
+
104
+ - name: SonarQube Quality Gate Check
105
+ uses: sonarsource/sonarqube-quality-gate-action@master
106
+ timeout-minutes: 5
107
+ env:
108
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
109
+ with:
110
+ scanMetadataReportFile: .scannerwork/report-task.txt
@@ -1,3 +1,17 @@
1
+ # [0.13.0](https://github.com/donghao1393/mcp-dbutils/compare/v0.12.0...v0.13.0) (2025-03-14)
2
+
3
+
4
+ ### Features
5
+
6
+ * configure SonarCloud quality gates ([#31](https://github.com/donghao1393/mcp-dbutils/issues/31)) ([454c4d3](https://github.com/donghao1393/mcp-dbutils/commit/454c4d384e4ddd8d324fe4292b13436c6b22328c)), closes [#30](https://github.com/donghao1393/mcp-dbutils/issues/30)
7
+
8
+ # [0.12.0](https://github.com/donghao1393/mcp-dbutils/compare/v0.11.0...v0.12.0) (2025-03-14)
9
+
10
+
11
+ ### Features
12
+
13
+ * integrate SonarCloud analysis ([#29](https://github.com/donghao1393/mcp-dbutils/issues/29)) ([67649c5](https://github.com/donghao1393/mcp-dbutils/commit/67649c55cc317c2ee20c69777d1629895863dd86)), closes [#28](https://github.com/donghao1393/mcp-dbutils/issues/28)
14
+
1
15
  # [0.11.0](https://github.com/donghao1393/mcp-dbutils/compare/v0.10.3...v0.11.0) (2025-03-13)
2
16
 
3
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-dbutils
3
- Version: 0.11.0
3
+ Version: 0.13.0
4
4
  Summary: MCP Database Utilities Service
5
5
  Author: Dong Hao
6
6
  License-Expression: MIT
@@ -65,7 +65,7 @@ uvx mcp-dbutils --config /path/to/config.yaml
65
65
  Add to Claude configuration:
66
66
  ```json
67
67
  "mcpServers": {
68
- "mcp-dbutils": {
68
+ "dbutils": {
69
69
  "command": "uvx",
70
70
  "args": [
71
71
  "mcp-dbutils",
@@ -87,7 +87,7 @@ pip install mcp-dbutils
87
87
  Add to Claude configuration:
88
88
  ```json
89
89
  "mcpServers": {
90
- "mcp-dbutils": {
90
+ "dbutils": {
91
91
  "command": "python",
92
92
  "args": [
93
93
  "-m",
@@ -114,7 +114,7 @@ docker run -i --rm \
114
114
  Add to Claude configuration:
115
115
  ```json
116
116
  "mcpServers": {
117
- "mcp-dbutils": {
117
+ "dbutils": {
118
118
  "command": "docker",
119
119
  "args": [
120
120
  "run",
@@ -460,6 +460,38 @@ Provides MySQL-specific features:
460
460
  - SSL/TLS secure connection
461
461
  - URL and standard connection methods
462
462
 
463
+ ## Code Quality
464
+
465
+ ### Quality Gates
466
+ We use SonarCloud to maintain high code quality standards. All pull requests must pass the following quality gates:
467
+
468
+ - Code Coverage: ≥ 80%
469
+ - Code Quality:
470
+ * No blocker or critical issues
471
+ * Less than 10 major issues
472
+ * Code duplication < 3%
473
+ - Security:
474
+ * No security vulnerabilities
475
+ * No security hotspots
476
+
477
+ ### Automated Checks
478
+ Our CI/CD pipeline automatically performs:
479
+ 1. Full test suite execution
480
+ 2. Code coverage analysis
481
+ 3. SonarCloud static code analysis
482
+ 4. Quality gate validation
483
+
484
+ Pull requests that don't meet these standards will be automatically blocked from merging.
485
+
486
+ ### Local Development
487
+ To check code quality locally:
488
+ 1. Run tests with coverage:
489
+ ```bash
490
+ pytest --cov=src/mcp_dbutils --cov-report=xml:coverage.xml tests/
491
+ ```
492
+ 2. Use SonarLint in your IDE to catch issues early
493
+ 3. Review SonarCloud analysis results in PR comments
494
+
463
495
  ## Contributing
464
496
  Contributions are welcome! Here's how you can help:
465
497
 
@@ -42,7 +42,7 @@ uvx mcp-dbutils --config /path/to/config.yaml
42
42
  Add to Claude configuration:
43
43
  ```json
44
44
  "mcpServers": {
45
- "mcp-dbutils": {
45
+ "dbutils": {
46
46
  "command": "uvx",
47
47
  "args": [
48
48
  "mcp-dbutils",
@@ -64,7 +64,7 @@ pip install mcp-dbutils
64
64
  Add to Claude configuration:
65
65
  ```json
66
66
  "mcpServers": {
67
- "mcp-dbutils": {
67
+ "dbutils": {
68
68
  "command": "python",
69
69
  "args": [
70
70
  "-m",
@@ -91,7 +91,7 @@ docker run -i --rm \
91
91
  Add to Claude configuration:
92
92
  ```json
93
93
  "mcpServers": {
94
- "mcp-dbutils": {
94
+ "dbutils": {
95
95
  "command": "docker",
96
96
  "args": [
97
97
  "run",
@@ -437,6 +437,38 @@ Provides MySQL-specific features:
437
437
  - SSL/TLS secure connection
438
438
  - URL and standard connection methods
439
439
 
440
+ ## Code Quality
441
+
442
+ ### Quality Gates
443
+ We use SonarCloud to maintain high code quality standards. All pull requests must pass the following quality gates:
444
+
445
+ - Code Coverage: ≥ 80%
446
+ - Code Quality:
447
+ * No blocker or critical issues
448
+ * Less than 10 major issues
449
+ * Code duplication < 3%
450
+ - Security:
451
+ * No security vulnerabilities
452
+ * No security hotspots
453
+
454
+ ### Automated Checks
455
+ Our CI/CD pipeline automatically performs:
456
+ 1. Full test suite execution
457
+ 2. Code coverage analysis
458
+ 3. SonarCloud static code analysis
459
+ 4. Quality gate validation
460
+
461
+ Pull requests that don't meet these standards will be automatically blocked from merging.
462
+
463
+ ### Local Development
464
+ To check code quality locally:
465
+ 1. Run tests with coverage:
466
+ ```bash
467
+ pytest --cov=src/mcp_dbutils --cov-report=xml:coverage.xml tests/
468
+ ```
469
+ 2. Use SonarLint in your IDE to catch issues early
470
+ 3. Review SonarCloud analysis results in PR comments
471
+
440
472
  ## Contributing
441
473
  Contributions are welcome! Here's how you can help:
442
474
 
@@ -26,7 +26,7 @@ uvx mcp-dbutils --config /path/to/config.yaml
26
26
  添加到 Claude 配置:
27
27
  ```json
28
28
  "mcpServers": {
29
- "mcp-dbutils": {
29
+ "dbutils": {
30
30
  "command": "uvx",
31
31
  "args": [
32
32
  "mcp-dbutils",
@@ -48,7 +48,7 @@ pip install mcp-dbutils
48
48
  添加到 Claude 配置:
49
49
  ```json
50
50
  "mcpServers": {
51
- "mcp-dbutils": {
51
+ "dbutils": {
52
52
  "command": "python",
53
53
  "args": [
54
54
  "-m",
@@ -75,7 +75,7 @@ docker run -i --rm \
75
75
  添加到 Claude 配置:
76
76
  ```json
77
77
  "mcpServers": {
78
- "mcp-dbutils": {
78
+ "dbutils": {
79
79
  "command": "docker",
80
80
  "args": [
81
81
  "run",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mcp-dbutils"
3
- version = "0.11.0"
3
+ version = "0.13.0"
4
4
  description = "MCP Database Utilities Service"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -0,0 +1,6 @@
1
+ sonar.organization=donghao1393
2
+ sonar.projectKey=donghao1393_mcp-dbutils
3
+ sonar.sources=src/mcp_dbutils
4
+ sonar.tests=tests
5
+ sonar.python.coverage.reportPaths=coverage.xml
6
+ sonar.python.version=3.10
@@ -9,13 +9,13 @@ import yaml
9
9
  from importlib.metadata import metadata
10
10
 
11
11
  from .log import create_logger
12
- from .base import ConnectionServer
12
+ from .base import ConnectionServer, LOG_NAME
13
13
 
14
14
  # 获取包信息
15
15
  pkg_meta = metadata("mcp-dbutils")
16
16
 
17
17
  # 创建全局logger
18
- log = create_logger(pkg_meta["Name"])
18
+ log = create_logger(LOG_NAME)
19
19
 
20
20
  async def run_server():
21
21
  """服务器运行逻辑"""
@@ -30,7 +30,7 @@ async def run_server():
30
30
 
31
31
  # 更新logger的debug状态
32
32
  global log
33
- log = create_logger(pkg_meta["Name"], debug)
33
+ log = create_logger(LOG_NAME, debug)
34
34
 
35
35
  log("info", f"MCP Connection Utilities Service v{pkg_meta['Version']}")
36
36
  if debug:
@@ -31,6 +31,9 @@ from .stats import ResourceStats
31
31
  # 获取包信息用于日志命名
32
32
  pkg_meta = metadata("mcp-dbutils")
33
33
 
34
+ # 日志名称常量
35
+ LOG_NAME = "dbutils"
36
+
34
37
  # MCP日志级别常量
35
38
  LOG_LEVEL_DEBUG = "debug" # 0
36
39
  LOG_LEVEL_INFO = "info" # 1
@@ -56,7 +59,7 @@ class ConnectionHandler(ABC):
56
59
  self.connection = connection
57
60
  self.debug = debug
58
61
  # 创建stderr日志记录器用于本地调试
59
- self.log = create_logger(f"{pkg_meta['Name']}.handler.{connection}", debug)
62
+ self.log = create_logger(f"{LOG_NAME}.handler.{connection}", debug)
60
63
  self.stats = ResourceStats()
61
64
  self._session = None
62
65
 
@@ -246,9 +249,9 @@ class ConnectionServer:
246
249
  self.debug = debug
247
250
  # 获取包信息用于服务器配置
248
251
  pkg_meta = metadata("mcp-dbutils")
249
- self.logger = create_logger(f"{pkg_meta['Name']}.server", debug)
252
+ self.logger = create_logger(f"{LOG_NAME}.server", debug)
250
253
  self.server = Server(
251
- name=pkg_meta["Name"],
254
+ name=LOG_NAME,
252
255
  version=pkg_meta["Version"]
253
256
  )
254
257
  self._session = None
@@ -9,7 +9,7 @@ from ..log import create_logger
9
9
  from .config import MySQLConfig
10
10
 
11
11
  # 获取包信息用于日志命名
12
- pkg_meta = metadata("mcp-dbutils")
12
+ from ..base import LOG_NAME
13
13
 
14
14
  class MySQLServer(ConnectionServer):
15
15
  def __init__(self, config: MySQLConfig, config_path: Optional[str] = None):
@@ -21,7 +21,7 @@ class MySQLServer(ConnectionServer):
21
21
  super().__init__(config_path, config.debug)
22
22
  self.config = config
23
23
  self.config_path = config_path
24
- self.log = create_logger(f"{pkg_meta['Name']}.db.mysql", config.debug)
24
+ self.log = create_logger(f"{LOG_NAME}.db.mysql", config.debug)
25
25
  # 创建连接池
26
26
  try:
27
27
  conn_params = config.get_connection_params()
@@ -9,7 +9,8 @@ from ..log import create_logger
9
9
  from .config import PostgreSQLConfig
10
10
 
11
11
  # 获取包信息用于日志命名
12
- pkg_meta = metadata("mcp-dbutils")
12
+ from ..base import LOG_NAME
13
+
13
14
  class PostgreSQLServer(ConnectionServer):
14
15
  def __init__(self, config: PostgreSQLConfig, config_path: Optional[str] = None):
15
16
  """初始化PostgreSQL服务器
@@ -20,7 +21,7 @@ class PostgreSQLServer(ConnectionServer):
20
21
  super().__init__(config_path, config.debug)
21
22
  self.config = config
22
23
  self.config_path = config_path
23
- self.log = create_logger(f"{pkg_meta['Name']}.db.postgres", config.debug)
24
+ self.log = create_logger(f"{LOG_NAME}.db.postgres", config.debug)
24
25
  # 创建连接池
25
26
  try:
26
27
  conn_params = config.get_connection_params()
@@ -12,7 +12,7 @@ from ..log import create_logger
12
12
  from .config import SQLiteConfig
13
13
 
14
14
  # 获取包信息用于日志命名
15
- pkg_meta = metadata("mcp-dbutils")
15
+ from ..base import LOG_NAME
16
16
 
17
17
  class SQLiteServer(ConnectionServer):
18
18
  def __init__(self, config: SQLiteConfig, config_path: Optional[str] = None):
@@ -24,7 +24,7 @@ class SQLiteServer(ConnectionServer):
24
24
  super().__init__(config_path, config.debug)
25
25
  self.config = config
26
26
  self.config_path = config_path
27
- self.log = create_logger(f"{pkg_meta['Name']}.db.sqlite", config.debug)
27
+ self.log = create_logger(f"{LOG_NAME}.db.sqlite", config.debug)
28
28
 
29
29
  # 确保数据库目录存在
30
30
  db_file = Path(self.config.absolute_path)
File without changes
File without changes
File without changes
File without changes
File without changes