excel-dbapi 0.2.0__tar.gz → 0.3.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.
- excel_dbapi-0.3.0/.editorconfig +9 -0
- excel_dbapi-0.3.0/.github/ISSUE_TEMPLATE/bug_report.yml +69 -0
- excel_dbapi-0.3.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- excel_dbapi-0.3.0/.github/ISSUE_TEMPLATE/feature_request.yml +65 -0
- excel_dbapi-0.3.0/.github/ISSUE_TEMPLATE/task.yml +56 -0
- excel_dbapi-0.3.0/.github/PULL_REQUEST_TEMPLATE.md +33 -0
- excel_dbapi-0.3.0/.github/RELEASE_CHECKLIST.md +10 -0
- excel_dbapi-0.3.0/.github/RELEASE_NOTES_TEMPLATE.md +25 -0
- excel_dbapi-0.3.0/.github/dependabot.yml +22 -0
- excel_dbapi-0.3.0/.github/labels.yml +47 -0
- excel_dbapi-0.3.0/.github/release.yml +21 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/.github/workflows/ci.yml +3 -3
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/.github/workflows/publish-pypi.yml +5 -2
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/.gitignore +7 -0
- excel_dbapi-0.3.0/.pre-commit-config.yaml +21 -0
- excel_dbapi-0.3.0/CHANGELOG.md +66 -0
- excel_dbapi-0.3.0/CODE_OF_CONDUCT.md +56 -0
- excel_dbapi-0.3.0/CONTRIBUTING.md +64 -0
- excel_dbapi-0.3.0/Makefile +81 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/PKG-INFO +82 -40
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/README.md +81 -39
- excel_dbapi-0.3.0/SECURITY.md +35 -0
- excel_dbapi-0.3.0/SUPPORT.md +46 -0
- excel_dbapi-0.3.0/cliff.toml +32 -0
- excel_dbapi-0.3.0/codecov.yml +13 -0
- excel_dbapi-0.3.0/docs/SQL_SPEC.md +398 -0
- excel_dbapi-0.3.0/logo.svg +21 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/pyproject.toml +1 -1
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/__init__.py +1 -1
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/parser.py +81 -7
- excel_dbapi-0.3.0/tests/graph/__init__.py +0 -0
- excel_dbapi-0.3.0/tests/test_golden_ddl.py +56 -0
- excel_dbapi-0.3.0/tests/test_golden_delete.py +81 -0
- excel_dbapi-0.3.0/tests/test_golden_insert.py +103 -0
- excel_dbapi-0.3.0/tests/test_golden_select.py +146 -0
- excel_dbapi-0.3.0/tests/test_golden_update.py +92 -0
- excel_dbapi-0.3.0/tests/test_low_coverage_modules.py +408 -0
- excel_dbapi-0.3.0/tests/test_reflection.py +204 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_sql_extensions.py +12 -4
- excel_dbapi-0.2.0/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
- excel_dbapi-0.2.0/.github/ISSUE_TEMPLATE/feature_request.md +0 -16
- excel_dbapi-0.2.0/.github/ISSUE_TEMPLATE/release_checklist.md +0 -23
- excel_dbapi-0.2.0/.github/pull_request_template.md +0 -13
- excel_dbapi-0.2.0/CHANGELOG.md +0 -18
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/LICENSE +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/docs/DEVELOPMENT.md +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/docs/OPERATIONS.md +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/docs/PUBLIC_ROADMAP.md +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/docs/QUICKSTART_10_MIN.md +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/docs/ROADMAP.md +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/docs/USAGE.md +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/examples/advanced_query.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/examples/basic_usage.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/examples/education/lesson_01_first_query.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/examples/education/lesson_02_parameter_binding.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/examples/pandas_engine.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/examples/transactions.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/examples/write_operations.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/connection.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/cursor.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/__init__.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/base.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/__init__.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/auth.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/backend.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/client.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/locator.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/graph/session.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/openpyxl/__init__.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/openpyxl/backend.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/pandas/__init__.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/pandas/backend.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/registry.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/engines/result.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/exceptions.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/executor.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/openpyxl/__init__.py +0 -0
- /excel_dbapi-0.2.0/tests/__init__.py → /excel_dbapi-0.3.0/src/excel_dbapi/py.typed +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/reflection.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/src/excel_dbapi/sanitize.py +0 -0
- {excel_dbapi-0.2.0/tests/graph → excel_dbapi-0.3.0/tests}/__init__.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/data/sample.xlsx +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/graph/test_auth.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/graph/test_backend.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/graph/test_client.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/graph/test_locator.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_additional_coverage.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_api_extensions.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_atomic_rollback_integration.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_base_engine.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_connection.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_connection_graph.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_cursor.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_engine.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_engine_state.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_error_paths.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_exceptions.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_executor.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_formula_injection.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_integration.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_openpyxl_edge_cases.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_openpyxl_facade.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_parser.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_parser_errors.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_pep249_compliance.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_sql_boundaries.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_sql_features.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_stage1_fixes.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_where_operators.py +0 -0
- {excel_dbapi-0.2.0 → excel_dbapi-0.3.0}/tests/test_write_operations.py +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a bug or unexpected behavior in excel-dbapi
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for taking the time to report a bug in `excel-dbapi`!
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: problem
|
|
13
|
+
attributes:
|
|
14
|
+
label: Problem
|
|
15
|
+
description: A clear description of the bug
|
|
16
|
+
placeholder: What happened? What did you expect to happen?
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: current-state
|
|
22
|
+
attributes:
|
|
23
|
+
label: Current State
|
|
24
|
+
description: Describe the current behavior and any relevant context
|
|
25
|
+
placeholder: |
|
|
26
|
+
- What is happening now?
|
|
27
|
+
- Any error messages or logs?
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
|
|
31
|
+
- type: textarea
|
|
32
|
+
id: steps-to-reproduce
|
|
33
|
+
attributes:
|
|
34
|
+
label: Steps to Reproduce
|
|
35
|
+
description: How can we reproduce this issue?
|
|
36
|
+
placeholder: |
|
|
37
|
+
1. Install package...
|
|
38
|
+
2. Run query...
|
|
39
|
+
3. See error...
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
|
|
43
|
+
- type: textarea
|
|
44
|
+
id: expected-outcome
|
|
45
|
+
attributes:
|
|
46
|
+
label: Expected Outcome
|
|
47
|
+
description: What should happen instead?
|
|
48
|
+
validations:
|
|
49
|
+
required: true
|
|
50
|
+
|
|
51
|
+
- type: textarea
|
|
52
|
+
id: environment
|
|
53
|
+
attributes:
|
|
54
|
+
label: Environment
|
|
55
|
+
description: Your environment details
|
|
56
|
+
placeholder: |
|
|
57
|
+
- Python version:
|
|
58
|
+
- Package version:
|
|
59
|
+
- OS:
|
|
60
|
+
validations:
|
|
61
|
+
required: false
|
|
62
|
+
|
|
63
|
+
- type: textarea
|
|
64
|
+
id: references
|
|
65
|
+
attributes:
|
|
66
|
+
label: References
|
|
67
|
+
description: Any related files, links, or resources
|
|
68
|
+
validations:
|
|
69
|
+
required: false
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Documentation
|
|
4
|
+
url: https://github.com/yeongseon/excel-dbapi#readme
|
|
5
|
+
about: Check our README for usage guides and examples
|
|
6
|
+
- name: Security Advisories
|
|
7
|
+
url: https://github.com/yeongseon/excel-dbapi/security/advisories/new
|
|
8
|
+
about: Report security issues privately via GitHub Security Advisories
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new feature or enhancement for excel-dbapi
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for suggesting a feature for `excel-dbapi`!
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: problem
|
|
13
|
+
attributes:
|
|
14
|
+
label: Problem
|
|
15
|
+
description: What problem does this feature solve?
|
|
16
|
+
placeholder: Describe the problem or limitation you're facing
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: current-state
|
|
22
|
+
attributes:
|
|
23
|
+
label: Current State
|
|
24
|
+
description: How does the project currently handle this (if at all)?
|
|
25
|
+
placeholder: |
|
|
26
|
+
- Current behavior
|
|
27
|
+
- Current limitations
|
|
28
|
+
validations:
|
|
29
|
+
required: false
|
|
30
|
+
|
|
31
|
+
- type: textarea
|
|
32
|
+
id: proposed-solution
|
|
33
|
+
attributes:
|
|
34
|
+
label: Proposed Solution
|
|
35
|
+
description: How would you like this to work?
|
|
36
|
+
placeholder: Describe your ideal solution
|
|
37
|
+
validations:
|
|
38
|
+
required: true
|
|
39
|
+
|
|
40
|
+
- type: textarea
|
|
41
|
+
id: tasks
|
|
42
|
+
attributes:
|
|
43
|
+
label: Tasks
|
|
44
|
+
description: Break down the implementation into tasks (if known)
|
|
45
|
+
placeholder: |
|
|
46
|
+
- [ ] Task 1
|
|
47
|
+
- [ ] Task 2
|
|
48
|
+
validations:
|
|
49
|
+
required: false
|
|
50
|
+
|
|
51
|
+
- type: textarea
|
|
52
|
+
id: expected-outcome
|
|
53
|
+
attributes:
|
|
54
|
+
label: Expected Outcome
|
|
55
|
+
description: What should be the end result?
|
|
56
|
+
validations:
|
|
57
|
+
required: true
|
|
58
|
+
|
|
59
|
+
- type: textarea
|
|
60
|
+
id: references
|
|
61
|
+
attributes:
|
|
62
|
+
label: References
|
|
63
|
+
description: Any related files, links, documentation, or examples
|
|
64
|
+
validations:
|
|
65
|
+
required: false
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: Task
|
|
2
|
+
description: A general task or chore (refactoring, maintenance, etc.)
|
|
3
|
+
title: "[Task]: "
|
|
4
|
+
labels: ["chore"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Use this template for maintenance tasks, refactoring, or other chores.
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: problem
|
|
13
|
+
attributes:
|
|
14
|
+
label: Problem
|
|
15
|
+
description: Why is this task needed?
|
|
16
|
+
placeholder: Describe the motivation for this task
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: current-state
|
|
22
|
+
attributes:
|
|
23
|
+
label: Current State
|
|
24
|
+
description: What is the current situation?
|
|
25
|
+
placeholder: |
|
|
26
|
+
- Current code/config state
|
|
27
|
+
- Any issues or limitations
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
|
|
31
|
+
- type: textarea
|
|
32
|
+
id: tasks
|
|
33
|
+
attributes:
|
|
34
|
+
label: Tasks
|
|
35
|
+
description: Break down the work into actionable items
|
|
36
|
+
placeholder: |
|
|
37
|
+
- [ ] Task 1
|
|
38
|
+
- [ ] Task 2
|
|
39
|
+
validations:
|
|
40
|
+
required: true
|
|
41
|
+
|
|
42
|
+
- type: textarea
|
|
43
|
+
id: expected-outcome
|
|
44
|
+
attributes:
|
|
45
|
+
label: Expected Outcome
|
|
46
|
+
description: What should be the result when this is complete?
|
|
47
|
+
validations:
|
|
48
|
+
required: true
|
|
49
|
+
|
|
50
|
+
- type: textarea
|
|
51
|
+
id: references
|
|
52
|
+
attributes:
|
|
53
|
+
label: References
|
|
54
|
+
description: Any related files, documentation, or resources
|
|
55
|
+
validations:
|
|
56
|
+
required: false
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- Brief description of changes -->
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
<!-- List the specific changes made -->
|
|
8
|
+
|
|
9
|
+
-
|
|
10
|
+
|
|
11
|
+
## Type of Change
|
|
12
|
+
|
|
13
|
+
<!-- Check the relevant option -->
|
|
14
|
+
|
|
15
|
+
- [ ] Bug fix (non-breaking change that fixes an issue)
|
|
16
|
+
- [ ] New feature (non-breaking change that adds functionality)
|
|
17
|
+
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
|
|
18
|
+
- [ ] Documentation update
|
|
19
|
+
- [ ] Refactoring (no functional changes)
|
|
20
|
+
- [ ] Chore (maintenance, dependencies, CI, etc.)
|
|
21
|
+
|
|
22
|
+
## Checklist
|
|
23
|
+
|
|
24
|
+
- [ ] My code follows the project's code style
|
|
25
|
+
- [ ] I have run `make check-all`
|
|
26
|
+
- [ ] I have run `make test` and all tests pass
|
|
27
|
+
- [ ] I have added tests for new functionality (if applicable)
|
|
28
|
+
- [ ] I have updated documentation (if applicable)
|
|
29
|
+
- [ ] My changes do not introduce new warnings
|
|
30
|
+
|
|
31
|
+
## Related Issues
|
|
32
|
+
|
|
33
|
+
<!-- Link to related issues: Closes #123, Fixes #456 -->
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Release Checklist
|
|
2
|
+
|
|
3
|
+
- [ ] Verify CI is green on `main`
|
|
4
|
+
- [ ] Run local quality gate with `make check-all`
|
|
5
|
+
- [ ] Build distribution artifacts with `make build`
|
|
6
|
+
- [ ] Update version in `pyproject.toml`
|
|
7
|
+
- [ ] Update `CHANGELOG.md` for the release
|
|
8
|
+
- [ ] Tag release `vX.Y.Z`
|
|
9
|
+
- [ ] Verify package publish succeeded
|
|
10
|
+
- [ ] Publish GitHub Release notes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "pip"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
commit-message:
|
|
8
|
+
prefix: "chore(deps)"
|
|
9
|
+
labels:
|
|
10
|
+
- "dependencies"
|
|
11
|
+
open-pull-requests-limit: 10
|
|
12
|
+
|
|
13
|
+
- package-ecosystem: "github-actions"
|
|
14
|
+
directory: "/"
|
|
15
|
+
schedule:
|
|
16
|
+
interval: "weekly"
|
|
17
|
+
commit-message:
|
|
18
|
+
prefix: "chore(deps)"
|
|
19
|
+
labels:
|
|
20
|
+
- "dependencies"
|
|
21
|
+
- "github-actions"
|
|
22
|
+
open-pull-requests-limit: 10
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
- name: "dependencies"
|
|
2
|
+
color: "0075ca"
|
|
3
|
+
description: "Pull requests that update a dependency file"
|
|
4
|
+
|
|
5
|
+
- name: "github-actions"
|
|
6
|
+
color: "e4e669"
|
|
7
|
+
description: "Pull requests that update GitHub Actions"
|
|
8
|
+
|
|
9
|
+
- name: "bug"
|
|
10
|
+
color: "d73a4a"
|
|
11
|
+
description: "Something isn't working"
|
|
12
|
+
|
|
13
|
+
- name: "enhancement"
|
|
14
|
+
color: "a2eeef"
|
|
15
|
+
description: "New feature or request"
|
|
16
|
+
|
|
17
|
+
- name: "documentation"
|
|
18
|
+
color: "0075ca"
|
|
19
|
+
description: "Improvements or additions to documentation"
|
|
20
|
+
|
|
21
|
+
- name: "question"
|
|
22
|
+
color: "d876e3"
|
|
23
|
+
description: "Further information is requested"
|
|
24
|
+
|
|
25
|
+
- name: "good first issue"
|
|
26
|
+
color: "7057ff"
|
|
27
|
+
description: "Good for newcomers"
|
|
28
|
+
|
|
29
|
+
- name: "help wanted"
|
|
30
|
+
color: "008672"
|
|
31
|
+
description: "Extra attention is needed"
|
|
32
|
+
|
|
33
|
+
- name: "security"
|
|
34
|
+
color: "e11d48"
|
|
35
|
+
description: "Security-related issue or pull request"
|
|
36
|
+
|
|
37
|
+
- name: "duplicate"
|
|
38
|
+
color: "cfd3d7"
|
|
39
|
+
description: "This issue or pull request already exists"
|
|
40
|
+
|
|
41
|
+
- name: "wontfix"
|
|
42
|
+
color: "ffffff"
|
|
43
|
+
description: "This will not be worked on"
|
|
44
|
+
|
|
45
|
+
- name: "invalid"
|
|
46
|
+
color: "e4e669"
|
|
47
|
+
description: "This doesn't seem right"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
changelog:
|
|
2
|
+
categories:
|
|
3
|
+
- title: "🚀 Features"
|
|
4
|
+
labels:
|
|
5
|
+
- enhancement
|
|
6
|
+
- title: "🐛 Bug Fixes"
|
|
7
|
+
labels:
|
|
8
|
+
- bug
|
|
9
|
+
- title: "📖 Documentation"
|
|
10
|
+
labels:
|
|
11
|
+
- documentation
|
|
12
|
+
- title: "🧹 Maintenance"
|
|
13
|
+
labels:
|
|
14
|
+
- dependencies
|
|
15
|
+
- chore
|
|
16
|
+
- title: "Other Changes"
|
|
17
|
+
labels:
|
|
18
|
+
- "*"
|
|
19
|
+
exclude:
|
|
20
|
+
labels:
|
|
21
|
+
- skip-changelog
|
|
@@ -11,9 +11,9 @@ jobs:
|
|
|
11
11
|
matrix:
|
|
12
12
|
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
13
13
|
steps:
|
|
14
|
-
- uses: actions/checkout@
|
|
14
|
+
- uses: actions/checkout@v6
|
|
15
15
|
- name: Set up Python
|
|
16
|
-
uses: actions/setup-python@
|
|
16
|
+
uses: actions/setup-python@v6
|
|
17
17
|
with:
|
|
18
18
|
python-version: ${{ matrix.python-version }}
|
|
19
19
|
- name: Install dependencies
|
|
@@ -24,7 +24,7 @@ jobs:
|
|
|
24
24
|
run: pytest tests/ -v --cov=excel_dbapi --cov-report=xml --cov-report=term-missing
|
|
25
25
|
- name: Upload coverage to Codecov
|
|
26
26
|
if: matrix.python-version == '3.12'
|
|
27
|
-
uses: codecov/codecov-action@
|
|
27
|
+
uses: codecov/codecov-action@v6
|
|
28
28
|
with:
|
|
29
29
|
files: coverage.xml
|
|
30
30
|
fail_ci_if_error: false
|
|
@@ -11,10 +11,10 @@ jobs:
|
|
|
11
11
|
permissions:
|
|
12
12
|
id-token: write
|
|
13
13
|
steps:
|
|
14
|
-
- uses: actions/checkout@
|
|
14
|
+
- uses: actions/checkout@v6
|
|
15
15
|
|
|
16
16
|
- name: Set up Python
|
|
17
|
-
uses: actions/setup-python@
|
|
17
|
+
uses: actions/setup-python@v6
|
|
18
18
|
with:
|
|
19
19
|
python-version: "3.12"
|
|
20
20
|
|
|
@@ -24,5 +24,8 @@ jobs:
|
|
|
24
24
|
- name: Build package
|
|
25
25
|
run: python -m build
|
|
26
26
|
|
|
27
|
+
- name: Validate package
|
|
28
|
+
run: pip install twine && twine check dist/*
|
|
29
|
+
|
|
27
30
|
- name: Publish to PyPI
|
|
28
31
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.15.6
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff-format
|
|
6
|
+
- id: ruff
|
|
7
|
+
args: ["--fix"]
|
|
8
|
+
|
|
9
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
10
|
+
rev: v1.19.1
|
|
11
|
+
hooks:
|
|
12
|
+
- id: mypy
|
|
13
|
+
language: python
|
|
14
|
+
files: "^src/"
|
|
15
|
+
pass_filenames: false
|
|
16
|
+
args:
|
|
17
|
+
[
|
|
18
|
+
"--config-file=pyproject.toml",
|
|
19
|
+
"--install-types",
|
|
20
|
+
"--non-interactive"
|
|
21
|
+
]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.3.0] - 2026-04-12
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Formal SQL subset specification (`docs/SQL_SPEC.md`) with EBNF grammar
|
|
9
|
+
- Parser golden tests for all statement families (SELECT, INSERT, UPDATE, DELETE, DDL)
|
|
10
|
+
- Reflection helpers unit tests
|
|
11
|
+
- Comprehensive low-coverage module tests (executor, backends, graph engine)
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- README restructured: limitations-first layout, Graph API moved to experimental section
|
|
15
|
+
- Test coverage: 84% → 98% (397 tests)
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- Parser tokenizer: quoted strings with embedded spaces now handled correctly
|
|
19
|
+
- Parser: escaped quotes (`''`, `""`) parsed correctly in all contexts
|
|
20
|
+
|
|
21
|
+
## [0.2.1] - 2026-04-12
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- Project logo (modern minimalist SVG)
|
|
25
|
+
- Comprehensive README documentation (WHERE operators section, Related Projects)
|
|
26
|
+
- Contributing guide, Code of Conduct, Security and Support policies
|
|
27
|
+
- Development tooling: Makefile, .editorconfig, pre-commit-config, codecov.yml, git-cliff config
|
|
28
|
+
- GitHub issue/PR templates and project management files
|
|
29
|
+
- py.typed marker for PEP 561 compliance
|
|
30
|
+
- twine check step in publish workflow
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- Classifier updated from Alpha to Beta
|
|
34
|
+
- Homepage metadata updated
|
|
35
|
+
- Version bumped to 0.2.1
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
- Oracle review findings: rollback docs, absolute logo URLs, metadata alignment
|
|
39
|
+
|
|
40
|
+
## [0.2.0] - 2026-04-12
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
- IN, BETWEEN, LIKE operators for SQL parser and executor
|
|
44
|
+
- Test coverage reporting with Codecov CI integration
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
- Version bumped from 0.1.x to 0.2.0 (skipping reserved PyPI versions)
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
- All mypy strict errors resolved; strict mode enabled in CI
|
|
51
|
+
- CI: install pandas extra for test suite
|
|
52
|
+
|
|
53
|
+
## [0.1.0] - 2026-04-12
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
- PEP 249 (DB-API 2.0) compliant driver for Excel files
|
|
57
|
+
- SQL support: SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE
|
|
58
|
+
- WHERE clauses with AND/OR, comparison operators, LIKE, IN, IS NULL/IS NOT NULL
|
|
59
|
+
- ORDER BY and LIMIT for SELECT queries
|
|
60
|
+
- Openpyxl engine (default) for local .xlsx files
|
|
61
|
+
- Pandas engine (optional) for DataFrame-based operations
|
|
62
|
+
- Microsoft Graph API engine (optional) for remote Excel files
|
|
63
|
+
- Formula injection defense (enabled by default)
|
|
64
|
+
- Transaction simulation (commit/rollback)
|
|
65
|
+
- Reflection helpers for dialect integration
|
|
66
|
+
- Metadata sheet support for schema persistence
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and leaders pledge to make participation in our
|
|
6
|
+
community a harassment-free experience for everyone, regardless of age, body
|
|
7
|
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
|
8
|
+
identity and expression, level of experience, education, socio-economic status,
|
|
9
|
+
nationality, personal appearance, race, religion, or sexual identity and
|
|
10
|
+
orientation.
|
|
11
|
+
|
|
12
|
+
## Our Standards
|
|
13
|
+
|
|
14
|
+
Examples of behavior that contributes to a positive environment:
|
|
15
|
+
|
|
16
|
+
* Using welcoming and inclusive language
|
|
17
|
+
* Being respectful of differing viewpoints and experiences
|
|
18
|
+
* Gracefully accepting constructive criticism
|
|
19
|
+
* Focusing on what is best for the community
|
|
20
|
+
* Showing empathy towards other community members
|
|
21
|
+
|
|
22
|
+
Examples of unacceptable behavior:
|
|
23
|
+
|
|
24
|
+
* The use of sexualized language or imagery and unwelcome sexual attention
|
|
25
|
+
* Trolling, insulting or derogatory comments, and personal or political attacks
|
|
26
|
+
* Public or private harassment
|
|
27
|
+
* Publishing others' private information without explicit permission
|
|
28
|
+
* Other conduct which could reasonably be considered inappropriate
|
|
29
|
+
|
|
30
|
+
## Enforcement Responsibilities
|
|
31
|
+
|
|
32
|
+
Community leaders are responsible for clarifying and enforcing our standards of
|
|
33
|
+
acceptable behavior and will take appropriate and fair corrective action in
|
|
34
|
+
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
35
|
+
or harmful.
|
|
36
|
+
|
|
37
|
+
## Scope
|
|
38
|
+
|
|
39
|
+
This Code of Conduct applies within all community spaces, and also applies when
|
|
40
|
+
an individual is officially representing the community in public spaces.
|
|
41
|
+
|
|
42
|
+
## Enforcement
|
|
43
|
+
|
|
44
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
45
|
+
reported to the community leaders responsible for enforcement at
|
|
46
|
+
yeongseon.choe@gmail.com.
|
|
47
|
+
|
|
48
|
+
All complaints will be reviewed and investigated promptly and fairly.
|
|
49
|
+
|
|
50
|
+
## Attribution
|
|
51
|
+
|
|
52
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
|
53
|
+
version 2.0, available at
|
|
54
|
+
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
|
55
|
+
|
|
56
|
+
[homepage]: https://www.contributor-covenant.org
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Contributing Guide
|
|
2
|
+
|
|
3
|
+
We welcome contributions to the `excel-dbapi` project.
|
|
4
|
+
|
|
5
|
+
## Branch Strategy
|
|
6
|
+
|
|
7
|
+
Use GitHub Flow and branch from `main`.
|
|
8
|
+
|
|
9
|
+
Recommended branch prefixes:
|
|
10
|
+
|
|
11
|
+
- `feat/` for new features
|
|
12
|
+
- `fix/` for bug fixes
|
|
13
|
+
- `docs/` for documentation-only changes
|
|
14
|
+
- `chore/` for tooling and maintenance
|
|
15
|
+
- `ci/` for workflow updates
|
|
16
|
+
|
|
17
|
+
## Development Workflow
|
|
18
|
+
|
|
19
|
+
1. Create a branch from `main`.
|
|
20
|
+
```bash
|
|
21
|
+
git checkout main
|
|
22
|
+
git pull origin main
|
|
23
|
+
git checkout -b feat/your-feature-name
|
|
24
|
+
```
|
|
25
|
+
2. Write code and tests.
|
|
26
|
+
3. Run the local quality gate.
|
|
27
|
+
```bash
|
|
28
|
+
make check-all
|
|
29
|
+
```
|
|
30
|
+
4. Push and create a pull request.
|
|
31
|
+
```bash
|
|
32
|
+
git push origin feat/your-feature-name
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Project Commands
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
make format # Format code with ruff
|
|
39
|
+
make lint # Lint with ruff
|
|
40
|
+
make typecheck # Type check with mypy
|
|
41
|
+
make test # Run tests
|
|
42
|
+
make cov # Run tests with coverage
|
|
43
|
+
make check-all # Run the full local gate
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Commit Message Guidelines
|
|
47
|
+
|
|
48
|
+
We follow the [Conventional Commits](https://www.conventionalcommits.org/) specification.
|
|
49
|
+
|
|
50
|
+
### Examples
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
git commit -m "feat: add LIKE operator support"
|
|
54
|
+
git commit -m "fix: handle empty IN clause gracefully"
|
|
55
|
+
git commit -m "docs: improve quickstart documentation"
|
|
56
|
+
git commit -m "refactor: extract SQL parser logic"
|
|
57
|
+
git commit -m "chore: update dev dependencies"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Use imperative present tense and keep the message concise.
|
|
61
|
+
|
|
62
|
+
## Code of Conduct
|
|
63
|
+
|
|
64
|
+
Be respectful and inclusive. See our [Code of Conduct](CODE_OF_CONDUCT.md) for details.
|