aio-sf 0.1.0b5__tar.gz → 0.1.0b6__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.
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/PKG-INFO +17 -10
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/README.md +9 -5
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/RELEASE.md +0 -25
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/pyproject.toml +8 -3
- aio_sf-0.1.0b6/src/aio_sf/__init__.py +61 -0
- aio_sf-0.1.0b5/src/aio_sf/__init__.py +0 -28
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/.cursor/rules/api-structure.mdc +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/.cursor/rules/async-patterns.mdc +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/.cursor/rules/project-tooling.mdc +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/.github/workflows/publish.yml +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/.github/workflows/test.yml +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/.gitignore +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/LICENSE +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/pytest.ini +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/__init__.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/auth/__init__.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/auth/base.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/auth/client_credentials.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/auth/refresh_token.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/auth/sfdx_cli.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/auth/static_token.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/bulk_v2/__init__.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/bulk_v2/client.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/bulk_v2/types.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/client.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/collections/__init__.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/collections/client.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/collections/types.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/describe/__init__.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/describe/client.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/describe/types.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/query/__init__.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/query/client.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/query/types.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/api/types.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/exporter/__init__.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/exporter/bulk_export.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/src/aio_sf/exporter/parquet_writer.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/tests/__init__.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/tests/conftest.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/tests/test_api_clients.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/tests/test_auth.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/tests/test_client.py +0 -0
- {aio_sf-0.1.0b5 → aio_sf-0.1.0b6}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aio-sf
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0b6
|
|
4
4
|
Summary: Async Salesforce library for Python
|
|
5
5
|
Project-URL: Homepage, https://github.com/callawaycloud/aio-salesforce
|
|
6
6
|
Project-URL: Repository, https://github.com/callawaycloud/aio-salesforce
|
|
@@ -35,13 +35,16 @@ Classifier: Programming Language :: Python :: 3
|
|
|
35
35
|
Classifier: Programming Language :: Python :: 3.11
|
|
36
36
|
Classifier: Programming Language :: Python :: 3.12
|
|
37
37
|
Requires-Python: >=3.11
|
|
38
|
+
Requires-Dist: boto3>=1.34.0
|
|
38
39
|
Requires-Dist: httpx>=0.25.0
|
|
40
|
+
Requires-Dist: pandas>=2.0.0
|
|
41
|
+
Requires-Dist: pyarrow>=10.0.0
|
|
39
42
|
Requires-Dist: pydantic>=2.0.0
|
|
40
43
|
Requires-Dist: python-dotenv>=1.0.0
|
|
41
|
-
Provides-Extra:
|
|
42
|
-
Requires-Dist:
|
|
43
|
-
Requires-Dist:
|
|
44
|
-
Requires-Dist:
|
|
44
|
+
Provides-Extra: core
|
|
45
|
+
Requires-Dist: httpx>=0.25.0; extra == 'core'
|
|
46
|
+
Requires-Dist: pydantic>=2.0.0; extra == 'core'
|
|
47
|
+
Requires-Dist: python-dotenv>=1.0.0; extra == 'core'
|
|
45
48
|
Provides-Extra: dev
|
|
46
49
|
Requires-Dist: black>=23.0.0; extra == 'dev'
|
|
47
50
|
Requires-Dist: mypy>=1.5.0; extra == 'dev'
|
|
@@ -88,16 +91,16 @@ An async Salesforce library for Python.
|
|
|
88
91
|
|
|
89
92
|
## Installation
|
|
90
93
|
|
|
91
|
-
###
|
|
94
|
+
### Full Package (Default - Includes Everything)
|
|
92
95
|
```bash
|
|
93
96
|
uv add aio-sf
|
|
94
97
|
# or: pip install aio-sf
|
|
95
98
|
```
|
|
96
99
|
|
|
97
|
-
###
|
|
100
|
+
### Core Only (Minimal Dependencies)
|
|
98
101
|
```bash
|
|
99
|
-
uv add "aio-sf[
|
|
100
|
-
# or: pip install "aio-sf[
|
|
102
|
+
uv add "aio-sf[core]"
|
|
103
|
+
# or: pip install "aio-sf[core]"
|
|
101
104
|
```
|
|
102
105
|
|
|
103
106
|
## Quick Start
|
|
@@ -157,7 +160,11 @@ The Exporter library contains a streamlined and "opinionated" way to export data
|
|
|
157
160
|
|
|
158
161
|
### 3. Export to Parquet
|
|
159
162
|
```python
|
|
160
|
-
|
|
163
|
+
# With full installation (default), you can import directly from aio_sf
|
|
164
|
+
from aio_sf import SalesforceClient, ClientCredentialsAuth, bulk_query, write_query_to_parquet
|
|
165
|
+
|
|
166
|
+
# Or import from the exporter module (both work)
|
|
167
|
+
# from aio_sf.exporter import bulk_query, write_query_to_parquet
|
|
161
168
|
|
|
162
169
|
async def main():
|
|
163
170
|
# ... authentication code from above ...
|
|
@@ -28,16 +28,16 @@ An async Salesforce library for Python.
|
|
|
28
28
|
|
|
29
29
|
## Installation
|
|
30
30
|
|
|
31
|
-
###
|
|
31
|
+
### Full Package (Default - Includes Everything)
|
|
32
32
|
```bash
|
|
33
33
|
uv add aio-sf
|
|
34
34
|
# or: pip install aio-sf
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
###
|
|
37
|
+
### Core Only (Minimal Dependencies)
|
|
38
38
|
```bash
|
|
39
|
-
uv add "aio-sf[
|
|
40
|
-
# or: pip install "aio-sf[
|
|
39
|
+
uv add "aio-sf[core]"
|
|
40
|
+
# or: pip install "aio-sf[core]"
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
## Quick Start
|
|
@@ -97,7 +97,11 @@ The Exporter library contains a streamlined and "opinionated" way to export data
|
|
|
97
97
|
|
|
98
98
|
### 3. Export to Parquet
|
|
99
99
|
```python
|
|
100
|
-
|
|
100
|
+
# With full installation (default), you can import directly from aio_sf
|
|
101
|
+
from aio_sf import SalesforceClient, ClientCredentialsAuth, bulk_query, write_query_to_parquet
|
|
102
|
+
|
|
103
|
+
# Or import from the exporter module (both work)
|
|
104
|
+
# from aio_sf.exporter import bulk_query, write_query_to_parquet
|
|
101
105
|
|
|
102
106
|
async def main():
|
|
103
107
|
# ... authentication code from above ...
|
|
@@ -39,31 +39,6 @@
|
|
|
39
39
|
- Builds and publishes to PyPI automatically
|
|
40
40
|
- Requires manual approval in the `pypi` environment
|
|
41
41
|
|
|
42
|
-
## Manual Release (Backup)
|
|
43
|
-
|
|
44
|
-
If you need to publish manually:
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
# Build the package
|
|
48
|
-
uv build
|
|
49
|
-
|
|
50
|
-
# Publish to PyPI (requires PYPI_API_TOKEN env var)
|
|
51
|
-
export PYPI_API_TOKEN=your_token_here
|
|
52
|
-
uv publish --token $PYPI_API_TOKEN
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Test Release
|
|
56
|
-
|
|
57
|
-
To test on TestPyPI first:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
# Get TestPyPI token from test.pypi.org
|
|
61
|
-
uv publish --repository testpypi --token $TEST_PYPI_TOKEN
|
|
62
|
-
|
|
63
|
-
# Test install from TestPyPI
|
|
64
|
-
pip install --index-url https://test.pypi.org/simple/ aio-salesforce
|
|
65
|
-
```
|
|
66
|
-
|
|
67
42
|
## Version Strategy
|
|
68
43
|
|
|
69
44
|
### Automatic Versioning
|
|
@@ -24,17 +24,22 @@ dependencies = [
|
|
|
24
24
|
"httpx>=0.25.0",
|
|
25
25
|
"pydantic>=2.0.0",
|
|
26
26
|
"python-dotenv>=1.0.0",
|
|
27
|
+
"pandas>=2.0.0",
|
|
28
|
+
"pyarrow>=10.0.0",
|
|
29
|
+
"boto3>=1.34.0", # For S3 uploads (future feature)
|
|
27
30
|
]
|
|
28
31
|
|
|
29
32
|
[project.optional-dependencies]
|
|
33
|
+
core = [
|
|
34
|
+
"httpx>=0.25.0",
|
|
35
|
+
"pydantic>=2.0.0",
|
|
36
|
+
"python-dotenv>=1.0.0",
|
|
37
|
+
]
|
|
30
38
|
exporter = [
|
|
31
39
|
"pandas>=2.0.0",
|
|
32
40
|
"pyarrow>=10.0.0",
|
|
33
41
|
"boto3>=1.34.0", # For S3 uploads (future feature)
|
|
34
42
|
]
|
|
35
|
-
all = [
|
|
36
|
-
"aio-sf[exporter]",
|
|
37
|
-
]
|
|
38
43
|
dev = [
|
|
39
44
|
"pytest>=7.0.0",
|
|
40
45
|
"pytest-asyncio>=0.21.0",
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""aio-salesforce: Async Salesforce library for Python with Bulk API 2.0 support."""
|
|
2
|
+
|
|
3
|
+
__author__ = "Jonas"
|
|
4
|
+
__email__ = "charlie@callaway.cloud"
|
|
5
|
+
|
|
6
|
+
# Client functionality
|
|
7
|
+
from .api.client import SalesforceClient # noqa: F401
|
|
8
|
+
from .api.auth import ( # noqa: F401
|
|
9
|
+
SalesforceAuthError,
|
|
10
|
+
AuthStrategy,
|
|
11
|
+
ClientCredentialsAuth,
|
|
12
|
+
RefreshTokenAuth,
|
|
13
|
+
StaticTokenAuth,
|
|
14
|
+
SfdxCliAuth,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
# Core package exports client functionality
|
|
18
|
+
# Exporter functionality is included by default, but gracefully handles missing deps
|
|
19
|
+
__all__ = [
|
|
20
|
+
"SalesforceClient",
|
|
21
|
+
"SalesforceAuthError",
|
|
22
|
+
"AuthStrategy",
|
|
23
|
+
"ClientCredentialsAuth",
|
|
24
|
+
"RefreshTokenAuth",
|
|
25
|
+
"StaticTokenAuth",
|
|
26
|
+
"SfdxCliAuth",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
# Try to import exporter functionality if dependencies are available
|
|
30
|
+
try:
|
|
31
|
+
from .exporter import ( # noqa: F401
|
|
32
|
+
bulk_query,
|
|
33
|
+
get_bulk_fields,
|
|
34
|
+
resume_from_locator,
|
|
35
|
+
write_records_to_csv,
|
|
36
|
+
QueryResult,
|
|
37
|
+
batch_records_async,
|
|
38
|
+
ParquetWriter,
|
|
39
|
+
create_schema_from_metadata,
|
|
40
|
+
write_query_to_parquet,
|
|
41
|
+
salesforce_to_arrow_type,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
__all__.extend(
|
|
45
|
+
[
|
|
46
|
+
"bulk_query",
|
|
47
|
+
"get_bulk_fields",
|
|
48
|
+
"resume_from_locator",
|
|
49
|
+
"write_records_to_csv",
|
|
50
|
+
"QueryResult",
|
|
51
|
+
"batch_records_async",
|
|
52
|
+
"ParquetWriter",
|
|
53
|
+
"create_schema_from_metadata",
|
|
54
|
+
"write_query_to_parquet",
|
|
55
|
+
"salesforce_to_arrow_type",
|
|
56
|
+
]
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
except ImportError:
|
|
60
|
+
# Exporter dependencies not available - this is fine for core-only installs
|
|
61
|
+
pass
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"""aio-salesforce: Async Salesforce library for Python with Bulk API 2.0 support."""
|
|
2
|
-
|
|
3
|
-
__author__ = "Jonas"
|
|
4
|
-
__email__ = "charlie@callaway.cloud"
|
|
5
|
-
|
|
6
|
-
# Client functionality
|
|
7
|
-
from .api.client import SalesforceClient # noqa: F401
|
|
8
|
-
from .api.auth import ( # noqa: F401
|
|
9
|
-
SalesforceAuthError,
|
|
10
|
-
AuthStrategy,
|
|
11
|
-
ClientCredentialsAuth,
|
|
12
|
-
RefreshTokenAuth,
|
|
13
|
-
StaticTokenAuth,
|
|
14
|
-
SfdxCliAuth,
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
# Core package only exports client functionality
|
|
18
|
-
# Users import exporter functions directly: from aio_sf.exporter import bulk_query
|
|
19
|
-
|
|
20
|
-
__all__ = [
|
|
21
|
-
"SalesforceClient",
|
|
22
|
-
"SalesforceAuthError",
|
|
23
|
-
"AuthStrategy",
|
|
24
|
-
"ClientCredentialsAuth",
|
|
25
|
-
"RefreshTokenAuth",
|
|
26
|
-
"StaticTokenAuth",
|
|
27
|
-
"SfdxCliAuth",
|
|
28
|
-
]
|
|
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
|
|
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
|