# 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"
}