coldstore


Namecoldstore JSON
Version 1.0.0 PyPI version JSON
download
home_pagehttps://github.com/janfasnacht/coldstore
SummaryProject archival with structured metadata (Git state, environment, notes) and multi-level integrity verification
upload_time2025-10-19 05:16:53
maintainerNone
docs_urlNone
authorJan Fasnacht
requires_python<4.0,>=3.10
licenseMIT
keywords archival metadata research academic snapshot verification git compliance audit
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # coldstore

[![PyPI version](https://badge.fury.io/py/coldstore.svg)](https://pypi.org/project/coldstore/)
[![Python](https://img.shields.io/pypi/pyversions/coldstore.svg)](https://pypi.org/project/coldstore/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![CI Status](https://github.com/janfasnacht/coldstore/actions/workflows/ci.yml/badge.svg)](https://github.com/janfasnacht/coldstore/actions)

**Project archival with rich metadata and integrity verification**

coldstore creates compressed project archives with structured metadata (Git repository state, environment details, event notes, timestamps) and comprehensive integrity verification (archive-level, per-file, and manifest checksums).

## Quick Start

### Installation

```bash
pipx install coldstore
```

Or with pip:
```bash
pip install coldstore
```

### Basic Usage

```bash
# Create archive
coldstore freeze ~/project ./archives/ --milestone "Nature submission"

# Verify integrity
coldstore verify ./archives/project-20251018-143022.tar.gz

# Inspect without extracting
coldstore inspect ./archives/project-20251018-143022.tar.gz
```

### Example: Paper Submission

```bash
coldstore freeze ~/research/paper ./archives/ \
    --milestone "Nature Neuroscience submission" \
    --note "Final version after reviewer comments" \
    --contact "PI: jane.doe@university.edu" \
    --exclude "*.pyc" \
    --exclude "__pycache__"
```

Output:
```
✓ Archive created: ./archives/paper-20251018-143022.tar.gz
  - Size: 127.3 MB (compressed from 456.2 MB)
  - Files: 1,234
  - SHA256: a3d2f1e8...

✓ Git metadata captured:
  - Branch: main (commit: abc123...)
  - Remote: https://github.com/user/paper

✓ Event metadata:
  - Milestone: Nature Neuroscience submission
  - Timestamp: 2025-10-18T14:30:22Z
```

## Features

### Event-Driven Metadata
- Milestone/event name and timestamp
- Multiple notes and contact information
- Git repository state (branch, commit, remotes, dirty status)
- Environment details (hostname, user, platform, Python version)
- Per-file SHA256 checksums

### Multi-Level Verification
- Archive-level: SHA256 of entire `.tar.gz`
- File-level: SHA256 for each archived file
- Manifest-level: Validates metadata structure

### Inspection Without Extraction
Explore archive metadata, file listings, and statistics without extracting files.

### Dry-Run Mode
Preview what will be archived before creating files.

## CLI Reference

### `coldstore freeze`

```bash
coldstore freeze [OPTIONS] SOURCE DESTINATION

Options:
  --milestone TEXT         Event name (e.g., "PNAS submission")
  --note TEXT             Description note (repeatable)
  --contact TEXT          Contact information (repeatable)
  --name TEXT             Custom archive name
  --compression-level INT Gzip level 1-9 [default: 6]
  --exclude TEXT          Exclude pattern (repeatable)
  --dry-run              Preview without creating files
  --no-manifest          Skip MANIFEST.json generation
  --no-filelist          Skip FILELIST.csv.gz generation
  --no-sha256            Skip per-file checksums
```

### `coldstore verify`

```bash
coldstore verify ARCHIVE_PATH
```

Performs three-level verification:
- Archive checksum (SHA256 of `.tar.gz`)
- Per-file checksums (from manifest)
- Manifest structure validation

### `coldstore inspect`

```bash
coldstore inspect ARCHIVE_PATH
```

Displays:
- Event metadata (milestone, notes, contacts, timestamp)
- Git state (branch, commit, remote, dirty status)
- Environment (hostname, user, platform)
- Archive statistics (file count, sizes)
- File listing with checksums

## Common Patterns

```bash
# Academic paper with exclusions
coldstore freeze ~/paper ./archives/ \
    --milestone "Journal submission" \
    --note "Supplementary materials included" \
    --contact "Corresponding: prof@university.edu" \
    --exclude "*.pyc" --exclude ".venv"

# Grant deliverable
coldstore freeze ~/grant-project ./deliverables/ \
    --milestone "NSF Year 2 Deliverable - Award #1234567" \
    --contact "PI: pi@university.edu" \
    --contact "Program Officer: po@nsf.gov"

# Dry-run preview
coldstore freeze ~/project ./archives/ --milestone "Test" --dry-run

# Maximum compression for long-term storage
coldstore freeze ~/project ./archives/ \
    --compression-level 9 \
    --milestone "Archive"
```

## Archive Structure

```
project-20251018-143022/
├── project-20251018-143022.tar.gz    # Compressed archive
├── MANIFEST.json                      # Structured metadata
├── FILELIST.csv.gz                    # File listing + checksums
└── SHA256SUMS                         # Archive checksum
```

### MANIFEST.json

```json
{
  "event": {
    "milestone": "Nature submission",
    "timestamp": "2025-10-18T14:30:22Z",
    "notes": ["Final version"],
    "contacts": ["PI: jane.doe@university.edu"]
  },
  "git": {
    "branch": "main",
    "commit": "abc123...",
    "remote": "https://github.com/user/repo",
    "is_dirty": false
  },
  "environment": {
    "hostname": "workstation",
    "username": "user",
    "platform": "Linux-5.15.0-x86_64",
    "python_version": "3.11.4"
  },
  "archive": {
    "path": "project-20251018-143022.tar.gz",
    "size_bytes": 133456789,
    "sha256": "a3d2f1e8..."
  },
  "files": {
    "total_count": 1234,
    "total_size_bytes": 456789012,
    "checksums": {
      "src/main.py": "d4e5f6...",
      "src/utils.py": "e7f8a9..."
    }
  }
}
```

## Documentation

- **[docs/USAGE.md](docs/USAGE.md)**: Detailed command reference and troubleshooting
- **[CHANGELOG.md](CHANGELOG.md)**: Version history

## Requirements

- Python 3.9+
- Git (optional, for repository metadata)

## Development

### Setup

```bash
git clone https://github.com/janfasnacht/coldstore.git
cd coldstore
poetry install
poetry run pytest  # 295 tests
```

### Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md)

### Testing

```bash
make test       # Run all tests
make test-cov   # With coverage
make lint       # Code quality checks
```

## License

MIT License - see [LICENSE](LICENSE) file for details.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/janfasnacht/coldstore",
    "name": "coldstore",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.10",
    "maintainer_email": null,
    "keywords": "archival, metadata, research, academic, snapshot, verification, git, compliance, audit",
    "author": "Jan Fasnacht",
    "author_email": "jan.fasnacht@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/00/96/3b933754fdbf17f57c2829e285975b0709b469accf71fed92883f5a0d58e/coldstore-1.0.0.tar.gz",
    "platform": null,
    "description": "# coldstore\n\n[![PyPI version](https://badge.fury.io/py/coldstore.svg)](https://pypi.org/project/coldstore/)\n[![Python](https://img.shields.io/pypi/pyversions/coldstore.svg)](https://pypi.org/project/coldstore/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![CI Status](https://github.com/janfasnacht/coldstore/actions/workflows/ci.yml/badge.svg)](https://github.com/janfasnacht/coldstore/actions)\n\n**Project archival with rich metadata and integrity verification**\n\ncoldstore creates compressed project archives with structured metadata (Git repository state, environment details, event notes, timestamps) and comprehensive integrity verification (archive-level, per-file, and manifest checksums).\n\n## Quick Start\n\n### Installation\n\n```bash\npipx install coldstore\n```\n\nOr with pip:\n```bash\npip install coldstore\n```\n\n### Basic Usage\n\n```bash\n# Create archive\ncoldstore freeze ~/project ./archives/ --milestone \"Nature submission\"\n\n# Verify integrity\ncoldstore verify ./archives/project-20251018-143022.tar.gz\n\n# Inspect without extracting\ncoldstore inspect ./archives/project-20251018-143022.tar.gz\n```\n\n### Example: Paper Submission\n\n```bash\ncoldstore freeze ~/research/paper ./archives/ \\\n    --milestone \"Nature Neuroscience submission\" \\\n    --note \"Final version after reviewer comments\" \\\n    --contact \"PI: jane.doe@university.edu\" \\\n    --exclude \"*.pyc\" \\\n    --exclude \"__pycache__\"\n```\n\nOutput:\n```\n\u2713 Archive created: ./archives/paper-20251018-143022.tar.gz\n  - Size: 127.3 MB (compressed from 456.2 MB)\n  - Files: 1,234\n  - SHA256: a3d2f1e8...\n\n\u2713 Git metadata captured:\n  - Branch: main (commit: abc123...)\n  - Remote: https://github.com/user/paper\n\n\u2713 Event metadata:\n  - Milestone: Nature Neuroscience submission\n  - Timestamp: 2025-10-18T14:30:22Z\n```\n\n## Features\n\n### Event-Driven Metadata\n- Milestone/event name and timestamp\n- Multiple notes and contact information\n- Git repository state (branch, commit, remotes, dirty status)\n- Environment details (hostname, user, platform, Python version)\n- Per-file SHA256 checksums\n\n### Multi-Level Verification\n- Archive-level: SHA256 of entire `.tar.gz`\n- File-level: SHA256 for each archived file\n- Manifest-level: Validates metadata structure\n\n### Inspection Without Extraction\nExplore archive metadata, file listings, and statistics without extracting files.\n\n### Dry-Run Mode\nPreview what will be archived before creating files.\n\n## CLI Reference\n\n### `coldstore freeze`\n\n```bash\ncoldstore freeze [OPTIONS] SOURCE DESTINATION\n\nOptions:\n  --milestone TEXT         Event name (e.g., \"PNAS submission\")\n  --note TEXT             Description note (repeatable)\n  --contact TEXT          Contact information (repeatable)\n  --name TEXT             Custom archive name\n  --compression-level INT Gzip level 1-9 [default: 6]\n  --exclude TEXT          Exclude pattern (repeatable)\n  --dry-run              Preview without creating files\n  --no-manifest          Skip MANIFEST.json generation\n  --no-filelist          Skip FILELIST.csv.gz generation\n  --no-sha256            Skip per-file checksums\n```\n\n### `coldstore verify`\n\n```bash\ncoldstore verify ARCHIVE_PATH\n```\n\nPerforms three-level verification:\n- Archive checksum (SHA256 of `.tar.gz`)\n- Per-file checksums (from manifest)\n- Manifest structure validation\n\n### `coldstore inspect`\n\n```bash\ncoldstore inspect ARCHIVE_PATH\n```\n\nDisplays:\n- Event metadata (milestone, notes, contacts, timestamp)\n- Git state (branch, commit, remote, dirty status)\n- Environment (hostname, user, platform)\n- Archive statistics (file count, sizes)\n- File listing with checksums\n\n## Common Patterns\n\n```bash\n# Academic paper with exclusions\ncoldstore freeze ~/paper ./archives/ \\\n    --milestone \"Journal submission\" \\\n    --note \"Supplementary materials included\" \\\n    --contact \"Corresponding: prof@university.edu\" \\\n    --exclude \"*.pyc\" --exclude \".venv\"\n\n# Grant deliverable\ncoldstore freeze ~/grant-project ./deliverables/ \\\n    --milestone \"NSF Year 2 Deliverable - Award #1234567\" \\\n    --contact \"PI: pi@university.edu\" \\\n    --contact \"Program Officer: po@nsf.gov\"\n\n# Dry-run preview\ncoldstore freeze ~/project ./archives/ --milestone \"Test\" --dry-run\n\n# Maximum compression for long-term storage\ncoldstore freeze ~/project ./archives/ \\\n    --compression-level 9 \\\n    --milestone \"Archive\"\n```\n\n## Archive Structure\n\n```\nproject-20251018-143022/\n\u251c\u2500\u2500 project-20251018-143022.tar.gz    # Compressed archive\n\u251c\u2500\u2500 MANIFEST.json                      # Structured metadata\n\u251c\u2500\u2500 FILELIST.csv.gz                    # File listing + checksums\n\u2514\u2500\u2500 SHA256SUMS                         # Archive checksum\n```\n\n### MANIFEST.json\n\n```json\n{\n  \"event\": {\n    \"milestone\": \"Nature submission\",\n    \"timestamp\": \"2025-10-18T14:30:22Z\",\n    \"notes\": [\"Final version\"],\n    \"contacts\": [\"PI: jane.doe@university.edu\"]\n  },\n  \"git\": {\n    \"branch\": \"main\",\n    \"commit\": \"abc123...\",\n    \"remote\": \"https://github.com/user/repo\",\n    \"is_dirty\": false\n  },\n  \"environment\": {\n    \"hostname\": \"workstation\",\n    \"username\": \"user\",\n    \"platform\": \"Linux-5.15.0-x86_64\",\n    \"python_version\": \"3.11.4\"\n  },\n  \"archive\": {\n    \"path\": \"project-20251018-143022.tar.gz\",\n    \"size_bytes\": 133456789,\n    \"sha256\": \"a3d2f1e8...\"\n  },\n  \"files\": {\n    \"total_count\": 1234,\n    \"total_size_bytes\": 456789012,\n    \"checksums\": {\n      \"src/main.py\": \"d4e5f6...\",\n      \"src/utils.py\": \"e7f8a9...\"\n    }\n  }\n}\n```\n\n## Documentation\n\n- **[docs/USAGE.md](docs/USAGE.md)**: Detailed command reference and troubleshooting\n- **[CHANGELOG.md](CHANGELOG.md)**: Version history\n\n## Requirements\n\n- Python 3.9+\n- Git (optional, for repository metadata)\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://github.com/janfasnacht/coldstore.git\ncd coldstore\npoetry install\npoetry run pytest  # 295 tests\n```\n\n### Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md)\n\n### Testing\n\n```bash\nmake test       # Run all tests\nmake test-cov   # With coverage\nmake lint       # Code quality checks\n```\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Project archival with structured metadata (Git state, environment, notes) and multi-level integrity verification",
    "version": "1.0.0",
    "project_urls": {
        "Documentation": "https://github.com/janfasnacht/coldstore#readme",
        "Homepage": "https://github.com/janfasnacht/coldstore",
        "Repository": "https://github.com/janfasnacht/coldstore"
    },
    "split_keywords": [
        "archival",
        " metadata",
        " research",
        " academic",
        " snapshot",
        " verification",
        " git",
        " compliance",
        " audit"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4d3c5c23b01d2ce9ea963188abb7f34d41254bce723be9c7647b1dc7964240f4",
                "md5": "214e428a358f918896be0196af0baff6",
                "sha256": "e6d4d9200ff805541e8762202aee19457d0c76712652ff65a8e37efa65042241"
            },
            "downloads": -1,
            "filename": "coldstore-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "214e428a358f918896be0196af0baff6",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.10",
            "size": 49972,
            "upload_time": "2025-10-19T05:16:52",
            "upload_time_iso_8601": "2025-10-19T05:16:52.122675Z",
            "url": "https://files.pythonhosted.org/packages/4d/3c/5c23b01d2ce9ea963188abb7f34d41254bce723be9c7647b1dc7964240f4/coldstore-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "00963b933754fdbf17f57c2829e285975b0709b469accf71fed92883f5a0d58e",
                "md5": "312f9cf5e5392301fae7e3b2cab36b54",
                "sha256": "8794697c3d0e53ee014542ca76c0848facb5362e6729a4f6296932e9b05aebb0"
            },
            "downloads": -1,
            "filename": "coldstore-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "312f9cf5e5392301fae7e3b2cab36b54",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.10",
            "size": 44924,
            "upload_time": "2025-10-19T05:16:53",
            "upload_time_iso_8601": "2025-10-19T05:16:53.501976Z",
            "url": "https://files.pythonhosted.org/packages/00/96/3b933754fdbf17f57c2829e285975b0709b469accf71fed92883f5a0d58e/coldstore-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-19 05:16:53",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "janfasnacht",
    "github_project": "coldstore",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "coldstore"
}
        
Elapsed time: 1.11357s