cryoflow 0.2.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.
- cryoflow-0.2.0/.github/actions/setup-nix/action.yaml +19 -0
- cryoflow-0.2.0/.github/pull_request_template.md +77 -0
- cryoflow-0.2.0/.github/workflows/cachix-push.yml +23 -0
- cryoflow-0.2.0/.github/workflows/publish.yml +26 -0
- cryoflow-0.2.0/.github/workflows/test.yml +22 -0
- cryoflow-0.2.0/.gitignore +227 -0
- cryoflow-0.2.0/.python-version +1 -0
- cryoflow-0.2.0/CHANGELOG.md +212 -0
- cryoflow-0.2.0/CHANGELOG_ja.md +212 -0
- cryoflow-0.2.0/CLAUDE.md +65 -0
- cryoflow-0.2.0/LICENSE +36 -0
- cryoflow-0.2.0/PKG-INFO +472 -0
- cryoflow-0.2.0/README.md +443 -0
- cryoflow-0.2.0/README_ja.md +442 -0
- cryoflow-0.2.0/cryoflow/__init__.py +0 -0
- cryoflow-0.2.0/dev/flake.lock +159 -0
- cryoflow-0.2.0/dev/flake.nix +94 -0
- cryoflow-0.2.0/docs/archives/implements_step_plan.md +171 -0
- cryoflow-0.2.0/docs/archives/implements_step_plan_ja.md +171 -0
- cryoflow-0.2.0/docs/archives/progress.md +368 -0
- cryoflow-0.2.0/docs/archives/progress_ja.md +368 -0
- cryoflow-0.2.0/docs/plugin_development.md +1618 -0
- cryoflow-0.2.0/docs/plugin_development_ja.md +1616 -0
- cryoflow-0.2.0/docs/spec.md +507 -0
- cryoflow-0.2.0/docs/spec_ja.md +505 -0
- cryoflow-0.2.0/example.envrc +5 -0
- cryoflow-0.2.0/examples/config.toml +28 -0
- cryoflow-0.2.0/examples/data/README.md +109 -0
- cryoflow-0.2.0/examples/data/output.parquet +0 -0
- cryoflow-0.2.0/examples/data/sample_sales.ipc +0 -0
- cryoflow-0.2.0/examples/data/sample_sales.parquet +0 -0
- cryoflow-0.2.0/examples/data/sensor_readings.parquet +0 -0
- cryoflow-0.2.0/examples/generate_sample_data.py +111 -0
- cryoflow-0.2.0/examples/generate_sensor_data.py +156 -0
- cryoflow-0.2.0/flake.lock +133 -0
- cryoflow-0.2.0/flake.nix +89 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/__init__.py +9 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/cli.py +110 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/commands/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/commands/check.py +63 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/commands/run.py +67 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/commands/utils.py +50 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/config.py +126 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/hookspecs.py +24 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/loader.py +270 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/pipeline.py +238 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/plugin.py +90 -0
- cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/result.py +41 -0
- cryoflow-0.2.0/packages/cryoflow-core/pyproject.toml +39 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_check_default_config_path.py +56 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_check_errors.py +145 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_check_success.py +108 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_default_config_path.py +56 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_help_display.py +40 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_run_errors.py +37 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_run_success.py +128 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_version_display.py +21 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/config/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/config/test_cryoflow_config.py +47 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/config/test_get_config_path.py +21 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/config/test_load_config.py +101 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/config/test_plugin_config.py +44 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/conftest.py +210 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/dotpath_test_plugin.py +21 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/e2e/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/e2e/test_check_command.py +166 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/e2e/test_e2e_integration.py +206 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/hookspecs/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/hookspecs/test_cryoflow_specs_methods.py +17 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/hookspecs/test_markers.py +11 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/hookspecs/test_pluggy_integration.py +93 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/conftest.py +118 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_discover_plugin_classes.py +44 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_get_plugins.py +76 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_instantiate_plugins.py +38 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_is_filesystem_path.py +25 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_load_module_from_dotpath.py +15 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_load_module_from_path.py +41 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_load_plugins.py +185 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_plugin_hook_relay.py +30 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_resolve_module_path.py +26 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_execute_dry_run_chain.py +85 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_execute_output.py +127 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_execute_output_dry_run.py +76 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_execute_transform_chain.py +114 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_extract_schema.py +47 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_label_routing.py +54 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_run_dry_run_pipeline.py +95 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_run_pipeline.py +83 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/__init__.py +0 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_abc_instantiation.py +35 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_dry_run.py +29 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_execute.py +36 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_inheritance.py +40 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_input_plugin_execute.py +26 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_label_attribute.py +29 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_options_storage.py +26 -0
- cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_path_resolution.py +50 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/__init__.py +41 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/input/__init__.py +1 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/input/csv_scan.py +52 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/input/ipc_scan.py +52 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/input/parquet_scan.py +52 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/__init__.py +21 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/core.py +32 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/polars.py +26 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/returns/__init__.py +7 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/returns/maybe.py +13 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/returns/result.py +15 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/output/__init__.py +5 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/output/parquet_writer.py +75 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/transform/__init__.py +5 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/transform/multiplier.py +85 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/pyproject.toml +39 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/input/test_csv_scan_plugin.py +138 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/input/test_ipc_scan_plugin.py +138 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/input/test_parquet_scan_plugin.py +138 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/libs_imports/core/test_core_reexport.py +30 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/libs_imports/polars/test_polars_reexport.py +91 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/libs_imports/returns/test_returns_reexport.py +116 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/output/test_parquet_writer_plugin.py +171 -0
- cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/transform/test_column_multiplier_plugin.py +163 -0
- cryoflow-0.2.0/pyproject.toml +74 -0
- cryoflow-0.2.0/uv.lock +480 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: 'Setup Nix'
|
|
2
|
+
description: 'Install Nix and configure Cachix'
|
|
3
|
+
inputs:
|
|
4
|
+
cachix-auth-token:
|
|
5
|
+
description: 'Cachix authentication token'
|
|
6
|
+
required: false
|
|
7
|
+
runs:
|
|
8
|
+
using: 'composite'
|
|
9
|
+
steps:
|
|
10
|
+
- name: Install Nix
|
|
11
|
+
uses: cachix/install-nix-action@2126ae7fc54c9df00dd18f7f18754393182c73cd # v31.9.1
|
|
12
|
+
with:
|
|
13
|
+
github_access_token: ${{ github.token }}
|
|
14
|
+
|
|
15
|
+
- name: Setup Cachix (yasunori)
|
|
16
|
+
uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
|
|
17
|
+
with:
|
|
18
|
+
name: yasunori0418
|
|
19
|
+
authToken: ${{ inputs.cachix-auth-token }}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
|
|
3
|
+
<!-- Briefly describe the purpose and context of this PR -->
|
|
4
|
+
|
|
5
|
+
## Type of Change
|
|
6
|
+
|
|
7
|
+
<!-- Check the items that apply -->
|
|
8
|
+
|
|
9
|
+
- [ ] 🎉 New feature (non-breaking change which adds functionality)
|
|
10
|
+
- [ ] 🐛 Bug fix (non-breaking change which fixes an issue)
|
|
11
|
+
- [ ] 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
|
12
|
+
- [ ] 📝 Documentation update
|
|
13
|
+
- [ ] ♻️ Refactoring (code improvement without changing functionality)
|
|
14
|
+
- [ ] 🎨 Style change (formatting, missing semicolons, etc.)
|
|
15
|
+
- [ ] ⚡ Performance improvement
|
|
16
|
+
- [ ] ✅ Test addition/modification
|
|
17
|
+
- [ ] 🔧 Configuration change
|
|
18
|
+
- [ ] 🏗️ Build/CI/CD related
|
|
19
|
+
|
|
20
|
+
## Changes
|
|
21
|
+
|
|
22
|
+
<!-- List the details of the changes made -->
|
|
23
|
+
|
|
24
|
+
-
|
|
25
|
+
-
|
|
26
|
+
-
|
|
27
|
+
|
|
28
|
+
## Related Issues
|
|
29
|
+
|
|
30
|
+
<!-- Link related issues if any -->
|
|
31
|
+
|
|
32
|
+
Closes #
|
|
33
|
+
Related to #
|
|
34
|
+
|
|
35
|
+
## Testing
|
|
36
|
+
|
|
37
|
+
<!-- Describe the testing status -->
|
|
38
|
+
|
|
39
|
+
### Test Results
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Paste test execution commands and results
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Verification
|
|
46
|
+
|
|
47
|
+
- [ ] Verified in local environment
|
|
48
|
+
- [ ] All existing tests pass
|
|
49
|
+
- [ ] Added new tests (if applicable)
|
|
50
|
+
|
|
51
|
+
## Screenshots
|
|
52
|
+
|
|
53
|
+
<!-- Attach Before/After screenshots if there are UI changes -->
|
|
54
|
+
|
|
55
|
+
## Checklist
|
|
56
|
+
|
|
57
|
+
<!-- Check items that should be verified before merging -->
|
|
58
|
+
|
|
59
|
+
- [ ] Code follows the project's coding conventions
|
|
60
|
+
- [ ] Self-reviewed the code
|
|
61
|
+
- [ ] Added comments (especially for complex logic)
|
|
62
|
+
- [ ] Updated documentation (if applicable)
|
|
63
|
+
- [ ] No warnings generated
|
|
64
|
+
- [ ] All existing tests pass
|
|
65
|
+
- [ ] Added tests for new changes
|
|
66
|
+
- [ ] Included migration guide (if breaking change)
|
|
67
|
+
|
|
68
|
+
## Additional Information
|
|
69
|
+
|
|
70
|
+
<!-- Add any additional information for reviewers -->
|
|
71
|
+
|
|
72
|
+
## Review Focus
|
|
73
|
+
|
|
74
|
+
<!-- Highlight specific areas that need reviewer attention -->
|
|
75
|
+
|
|
76
|
+
-
|
|
77
|
+
-
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Cachix Push
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build-and-push:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
14
|
+
|
|
15
|
+
- name: Setup Nix
|
|
16
|
+
uses: ./.github/actions/setup-nix
|
|
17
|
+
with:
|
|
18
|
+
cachix-auth-token: ${{ secrets.CACHIX_AUTH_TOKEN }}
|
|
19
|
+
|
|
20
|
+
- name: Build packages
|
|
21
|
+
run: |
|
|
22
|
+
nix build .#default
|
|
23
|
+
nix build .#test
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
publish:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
16
|
+
|
|
17
|
+
- name: Setup uv
|
|
18
|
+
uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1
|
|
19
|
+
|
|
20
|
+
- name: Build packages
|
|
21
|
+
run: uv build --all-packages
|
|
22
|
+
|
|
23
|
+
- name: Publish to PyPI
|
|
24
|
+
run: uv publish
|
|
25
|
+
env:
|
|
26
|
+
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
push:
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
pytest:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
13
|
+
|
|
14
|
+
- name: Setup Nix
|
|
15
|
+
uses: ./.github/actions/setup-nix
|
|
16
|
+
with:
|
|
17
|
+
cachix-auth-token: ${{ secrets.CACHIX_AUTH_TOKEN }}
|
|
18
|
+
|
|
19
|
+
- name: Run pytest
|
|
20
|
+
run: nix shell .#test -c pytest
|
|
21
|
+
env:
|
|
22
|
+
TERM: "dumb"
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Python.gitignore
|
|
2
|
+
# @see: https://github.com/github/gitignore/blob/main/Python.gitignore
|
|
3
|
+
# Byte-compiled / optimized / DLL files
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.py[codz]
|
|
6
|
+
*$py.class
|
|
7
|
+
|
|
8
|
+
# C extensions
|
|
9
|
+
*.so
|
|
10
|
+
|
|
11
|
+
# Distribution / packaging
|
|
12
|
+
.Python
|
|
13
|
+
build/
|
|
14
|
+
develop-eggs/
|
|
15
|
+
dist/
|
|
16
|
+
downloads/
|
|
17
|
+
eggs/
|
|
18
|
+
.eggs/
|
|
19
|
+
lib/
|
|
20
|
+
lib64/
|
|
21
|
+
parts/
|
|
22
|
+
sdist/
|
|
23
|
+
var/
|
|
24
|
+
wheels/
|
|
25
|
+
share/python-wheels/
|
|
26
|
+
*.egg-info/
|
|
27
|
+
.installed.cfg
|
|
28
|
+
*.egg
|
|
29
|
+
MANIFEST
|
|
30
|
+
|
|
31
|
+
# PyInstaller
|
|
32
|
+
# Usually these files are written by a python script from a template
|
|
33
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
34
|
+
*.manifest
|
|
35
|
+
*.spec
|
|
36
|
+
|
|
37
|
+
# Installer logs
|
|
38
|
+
pip-log.txt
|
|
39
|
+
pip-delete-this-directory.txt
|
|
40
|
+
|
|
41
|
+
# Unit test / coverage reports
|
|
42
|
+
htmlcov/
|
|
43
|
+
.tox/
|
|
44
|
+
.nox/
|
|
45
|
+
.coverage
|
|
46
|
+
.coverage.*
|
|
47
|
+
.cache
|
|
48
|
+
nosetests.xml
|
|
49
|
+
coverage.xml
|
|
50
|
+
*.cover
|
|
51
|
+
*.py.cover
|
|
52
|
+
.hypothesis/
|
|
53
|
+
.pytest_cache/
|
|
54
|
+
cover/
|
|
55
|
+
|
|
56
|
+
# Translations
|
|
57
|
+
*.mo
|
|
58
|
+
*.pot
|
|
59
|
+
|
|
60
|
+
# Django stuff:
|
|
61
|
+
*.log
|
|
62
|
+
local_settings.py
|
|
63
|
+
db.sqlite3
|
|
64
|
+
db.sqlite3-journal
|
|
65
|
+
|
|
66
|
+
# Flask stuff:
|
|
67
|
+
instance/
|
|
68
|
+
.webassets-cache
|
|
69
|
+
|
|
70
|
+
# Scrapy stuff:
|
|
71
|
+
.scrapy
|
|
72
|
+
|
|
73
|
+
# Sphinx documentation
|
|
74
|
+
docs/_build/
|
|
75
|
+
|
|
76
|
+
# PyBuilder
|
|
77
|
+
.pybuilder/
|
|
78
|
+
target/
|
|
79
|
+
|
|
80
|
+
# Jupyter Notebook
|
|
81
|
+
.ipynb_checkpoints
|
|
82
|
+
|
|
83
|
+
# IPython
|
|
84
|
+
profile_default/
|
|
85
|
+
ipython_config.py
|
|
86
|
+
|
|
87
|
+
# pyenv
|
|
88
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
89
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
90
|
+
# .python-version
|
|
91
|
+
|
|
92
|
+
# pipenv
|
|
93
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
94
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
95
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
96
|
+
# install all needed dependencies.
|
|
97
|
+
# Pipfile.lock
|
|
98
|
+
|
|
99
|
+
# UV
|
|
100
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
101
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
102
|
+
# commonly ignored for libraries.
|
|
103
|
+
# uv.lock
|
|
104
|
+
|
|
105
|
+
# poetry
|
|
106
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
107
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
108
|
+
# commonly ignored for libraries.
|
|
109
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
110
|
+
# poetry.lock
|
|
111
|
+
# poetry.toml
|
|
112
|
+
|
|
113
|
+
# pdm
|
|
114
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
115
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
116
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
117
|
+
# pdm.lock
|
|
118
|
+
# pdm.toml
|
|
119
|
+
.pdm-python
|
|
120
|
+
.pdm-build/
|
|
121
|
+
|
|
122
|
+
# pixi
|
|
123
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
124
|
+
# pixi.lock
|
|
125
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
126
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
127
|
+
.pixi
|
|
128
|
+
|
|
129
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
130
|
+
__pypackages__/
|
|
131
|
+
|
|
132
|
+
# Celery stuff
|
|
133
|
+
celerybeat-schedule
|
|
134
|
+
celerybeat.pid
|
|
135
|
+
|
|
136
|
+
# Redis
|
|
137
|
+
*.rdb
|
|
138
|
+
*.aof
|
|
139
|
+
*.pid
|
|
140
|
+
|
|
141
|
+
# RabbitMQ
|
|
142
|
+
mnesia/
|
|
143
|
+
rabbitmq/
|
|
144
|
+
rabbitmq-data/
|
|
145
|
+
|
|
146
|
+
# ActiveMQ
|
|
147
|
+
activemq-data/
|
|
148
|
+
|
|
149
|
+
# SageMath parsed files
|
|
150
|
+
*.sage.py
|
|
151
|
+
|
|
152
|
+
# Environments
|
|
153
|
+
.env
|
|
154
|
+
.envrc
|
|
155
|
+
.venv
|
|
156
|
+
env/
|
|
157
|
+
venv/
|
|
158
|
+
ENV/
|
|
159
|
+
env.bak/
|
|
160
|
+
venv.bak/
|
|
161
|
+
|
|
162
|
+
# Spyder project settings
|
|
163
|
+
.spyderproject
|
|
164
|
+
.spyproject
|
|
165
|
+
|
|
166
|
+
# Rope project settings
|
|
167
|
+
.ropeproject
|
|
168
|
+
|
|
169
|
+
# mkdocs documentation
|
|
170
|
+
/site
|
|
171
|
+
|
|
172
|
+
# mypy
|
|
173
|
+
.mypy_cache/
|
|
174
|
+
.dmypy.json
|
|
175
|
+
dmypy.json
|
|
176
|
+
|
|
177
|
+
# Pyre type checker
|
|
178
|
+
.pyre/
|
|
179
|
+
|
|
180
|
+
# pytype static type analyzer
|
|
181
|
+
.pytype/
|
|
182
|
+
|
|
183
|
+
# Cython debug symbols
|
|
184
|
+
cython_debug/
|
|
185
|
+
|
|
186
|
+
# PyCharm
|
|
187
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
188
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
189
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
190
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
191
|
+
# .idea/
|
|
192
|
+
|
|
193
|
+
# Abstra
|
|
194
|
+
# Abstra is an AI-powered process automation framework.
|
|
195
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
196
|
+
# Learn more at https://abstra.io/docs
|
|
197
|
+
.abstra/
|
|
198
|
+
|
|
199
|
+
# Visual Studio Code
|
|
200
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
201
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
202
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
203
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
204
|
+
# .vscode/
|
|
205
|
+
|
|
206
|
+
# Ruff stuff:
|
|
207
|
+
.ruff_cache/
|
|
208
|
+
|
|
209
|
+
# PyPI configuration file
|
|
210
|
+
.pypirc
|
|
211
|
+
|
|
212
|
+
# Marimo
|
|
213
|
+
marimo/_static/
|
|
214
|
+
marimo/_lsp/
|
|
215
|
+
__marimo__/
|
|
216
|
+
|
|
217
|
+
# Streamlit
|
|
218
|
+
.streamlit/secrets.toml
|
|
219
|
+
|
|
220
|
+
# Nix.gitignore
|
|
221
|
+
# @see: https://github.com/github/gitignore/blob/main/Nix.gitignore
|
|
222
|
+
# Ignore build outputs from performing a nix-build or `nix build` command
|
|
223
|
+
result
|
|
224
|
+
result-*
|
|
225
|
+
|
|
226
|
+
# Ignore automatically generated direnv output
|
|
227
|
+
.direnv
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.2.0] - 2026-02-22
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`InputPlugin` ABC** (`cryoflow-core`):
|
|
13
|
+
- New `InputPlugin` base class for loading data from arbitrary sources
|
|
14
|
+
- `execute()` takes no arguments and returns `Result[FrameData, Exception]`
|
|
15
|
+
- `dry_run()` returns schema without loading actual data
|
|
16
|
+
- Registered via new `register_input_plugins` hookspec in `hookspecs.py`
|
|
17
|
+
|
|
18
|
+
- **`label` attribute on `BasePlugin`** (`cryoflow-core`):
|
|
19
|
+
- All plugins now carry a `label` string (default: `'default'`)
|
|
20
|
+
- Enables label-based routing of multiple concurrent data streams
|
|
21
|
+
|
|
22
|
+
- **Concrete `InputPlugin` implementations** (`cryoflow-plugin-collections`):
|
|
23
|
+
- `cryoflow_plugin_collections.input.parquet_scan` — reads Parquet files via `pl.scan_parquet()`
|
|
24
|
+
- `cryoflow_plugin_collections.input.ipc_scan` — reads Arrow IPC files via `pl.scan_ipc()`
|
|
25
|
+
|
|
26
|
+
- **`libs/returns` submodule split** (`cryoflow-plugin-collections`):
|
|
27
|
+
- `libs/returns/result.py` — re-exports `Result`, `Success`, `Failure`, and related utilities
|
|
28
|
+
- `libs/returns/maybe.py` — re-exports `Maybe`, `Some`, `Nothing`, and related utilities
|
|
29
|
+
- Both are re-exported from `libs/returns/__init__.py` for backward compatibility
|
|
30
|
+
|
|
31
|
+
- **Docs**: InputPlugin guide integrated into `docs/plugin_development.md` / `docs/plugin_development_ja.md`
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- **BREAKING**: `config.py` — `input_path: Path` field removed from `RunConfig`; replaced by `input_plugins: list[PluginConfig]`
|
|
36
|
+
- **BREAKING**: `config.py` — `plugins` field renamed to `transform_plugins` and `output_plugins` (separate lists)
|
|
37
|
+
- **BREAKING**: `config.py` — `label` field added to `PluginConfig`; required for multi-stream routing
|
|
38
|
+
- **BREAKING**: `pipeline.py` — `load_data()` and `_detect_format()` removed; pipeline now built on `LabeledDataMap` keyed by label
|
|
39
|
+
- **BREAKING**: `loader.py` — `InputPlugin` load/registration added; `label` passed to all plugin instances at instantiation
|
|
40
|
+
|
|
41
|
+
### Tests
|
|
42
|
+
|
|
43
|
+
- Reorganized all test files from flat layout into per-module directories (one class per file)
|
|
44
|
+
- Added pipeline tests: label routing, `LabeledDataMap` construction, `execute_transform_chain`, `execute_output`, dry-run pipeline
|
|
45
|
+
- Added `InputPlugin` unit tests, `label` attribute tests
|
|
46
|
+
- Total: 232 tests passing
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### Migration Guide
|
|
51
|
+
|
|
52
|
+
#### Configuration File Migration
|
|
53
|
+
|
|
54
|
+
The top-level `input_path` key is removed. Input data sources must now be declared as `[[input_plugins]]` entries.
|
|
55
|
+
|
|
56
|
+
```toml
|
|
57
|
+
# Before (0.1.x)
|
|
58
|
+
input_path = "data/input.parquet"
|
|
59
|
+
|
|
60
|
+
[[plugins]]
|
|
61
|
+
name = "column-multiplier"
|
|
62
|
+
module = "cryoflow_plugin_collections.transform.multiplier"
|
|
63
|
+
|
|
64
|
+
[[plugins]]
|
|
65
|
+
name = "parquet-writer"
|
|
66
|
+
module = "cryoflow_plugin_collections.output.parquet_writer"
|
|
67
|
+
|
|
68
|
+
# After (0.2.0)
|
|
69
|
+
[[input_plugins]]
|
|
70
|
+
name = "parquet-scan"
|
|
71
|
+
module = "cryoflow_plugin_collections.input.parquet_scan"
|
|
72
|
+
label = "default"
|
|
73
|
+
[input_plugins.options]
|
|
74
|
+
input_path = "data/input.parquet"
|
|
75
|
+
|
|
76
|
+
[[transform_plugins]]
|
|
77
|
+
name = "column-multiplier"
|
|
78
|
+
module = "cryoflow_plugin_collections.transform.multiplier"
|
|
79
|
+
label = "default"
|
|
80
|
+
|
|
81
|
+
[[output_plugins]]
|
|
82
|
+
name = "parquet-writer"
|
|
83
|
+
module = "cryoflow_plugin_collections.output.parquet_writer"
|
|
84
|
+
label = "default"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### Plugin Development Migration
|
|
88
|
+
|
|
89
|
+
If you have custom plugins that referenced the old `plugins` config key or `load_data()` pipeline API, update as follows:
|
|
90
|
+
|
|
91
|
+
- Replace `plugins` with `transform_plugins` or `output_plugins` in your config files
|
|
92
|
+
- Remove any code relying on `pipeline.load_data()` or `pipeline._detect_format()`
|
|
93
|
+
- `InputPlugin.execute()` takes **no arguments** (unlike `TransformPlugin` / `OutputPlugin` which receive `df: FrameData`)
|
|
94
|
+
- Assign a `label` to every plugin config entry; use `'default'` for single-stream pipelines
|
|
95
|
+
|
|
96
|
+
#### `libs/returns` Import Path (unchanged)
|
|
97
|
+
|
|
98
|
+
The `libs/returns` module was split internally into `result.py` and `maybe.py`, but all public symbols remain importable from `cryoflow_plugin_collections.libs.returns` — no import changes required.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## [0.1.3] - 2026-02-17
|
|
103
|
+
|
|
104
|
+
### Added
|
|
105
|
+
|
|
106
|
+
- **Complete polars API re-export** (`cryoflow-plugin-collections`):
|
|
107
|
+
- Re-export all 228+ public APIs from polars using wildcard import
|
|
108
|
+
- Support for 3 import patterns:
|
|
109
|
+
1. Module import: `from libs import polars as pl; pl.col()`
|
|
110
|
+
2. Object import: `from libs.polars import pl; pl.col()`
|
|
111
|
+
3. Individual imports: `from libs.polars import col, lit, when`
|
|
112
|
+
- Dynamic `__all__` generation for automatic tracking of polars updates
|
|
113
|
+
- Zero maintenance overhead and zero runtime overhead
|
|
114
|
+
- Full type safety and IDE autocomplete support
|
|
115
|
+
|
|
116
|
+
- **Complete returns library re-export** (`cryoflow-plugin-collections`):
|
|
117
|
+
- Re-export 146+ unique public APIs from 13 major returns modules
|
|
118
|
+
- Newly available containers and utilities:
|
|
119
|
+
- `Maybe` monad for optional values (`Some`, `Nothing`)
|
|
120
|
+
- `IO` containers for side effect management (`IO`, `IOResult`)
|
|
121
|
+
- `Future` for async operations (`Future`, `FutureResult`)
|
|
122
|
+
- `Context` for dependency injection (`RequiresContext`)
|
|
123
|
+
- Pipeline utilities (`flow`, `pipe`)
|
|
124
|
+
- Pointfree operations (`bind`, `map`, `alt`, `lash`)
|
|
125
|
+
- Curry/partial application utilities
|
|
126
|
+
- Converters and methods for container transformations
|
|
127
|
+
- Support for individual imports: `from libs.returns import Maybe, IO, flow`
|
|
128
|
+
- Full functional programming toolkit for plugin developers
|
|
129
|
+
|
|
130
|
+
### Changed
|
|
131
|
+
|
|
132
|
+
- **Improved `__all__` construction** (`cryoflow-plugin-collections`):
|
|
133
|
+
- Refactored returns module to use single assignment pattern
|
|
134
|
+
- Replaced destructive extend/reassign with list comprehension and temporary variable
|
|
135
|
+
- Better static analysis compatibility (reduced Pyright warnings)
|
|
136
|
+
|
|
137
|
+
### Tests
|
|
138
|
+
|
|
139
|
+
- Added comprehensive tests for polars re-export (4 new test cases)
|
|
140
|
+
- Added comprehensive tests for returns re-export (4 new test cases)
|
|
141
|
+
- All 44 tests passing with full backward compatibility
|
|
142
|
+
|
|
143
|
+
## [0.1.0] - 2025-02-12
|
|
144
|
+
|
|
145
|
+
### Added
|
|
146
|
+
|
|
147
|
+
- **Path resolution system**: All file paths in configuration are now resolved relative to the config file's directory
|
|
148
|
+
- `config.py`: Added `_resolve_path_relative_to_config()` helper function
|
|
149
|
+
- `BasePlugin`: Added `resolve_path()` method for consistent path resolution across plugins
|
|
150
|
+
- Comprehensive E2E tests for relative path resolution
|
|
151
|
+
|
|
152
|
+
### Changed
|
|
153
|
+
|
|
154
|
+
- **BREAKING CHANGE**: `BasePlugin.__init__()` now requires `config_dir` parameter (no longer optional)
|
|
155
|
+
- Remove backward compatibility fallback to eliminate technical debt
|
|
156
|
+
- All plugins must explicitly receive `config_dir` during instantiation
|
|
157
|
+
- **BREAKING CHANGE**: Relative paths in `input_path` are now resolved relative to config file directory instead of current working directory
|
|
158
|
+
- **BREAKING CHANGE**: Plugin option paths are resolved relative to config file directory
|
|
159
|
+
- Updated `ParquetWriterPlugin` to use `resolve_path()` for output paths
|
|
160
|
+
- Updated all example configurations to use relative paths
|
|
161
|
+
|
|
162
|
+
### Documentation
|
|
163
|
+
|
|
164
|
+
- Added comprehensive path resolution behavior section to `docs/spec.md` and `docs/spec_ja.md`
|
|
165
|
+
- Updated `README.md` and `README_ja.md` with path resolution guidelines
|
|
166
|
+
- Updated plugin development guides (`docs/plugin_development.md`, `docs/plugin_development_ja.md`) with new API
|
|
167
|
+
|
|
168
|
+
### Migration Guide
|
|
169
|
+
|
|
170
|
+
#### For Configuration Files
|
|
171
|
+
|
|
172
|
+
Update relative paths to be relative to the config file location:
|
|
173
|
+
|
|
174
|
+
```toml
|
|
175
|
+
# Before (0.0.x): paths relative to current working directory
|
|
176
|
+
input_path = "examples/data/input.parquet"
|
|
177
|
+
|
|
178
|
+
# After (0.1.0): paths relative to config file directory
|
|
179
|
+
# If config.toml is in project root:
|
|
180
|
+
input_path = "examples/data/input.parquet" # Same if running from project root
|
|
181
|
+
|
|
182
|
+
# If config.toml is in config/:
|
|
183
|
+
input_path = "../examples/data/input.parquet" # OR use absolute path
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### For Plugin Development
|
|
187
|
+
|
|
188
|
+
Update plugin constructors to accept `config_dir`:
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
# Before (0.0.x)
|
|
192
|
+
class MyPlugin(OutputPlugin):
|
|
193
|
+
def execute(self, df):
|
|
194
|
+
output_path = Path(self.options.get('output_path'))
|
|
195
|
+
# ...
|
|
196
|
+
|
|
197
|
+
# After (0.1.0)
|
|
198
|
+
class MyPlugin(OutputPlugin):
|
|
199
|
+
def execute(self, df):
|
|
200
|
+
output_path = self.resolve_path(self.options.get('output_path'))
|
|
201
|
+
# ...
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## [0.0.4] - 2025-02-11
|
|
205
|
+
|
|
206
|
+
### Changed
|
|
207
|
+
|
|
208
|
+
- Remove unused `output_target` configuration field
|
|
209
|
+
|
|
210
|
+
## [0.0.3] - 2025-02-11
|
|
211
|
+
|
|
212
|
+
Initial working release with core functionality.
|