cjm-fasthtml-workflows


Namecjm-fasthtml-workflows JSON
Version 0.0.1 PyPI version JSON
download
home_pagehttps://github.com/cj-mills/cjm-fasthtml-workflows
SummarySession-based workflow management for FastHTML applications with multi-step state tracking, job metadata storage, and operation deduplication.
upload_time2025-10-24 04:50:15
maintainerNone
docs_urlNone
authorChristian J. Mills
requires_python>=3.11
licenseApache Software License 2.0
keywords nbdev jupyter notebook python
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # cjm-fasthtml-workflows


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

## Install

``` bash
pip install cjm_fasthtml_workflows
```

## Project Structure

    nbs/
    └── core/ (4)
        ├── deduplication.ipynb     # Track one-time operations per job to prevent duplicates.
        ├── helpers.ipynb           # Helper functions for common workflow patterns.
        ├── job_session.ipynb       # Manage job-related metadata that needs to be accessed across multiple requests.
        └── workflow_session.ipynb  # Namespaced workflow state management within FastHTML sessions.

Total: 4 notebooks across 1 directory

## Module Dependencies

``` mermaid
graph LR
    core_deduplication[core.deduplication<br/>DeduplicationTracker]
    core_helpers[core.helpers<br/>Helpers]
    core_job_session[core.job_session<br/>JobSessionManager]
    core_workflow_session[core.workflow_session<br/>WorkflowSession]

    core_helpers --> core_job_session
    core_helpers --> core_deduplication
```

*2 cross-module dependencies detected*

## CLI Reference

No CLI commands found in this project.

## Module Overview

Detailed documentation for each module in the project:

### DeduplicationTracker (`deduplication.ipynb`)

> Track one-time operations per job to prevent duplicates.

#### Import

``` python
from cjm_fasthtml_workflows.core.deduplication import (
    DeduplicationTracker
)
```

#### Classes

``` python
class DeduplicationTracker:
    def __init__(
        self, 
        sess:Any, # FastHTML session object
        tracker_id:str # Unique identifier for this tracker (e.g., "saved_jobs", "sent_notifications")
    )
    "Track one-time operations per job to prevent duplicates."
    
    def __init__(
            self, 
            sess:Any, # FastHTML session object
            tracker_id:str # Unique identifier for this tracker (e.g., "saved_jobs", "sent_notifications")
        )
        "Initialize deduplication tracker."
    
    def is_processed(
            self, 
            job_id:str # Unique job identifier
        ) -> bool: # True if job has been marked as processed, False otherwise
        "Check if a job has been processed."
    
    def mark_processed(
            self, 
            job_id:str # Unique job identifier
        ) -> None
        "Mark a job as processed."
    
    def unmark_processed(
            self, 
            job_id:str # Unique job identifier
        ) -> None
        "Remove processed mark from a job (allows reprocessing)."
    
    def clear_all(self) -> None:
            """Clear all processed job IDs."""
            if self._key in self.sess
        "Clear all processed job IDs."
    
    def get_all_processed(self) -> Set[str]: # Set of job IDs that have been marked as processed
        "Get all processed job IDs."
```

### Helpers (`helpers.ipynb`)

> Helper functions for common workflow patterns.

#### Import

``` python
from cjm_fasthtml_workflows.core.helpers import (
    get_job_session_info,
    once_per_job
)
```

#### Functions

``` python
def get_job_session_info(
    job_id:str, # Unique job identifier
    job:Any, # Job object (should have attributes like file_name, file_path, plugin_id)
    sess:Any, # FastHTML session object
    fallback_fields:Optional[Dict[str, Any]]=None # Optional additional fallback fields
) -> Tuple[Dict[str, Any], Dict[str, Any]]: # (file_info, plugin_info) dictionaries
    "Retrieve job-related display information from session with fallbacks."
```

``` python
def once_per_job(
    sess:Any, # FastHTML session object
    job_id:str, # Unique job identifier
    operation:Callable[[], Any], # Callable to execute (should take no arguments)
    tracker_id:str="default_operation" # Unique identifier for this operation type
) -> Optional[Any]: # Result of operation if executed, None if already processed
    "Execute an operation once per job using automatic deduplication."
```

### JobSessionManager (`job_session.ipynb`)

> Manage job-related metadata that needs to be accessed across multiple
> requests.

#### Import

``` python
from cjm_fasthtml_workflows.core.job_session import (
    JobSessionManager
)
```

#### Classes

``` python
class JobSessionManager:
    def __init__(
        self, 
        sess:Any, # FastHTML session object
        prefix:str="job" # Prefix for job keys in session
    )
    "Manage job-related metadata that needs to be accessed across multiple requests."
    
    def __init__(
            self, 
            sess:Any, # FastHTML session object
            prefix:str="job" # Prefix for job keys in session
        )
        "Initialize job session manager."
    
    def store_job_metadata(
            self, 
            job_id:str, # Unique job identifier
            metadata:Dict[str, Any] # Dictionary of metadata to store
        ) -> None
        "Store metadata for a job."
    
    def get_job_metadata(
            self, 
            job_id:str, # Unique job identifier
            default:Optional[Dict[str, Any]]=None # Default value if metadata not found
        ) -> Dict[str, Any]: # Job metadata dictionary
        "Retrieve metadata for a job."
    
    def delete_job_metadata(
            self, 
            job_id:str # Unique job identifier
        ) -> None
        "Remove metadata for a job."
    
    def clear_all_jobs(self) -> None:
            """Clear all job metadata from session."""
            keys_to_delete = [k for k in self.sess.keys() if k.startswith(f"{self.prefix}_")]
            for key in keys_to_delete
        "Clear all job metadata from session."
```

### WorkflowSession (`workflow_session.ipynb`)

> Namespaced workflow state management within FastHTML sessions.

#### Import

``` python
from cjm_fasthtml_workflows.core.workflow_session import (
    WorkflowSession
)
```

#### Classes

``` python
class WorkflowSession:
    def __init__(
        self, 
        sess:Any, # FastHTML session object (from route handler parameter)
        workflow_id:str # Unique identifier for this workflow (e.g., "registration", "checkout")
    )
    "Manage workflow state within FastHTML sessions with proper namespacing."
    
    def __init__(
            self, 
            sess:Any, # FastHTML session object (from route handler parameter)
            workflow_id:str # Unique identifier for this workflow (e.g., "registration", "checkout")
        )
        "Initialize workflow session wrapper."
    
    def set(
            self, 
            key:str, # Key name within this workflow namespace
            value:Any # Value to store (must be JSON-serializable for session storage)
        ) -> None
        "Store value in workflow session."
    
    def get(
            self, 
            key:str, # Key name within this workflow namespace
            default:Any=None # Default value if key not found
        ) -> Any: # Stored value or default
        "Retrieve value from workflow session."
    
    def delete(
            self, 
            key:str # Key name within this workflow namespace
        ) -> None
        "Remove value from workflow session."
    
    def clear(self) -> None:
            """Clear all data for this workflow from session."""
            keys_to_delete = [k for k in self.sess.keys() if k.startswith(self._prefix)]
            for key in keys_to_delete
        "Clear all data for this workflow from session."
    
    def get_all(self) -> Dict[str, Any]: # Dictionary mapping original keys to their values
            """Get all workflow data as a dictionary with original (unprefixed) keys."""
            result = {}
            prefix_len = len(self._prefix)
            for key, value in self.sess.items()
        "Get all workflow data as a dictionary with original (unprefixed) keys."
    
    def has(
            self, 
            key:str # Key name within this workflow namespace
        ) -> bool: # True if key exists, False otherwise
        "Check if key exists in workflow session."
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/cj-mills/cjm-fasthtml-workflows",
    "name": "cjm-fasthtml-workflows",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "nbdev jupyter notebook python",
    "author": "Christian J. Mills",
    "author_email": "9126128+cj-mills@users.noreply.github.com",
    "download_url": "https://files.pythonhosted.org/packages/32/45/abc5e82321ee76975da04703bdff6aed8645da6f8387597ef2c5f960a273/cjm_fasthtml_workflows-0.0.1.tar.gz",
    "platform": null,
    "description": "# cjm-fasthtml-workflows\n\n\n<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->\n\n## Install\n\n``` bash\npip install cjm_fasthtml_workflows\n```\n\n## Project Structure\n\n    nbs/\n    \u2514\u2500\u2500 core/ (4)\n        \u251c\u2500\u2500 deduplication.ipynb     # Track one-time operations per job to prevent duplicates.\n        \u251c\u2500\u2500 helpers.ipynb           # Helper functions for common workflow patterns.\n        \u251c\u2500\u2500 job_session.ipynb       # Manage job-related metadata that needs to be accessed across multiple requests.\n        \u2514\u2500\u2500 workflow_session.ipynb  # Namespaced workflow state management within FastHTML sessions.\n\nTotal: 4 notebooks across 1 directory\n\n## Module Dependencies\n\n``` mermaid\ngraph LR\n    core_deduplication[core.deduplication<br/>DeduplicationTracker]\n    core_helpers[core.helpers<br/>Helpers]\n    core_job_session[core.job_session<br/>JobSessionManager]\n    core_workflow_session[core.workflow_session<br/>WorkflowSession]\n\n    core_helpers --> core_job_session\n    core_helpers --> core_deduplication\n```\n\n*2 cross-module dependencies detected*\n\n## CLI Reference\n\nNo CLI commands found in this project.\n\n## Module Overview\n\nDetailed documentation for each module in the project:\n\n### DeduplicationTracker (`deduplication.ipynb`)\n\n> Track one-time operations per job to prevent duplicates.\n\n#### Import\n\n``` python\nfrom cjm_fasthtml_workflows.core.deduplication import (\n    DeduplicationTracker\n)\n```\n\n#### Classes\n\n``` python\nclass DeduplicationTracker:\n    def __init__(\n        self, \n        sess:Any, # FastHTML session object\n        tracker_id:str # Unique identifier for this tracker (e.g., \"saved_jobs\", \"sent_notifications\")\n    )\n    \"Track one-time operations per job to prevent duplicates.\"\n    \n    def __init__(\n            self, \n            sess:Any, # FastHTML session object\n            tracker_id:str # Unique identifier for this tracker (e.g., \"saved_jobs\", \"sent_notifications\")\n        )\n        \"Initialize deduplication tracker.\"\n    \n    def is_processed(\n            self, \n            job_id:str # Unique job identifier\n        ) -> bool: # True if job has been marked as processed, False otherwise\n        \"Check if a job has been processed.\"\n    \n    def mark_processed(\n            self, \n            job_id:str # Unique job identifier\n        ) -> None\n        \"Mark a job as processed.\"\n    \n    def unmark_processed(\n            self, \n            job_id:str # Unique job identifier\n        ) -> None\n        \"Remove processed mark from a job (allows reprocessing).\"\n    \n    def clear_all(self) -> None:\n            \"\"\"Clear all processed job IDs.\"\"\"\n            if self._key in self.sess\n        \"Clear all processed job IDs.\"\n    \n    def get_all_processed(self) -> Set[str]: # Set of job IDs that have been marked as processed\n        \"Get all processed job IDs.\"\n```\n\n### Helpers (`helpers.ipynb`)\n\n> Helper functions for common workflow patterns.\n\n#### Import\n\n``` python\nfrom cjm_fasthtml_workflows.core.helpers import (\n    get_job_session_info,\n    once_per_job\n)\n```\n\n#### Functions\n\n``` python\ndef get_job_session_info(\n    job_id:str, # Unique job identifier\n    job:Any, # Job object (should have attributes like file_name, file_path, plugin_id)\n    sess:Any, # FastHTML session object\n    fallback_fields:Optional[Dict[str, Any]]=None # Optional additional fallback fields\n) -> Tuple[Dict[str, Any], Dict[str, Any]]: # (file_info, plugin_info) dictionaries\n    \"Retrieve job-related display information from session with fallbacks.\"\n```\n\n``` python\ndef once_per_job(\n    sess:Any, # FastHTML session object\n    job_id:str, # Unique job identifier\n    operation:Callable[[], Any], # Callable to execute (should take no arguments)\n    tracker_id:str=\"default_operation\" # Unique identifier for this operation type\n) -> Optional[Any]: # Result of operation if executed, None if already processed\n    \"Execute an operation once per job using automatic deduplication.\"\n```\n\n### JobSessionManager (`job_session.ipynb`)\n\n> Manage job-related metadata that needs to be accessed across multiple\n> requests.\n\n#### Import\n\n``` python\nfrom cjm_fasthtml_workflows.core.job_session import (\n    JobSessionManager\n)\n```\n\n#### Classes\n\n``` python\nclass JobSessionManager:\n    def __init__(\n        self, \n        sess:Any, # FastHTML session object\n        prefix:str=\"job\" # Prefix for job keys in session\n    )\n    \"Manage job-related metadata that needs to be accessed across multiple requests.\"\n    \n    def __init__(\n            self, \n            sess:Any, # FastHTML session object\n            prefix:str=\"job\" # Prefix for job keys in session\n        )\n        \"Initialize job session manager.\"\n    \n    def store_job_metadata(\n            self, \n            job_id:str, # Unique job identifier\n            metadata:Dict[str, Any] # Dictionary of metadata to store\n        ) -> None\n        \"Store metadata for a job.\"\n    \n    def get_job_metadata(\n            self, \n            job_id:str, # Unique job identifier\n            default:Optional[Dict[str, Any]]=None # Default value if metadata not found\n        ) -> Dict[str, Any]: # Job metadata dictionary\n        \"Retrieve metadata for a job.\"\n    \n    def delete_job_metadata(\n            self, \n            job_id:str # Unique job identifier\n        ) -> None\n        \"Remove metadata for a job.\"\n    \n    def clear_all_jobs(self) -> None:\n            \"\"\"Clear all job metadata from session.\"\"\"\n            keys_to_delete = [k for k in self.sess.keys() if k.startswith(f\"{self.prefix}_\")]\n            for key in keys_to_delete\n        \"Clear all job metadata from session.\"\n```\n\n### WorkflowSession (`workflow_session.ipynb`)\n\n> Namespaced workflow state management within FastHTML sessions.\n\n#### Import\n\n``` python\nfrom cjm_fasthtml_workflows.core.workflow_session import (\n    WorkflowSession\n)\n```\n\n#### Classes\n\n``` python\nclass WorkflowSession:\n    def __init__(\n        self, \n        sess:Any, # FastHTML session object (from route handler parameter)\n        workflow_id:str # Unique identifier for this workflow (e.g., \"registration\", \"checkout\")\n    )\n    \"Manage workflow state within FastHTML sessions with proper namespacing.\"\n    \n    def __init__(\n            self, \n            sess:Any, # FastHTML session object (from route handler parameter)\n            workflow_id:str # Unique identifier for this workflow (e.g., \"registration\", \"checkout\")\n        )\n        \"Initialize workflow session wrapper.\"\n    \n    def set(\n            self, \n            key:str, # Key name within this workflow namespace\n            value:Any # Value to store (must be JSON-serializable for session storage)\n        ) -> None\n        \"Store value in workflow session.\"\n    \n    def get(\n            self, \n            key:str, # Key name within this workflow namespace\n            default:Any=None # Default value if key not found\n        ) -> Any: # Stored value or default\n        \"Retrieve value from workflow session.\"\n    \n    def delete(\n            self, \n            key:str # Key name within this workflow namespace\n        ) -> None\n        \"Remove value from workflow session.\"\n    \n    def clear(self) -> None:\n            \"\"\"Clear all data for this workflow from session.\"\"\"\n            keys_to_delete = [k for k in self.sess.keys() if k.startswith(self._prefix)]\n            for key in keys_to_delete\n        \"Clear all data for this workflow from session.\"\n    \n    def get_all(self) -> Dict[str, Any]: # Dictionary mapping original keys to their values\n            \"\"\"Get all workflow data as a dictionary with original (unprefixed) keys.\"\"\"\n            result = {}\n            prefix_len = len(self._prefix)\n            for key, value in self.sess.items()\n        \"Get all workflow data as a dictionary with original (unprefixed) keys.\"\n    \n    def has(\n            self, \n            key:str # Key name within this workflow namespace\n        ) -> bool: # True if key exists, False otherwise\n        \"Check if key exists in workflow session.\"\n```\n",
    "bugtrack_url": null,
    "license": "Apache Software License 2.0",
    "summary": "Session-based workflow management for FastHTML applications with multi-step state tracking, job metadata storage, and operation deduplication.",
    "version": "0.0.1",
    "project_urls": {
        "Homepage": "https://github.com/cj-mills/cjm-fasthtml-workflows"
    },
    "split_keywords": [
        "nbdev",
        "jupyter",
        "notebook",
        "python"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4d5aa160c4e9ca3d5b56bf131bf3b286309565eafd48abadb5c3ba2bc539ef41",
                "md5": "3ddde8fb123a0fc5e5d40363a78c1d3a",
                "sha256": "a9cf3d2a3ea6104fcc6f10c4575611a5464a72bf3bc004c7c0266b639d3bd03c"
            },
            "downloads": -1,
            "filename": "cjm_fasthtml_workflows-0.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3ddde8fb123a0fc5e5d40363a78c1d3a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 13513,
            "upload_time": "2025-10-24T04:50:14",
            "upload_time_iso_8601": "2025-10-24T04:50:14.511357Z",
            "url": "https://files.pythonhosted.org/packages/4d/5a/a160c4e9ca3d5b56bf131bf3b286309565eafd48abadb5c3ba2bc539ef41/cjm_fasthtml_workflows-0.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3245abc5e82321ee76975da04703bdff6aed8645da6f8387597ef2c5f960a273",
                "md5": "467853fa51f39330cf5602fc244f85fe",
                "sha256": "987eb8d0b9bdb7f10b64c100c7e6a1b578b20278276ee41b1d8e6cc4eb8958d3"
            },
            "downloads": -1,
            "filename": "cjm_fasthtml_workflows-0.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "467853fa51f39330cf5602fc244f85fe",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 13165,
            "upload_time": "2025-10-24T04:50:15",
            "upload_time_iso_8601": "2025-10-24T04:50:15.685946Z",
            "url": "https://files.pythonhosted.org/packages/32/45/abc5e82321ee76975da04703bdff6aed8645da6f8387597ef2c5f960a273/cjm_fasthtml_workflows-0.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-24 04:50:15",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "cj-mills",
    "github_project": "cjm-fasthtml-workflows",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "cjm-fasthtml-workflows"
}
        
Elapsed time: 0.68000s