Skip to content

Commit 92f62d4

Browse files
authored
Merge pull request #8 from londogard/copilot/implement-s3-import-command
Add streaming S3 import command with metadata identity and path filter support
2 parents 5d86a43 + e5b85e8 commit 92f62d4

37 files changed

Lines changed: 6635 additions & 390 deletions

.github/FUNDING.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
github: [londogard]

.github/workflows/ci.yml

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
pull_request:
6+
7+
jobs:
8+
test-and-build:
9+
runs-on: ubuntu-latest
10+
11+
steps:
12+
- name: Check out repository
13+
uses: actions/checkout@v4
14+
15+
- name: Set up Python
16+
uses: actions/setup-python@v5
17+
with:
18+
python-version: "3.12"
19+
20+
- name: Set up uv
21+
uses: astral-sh/setup-uv@v4
22+
23+
- name: Install dependencies
24+
run: uv sync --group dev
25+
26+
- name: Reject macOS junk files
27+
run: |
28+
if git ls-files | grep -E '(^__MACOSX/|(^|/)\.DS_Store$|(^|/)\._)'; then
29+
echo "Remove macOS archive/junk files before merging."
30+
exit 1
31+
fi
32+
33+
- name: Run non-integration tests
34+
run: uv run pytest tests -m "not integration"
35+
36+
- name: Smoke-test CLI help
37+
run: uv run fluxel --help
38+
39+
- name: Build package
40+
run: uv build
41+
42+
s3-integration:
43+
runs-on: ubuntu-latest
44+
45+
steps:
46+
- name: Check out repository
47+
uses: actions/checkout@v4
48+
49+
- name: Set up Python
50+
uses: actions/setup-python@v5
51+
with:
52+
python-version: "3.12"
53+
54+
- name: Set up uv
55+
uses: astral-sh/setup-uv@v4
56+
57+
- name: Install dependencies
58+
run: uv sync --group dev
59+
60+
- name: Run S3 integration tests against MiniStack
61+
run: bash scripts/run_s3_integration.sh

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
__pycache__/
33
*.py[cod]
44
*$py.class
5+
.DS_Store
6+
._*
7+
__MACOSX/
58

69
# C extensions
710
*.so

CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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, and Fluxel currently tracks changes before its first public beta release.
6+
7+
## Unreleased
8+
9+
### Added
10+
11+
- Streaming S3 import with metadata identity mode and repeatable path filters.
12+
- Manifest sidecar indexes for exact-path and prefix-based lookups.
13+
- Staged add support for arbitrary local files, directories, S3 objects, and S3 prefixes.
14+
- Real S3 integration coverage for remote repository flows.
15+
- AGPL-3.0-or-later licensing, attribution notice, and funding metadata for the first public beta.
16+
17+
### Changed
18+
19+
- CLI examples and tests now prefer `--repo` repository selection semantics.
20+
- Client-local state writes now use atomic replace semantics for HEAD and staging payloads.
21+
- Manifest index prefix iteration now streams rows instead of materializing full result sets.
22+
23+
### Fixed
24+
25+
- Manifest parsing now validates entry shape, digests, and metadata-only invariants with line-aware errors.
26+
- CLI commands now return clean `... error:` messages for common validation, filesystem, and object-storage failures instead of raw tracebacks.
27+
- Corrupt S3-hosted manifest lines now surface actionable validation errors.

CONTRIBUTING.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Contributing
2+
3+
## Development Setup
4+
5+
Fluxel uses `uv` for dependency management and local commands.
6+
7+
```bash
8+
uv sync --group dev
9+
uv run fluxel --help
10+
```
11+
12+
## Local Validation
13+
14+
Run the full local suite:
15+
16+
```bash
17+
uv run pytest tests
18+
```
19+
20+
Run only the real S3 integration tests against Ministack:
21+
22+
```bash
23+
export FLUXEL_MINISTACK_ENDPOINT=http://127.0.0.1:9000
24+
export FLUXEL_MINISTACK_ACCESS_KEY=ministack
25+
export FLUXEL_MINISTACK_SECRET_KEY=ministack123
26+
export FLUXEL_MINISTACK_REGION=us-east-1
27+
28+
uv run pytest tests/test_s3_integration.py -m integration
29+
```
30+
31+
If `FLUXEL_MINISTACK_ENDPOINT` is unset or unreachable, the integration tests skip automatically.
32+
33+
## Project Expectations
34+
35+
- Fluxel is licensed under AGPL-3.0-or-later; preserve the license and notice files in redistributions.
36+
- Prefer Python type hints by default.
37+
- Keep Fluxel client-first: no server, daemon, or central database.
38+
- Keep canonical blob storage simple and immutable.
39+
- Metadata-only operations must not read blob payloads.
40+
- Prefer stream-safe, O(1)-memory patterns when working with manifests and large imports.
41+
- Use Blake3 for Fluxel content and identity hashing.
42+
43+
## Pull Requests
44+
45+
- Keep changes focused and explain user-facing behavior changes clearly.
46+
- Add or update tests for every functional change.
47+
- Update [README.md](README.md) and [CHANGELOG.md](CHANGELOG.md) when the CLI, packaging, or documented workflows change.
48+
- Keep [NOTICE](NOTICE) aligned with project attribution and sponsorship guidance.
49+
- Prefer `--repo` in docs and examples for repository selection.

ISSUES.MD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ Implement `fluxel log` using commit parent links only.
8787
- Optional JSON output mode.
8888

8989
**Acceptance Criteria**
90-
- `fluxel log --root <root> main` prints deterministic history.
90+
- `fluxel log --repo <repo> main` prints deterministic history.
9191
- No blob reads occur during history traversal.
9292
- Unit tests cover empty/single/multi-commit chains.
9393

0 commit comments

Comments
 (0)