pinky-core 0.1.0.dev1__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 (51) hide show
  1. pinky_core-0.1.0.dev1/.github/workflows/ci.yml +39 -0
  2. pinky_core-0.1.0.dev1/.github/workflows/publish.yml +32 -0
  3. pinky_core-0.1.0.dev1/.github/workflows/release.yml +47 -0
  4. pinky_core-0.1.0.dev1/.gitignore +60 -0
  5. pinky_core-0.1.0.dev1/.pre-commit-config.yaml +125 -0
  6. pinky_core-0.1.0.dev1/.secrets.baseline +127 -0
  7. pinky_core-0.1.0.dev1/.vscode/extensions.json +35 -0
  8. pinky_core-0.1.0.dev1/.vscode/settings.json +46 -0
  9. pinky_core-0.1.0.dev1/AGENT.md +209 -0
  10. pinky_core-0.1.0.dev1/LICENSE +21 -0
  11. pinky_core-0.1.0.dev1/PKG-INFO +87 -0
  12. pinky_core-0.1.0.dev1/README.md +30 -0
  13. pinky_core-0.1.0.dev1/docs/adr/0001-zero-dependency-static-html.md +23 -0
  14. pinky_core-0.1.0.dev1/docs/explanation/design.md +65 -0
  15. pinky_core-0.1.0.dev1/docs/explanation/features.md +85 -0
  16. pinky_core-0.1.0.dev1/docs/index.md +15 -0
  17. pinky_core-0.1.0.dev1/docs/reference/generated/api/files.md +5 -0
  18. pinky_core-0.1.0.dev1/docs/reference/generated/api/fmt.md +5 -0
  19. pinky_core-0.1.0.dev1/docs/reference/generated/api/schedule.md +5 -0
  20. pinky_core-0.1.0.dev1/docs/reference/generated/api/security.md +5 -0
  21. pinky_core-0.1.0.dev1/docs/reference/generated/api/sql.md +5 -0
  22. pinky_core-0.1.0.dev1/docs/reference/generated/api/validate.md +5 -0
  23. pinky_core-0.1.0.dev1/docs/reference/generated/api/xml.md +5 -0
  24. pinky_core-0.1.0.dev1/mkdocs.dev.yml +3 -0
  25. pinky_core-0.1.0.dev1/mkdocs.yml +35 -0
  26. pinky_core-0.1.0.dev1/pyproject.toml +97 -0
  27. pinky_core-0.1.0.dev1/scripts/deploy_validate_udfs.py +156 -0
  28. pinky_core-0.1.0.dev1/scripts/hooks/check-docs-up-to-date +36 -0
  29. pinky_core-0.1.0.dev1/scripts/hooks/check_forbidden_keywords.py +76 -0
  30. pinky_core-0.1.0.dev1/scripts/hooks/check_typed_api.py +138 -0
  31. pinky_core-0.1.0.dev1/scripts/hooks/check_zws.py +39 -0
  32. pinky_core-0.1.0.dev1/scripts/hooks/commit-msg +142 -0
  33. pinky_core-0.1.0.dev1/sql/deploy_udf_example.sql +75 -0
  34. pinky_core-0.1.0.dev1/src/pinky_core/__init__.py +149 -0
  35. pinky_core-0.1.0.dev1/src/pinky_core/files.py +178 -0
  36. pinky_core-0.1.0.dev1/src/pinky_core/fmt.py +729 -0
  37. pinky_core-0.1.0.dev1/src/pinky_core/schedule.py +230 -0
  38. pinky_core-0.1.0.dev1/src/pinky_core/security.py +52 -0
  39. pinky_core-0.1.0.dev1/src/pinky_core/sql.py +83 -0
  40. pinky_core-0.1.0.dev1/src/pinky_core/sql_custom.py +78 -0
  41. pinky_core-0.1.0.dev1/src/pinky_core/validate.py +575 -0
  42. pinky_core-0.1.0.dev1/src/pinky_core/xml.py +451 -0
  43. pinky_core-0.1.0.dev1/tests/__init__.py +0 -0
  44. pinky_core-0.1.0.dev1/tests/fixtures/cats_domination.xml +213 -0
  45. pinky_core-0.1.0.dev1/tests/test_files.py +271 -0
  46. pinky_core-0.1.0.dev1/tests/test_fmt.py +219 -0
  47. pinky_core-0.1.0.dev1/tests/test_schedule.py +181 -0
  48. pinky_core-0.1.0.dev1/tests/test_security.py +91 -0
  49. pinky_core-0.1.0.dev1/tests/test_sql.py +84 -0
  50. pinky_core-0.1.0.dev1/tests/test_validate.py +194 -0
  51. pinky_core-0.1.0.dev1/tests/test_xml_xpath.py +347 -0
@@ -0,0 +1,39 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main, develop]
8
+
9
+ jobs:
10
+ ci:
11
+ runs-on: ubuntu-latest
12
+ env:
13
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
14
+
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - name: Set up Python 3.11
19
+ uses: actions/setup-python@v5
20
+ with:
21
+ python-version: "3.11"
22
+
23
+ - name: Install dependencies
24
+ run: pip install -e ".[validate,address,dev]"
25
+
26
+ - name: Lint
27
+ run: ruff check src/ tests/
28
+
29
+ - name: Format check
30
+ run: ruff format --check src/ tests/
31
+
32
+ - name: Type check
33
+ run: mypy src/pinky_core/
34
+
35
+ - name: Security scan
36
+ run: bandit -r src/pinky_core/ -ll
37
+
38
+ - name: Tests
39
+ run: pytest
@@ -0,0 +1,32 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*.dev*"
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ env:
12
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
13
+ permissions:
14
+ contents: read
15
+ id-token: write # required for trusted publishing (OIDC)
16
+
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - name: Set up Python 3.11
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.11"
24
+
25
+ - name: Install build
26
+ run: pip install build
27
+
28
+ - name: Build wheel and sdist
29
+ run: python -m build
30
+
31
+ - name: Publish to PyPI
32
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,47 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ jobs:
8
+ release:
9
+ runs-on: ubuntu-latest
10
+ env:
11
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
12
+ permissions:
13
+ contents: write
14
+ id-token: write
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Read version
20
+ id: version
21
+ run: echo "version=$(grep '^version' pyproject.toml | cut -d'"' -f2)" >> $GITHUB_OUTPUT
22
+
23
+ - name: Guard — no .dev version on main
24
+ run: |
25
+ if [[ "${{ steps.version.outputs.version }}" == *".dev"* ]]; then
26
+ echo "❌ version .dev sur main — bumper la version avant de merger"
27
+ exit 1
28
+ fi
29
+
30
+ - name: Create tag
31
+ run: |
32
+ git tag "v${{ steps.version.outputs.version }}"
33
+ git push origin "v${{ steps.version.outputs.version }}"
34
+
35
+ - name: Set up Python 3.11
36
+ uses: actions/setup-python@v5
37
+ with:
38
+ python-version: "3.11"
39
+
40
+ - name: Install build
41
+ run: pip install build
42
+
43
+ - name: Build
44
+ run: python -m build
45
+
46
+ - name: Publish to PyPI
47
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,60 @@
1
+ # ── Python ───────────────────────────────────────────────────────────────────
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.pyo
5
+ *.pyd
6
+ .Python
7
+ *.egg-info/
8
+ dist/
9
+ build/
10
+ *.egg
11
+ .eggs/
12
+
13
+ # ── Environments ─────────────────────────────────────────────────────────────
14
+ .env
15
+ .venv/
16
+ venv/
17
+ .conda/
18
+
19
+ # ── Tools cache ──────────────────────────────────────────────────────────────
20
+ .ruff_cache/
21
+ .mypy_cache/
22
+ .pytest_cache/
23
+ .pre-commit-cache/
24
+ htmlcov/
25
+ .coverage
26
+ .coverage.*
27
+ coverage.xml
28
+
29
+ # ── Generated docs ───────────────────────────────────────────────────────────
30
+ # docs/api/ is versioned — regenerate with: pdoc snowflake_kit -o docs/api/ or wget
31
+ # Heavy wget mirrors are excluded (1 GB+)
32
+ docs/api/*/*.com/
33
+ # Local MkDocs assets — symlinked from pinky-studio for local dev, not committed
34
+ docs/assets/
35
+ site/
36
+
37
+ # ── Provider cache ───────────────────────────────────────────────────────────
38
+ .snowflake-provider/
39
+
40
+ # ── Local dev ────────────────────────────────────────────────────────────────
41
+ .local/
42
+ *.local.json
43
+
44
+ # ── Snowflake credentials ────────────────────────────────────────────────────
45
+ *.p8
46
+ connection.json
47
+ connections.toml
48
+ .snowflake/
49
+
50
+ # ── macOS ────────────────────────────────────────────────────────────────────
51
+ .DS_Store
52
+ .AppleDouble
53
+ .LSOverride
54
+
55
+ # ── VSCode ───────────────────────────────────────────────────────────────────
56
+ # (keep .vscode/extensions.json and .vscode/settings.json — versioned)
57
+ .vscode/*.log
58
+
59
+ # ── Plan output ──────────────────────────────────────────────────────────────
60
+ out/
@@ -0,0 +1,125 @@
1
+ ---
2
+ # =============================================================================
3
+ # .pre-commit-config.yaml — snowflake-kit
4
+ # =============================================================================
5
+ # Install:
6
+ # pip install pre-commit
7
+ # pre-commit install
8
+ # pre-commit install --hook-type commit-msg
9
+ #
10
+ # Update standard hooks:
11
+ # pre-commit autoupdate
12
+ # =============================================================================
13
+ default_install_hook_types: [pre-commit, commit-msg]
14
+
15
+ repos:
16
+ # ── Formatting: trailing spaces + newline ─────────────────────────────────
17
+ - repo: https://github.com/pre-commit/pre-commit-hooks
18
+ rev: v6.0.0
19
+ hooks:
20
+ - id: trailing-whitespace
21
+ - id: end-of-file-fixer
22
+ - id: check-yaml
23
+ - id: check-toml
24
+ - id: check-merge-conflict
25
+ - id: debug-statements
26
+
27
+ # ── Formatting: Markdown ──────────────────────────────────────────────────
28
+ - repo: local
29
+ hooks:
30
+ - id: mdformat
31
+ name: mdformat
32
+ entry: mdformat
33
+ language: system
34
+ files: ^README\.md$
35
+
36
+ # ── Security: secrets & forbidden files ──────────────────────────────────
37
+ - repo: https://github.com/gitleaks/gitleaks
38
+ rev: v8.30.0
39
+ hooks:
40
+ - id: gitleaks
41
+
42
+ # ── Security: alternative secret detection ────────────────────────────────
43
+ - repo: https://github.com/Yelp/detect-secrets
44
+ rev: v1.5.0
45
+ hooks:
46
+ - id: detect-secrets
47
+ args: ["--baseline", ".secrets.baseline"]
48
+ exclude: ^docs/
49
+
50
+ # ── Python: ruff lint + format ────────────────────────────────────────────
51
+ - repo: https://github.com/astral-sh/ruff-pre-commit
52
+ rev: v0.15.9
53
+ hooks:
54
+ - id: ruff-check
55
+ args: [--no-fix]
56
+ - id: ruff-format
57
+ args: [--check]
58
+
59
+ # ── Python: type checking ─────────────────────────────────────────────────
60
+ - repo: local
61
+ hooks:
62
+ - id: mypy
63
+ name: mypy
64
+ entry: mypy
65
+ language: system
66
+ types: [python]
67
+ args: [--ignore-missing-imports]
68
+ files: ^src/
69
+
70
+ # ── Python: security ─────────────────────────────────────────────────────
71
+ - repo: local
72
+ hooks:
73
+ - id: bandit
74
+ name: bandit
75
+ entry: bandit
76
+ language: system
77
+ pass_filenames: false
78
+ args: [-r, src/, -ll]
79
+
80
+ # ── Zero-width spaces (copy-paste from Outlook/Teams) ────────────────────
81
+ - repo: local
82
+ hooks:
83
+ - id: check-zws
84
+ name: "[ZWS] Invisible characters (zero-width)"
85
+ entry: python scripts/hooks/check_zws.py
86
+ language: system
87
+ pass_filenames: true
88
+
89
+ # ── Typed API guard ──────────────────────────────────────────────────────
90
+ - repo: local
91
+ hooks:
92
+ - id: check-typed-api
93
+ name: "[TYPED-API] No raw dict/tuple/set in public annotations"
94
+ entry: python scripts/hooks/check_typed_api.py
95
+ language: system
96
+ types: [python]
97
+ files: ^src/
98
+
99
+ # ── Employer reference guard ──────────────────────────────────────────────
100
+ - repo: local
101
+ hooks:
102
+ - id: check-forbidden-keywords
103
+ name: "[FORBIDDEN] Employer references"
104
+ entry: python scripts/hooks/check_forbidden_keywords.py
105
+ language: system
106
+ pass_filenames: true
107
+
108
+ # ── Docs up-to-date check ─────────────────────────────────────────────────
109
+ - repo: local
110
+ hooks:
111
+ - id: check-docs-up-to-date
112
+ name: Docs up-to-date (README + pdoc)
113
+ entry: scripts/hooks/check-docs-up-to-date
114
+ language: script
115
+ stages: [pre-commit]
116
+ pass_filenames: false
117
+
118
+ # ── Commit message format ─────────────────────────────────────────────────
119
+ - repo: local
120
+ hooks:
121
+ - id: commit-msg-format
122
+ name: Commit message format
123
+ entry: scripts/hooks/commit-msg
124
+ language: script
125
+ stages: [commit-msg]
@@ -0,0 +1,127 @@
1
+ {
2
+ "version": "1.5.0",
3
+ "plugins_used": [
4
+ {
5
+ "name": "ArtifactoryDetector"
6
+ },
7
+ {
8
+ "name": "AWSKeyDetector"
9
+ },
10
+ {
11
+ "name": "AzureStorageKeyDetector"
12
+ },
13
+ {
14
+ "name": "Base64HighEntropyString",
15
+ "limit": 4.5
16
+ },
17
+ {
18
+ "name": "BasicAuthDetector"
19
+ },
20
+ {
21
+ "name": "CloudantDetector"
22
+ },
23
+ {
24
+ "name": "DiscordBotTokenDetector"
25
+ },
26
+ {
27
+ "name": "GitHubTokenDetector"
28
+ },
29
+ {
30
+ "name": "GitLabTokenDetector"
31
+ },
32
+ {
33
+ "name": "HexHighEntropyString",
34
+ "limit": 3.0
35
+ },
36
+ {
37
+ "name": "IbmCloudIamDetector"
38
+ },
39
+ {
40
+ "name": "IbmCosHmacDetector"
41
+ },
42
+ {
43
+ "name": "IPPublicDetector"
44
+ },
45
+ {
46
+ "name": "JwtTokenDetector"
47
+ },
48
+ {
49
+ "name": "KeywordDetector",
50
+ "keyword_exclude": ""
51
+ },
52
+ {
53
+ "name": "MailchimpDetector"
54
+ },
55
+ {
56
+ "name": "NpmDetector"
57
+ },
58
+ {
59
+ "name": "OpenAIDetector"
60
+ },
61
+ {
62
+ "name": "PrivateKeyDetector"
63
+ },
64
+ {
65
+ "name": "PypiTokenDetector"
66
+ },
67
+ {
68
+ "name": "SendGridDetector"
69
+ },
70
+ {
71
+ "name": "SlackDetector"
72
+ },
73
+ {
74
+ "name": "SoftlayerDetector"
75
+ },
76
+ {
77
+ "name": "SquareOAuthDetector"
78
+ },
79
+ {
80
+ "name": "StripeDetector"
81
+ },
82
+ {
83
+ "name": "TelegramBotTokenDetector"
84
+ },
85
+ {
86
+ "name": "TwilioKeyDetector"
87
+ }
88
+ ],
89
+ "filters_used": [
90
+ {
91
+ "path": "detect_secrets.filters.allowlist.is_line_allowlisted"
92
+ },
93
+ {
94
+ "path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies",
95
+ "min_level": 2
96
+ },
97
+ {
98
+ "path": "detect_secrets.filters.heuristic.is_indirect_reference"
99
+ },
100
+ {
101
+ "path": "detect_secrets.filters.heuristic.is_likely_id_string"
102
+ },
103
+ {
104
+ "path": "detect_secrets.filters.heuristic.is_lock_file"
105
+ },
106
+ {
107
+ "path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string"
108
+ },
109
+ {
110
+ "path": "detect_secrets.filters.heuristic.is_potential_uuid"
111
+ },
112
+ {
113
+ "path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign"
114
+ },
115
+ {
116
+ "path": "detect_secrets.filters.heuristic.is_sequential_string"
117
+ },
118
+ {
119
+ "path": "detect_secrets.filters.heuristic.is_swagger_file"
120
+ },
121
+ {
122
+ "path": "detect_secrets.filters.heuristic.is_templated_secret"
123
+ }
124
+ ],
125
+ "results": {},
126
+ "generated_at": "2026-05-10T19:21:47Z"
127
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "recommendations": [
3
+ // ── AI ────────────────────────────────────────────────────────────────────
4
+ "anthropic.claude-code",
5
+
6
+ // ── Git / GitHub ──────────────────────────────────────────────────────────
7
+ "eamodio.gitlens",
8
+ "github.vscode-pull-request-github",
9
+ "github.vscode-github-actions",
10
+
11
+ // ── Python ────────────────────────────────────────────────────────────────
12
+ "ms-python.python",
13
+ "ms-python.pylance",
14
+ "charliermarsh.ruff",
15
+
16
+ // ── Snowflake ─────────────────────────────────────────────────────────────
17
+ "snowflake.snowflake-vsc",
18
+
19
+ // ── YAML ──────────────────────────────────────────────────────────────────
20
+ "redhat.vscode-yaml",
21
+
22
+ // ── Markdown ──────────────────────────────────────────────────────────────
23
+ "yzhang.markdown-all-in-one",
24
+ "bierner.markdown-mermaid",
25
+
26
+ // ── Data files ────────────────────────────────────────────────────────────
27
+ "mechatroner.rainbow-csv",
28
+ "AykutSarac.jsoncrack-vscode",
29
+ "redhat.vscode-xml",
30
+
31
+ // ── DX ────────────────────────────────────────────────────────────────────
32
+ "oderwat.indent-rainbow",
33
+ "ryu1kn.partial-diff"
34
+ ]
35
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ // ── Python ──────────────────────────────────────────────────────────────────
3
+ "python.defaultInterpreterPath": "~/miniforge3/envs/snowflake-kit/bin/python",
4
+ "python.analysis.typeCheckingMode": "basic",
5
+
6
+ // ── Ruff ────────────────────────────────────────────────────────────────────
7
+ "[python]": {
8
+ "editor.defaultFormatter": "charliermarsh.ruff",
9
+ "editor.formatOnSave": true,
10
+ "editor.codeActionsOnSave": {
11
+ "source.fixAll.ruff": "explicit",
12
+ "source.organizeImports.ruff": "explicit"
13
+ }
14
+ },
15
+
16
+ // ── YAML ────────────────────────────────────────────────────────────────────
17
+ "[yaml]": {
18
+ "editor.defaultFormatter": "redhat.vscode-yaml",
19
+ "editor.formatOnSave": true
20
+ },
21
+ "yaml.schemas": {
22
+ "./schemas/*.schema.json": "resources/**/*.yml"
23
+ },
24
+
25
+ // ── Editor ──────────────────────────────────────────────────────────────────
26
+ "editor.rulers": [88],
27
+ "editor.tabSize": 4,
28
+ "editor.insertSpaces": true,
29
+ "editor.trimAutoWhitespace": true,
30
+ "files.trimTrailingWhitespace": true,
31
+ "files.insertFinalNewline": true,
32
+
33
+ // ── Git ─────────────────────────────────────────────────────────────────────
34
+ "git.autofetch": true,
35
+ "git.confirmSync": false,
36
+ "gitlens.currentLine.enabled": true,
37
+
38
+ // ── Explorer ────────────────────────────────────────────────────────────────
39
+ "files.exclude": {
40
+ "**/__pycache__": true,
41
+ "**/.ruff_cache": true,
42
+ "**/.mypy_cache": true,
43
+ "**/*.egg-info": true,
44
+ "**/.snowflake-provider": true
45
+ }
46
+ }