guiderails


Nameguiderails JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryTutorials-as-Code: Execute and validate Markdown tutorials
upload_time2025-11-02 15:22:32
maintainerNone
docs_urlNone
authorGuideRails Contributors
requires_python>=3.9
licenseApache-2.0
keywords ci documentation markdown testing tutorial
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # GuideRails

**Tutorials-as-Code**: Execute and validate Markdown tutorials to prevent documentation drift.

GuideRails enables you to write interactive, executable tutorials in Markdown that can be:
- ✅ Validated automatically in CI/CD pipelines
- 🚀 Run interactively in guided mode for step-by-step execution
- 📝 Authored with minimal, unobtrusive markup
- 🌐 Executed from local files or web URLs

## Features

- **Markdown-first**: Write tutorials in plain Markdown with minimal annotations
- **Interactive mode**: Step-by-step guided execution with user prompts
- **CI mode**: Automated validation for continuous integration
- **Flexible validation**: Support for exit codes, output matching, regex, and exact comparisons
- **File generation**: Create files directly from code blocks with `.gr-file`
- **Output capture**: Store command output and exit codes in variables
- **Variable substitution**: Use `${VAR}` syntax for continuity across steps
- **Web support**: Load tutorials from URLs with meta tag discovery
- **Developer-friendly**: Simple attribute syntax for marking executable steps
- **Safe by default**: Sandboxed file operations within working directory

> **Note**: As of version 0.2.0, the CLI tool has been renamed from `guiderun` to `guiderails` for consistency with the project name. Please update your scripts and workflows accordingly. See [CHANGELOG.md](CHANGELOG.md) for details.

## Installation

```bash
pip install guiderails
```

Or install from source:

```bash
git clone https://github.com/srbouffard/guiderails.git
cd guiderails
pip install -e .
```

## Quick Start

### 1. Write a Tutorial

Create a Markdown file with GuideRails annotations:

```markdown
# My First Tutorial

## Step 1: Setup {.gr-step #step1}

Let's create a test directory:

\```bash {.gr-run data-mode=exit data-exp=0}
mkdir -p /tmp/test
\```

## Step 2: Verify {.gr-step #step2}

Check that it was created:

\```bash {.gr-run data-mode=contains data-exp="/tmp/test"}
ls -d /tmp/test
\```
```

### 2. Run Interactively

```bash
guiderails exec --guided tutorial.md
```

### 3. Validate in CI

```bash
guiderails exec --ci tutorial.md
```

## Authoring Convention

### Marking Steps

Mark tutorial steps by adding `{.gr-step}` to headings:

```markdown
## Setup Environment {.gr-step #setup}
```

Optional: Add an ID with `#step-id` for reference.

### Marking Executable Code

Mark code blocks for execution with `{.gr-run}`:

```markdown
\```bash {.gr-run data-mode=exit data-exp=0}
echo "Hello, World!"
\```
```

### Validation Modes

GuideRails supports four validation modes:

#### 1. Exit Code (default)
```markdown
\```bash {.gr-run data-mode=exit data-exp=0}
test -f myfile.txt
\```
```

#### 2. Contains
```markdown
\```bash {.gr-run data-mode=contains data-exp="success"}
./my-script.sh
\```
```

#### 3. Regex
```markdown
\```bash {.gr-run data-mode=regex data-exp="Error: [0-9]+"}
./check-status.sh
\```
```

#### 4. Exact Match
```markdown
\```bash {.gr-run data-mode=exact data-exp="Hello, World!"}
echo "Hello, World!"
\```
```

### File-Generating Blocks

Create files directly from your tutorial using `.gr-file` blocks:

```markdown
\```bash {.gr-file data-path="script.sh" data-mode=write data-exec=true}
#!/bin/bash
echo "Hello from GuideRails!"
\```
```

**Attributes:**
- `data-path`: Target file path (relative to working directory)
- `data-mode`: `write` (default, overwrite) or `append`
- `data-exec`: `true` to make file executable (chmod +x)
- `data-template`: `none` (default) or `shell` (enables ${VAR} substitution)
- `data-once`: `true` to skip if file already exists

**Example with variable substitution:**
```markdown
\```python {.gr-file data-path="config.py" data-template=shell}
VERSION = "${APP_VERSION}"
PORT = ${PORT}
\```
```

### Output and Exit Code Capture

Capture command output and exit codes for use in later steps:

```markdown
\```bash {.gr-run data-out-var=GREETING data-code-var=EXIT_STATUS}
echo "Hello, World!"
exit 0
\```
```

**Capture Options:**
- `data-out-var=VARNAME`: Store combined stdout/stderr in a variable
- `data-out-file=path`: Write stdout to a file
- `data-code-var=VARNAME`: Store exit code in a variable

### Variable Substitution

Use captured variables in subsequent blocks with `${VAR}` syntax:

```markdown
\```bash {.gr-run data-out-var=NAME}
echo -n "Alice"
\```

\```bash {.gr-run data-mode=contains data-exp="Hello, Alice"}
echo "Hello, ${NAME}"
\```
```

Variables are automatically substituted when:
- Running `.gr-run` code blocks (command is substituted before execution)
- Writing `.gr-file` blocks with `data-template=shell`

**Safety:** File paths are sandboxed to the working directory by default. Absolute paths and `..` traversal are rejected unless explicitly allowed with CLI flags.

### Additional Options

- **Timeout**: `data-timeout=60` (seconds, default: 30)
- **Working Directory**: `data-workdir=/tmp`
- **Continue on Error**: `data-continue-on-error=true`

Example:

```markdown
\```bash {.gr-run data-mode=exit data-exp=0 data-timeout=60 data-workdir=/tmp}
long-running-command
\```
```

## CLI Usage

### Commands

#### `guiderails exec`

Execute a tutorial:

```bash
guiderails exec [OPTIONS] TUTORIAL
```

**Basic Options:**
- `--guided`: Run in interactive mode (shows each step, prompts for execution)
- `--ci`: Run in CI mode (non-interactive, fails fast, defaults to quiet output)
- `--working-dir, -w PATH`: Set base working directory for execution

**Verbosity Options:**
- `--verbosity LEVEL`: Set verbosity level (`quiet`, `normal`, `verbose`, `debug`)
- `--quiet, -q`: Quiet mode (minimal output, alias for `--verbosity=quiet`)
- `--verbose, -v`: Increase verbosity (`-v` for verbose, `-vv` or `-vvv` for debug)
- `--debug`: Debug mode (maximum verbosity, alias for `--verbosity=debug`)

**Output Toggle Options:**
- `--show-commands / --no-show-commands`: Show/hide commands being executed
- `--show-substituted / --no-show-substituted`: Show/hide variable substitution hints
- `--show-expected / --no-show-expected`: Show/hide expected validation values
- `--show-captured / --no-show-captured`: Show/hide captured variable information
- `--timestamps / --no-timestamps`: Show/hide execution timestamps
- `--step-banners / --no-step-banners`: Show/hide step banners and boxes
- `--previews / --no-previews`: Show/hide command previews and extra details

**Output Format:**
- `--output FORMAT`: Output format (`text` or `jsonl`)

**Verbosity Level Behaviors:**

- **quiet**: Shows only step titles, commands (if `--show-commands`), command output, and PASS/FAIL status. Minimal decoration.
- **normal** (default): Adds step banners, content boxes, and basic execution results.
- **verbose**: Adds command previews, substitution details, timing information, and working directory.
- **debug**: Adds internal diagnostics, parser events, and variable table state.

**Tutorial Sources:**
- Local file: `./tutorial.md`
- Direct URL: `https://example.com/tutorial.md`
- HTML page with meta tag: `https://example.com/tutorial.html`

### Examples

Run locally with interaction:
```bash
guiderails exec --guided examples/getting-started.md
```

Validate in CI (defaults to quiet output):
```bash
guiderails exec --ci examples/getting-started.md
```

Run with verbose output:
```bash
guiderails exec --ci --verbose examples/getting-started.md
```

Run in quiet mode with no command display:
```bash
guiderails exec --ci --quiet --no-show-commands examples/getting-started.md
```

Run from URL:
```bash
guiderails exec --guided https://example.com/tutorial.md
```

From HTML with meta tag:
```bash
guiderails exec --guided https://example.com/tutorial.html
```

The HTML page should include:
```html
<meta name="guiderails:source" content="https://example.com/raw/tutorial.md">
```

### Configuration

GuideRails supports configuration through multiple sources with the following precedence:

**1. Command-line flags** (highest priority)  
**2. Environment variables**  
**3. Configuration file** (`guiderails.yml`)  
**4. Built-in defaults** (lowest priority)

#### Environment Variables

```bash
# Verbosity level
export GUIDERAILS_VERBOSITY=quiet|normal|verbose|debug

# Output toggles
export GUIDERAILS_SHOW_COMMANDS=true|false
export GUIDERAILS_SHOW_SUBSTITUTED=true|false
export GUIDERAILS_SHOW_EXPECTED=true|false
export GUIDERAILS_SHOW_CAPTURED=true|false
export GUIDERAILS_TIMESTAMPS=true|false
export GUIDERAILS_STEP_BANNERS=true|false
export GUIDERAILS_PREVIEWS=true|false
```

#### Configuration File

Create a `guiderails.yml` file in your project root:

```yaml
# Verbosity level (quiet, normal, verbose, debug)
verbosity: normal

# Output toggles
show_commands: true
show_substituted: false
show_expected: true
show_captured: true
show_timestamps: false
show_step_banners: true
show_previews: false
```

GuideRails will search for `guiderails.yml` in the current directory and parent directories.

## CI Integration

### GitHub Actions

Create `.github/workflows/validate-tutorials.yml`:

```yaml
name: Validate Tutorials

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  validate:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.11'
    
    - name: Install GuideRails
      run: pip install guiderails
    
    - name: Validate tutorials
      run: |
        guiderails exec --ci docs/tutorial.md
```

## Examples

See the [examples](examples/) directory for sample tutorials:

- [getting-started.md](examples/getting-started.md) - Basic GuideRails tutorial
- [file-generation-and-capture.md](examples/file-generation-and-capture.md) - File generation, output capture, and variable substitution
- [tutorial-page.html](examples/tutorial-page.html) - HTML page with meta tag

## Development

### Setup

```bash
# Clone the repository
git clone https://github.com/srbouffard/guiderails.git
cd guiderails

# Install in development mode
pip install -e ".[dev]"
```

### Running Tests

```bash
pytest tests/ -v
```

### Code Formatting

```bash
black src/ tests/
ruff check src/
```

## Roadmap

- [ ] Support for reStructuredText (reST) tutorials
- [ ] Environment variable support
- [ ] Parallel execution of independent steps
- [ ] Step dependencies and conditional execution
- [ ] Plugin system for custom validators
- [ ] Web UI for tutorial execution and monitoring

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT License - see LICENSE file for details.

## Acknowledgments

Inspired by the need for validated, executable documentation that stays in sync with code.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "guiderails",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "ci, documentation, markdown, testing, tutorial",
    "author": "GuideRails Contributors",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/ac/9e/3a9f3421924baab8c3d6202bfb0ebfba778d36d7d8affe4cb45fc171bb61/guiderails-0.1.0.tar.gz",
    "platform": null,
    "description": "# GuideRails\n\n**Tutorials-as-Code**: Execute and validate Markdown tutorials to prevent documentation drift.\n\nGuideRails enables you to write interactive, executable tutorials in Markdown that can be:\n- \u2705 Validated automatically in CI/CD pipelines\n- \ud83d\ude80 Run interactively in guided mode for step-by-step execution\n- \ud83d\udcdd Authored with minimal, unobtrusive markup\n- \ud83c\udf10 Executed from local files or web URLs\n\n## Features\n\n- **Markdown-first**: Write tutorials in plain Markdown with minimal annotations\n- **Interactive mode**: Step-by-step guided execution with user prompts\n- **CI mode**: Automated validation for continuous integration\n- **Flexible validation**: Support for exit codes, output matching, regex, and exact comparisons\n- **File generation**: Create files directly from code blocks with `.gr-file`\n- **Output capture**: Store command output and exit codes in variables\n- **Variable substitution**: Use `${VAR}` syntax for continuity across steps\n- **Web support**: Load tutorials from URLs with meta tag discovery\n- **Developer-friendly**: Simple attribute syntax for marking executable steps\n- **Safe by default**: Sandboxed file operations within working directory\n\n> **Note**: As of version 0.2.0, the CLI tool has been renamed from `guiderun` to `guiderails` for consistency with the project name. Please update your scripts and workflows accordingly. See [CHANGELOG.md](CHANGELOG.md) for details.\n\n## Installation\n\n```bash\npip install guiderails\n```\n\nOr install from source:\n\n```bash\ngit clone https://github.com/srbouffard/guiderails.git\ncd guiderails\npip install -e .\n```\n\n## Quick Start\n\n### 1. Write a Tutorial\n\nCreate a Markdown file with GuideRails annotations:\n\n```markdown\n# My First Tutorial\n\n## Step 1: Setup {.gr-step #step1}\n\nLet's create a test directory:\n\n\\```bash {.gr-run data-mode=exit data-exp=0}\nmkdir -p /tmp/test\n\\```\n\n## Step 2: Verify {.gr-step #step2}\n\nCheck that it was created:\n\n\\```bash {.gr-run data-mode=contains data-exp=\"/tmp/test\"}\nls -d /tmp/test\n\\```\n```\n\n### 2. Run Interactively\n\n```bash\nguiderails exec --guided tutorial.md\n```\n\n### 3. Validate in CI\n\n```bash\nguiderails exec --ci tutorial.md\n```\n\n## Authoring Convention\n\n### Marking Steps\n\nMark tutorial steps by adding `{.gr-step}` to headings:\n\n```markdown\n## Setup Environment {.gr-step #setup}\n```\n\nOptional: Add an ID with `#step-id` for reference.\n\n### Marking Executable Code\n\nMark code blocks for execution with `{.gr-run}`:\n\n```markdown\n\\```bash {.gr-run data-mode=exit data-exp=0}\necho \"Hello, World!\"\n\\```\n```\n\n### Validation Modes\n\nGuideRails supports four validation modes:\n\n#### 1. Exit Code (default)\n```markdown\n\\```bash {.gr-run data-mode=exit data-exp=0}\ntest -f myfile.txt\n\\```\n```\n\n#### 2. Contains\n```markdown\n\\```bash {.gr-run data-mode=contains data-exp=\"success\"}\n./my-script.sh\n\\```\n```\n\n#### 3. Regex\n```markdown\n\\```bash {.gr-run data-mode=regex data-exp=\"Error: [0-9]+\"}\n./check-status.sh\n\\```\n```\n\n#### 4. Exact Match\n```markdown\n\\```bash {.gr-run data-mode=exact data-exp=\"Hello, World!\"}\necho \"Hello, World!\"\n\\```\n```\n\n### File-Generating Blocks\n\nCreate files directly from your tutorial using `.gr-file` blocks:\n\n```markdown\n\\```bash {.gr-file data-path=\"script.sh\" data-mode=write data-exec=true}\n#!/bin/bash\necho \"Hello from GuideRails!\"\n\\```\n```\n\n**Attributes:**\n- `data-path`: Target file path (relative to working directory)\n- `data-mode`: `write` (default, overwrite) or `append`\n- `data-exec`: `true` to make file executable (chmod +x)\n- `data-template`: `none` (default) or `shell` (enables ${VAR} substitution)\n- `data-once`: `true` to skip if file already exists\n\n**Example with variable substitution:**\n```markdown\n\\```python {.gr-file data-path=\"config.py\" data-template=shell}\nVERSION = \"${APP_VERSION}\"\nPORT = ${PORT}\n\\```\n```\n\n### Output and Exit Code Capture\n\nCapture command output and exit codes for use in later steps:\n\n```markdown\n\\```bash {.gr-run data-out-var=GREETING data-code-var=EXIT_STATUS}\necho \"Hello, World!\"\nexit 0\n\\```\n```\n\n**Capture Options:**\n- `data-out-var=VARNAME`: Store combined stdout/stderr in a variable\n- `data-out-file=path`: Write stdout to a file\n- `data-code-var=VARNAME`: Store exit code in a variable\n\n### Variable Substitution\n\nUse captured variables in subsequent blocks with `${VAR}` syntax:\n\n```markdown\n\\```bash {.gr-run data-out-var=NAME}\necho -n \"Alice\"\n\\```\n\n\\```bash {.gr-run data-mode=contains data-exp=\"Hello, Alice\"}\necho \"Hello, ${NAME}\"\n\\```\n```\n\nVariables are automatically substituted when:\n- Running `.gr-run` code blocks (command is substituted before execution)\n- Writing `.gr-file` blocks with `data-template=shell`\n\n**Safety:** File paths are sandboxed to the working directory by default. Absolute paths and `..` traversal are rejected unless explicitly allowed with CLI flags.\n\n### Additional Options\n\n- **Timeout**: `data-timeout=60` (seconds, default: 30)\n- **Working Directory**: `data-workdir=/tmp`\n- **Continue on Error**: `data-continue-on-error=true`\n\nExample:\n\n```markdown\n\\```bash {.gr-run data-mode=exit data-exp=0 data-timeout=60 data-workdir=/tmp}\nlong-running-command\n\\```\n```\n\n## CLI Usage\n\n### Commands\n\n#### `guiderails exec`\n\nExecute a tutorial:\n\n```bash\nguiderails exec [OPTIONS] TUTORIAL\n```\n\n**Basic Options:**\n- `--guided`: Run in interactive mode (shows each step, prompts for execution)\n- `--ci`: Run in CI mode (non-interactive, fails fast, defaults to quiet output)\n- `--working-dir, -w PATH`: Set base working directory for execution\n\n**Verbosity Options:**\n- `--verbosity LEVEL`: Set verbosity level (`quiet`, `normal`, `verbose`, `debug`)\n- `--quiet, -q`: Quiet mode (minimal output, alias for `--verbosity=quiet`)\n- `--verbose, -v`: Increase verbosity (`-v` for verbose, `-vv` or `-vvv` for debug)\n- `--debug`: Debug mode (maximum verbosity, alias for `--verbosity=debug`)\n\n**Output Toggle Options:**\n- `--show-commands / --no-show-commands`: Show/hide commands being executed\n- `--show-substituted / --no-show-substituted`: Show/hide variable substitution hints\n- `--show-expected / --no-show-expected`: Show/hide expected validation values\n- `--show-captured / --no-show-captured`: Show/hide captured variable information\n- `--timestamps / --no-timestamps`: Show/hide execution timestamps\n- `--step-banners / --no-step-banners`: Show/hide step banners and boxes\n- `--previews / --no-previews`: Show/hide command previews and extra details\n\n**Output Format:**\n- `--output FORMAT`: Output format (`text` or `jsonl`)\n\n**Verbosity Level Behaviors:**\n\n- **quiet**: Shows only step titles, commands (if `--show-commands`), command output, and PASS/FAIL status. Minimal decoration.\n- **normal** (default): Adds step banners, content boxes, and basic execution results.\n- **verbose**: Adds command previews, substitution details, timing information, and working directory.\n- **debug**: Adds internal diagnostics, parser events, and variable table state.\n\n**Tutorial Sources:**\n- Local file: `./tutorial.md`\n- Direct URL: `https://example.com/tutorial.md`\n- HTML page with meta tag: `https://example.com/tutorial.html`\n\n### Examples\n\nRun locally with interaction:\n```bash\nguiderails exec --guided examples/getting-started.md\n```\n\nValidate in CI (defaults to quiet output):\n```bash\nguiderails exec --ci examples/getting-started.md\n```\n\nRun with verbose output:\n```bash\nguiderails exec --ci --verbose examples/getting-started.md\n```\n\nRun in quiet mode with no command display:\n```bash\nguiderails exec --ci --quiet --no-show-commands examples/getting-started.md\n```\n\nRun from URL:\n```bash\nguiderails exec --guided https://example.com/tutorial.md\n```\n\nFrom HTML with meta tag:\n```bash\nguiderails exec --guided https://example.com/tutorial.html\n```\n\nThe HTML page should include:\n```html\n<meta name=\"guiderails:source\" content=\"https://example.com/raw/tutorial.md\">\n```\n\n### Configuration\n\nGuideRails supports configuration through multiple sources with the following precedence:\n\n**1. Command-line flags** (highest priority)  \n**2. Environment variables**  \n**3. Configuration file** (`guiderails.yml`)  \n**4. Built-in defaults** (lowest priority)\n\n#### Environment Variables\n\n```bash\n# Verbosity level\nexport GUIDERAILS_VERBOSITY=quiet|normal|verbose|debug\n\n# Output toggles\nexport GUIDERAILS_SHOW_COMMANDS=true|false\nexport GUIDERAILS_SHOW_SUBSTITUTED=true|false\nexport GUIDERAILS_SHOW_EXPECTED=true|false\nexport GUIDERAILS_SHOW_CAPTURED=true|false\nexport GUIDERAILS_TIMESTAMPS=true|false\nexport GUIDERAILS_STEP_BANNERS=true|false\nexport GUIDERAILS_PREVIEWS=true|false\n```\n\n#### Configuration File\n\nCreate a `guiderails.yml` file in your project root:\n\n```yaml\n# Verbosity level (quiet, normal, verbose, debug)\nverbosity: normal\n\n# Output toggles\nshow_commands: true\nshow_substituted: false\nshow_expected: true\nshow_captured: true\nshow_timestamps: false\nshow_step_banners: true\nshow_previews: false\n```\n\nGuideRails will search for `guiderails.yml` in the current directory and parent directories.\n\n## CI Integration\n\n### GitHub Actions\n\nCreate `.github/workflows/validate-tutorials.yml`:\n\n```yaml\nname: Validate Tutorials\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  validate:\n    runs-on: ubuntu-latest\n    \n    steps:\n    - uses: actions/checkout@v3\n    \n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: '3.11'\n    \n    - name: Install GuideRails\n      run: pip install guiderails\n    \n    - name: Validate tutorials\n      run: |\n        guiderails exec --ci docs/tutorial.md\n```\n\n## Examples\n\nSee the [examples](examples/) directory for sample tutorials:\n\n- [getting-started.md](examples/getting-started.md) - Basic GuideRails tutorial\n- [file-generation-and-capture.md](examples/file-generation-and-capture.md) - File generation, output capture, and variable substitution\n- [tutorial-page.html](examples/tutorial-page.html) - HTML page with meta tag\n\n## Development\n\n### Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/srbouffard/guiderails.git\ncd guiderails\n\n# Install in development mode\npip install -e \".[dev]\"\n```\n\n### Running Tests\n\n```bash\npytest tests/ -v\n```\n\n### Code Formatting\n\n```bash\nblack src/ tests/\nruff check src/\n```\n\n## Roadmap\n\n- [ ] Support for reStructuredText (reST) tutorials\n- [ ] Environment variable support\n- [ ] Parallel execution of independent steps\n- [ ] Step dependencies and conditional execution\n- [ ] Plugin system for custom validators\n- [ ] Web UI for tutorial execution and monitoring\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nMIT License - see LICENSE file for details.\n\n## Acknowledgments\n\nInspired by the need for validated, executable documentation that stays in sync with code.\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Tutorials-as-Code: Execute and validate Markdown tutorials",
    "version": "0.1.0",
    "project_urls": {
        "Documentation": "https://github.com/srbouffard/guiderails#readme",
        "Homepage": "https://github.com/srbouffard/guiderails",
        "Issues": "https://github.com/srbouffard/guiderails/issues",
        "Repository": "https://github.com/srbouffard/guiderails"
    },
    "split_keywords": [
        "ci",
        " documentation",
        " markdown",
        " testing",
        " tutorial"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e00390717722d3ba5401d9e846f87802cc9ff219277bf7ab241b24a280cbaa10",
                "md5": "58089c0f7f5a428b92e0f0bad9eeaf46",
                "sha256": "62151ebba591c6266ff5d7ece985e878b05f2b00c627fde0ed42b9fdac509ba8"
            },
            "downloads": -1,
            "filename": "guiderails-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "58089c0f7f5a428b92e0f0bad9eeaf46",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 25591,
            "upload_time": "2025-11-02T15:22:31",
            "upload_time_iso_8601": "2025-11-02T15:22:31.604824Z",
            "url": "https://files.pythonhosted.org/packages/e0/03/90717722d3ba5401d9e846f87802cc9ff219277bf7ab241b24a280cbaa10/guiderails-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ac9e3a9f3421924baab8c3d6202bfb0ebfba778d36d7d8affe4cb45fc171bb61",
                "md5": "6ad6b7eff0d74b1f84e82aabcfc91e46",
                "sha256": "d40637ffaf48d56e9e1bfaf8660c84bf8e5d1e57e6bae3fc3d7cee34c9bc6a04"
            },
            "downloads": -1,
            "filename": "guiderails-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "6ad6b7eff0d74b1f84e82aabcfc91e46",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 37348,
            "upload_time": "2025-11-02T15:22:32",
            "upload_time_iso_8601": "2025-11-02T15:22:32.698163Z",
            "url": "https://files.pythonhosted.org/packages/ac/9e/3a9f3421924baab8c3d6202bfb0ebfba778d36d7d8affe4cb45fc171bb61/guiderails-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-11-02 15:22:32",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "srbouffard",
    "github_project": "guiderails#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "guiderails"
}
        
Elapsed time: 1.54986s