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.
Files changed (128) hide show
  1. cryoflow-0.2.0/.github/actions/setup-nix/action.yaml +19 -0
  2. cryoflow-0.2.0/.github/pull_request_template.md +77 -0
  3. cryoflow-0.2.0/.github/workflows/cachix-push.yml +23 -0
  4. cryoflow-0.2.0/.github/workflows/publish.yml +26 -0
  5. cryoflow-0.2.0/.github/workflows/test.yml +22 -0
  6. cryoflow-0.2.0/.gitignore +227 -0
  7. cryoflow-0.2.0/.python-version +1 -0
  8. cryoflow-0.2.0/CHANGELOG.md +212 -0
  9. cryoflow-0.2.0/CHANGELOG_ja.md +212 -0
  10. cryoflow-0.2.0/CLAUDE.md +65 -0
  11. cryoflow-0.2.0/LICENSE +36 -0
  12. cryoflow-0.2.0/PKG-INFO +472 -0
  13. cryoflow-0.2.0/README.md +443 -0
  14. cryoflow-0.2.0/README_ja.md +442 -0
  15. cryoflow-0.2.0/cryoflow/__init__.py +0 -0
  16. cryoflow-0.2.0/dev/flake.lock +159 -0
  17. cryoflow-0.2.0/dev/flake.nix +94 -0
  18. cryoflow-0.2.0/docs/archives/implements_step_plan.md +171 -0
  19. cryoflow-0.2.0/docs/archives/implements_step_plan_ja.md +171 -0
  20. cryoflow-0.2.0/docs/archives/progress.md +368 -0
  21. cryoflow-0.2.0/docs/archives/progress_ja.md +368 -0
  22. cryoflow-0.2.0/docs/plugin_development.md +1618 -0
  23. cryoflow-0.2.0/docs/plugin_development_ja.md +1616 -0
  24. cryoflow-0.2.0/docs/spec.md +507 -0
  25. cryoflow-0.2.0/docs/spec_ja.md +505 -0
  26. cryoflow-0.2.0/example.envrc +5 -0
  27. cryoflow-0.2.0/examples/config.toml +28 -0
  28. cryoflow-0.2.0/examples/data/README.md +109 -0
  29. cryoflow-0.2.0/examples/data/output.parquet +0 -0
  30. cryoflow-0.2.0/examples/data/sample_sales.ipc +0 -0
  31. cryoflow-0.2.0/examples/data/sample_sales.parquet +0 -0
  32. cryoflow-0.2.0/examples/data/sensor_readings.parquet +0 -0
  33. cryoflow-0.2.0/examples/generate_sample_data.py +111 -0
  34. cryoflow-0.2.0/examples/generate_sensor_data.py +156 -0
  35. cryoflow-0.2.0/flake.lock +133 -0
  36. cryoflow-0.2.0/flake.nix +89 -0
  37. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/__init__.py +9 -0
  38. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/cli.py +110 -0
  39. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/commands/__init__.py +0 -0
  40. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/commands/check.py +63 -0
  41. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/commands/run.py +67 -0
  42. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/commands/utils.py +50 -0
  43. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/config.py +126 -0
  44. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/hookspecs.py +24 -0
  45. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/loader.py +270 -0
  46. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/pipeline.py +238 -0
  47. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/plugin.py +90 -0
  48. cryoflow-0.2.0/packages/cryoflow-core/cryoflow_core/result.py +41 -0
  49. cryoflow-0.2.0/packages/cryoflow-core/pyproject.toml +39 -0
  50. cryoflow-0.2.0/packages/cryoflow-core/tests/__init__.py +0 -0
  51. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/__init__.py +0 -0
  52. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_check_default_config_path.py +56 -0
  53. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_check_errors.py +145 -0
  54. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_check_success.py +108 -0
  55. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_default_config_path.py +56 -0
  56. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_help_display.py +40 -0
  57. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_run_errors.py +37 -0
  58. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_run_success.py +128 -0
  59. cryoflow-0.2.0/packages/cryoflow-core/tests/cli/test_version_display.py +21 -0
  60. cryoflow-0.2.0/packages/cryoflow-core/tests/config/__init__.py +0 -0
  61. cryoflow-0.2.0/packages/cryoflow-core/tests/config/test_cryoflow_config.py +47 -0
  62. cryoflow-0.2.0/packages/cryoflow-core/tests/config/test_get_config_path.py +21 -0
  63. cryoflow-0.2.0/packages/cryoflow-core/tests/config/test_load_config.py +101 -0
  64. cryoflow-0.2.0/packages/cryoflow-core/tests/config/test_plugin_config.py +44 -0
  65. cryoflow-0.2.0/packages/cryoflow-core/tests/conftest.py +210 -0
  66. cryoflow-0.2.0/packages/cryoflow-core/tests/dotpath_test_plugin.py +21 -0
  67. cryoflow-0.2.0/packages/cryoflow-core/tests/e2e/__init__.py +0 -0
  68. cryoflow-0.2.0/packages/cryoflow-core/tests/e2e/test_check_command.py +166 -0
  69. cryoflow-0.2.0/packages/cryoflow-core/tests/e2e/test_e2e_integration.py +206 -0
  70. cryoflow-0.2.0/packages/cryoflow-core/tests/hookspecs/__init__.py +0 -0
  71. cryoflow-0.2.0/packages/cryoflow-core/tests/hookspecs/test_cryoflow_specs_methods.py +17 -0
  72. cryoflow-0.2.0/packages/cryoflow-core/tests/hookspecs/test_markers.py +11 -0
  73. cryoflow-0.2.0/packages/cryoflow-core/tests/hookspecs/test_pluggy_integration.py +93 -0
  74. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/__init__.py +0 -0
  75. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/conftest.py +118 -0
  76. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_discover_plugin_classes.py +44 -0
  77. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_get_plugins.py +76 -0
  78. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_instantiate_plugins.py +38 -0
  79. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_is_filesystem_path.py +25 -0
  80. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_load_module_from_dotpath.py +15 -0
  81. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_load_module_from_path.py +41 -0
  82. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_load_plugins.py +185 -0
  83. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_plugin_hook_relay.py +30 -0
  84. cryoflow-0.2.0/packages/cryoflow-core/tests/loader/test_resolve_module_path.py +26 -0
  85. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/__init__.py +0 -0
  86. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_execute_dry_run_chain.py +85 -0
  87. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_execute_output.py +127 -0
  88. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_execute_output_dry_run.py +76 -0
  89. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_execute_transform_chain.py +114 -0
  90. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_extract_schema.py +47 -0
  91. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_label_routing.py +54 -0
  92. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_run_dry_run_pipeline.py +95 -0
  93. cryoflow-0.2.0/packages/cryoflow-core/tests/pipeline/test_run_pipeline.py +83 -0
  94. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/__init__.py +0 -0
  95. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_abc_instantiation.py +35 -0
  96. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_dry_run.py +29 -0
  97. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_execute.py +36 -0
  98. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_inheritance.py +40 -0
  99. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_input_plugin_execute.py +26 -0
  100. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_label_attribute.py +29 -0
  101. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_options_storage.py +26 -0
  102. cryoflow-0.2.0/packages/cryoflow-core/tests/plugin/test_path_resolution.py +50 -0
  103. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/__init__.py +41 -0
  104. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/input/__init__.py +1 -0
  105. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/input/csv_scan.py +52 -0
  106. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/input/ipc_scan.py +52 -0
  107. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/input/parquet_scan.py +52 -0
  108. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/__init__.py +21 -0
  109. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/core.py +32 -0
  110. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/polars.py +26 -0
  111. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/returns/__init__.py +7 -0
  112. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/returns/maybe.py +13 -0
  113. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/libs/returns/result.py +15 -0
  114. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/output/__init__.py +5 -0
  115. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/output/parquet_writer.py +75 -0
  116. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/transform/__init__.py +5 -0
  117. cryoflow-0.2.0/packages/cryoflow-plugin-collections/cryoflow_plugin_collections/transform/multiplier.py +85 -0
  118. cryoflow-0.2.0/packages/cryoflow-plugin-collections/pyproject.toml +39 -0
  119. cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/input/test_csv_scan_plugin.py +138 -0
  120. cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/input/test_ipc_scan_plugin.py +138 -0
  121. cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/input/test_parquet_scan_plugin.py +138 -0
  122. cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/libs_imports/core/test_core_reexport.py +30 -0
  123. cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/libs_imports/polars/test_polars_reexport.py +91 -0
  124. cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/libs_imports/returns/test_returns_reexport.py +116 -0
  125. cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/output/test_parquet_writer_plugin.py +171 -0
  126. cryoflow-0.2.0/packages/cryoflow-plugin-collections/tests/transform/test_column_multiplier_plugin.py +163 -0
  127. cryoflow-0.2.0/pyproject.toml +74 -0
  128. 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.