datalegion 0.1.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.
@@ -0,0 +1,27 @@
1
+ # CLAUDE.md
2
+
3
+ Python SDK for the Data Legion API. Provides sync (`DataLegion`) and async (`AsyncDataLegion`) clients for person/company enrichment, search, discover, and utility endpoints. All responses are Pydantic v2 models with dot access and autocomplete.
4
+
5
+ ## Commands
6
+
7
+ ```bash
8
+ uv sync --dev # Install dependencies
9
+ uv run lint # Lint (ruff format + check, mdformat)
10
+ uv run pytest tests/ # Run tests (needs DATALEGION_API_KEY env var)
11
+ uv build # Build package
12
+ ```
13
+
14
+ ## Architecture
15
+
16
+ - `src/datalegion/__init__.py` - Package exports (clients, exceptions, response types)
17
+ - `src/datalegion/_client.py` - Sync + async HTTP clients with resource namespaces and `@overload` for enrich return types
18
+ - `src/datalegion/_exceptions.py` - Exception hierarchy (AuthenticationError, RateLimitError, etc.)
19
+ - `src/datalegion/_types.py` - Pydantic v2 response models (PersonResponse, CompanyResponse, etc.)
20
+ - `scripts/lint.py` - Lint script
21
+ - `tests/test_client.py` - Integration tests (call real API)
22
+
23
+ ## Guidelines
24
+
25
+ - Use `uv run` for all commands
26
+ - Run lint and tests after changes
27
+ - Keep it simple, no over-engineering
@@ -0,0 +1 @@
1
+ * @datalegion-ai/sdk-maintainers
@@ -0,0 +1,47 @@
1
+ name: Bug Report
2
+ description: Report a bug in the Python SDK
3
+ labels: ["bug"]
4
+ body:
5
+ - type: textarea
6
+ id: description
7
+ attributes:
8
+ label: Description
9
+ description: A clear description of the bug.
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: reproduction
14
+ attributes:
15
+ label: Steps to Reproduce
16
+ description: Minimal code example or steps to reproduce the issue.
17
+ render: python
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: expected
22
+ attributes:
23
+ label: Expected Behavior
24
+ description: What you expected to happen.
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: actual
29
+ attributes:
30
+ label: Actual Behavior
31
+ description: What actually happened. Include any error messages or tracebacks.
32
+ validations:
33
+ required: true
34
+ - type: input
35
+ id: sdk-version
36
+ attributes:
37
+ label: SDK Version
38
+ description: Output of `pip show datalegion | grep Version`
39
+ validations:
40
+ required: true
41
+ - type: input
42
+ id: python-version
43
+ attributes:
44
+ label: Python Version
45
+ description: Output of `python --version`
46
+ validations:
47
+ required: true
@@ -0,0 +1 @@
1
+ blank_issues_enabled: false
@@ -0,0 +1,25 @@
1
+ name: Feature Request
2
+ description: Suggest a feature or improvement
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: textarea
6
+ id: description
7
+ attributes:
8
+ label: Description
9
+ description: A clear description of the feature you'd like.
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: use-case
14
+ attributes:
15
+ label: Use Case
16
+ description: Why do you need this? What problem does it solve?
17
+ validations:
18
+ required: true
19
+ - type: textarea
20
+ id: alternatives
21
+ attributes:
22
+ label: Alternatives Considered
23
+ description: Any workarounds or alternatives you've considered.
24
+ validations:
25
+ required: false
@@ -0,0 +1,10 @@
1
+ ## Summary
2
+
3
+ <!-- What does this PR do? -->
4
+
5
+ ## Test Plan
6
+
7
+ <!-- How was this tested? -->
8
+
9
+ - [ ] Tests pass (`uv run pytest tests/`)
10
+ - [ ] Lint passes (`uv run lint`)
@@ -0,0 +1,34 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ day: "sunday"
8
+ time: "09:00"
9
+ timezone: "America/Los_Angeles"
10
+ labels:
11
+ - "dependencies"
12
+ - "python"
13
+ commit-message:
14
+ prefix: "chore(deps)"
15
+ groups:
16
+ minor-patch:
17
+ patterns:
18
+ - "*"
19
+ update-types:
20
+ - "minor"
21
+ - "patch"
22
+
23
+ - package-ecosystem: "github-actions"
24
+ directory: "/"
25
+ schedule:
26
+ interval: "weekly"
27
+ day: "sunday"
28
+ time: "09:00"
29
+ timezone: "America/Los_Angeles"
30
+ labels:
31
+ - "dependencies"
32
+ - "github-actions"
33
+ commit-message:
34
+ prefix: "chore(deps)"
@@ -0,0 +1,54 @@
1
+ <svg width="260" height="80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
2
+ <defs>
3
+ <linearGradient id="goldGrad">
4
+ <stop stop-color="#905e26" offset="0"/>
5
+ <stop stop-color="#f5ec9b" offset="0.5"/>
6
+ <stop stop-color="#905e26" offset="1"/>
7
+ </linearGradient>
8
+ <clipPath id="iconClip">
9
+ <rect x="4" y="8" width="64" height="64" rx="14" ry="14"/>
10
+ </clipPath>
11
+ </defs>
12
+
13
+ <!-- Icon scaled to fit -->
14
+ <g>
15
+ <g transform="translate(4, 8) scale(0.05333)">
16
+ <g transform="scale(1.4411527580125738) translate(-83.81662835015196, -83.66665734185113)">
17
+ <g fill="url(#goldGrad)">
18
+ <g>
19
+ <path d="M661.8,226L637,215.3c-12.6-5.4-27.4,0.4-32.8,13l-36.9,85.7L269.8,185.9c-4.2-34.1-33.4-60.6-68.6-60.6 c-38.1,0-69.2,31-69.2,69.1c0,38.1,31,69.2,69.2,69.2c12.3,0,23.9-3.2,33.9-8.9l322.4,138.9l27.1,11.7c10.8,4.7,23.3,1,30-8.2 c1.1-1.5,2-3.1,2.7-4.8l11.1-25.7l0.2-0.4l46.3-107.5C680.3,246.2,674.4,231.5,661.8,226z M201.2,231.9c-2.4,0-4.7-0.2-7-0.7 c-17.3-3.3-30.4-18.5-30.4-36.8c0-20.6,16.8-37.4,37.4-37.4c11.2,0,21.2,4.9,28,12.7c5.8,6.6,9.4,15.3,9.4,24.8 C238.6,215.1,221.8,231.9,201.2,231.9z"/>
20
+ <path d="M628.3,366.7c-0.1,0.3-0.2,0.5-0.3,0.8l-10.7,24.8c0,0,0,0.1-0.1,0.1L628.3,366.7z"/>
21
+ <path d="M545.3,279.8L387.9,212c-6.1-2.6-8.9-9.7-6.3-15.8l21-48.7c2.6-6.1,9.7-8.9,15.8-6.3l157.4,67.8 c6.1,2.6,8.9,9.7,6.3,15.8l-21,48.7C558.5,279.6,551.4,282.4,545.3,279.8z"/>
22
+ <path d="M614.5,397.2c-6.7,9.2-19.2,12.9-30.1,8.3l-24.8-10.7c-0.7-0.3-1.5-0.7-2.2-1.1l27.1,11.7 C595.4,410,607.8,406.4,614.5,397.2z"/>
23
+ <path d="M630.3,632.5l-24.9-10.6c0,0-0.1,0-0.1-0.1L630.3,632.5z"/>
24
+ <path d="M717.5,549.4l67.1-157.7c2.6-6.1,9.7-8.9,15.7-6.3l48.7,20.7c6.1,2.6,8.9,9.7,6.3,15.7l-67.1,157.7 c-2.6,6.1-9.7,8.9-15.7,6.3l-48.7-20.7C717.8,562.5,714.9,555.4,717.5,549.4z"/>
25
+ <path d="M597,616.1c0.1,0.1,0.1,0.1,0.2,0.2C597.2,616.2,597.1,616.2,597,616.1C597.1,616.1,597.1,616.1,597,616.1z"/>
26
+ <path d="M597.2,616.2c0.3,0.3,0.5,0.6,0.8,0.8C597.7,616.8,597.5,616.5,597.2,616.2z"/>
27
+ <path d="M596.1,615c0.3,0.4,0.6,0.7,0.9,1c-6.7-7-9-17.6-5-27l10.6-24.9c0.3-0.7,0.7-1.4,1.1-2.1l-11.5,27.1 c-1.5,3.6-2.2,7.4-2,11.1c0,0.3,0,0.5,0.1,0.7c0,0.3,0,0.5,0.1,0.8c0,0,0,0.1,0,0.1c0.1,0.4,0.1,0.9,0.2,1.3 c0.1,0.4,0.1,0.8,0.2,1.2c0,0.2,0.1,0.4,0.2,0.6c0.1,0.4,0.2,0.7,0.3,1c0.1,0.4,0.2,0.8,0.4,1.2c0,0.2,0.1,0.3,0.2,0.5 c0.1,0.4,0.3,0.8,0.5,1.1c0.2,0.4,0.3,0.7,0.5,1.1c0.1,0.2,0.2,0.5,0.4,0.7c0,0.1,0.1,0.2,0.1,0.3c0.2,0.3,0.3,0.6,0.5,0.8 c0.1,0.3,0.3,0.5,0.5,0.7c0.2,0.3,0.4,0.7,0.7,1c0.2,0.2,0.3,0.5,0.5,0.7C595.6,614.4,595.8,614.7,596.1,615z"/>
28
+ <path d="M599.3,618.2c-0.4-0.4-0.8-0.7-1.2-1.1C598.4,617.4,598.8,617.8,599.3,618.2z"/>
29
+ <path d="M375.8,610.9L365,636.6c0.1-0.2,0.2-0.5,0.3-0.7l10.5-24.9C375.8,610.9,375.8,610.9,375.8,610.9z"/>
30
+ <path d="M448.8,722.8l158,66.4c6.1,2.6,9,9.6,6.4,15.7l-20.5,48.8c-2.6,6.1-9.6,9-15.7,6.4l-158-66.4 c-6.1-2.6-9-9.6-6.4-15.7l20.5-48.8C435.6,723.1,442.7,720.2,448.8,722.8z"/>
31
+ <path d="M435.5,609l-27.1-11.4c-9.7-4-20.6-1.5-27.5,5.6c6.9-7.2,17.9-9.8,27.6-5.7l24.9,10.5 C434.2,608.3,434.9,608.6,435.5,609z"/>
32
+ <path d="M385.7,381.4l-26-10.8c0.3,0.1,0.6,0.2,0.9,0.4l25,10.4C385.7,381.3,385.7,381.3,385.7,381.4z"/>
33
+ <path d="M274.1,454.8l-65.7,158.3c-2.5,6.1-9.6,9-15.7,6.5l-48.9-20.3c-6.1-2.5-9-9.6-6.5-15.7L203,425.4 c2.5-6.1,9.6-9,15.7-6.5l48.9,20.3C273.8,441.7,276.7,448.7,274.1,454.8z"/>
34
+ <g>
35
+ <path d="M798.8,133c-38.1,0-69.2,31-69.2,69.1c0,13.9,4.1,26.8,11.2,37.6L603.7,562l-11.5,27.1 c-1.5,3.6-2.2,7.4-2,11.1c0,0.2,0,0.5,0.1,0.7c0,0.3,0,0.5,0.1,0.8c0,0,0,0.1,0,0.1c0.1,0.4,0.1,0.9,0.2,1.3 c0.1,0.4,0.1,0.8,0.2,1.2c0,0.2,0.1,0.4,0.2,0.6c0.1,0.4,0.2,0.7,0.3,1c0.1,0.4,0.2,0.8,0.4,1.2c0,0.2,0.1,0.3,0.2,0.5 c0.1,0.4,0.3,0.8,0.5,1.1c0.2,0.4,0.3,0.7,0.5,1.1c0.1,0.2,0.2,0.5,0.4,0.7c0,0.1,0.1,0.2,0.1,0.3c0.2,0.3,0.3,0.6,0.5,0.8 c0.1,0.3,0.3,0.5,0.5,0.7c0.2,0.3,0.4,0.7,0.7,1c0.2,0.2,0.3,0.5,0.5,0.7c0.3,0.3,0.5,0.6,0.8,1c0.2,0.2,0.3,0.4,0.5,0.6 c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.1,0.1,0.1c0.7,0.7,1.4,1.4,2.2,2c0,0,0,0,0,0 c0.4,0.3,0.8,0.6,1.2,0.9c1.5,1.1,3.1,2,4.8,2.7l25,10.7l1.2,0.5l107.7,45.8c12.6,5.4,27.4-0.6,32.7-13.2l10.6-24.9 c5.4-12.6-0.6-27.3-13.2-32.7l-85.9-36.5l128.2-301.3c32.1-6,56.4-34.2,56.4-68C868,164,837,133,798.8,133z M826.1,227.7 c-6.8,7.3-16.5,11.8-27.3,11.8c-20.6,0-37.4-16.8-37.4-37.4c0-0.7,0-1.5,0.1-2.2v0c1.1-19.6,17.4-35.2,37.4-35.2 c20.6,0,37.4,16.8,37.4,37.4C836.3,212,832.4,221,826.1,227.7z"/>
36
+ </g>
37
+ <g>
38
+ <path d="M392.1,385.2c-1.9-1.6-4-2.9-6.3-3.8l-26-10.8l-0.3-0.1l-108.1-44.8c-12.7-5.3-27.4,0.8-32.6,13.5 l-10.4,25c-5.3,12.7,0.8,27.4,13.5,32.6l86.2,35.8L181.7,737.2c-28.7,8.4-49.7,35-49.7,66.4c0,38.1,31,69.2,69.2,69.2 c38.1,0,69.2-31,69.2-69.2c0-16.2-5.6-31.1-15-42.9l132.5-319.5c0.4-0.7,0.7-1.4,1-2.1l10.4-25C403.5,403.7,400.3,392,392.1,385.2 z M201.2,841c-20.6,0-37.4-16.8-37.4-37.4c0-7.6,2.3-14.6,6.1-20.5c6.7-10.2,18.2-16.9,31.3-16.9c19.3,0,35.2,14.7,37.2,33.5v0 c0.1,1.3,0.2,2.6,0.2,3.9C238.6,824.2,221.8,841,201.2,841z"/>
39
+ </g>
40
+ <g>
41
+ <path d="M795,736.3c-12.5,0-24.3,3.4-34.5,9.2L435.5,609l-27.1-11.4c-9.7-4-20.6-1.5-27.5,5.6 c-2.1,2.2-3.9,4.7-5.1,7.7L365,636.6L319.5,745c-5.3,12.7,0.7,27.4,13.3,32.7l24.9,10.5c12.7,5.3,27.4-0.7,32.7-13.3l36.2-86.1 l299.9,126c4.5,33.8,33.5,59.9,68.5,59.9c38.1,0,69.2-31,69.2-69.2C864.2,767.4,833.2,736.3,795,736.3z M795,842.9 c-11.3,0-21.4-5-28.2-12.9h0c-5.7-6.6-9.2-15.2-9.2-24.5c0-20.6,16.8-37.4,37.4-37.4c1.9,0,3.7,0.1,5.6,0.4 c18,2.7,31.9,18.3,31.9,37C832.5,826.1,815.7,842.9,795,842.9z"/>
42
+ </g>
43
+ </g>
44
+ </g>
45
+ </g>
46
+ </g>
47
+ </g>
48
+
49
+ <!-- Data Legion text — white for dark backgrounds -->
50
+ <text x="80" y="38" font-family="Inter, -apple-system, system-ui, Segoe UI, Roboto, Helvetica, Arial, sans-serif" font-size="24" font-weight="600" fill="#1c1917">Data Legion</text>
51
+
52
+ <!-- Enterprise Data Solutions tagline -->
53
+ <text x="80" y="58" font-family="Inter, -apple-system, system-ui, Segoe UI, Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="500" fill="#d4af37">Enterprise Data Solutions</text>
54
+ </svg>
@@ -0,0 +1,54 @@
1
+ <svg width="260" height="80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
2
+ <defs>
3
+ <linearGradient id="goldGrad">
4
+ <stop stop-color="#905e26" offset="0"/>
5
+ <stop stop-color="#f5ec9b" offset="0.5"/>
6
+ <stop stop-color="#905e26" offset="1"/>
7
+ </linearGradient>
8
+ <clipPath id="iconClip">
9
+ <rect x="4" y="8" width="64" height="64" rx="14" ry="14"/>
10
+ </clipPath>
11
+ </defs>
12
+
13
+ <!-- Icon scaled to fit -->
14
+ <g>
15
+ <g transform="translate(4, 8) scale(0.05333)">
16
+ <g transform="scale(1.4411527580125738) translate(-83.81662835015196, -83.66665734185113)">
17
+ <g fill="url(#goldGrad)">
18
+ <g>
19
+ <path d="M661.8,226L637,215.3c-12.6-5.4-27.4,0.4-32.8,13l-36.9,85.7L269.8,185.9c-4.2-34.1-33.4-60.6-68.6-60.6 c-38.1,0-69.2,31-69.2,69.1c0,38.1,31,69.2,69.2,69.2c12.3,0,23.9-3.2,33.9-8.9l322.4,138.9l27.1,11.7c10.8,4.7,23.3,1,30-8.2 c1.1-1.5,2-3.1,2.7-4.8l11.1-25.7l0.2-0.4l46.3-107.5C680.3,246.2,674.4,231.5,661.8,226z M201.2,231.9c-2.4,0-4.7-0.2-7-0.7 c-17.3-3.3-30.4-18.5-30.4-36.8c0-20.6,16.8-37.4,37.4-37.4c11.2,0,21.2,4.9,28,12.7c5.8,6.6,9.4,15.3,9.4,24.8 C238.6,215.1,221.8,231.9,201.2,231.9z"/>
20
+ <path d="M628.3,366.7c-0.1,0.3-0.2,0.5-0.3,0.8l-10.7,24.8c0,0,0,0.1-0.1,0.1L628.3,366.7z"/>
21
+ <path d="M545.3,279.8L387.9,212c-6.1-2.6-8.9-9.7-6.3-15.8l21-48.7c2.6-6.1,9.7-8.9,15.8-6.3l157.4,67.8 c6.1,2.6,8.9,9.7,6.3,15.8l-21,48.7C558.5,279.6,551.4,282.4,545.3,279.8z"/>
22
+ <path d="M614.5,397.2c-6.7,9.2-19.2,12.9-30.1,8.3l-24.8-10.7c-0.7-0.3-1.5-0.7-2.2-1.1l27.1,11.7 C595.4,410,607.8,406.4,614.5,397.2z"/>
23
+ <path d="M630.3,632.5l-24.9-10.6c0,0-0.1,0-0.1-0.1L630.3,632.5z"/>
24
+ <path d="M717.5,549.4l67.1-157.7c2.6-6.1,9.7-8.9,15.7-6.3l48.7,20.7c6.1,2.6,8.9,9.7,6.3,15.7l-67.1,157.7 c-2.6,6.1-9.7,8.9-15.7,6.3l-48.7-20.7C717.8,562.5,714.9,555.4,717.5,549.4z"/>
25
+ <path d="M597,616.1c0.1,0.1,0.1,0.1,0.2,0.2C597.2,616.2,597.1,616.2,597,616.1C597.1,616.1,597.1,616.1,597,616.1z"/>
26
+ <path d="M597.2,616.2c0.3,0.3,0.5,0.6,0.8,0.8C597.7,616.8,597.5,616.5,597.2,616.2z"/>
27
+ <path d="M596.1,615c0.3,0.4,0.6,0.7,0.9,1c-6.7-7-9-17.6-5-27l10.6-24.9c0.3-0.7,0.7-1.4,1.1-2.1l-11.5,27.1 c-1.5,3.6-2.2,7.4-2,11.1c0,0.3,0,0.5,0.1,0.7c0,0.3,0,0.5,0.1,0.8c0,0,0,0.1,0,0.1c0.1,0.4,0.1,0.9,0.2,1.3 c0.1,0.4,0.1,0.8,0.2,1.2c0,0.2,0.1,0.4,0.2,0.6c0.1,0.4,0.2,0.7,0.3,1c0.1,0.4,0.2,0.8,0.4,1.2c0,0.2,0.1,0.3,0.2,0.5 c0.1,0.4,0.3,0.8,0.5,1.1c0.2,0.4,0.3,0.7,0.5,1.1c0.1,0.2,0.2,0.5,0.4,0.7c0,0.1,0.1,0.2,0.1,0.3c0.2,0.3,0.3,0.6,0.5,0.8 c0.1,0.3,0.3,0.5,0.5,0.7c0.2,0.3,0.4,0.7,0.7,1c0.2,0.2,0.3,0.5,0.5,0.7C595.6,614.4,595.8,614.7,596.1,615z"/>
28
+ <path d="M599.3,618.2c-0.4-0.4-0.8-0.7-1.2-1.1C598.4,617.4,598.8,617.8,599.3,618.2z"/>
29
+ <path d="M375.8,610.9L365,636.6c0.1-0.2,0.2-0.5,0.3-0.7l10.5-24.9C375.8,610.9,375.8,610.9,375.8,610.9z"/>
30
+ <path d="M448.8,722.8l158,66.4c6.1,2.6,9,9.6,6.4,15.7l-20.5,48.8c-2.6,6.1-9.6,9-15.7,6.4l-158-66.4 c-6.1-2.6-9-9.6-6.4-15.7l20.5-48.8C435.6,723.1,442.7,720.2,448.8,722.8z"/>
31
+ <path d="M435.5,609l-27.1-11.4c-9.7-4-20.6-1.5-27.5,5.6c6.9-7.2,17.9-9.8,27.6-5.7l24.9,10.5 C434.2,608.3,434.9,608.6,435.5,609z"/>
32
+ <path d="M385.7,381.4l-26-10.8c0.3,0.1,0.6,0.2,0.9,0.4l25,10.4C385.7,381.3,385.7,381.3,385.7,381.4z"/>
33
+ <path d="M274.1,454.8l-65.7,158.3c-2.5,6.1-9.6,9-15.7,6.5l-48.9-20.3c-6.1-2.5-9-9.6-6.5-15.7L203,425.4 c2.5-6.1,9.6-9,15.7-6.5l48.9,20.3C273.8,441.7,276.7,448.7,274.1,454.8z"/>
34
+ <g>
35
+ <path d="M798.8,133c-38.1,0-69.2,31-69.2,69.1c0,13.9,4.1,26.8,11.2,37.6L603.7,562l-11.5,27.1 c-1.5,3.6-2.2,7.4-2,11.1c0,0.2,0,0.5,0.1,0.7c0,0.3,0,0.5,0.1,0.8c0,0,0,0.1,0,0.1c0.1,0.4,0.1,0.9,0.2,1.3 c0.1,0.4,0.1,0.8,0.2,1.2c0,0.2,0.1,0.4,0.2,0.6c0.1,0.4,0.2,0.7,0.3,1c0.1,0.4,0.2,0.8,0.4,1.2c0,0.2,0.1,0.3,0.2,0.5 c0.1,0.4,0.3,0.8,0.5,1.1c0.2,0.4,0.3,0.7,0.5,1.1c0.1,0.2,0.2,0.5,0.4,0.7c0,0.1,0.1,0.2,0.1,0.3c0.2,0.3,0.3,0.6,0.5,0.8 c0.1,0.3,0.3,0.5,0.5,0.7c0.2,0.3,0.4,0.7,0.7,1c0.2,0.2,0.3,0.5,0.5,0.7c0.3,0.3,0.5,0.6,0.8,1c0.2,0.2,0.3,0.4,0.5,0.6 c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.1,0.1,0.1c0.7,0.7,1.4,1.4,2.2,2c0,0,0,0,0,0 c0.4,0.3,0.8,0.6,1.2,0.9c1.5,1.1,3.1,2,4.8,2.7l25,10.7l1.2,0.5l107.7,45.8c12.6,5.4,27.4-0.6,32.7-13.2l10.6-24.9 c5.4-12.6-0.6-27.3-13.2-32.7l-85.9-36.5l128.2-301.3c32.1-6,56.4-34.2,56.4-68C868,164,837,133,798.8,133z M826.1,227.7 c-6.8,7.3-16.5,11.8-27.3,11.8c-20.6,0-37.4-16.8-37.4-37.4c0-0.7,0-1.5,0.1-2.2v0c1.1-19.6,17.4-35.2,37.4-35.2 c20.6,0,37.4,16.8,37.4,37.4C836.3,212,832.4,221,826.1,227.7z"/>
36
+ </g>
37
+ <g>
38
+ <path d="M392.1,385.2c-1.9-1.6-4-2.9-6.3-3.8l-26-10.8l-0.3-0.1l-108.1-44.8c-12.7-5.3-27.4,0.8-32.6,13.5 l-10.4,25c-5.3,12.7,0.8,27.4,13.5,32.6l86.2,35.8L181.7,737.2c-28.7,8.4-49.7,35-49.7,66.4c0,38.1,31,69.2,69.2,69.2 c38.1,0,69.2-31,69.2-69.2c0-16.2-5.6-31.1-15-42.9l132.5-319.5c0.4-0.7,0.7-1.4,1-2.1l10.4-25C403.5,403.7,400.3,392,392.1,385.2 z M201.2,841c-20.6,0-37.4-16.8-37.4-37.4c0-7.6,2.3-14.6,6.1-20.5c6.7-10.2,18.2-16.9,31.3-16.9c19.3,0,35.2,14.7,37.2,33.5v0 c0.1,1.3,0.2,2.6,0.2,3.9C238.6,824.2,221.8,841,201.2,841z"/>
39
+ </g>
40
+ <g>
41
+ <path d="M795,736.3c-12.5,0-24.3,3.4-34.5,9.2L435.5,609l-27.1-11.4c-9.7-4-20.6-1.5-27.5,5.6 c-2.1,2.2-3.9,4.7-5.1,7.7L365,636.6L319.5,745c-5.3,12.7,0.7,27.4,13.3,32.7l24.9,10.5c12.7,5.3,27.4-0.7,32.7-13.3l36.2-86.1 l299.9,126c4.5,33.8,33.5,59.9,68.5,59.9c38.1,0,69.2-31,69.2-69.2C864.2,767.4,833.2,736.3,795,736.3z M795,842.9 c-11.3,0-21.4-5-28.2-12.9h0c-5.7-6.6-9.2-15.2-9.2-24.5c0-20.6,16.8-37.4,37.4-37.4c1.9,0,3.7,0.1,5.6,0.4 c18,2.7,31.9,18.3,31.9,37C832.5,826.1,815.7,842.9,795,842.9z"/>
42
+ </g>
43
+ </g>
44
+ </g>
45
+ </g>
46
+ </g>
47
+ </g>
48
+
49
+ <!-- Data Legion text — white for dark backgrounds -->
50
+ <text x="80" y="38" font-family="Inter, -apple-system, system-ui, Segoe UI, Roboto, Helvetica, Arial, sans-serif" font-size="24" font-weight="600" fill="#f8f8f8">Data Legion</text>
51
+
52
+ <!-- Enterprise Data Solutions tagline -->
53
+ <text x="80" y="58" font-family="Inter, -apple-system, system-ui, Segoe UI, Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="500" fill="#d4af37">Enterprise Data Solutions</text>
54
+ </svg>
@@ -0,0 +1,148 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ lint:
14
+ name: Lint & Build
15
+ runs-on: blacksmith-2vcpu-ubuntu-2404
16
+ timeout-minutes: 5
17
+ permissions:
18
+ contents: read
19
+ steps:
20
+ - name: Checkout
21
+ uses: actions/checkout@v6
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v7
25
+ with:
26
+ version: "0.10.x"
27
+ enable-cache: true
28
+ cache-dependency-glob: "uv.lock"
29
+
30
+ - name: Set up Python
31
+ run: uv python install 3.12
32
+
33
+ - name: Install dependencies
34
+ run: uv sync --frozen --dev
35
+
36
+ - name: Run lint
37
+ run: uv run lint
38
+
39
+ - name: Build
40
+ run: uv build
41
+
42
+ - name: Prune uv cache
43
+ if: always()
44
+ run: uv cache prune --ci
45
+
46
+ test:
47
+ name: Test (Python ${{ matrix.python-version }})
48
+ runs-on: blacksmith-2vcpu-ubuntu-2404
49
+ timeout-minutes: 10
50
+ permissions:
51
+ contents: read
52
+ strategy:
53
+ fail-fast: false
54
+ matrix:
55
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
56
+ steps:
57
+ - name: Checkout
58
+ uses: actions/checkout@v6
59
+
60
+ - name: Install uv
61
+ uses: astral-sh/setup-uv@v7
62
+ with:
63
+ version: "0.10.x"
64
+ enable-cache: true
65
+ cache-dependency-glob: "uv.lock"
66
+
67
+ - name: Set up Python ${{ matrix.python-version }}
68
+ run: uv python install ${{ matrix.python-version }}
69
+
70
+ - name: Install dependencies
71
+ run: uv sync --frozen --dev
72
+
73
+ - name: Run tests
74
+ run: uv run pytest tests/ -v --tb=short
75
+ env:
76
+ DATALEGION_API_KEY: ${{ secrets.DATALEGION_API_KEY }}
77
+
78
+ - name: Prune uv cache
79
+ if: always()
80
+ run: uv cache prune --ci
81
+
82
+ publish-pypi:
83
+ name: Publish to PyPI
84
+ needs: [lint, test]
85
+ runs-on: blacksmith-2vcpu-ubuntu-2404
86
+ timeout-minutes: 5
87
+ permissions:
88
+ contents: read
89
+ id-token: write
90
+ steps:
91
+ - name: Checkout
92
+ uses: actions/checkout@v6
93
+
94
+ - name: Install uv
95
+ uses: astral-sh/setup-uv@v7
96
+ with:
97
+ version: "0.10.x"
98
+
99
+ - name: Set up Python
100
+ run: uv python install 3.12
101
+
102
+ - name: Set version from tag
103
+ run: |
104
+ VERSION="${GITHUB_REF_NAME#v}"
105
+ sed -i "s/^version = .*/version = \"${VERSION}\"/" pyproject.toml
106
+
107
+ - name: Build
108
+ run: uv build
109
+
110
+ - name: Publish to PyPI
111
+ run: uv publish --trusted-publishing always
112
+
113
+ github-release:
114
+ name: Create GitHub Release
115
+ needs: [publish-pypi]
116
+ runs-on: blacksmith-2vcpu-ubuntu-2404
117
+ timeout-minutes: 5
118
+ permissions:
119
+ contents: write
120
+ steps:
121
+ - name: Checkout
122
+ uses: actions/checkout@v6
123
+ with:
124
+ ref: main
125
+ token: ${{ secrets.GH_PAT }}
126
+
127
+ - name: Update version in pyproject.toml
128
+ run: |
129
+ VERSION="${GITHUB_REF_NAME#v}"
130
+ sed -i "s/^version = .*/version = \"${VERSION}\"/" pyproject.toml
131
+ git config user.name "github-actions[bot]"
132
+ git config user.email "github-actions[bot]@users.noreply.github.com"
133
+ git add pyproject.toml
134
+ git diff --staged --quiet || git commit -m "chore: bump version to ${VERSION} [skip ci]"
135
+ git push
136
+
137
+ - name: Create Release
138
+ uses: actions/github-script@v8
139
+ with:
140
+ script: |
141
+ const tag = context.ref.replace('refs/tags/', '');
142
+ await github.rest.repos.createRelease({
143
+ owner: context.repo.owner,
144
+ repo: context.repo.repo,
145
+ tag_name: tag,
146
+ name: tag,
147
+ generate_release_notes: true,
148
+ });
@@ -0,0 +1,73 @@
1
+ name: Security
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ - main
10
+ workflow_dispatch:
11
+
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ changes:
18
+ name: Check Changes
19
+ runs-on: blacksmith-2vcpu-ubuntu-2404
20
+ if: github.event.pull_request.draft != true
21
+ permissions:
22
+ contents: read
23
+ pull-requests: read
24
+ outputs:
25
+ should_run: ${{ steps.filter.outputs.src }}
26
+ steps:
27
+ - uses: actions/checkout@v6
28
+ - uses: dorny/paths-filter@v3
29
+ id: filter
30
+ with:
31
+ filters: |
32
+ src:
33
+ - '**.py'
34
+ - 'pyproject.toml'
35
+ - 'uv.lock'
36
+ - '.github/workflows/**'
37
+
38
+ security:
39
+ name: Security Scan
40
+ needs: changes
41
+ if: needs.changes.outputs.should_run == 'true'
42
+ runs-on: blacksmith-2vcpu-ubuntu-2404
43
+ timeout-minutes: 5
44
+ permissions:
45
+ contents: read
46
+ steps:
47
+ - name: Checkout
48
+ uses: actions/checkout@v6
49
+
50
+ - name: Install uv
51
+ uses: astral-sh/setup-uv@v7
52
+ with:
53
+ version: "0.10.x"
54
+
55
+ - name: Set up Python
56
+ uses: actions/setup-python@v6
57
+ with:
58
+ python-version: "3.12"
59
+ cache: "pip"
60
+
61
+ - name: Install security tools
62
+ run: pip install bandit pip-audit
63
+
64
+ - name: Run Bandit (SAST)
65
+ run: |
66
+ bandit -r src/ \
67
+ --severity-level high \
68
+ --confidence-level high
69
+
70
+ - name: Run pip-audit (dependency vulnerabilities)
71
+ run: |
72
+ uv export --format requirements-txt --no-hashes > requirements.txt
73
+ pip-audit -r requirements.txt --disable-pip --no-deps
@@ -0,0 +1,109 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ - main
10
+ workflow_dispatch:
11
+
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ changes:
18
+ name: Check Changes
19
+ runs-on: blacksmith-2vcpu-ubuntu-2404
20
+ if: github.event.pull_request.draft != true
21
+ permissions:
22
+ contents: read
23
+ pull-requests: read
24
+ outputs:
25
+ should_run: ${{ steps.filter.outputs.src }}
26
+ steps:
27
+ - uses: actions/checkout@v6
28
+ - uses: dorny/paths-filter@v3
29
+ id: filter
30
+ with:
31
+ filters: |
32
+ src:
33
+ - '**.py'
34
+ - 'pyproject.toml'
35
+ - 'uv.lock'
36
+ - '.github/workflows/**'
37
+
38
+ lint:
39
+ name: Lint & Build
40
+ needs: changes
41
+ if: needs.changes.outputs.should_run == 'true'
42
+ runs-on: blacksmith-2vcpu-ubuntu-2404
43
+ timeout-minutes: 5
44
+ permissions:
45
+ contents: read
46
+ steps:
47
+ - name: Checkout
48
+ uses: actions/checkout@v6
49
+
50
+ - name: Install uv
51
+ uses: astral-sh/setup-uv@v7
52
+ with:
53
+ version: "0.10.x"
54
+ enable-cache: true
55
+ cache-dependency-glob: "uv.lock"
56
+
57
+ - name: Set up Python
58
+ run: uv python install 3.12
59
+
60
+ - name: Install dependencies
61
+ run: uv sync --frozen --dev
62
+
63
+ - name: Run lint
64
+ run: uv run lint
65
+
66
+ - name: Build
67
+ run: uv build
68
+
69
+ - name: Prune uv cache
70
+ if: always()
71
+ run: uv cache prune --ci
72
+
73
+ test:
74
+ name: Test (Python ${{ matrix.python-version }})
75
+ needs: changes
76
+ if: needs.changes.outputs.should_run == 'true'
77
+ runs-on: blacksmith-2vcpu-ubuntu-2404
78
+ timeout-minutes: 10
79
+ permissions:
80
+ contents: read
81
+ strategy:
82
+ fail-fast: false
83
+ matrix:
84
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
85
+ steps:
86
+ - name: Checkout
87
+ uses: actions/checkout@v6
88
+
89
+ - name: Install uv
90
+ uses: astral-sh/setup-uv@v7
91
+ with:
92
+ version: "0.10.x"
93
+ enable-cache: true
94
+ cache-dependency-glob: "uv.lock"
95
+
96
+ - name: Set up Python ${{ matrix.python-version }}
97
+ run: uv python install ${{ matrix.python-version }}
98
+
99
+ - name: Install dependencies
100
+ run: uv sync --frozen --dev
101
+
102
+ - name: Run tests
103
+ run: uv run pytest tests/ -v --tb=short
104
+ env:
105
+ DATALEGION_API_KEY: ${{ secrets.DATALEGION_API_KEY }}
106
+
107
+ - name: Prune uv cache
108
+ if: always()
109
+ run: uv cache prune --ci
@@ -0,0 +1,14 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.so
5
+ .eggs/
6
+ dist/
7
+ build/
8
+ *.egg-info/
9
+ *.egg
10
+ .venv/
11
+ .env
12
+ *.whl
13
+ .mypy_cache/
14
+ .ruff_cache/
@@ -0,0 +1,9 @@
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ - id: lint
5
+ name: lint
6
+ entry: uv run lint
7
+ language: system
8
+ pass_filenames: false
9
+ always_run: true
@@ -0,0 +1,29 @@
1
+ # Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ ## Our Standards
8
+
9
+ Examples of behavior that contributes to a positive environment:
10
+
11
+ - Using welcoming and inclusive language
12
+ - Being respectful of differing viewpoints and experiences
13
+ - Gracefully accepting constructive criticism
14
+ - Focusing on what is best for the community
15
+
16
+ Examples of unacceptable behavior:
17
+
18
+ - Trolling, insulting/derogatory comments, and personal or political attacks
19
+ - Public or private harassment
20
+ - Publishing others' private information without explicit permission
21
+ - Other conduct which could reasonably be considered inappropriate in a professional setting
22
+
23
+ ## Enforcement
24
+
25
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at **engineering@datalegion.ai**. All complaints will be reviewed and investigated promptly and fairly.
26
+
27
+ ## Attribution
28
+
29
+ This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1.