beatrica


Namebeatrica JSON
Version 0.0.12 PyPI version JSON
download
home_pagehttps://github.com/chigwell/beatrica
SummaryBeatrica is a tool for code review automation using large language models.
upload_time2024-04-15 09:45:29
maintainerNone
docs_urlNone
authorEugene Evstafev
requires_python>=3.6
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![PyPI version](https://badge.fury.io/py/beatrica.svg)](https://badge.fury.io/py/beatrica)
[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
[![Downloads](https://static.pepy.tech/badge/beatrica)](https://pepy.tech/project/beatrica)

# Beatrica

`beatrica` is an innovative Python package that utilizes Large Language Models (LLMs) such as OpenAI's GPT and MistralAI for automating code review processes. It provides insights by analyzing differences between the current active branch and a specified base branch, processing code changes, and generating reviews to improve code quality and collaboration.

## Installation

Integrate cutting-edge code review automation into your workflow by installing `beatrica` using pip:

```bash
pip install beatrica
```

Certainly! Here's how you can configure the API key for Beatrica via a parameter or environment variable:

## Configuring the API Key

For Beatrica to communicate with LLM services like OpenAI or MistralAI, an API key is required. You can provide this API key in two ways:

### Using an Environment Variable

Set the API key as an environment variable before running Beatrica. This method is recommended for keeping your API key secure and not directly visible in command line history.

For Unix-like systems (Linux/macOS):

```bash
export LLM_API_KEY='your_api_key_here'
```

For Windows Command Prompt:

```cmd
set LLM_API_KEY=your_api_key_here
```

For Windows PowerShell:

```powershell
$env:LLM_API_KEY='your_api_key_here'
```

After setting the environment variable, you can run Beatrica without explicitly passing the API key in the command:

```bash
beatrica --base_branch=main --llm_type=openai
```

### Using the Command Line Argument

If you prefer or need to, you can directly pass the API key as a command line argument. However, be mindful of security implications such as exposing your API key in shell history or logs.

```bash
beatrica --base_branch=main --llm_type=openai --api_key='your_api_key_here'
```

Choose the method that best suits your workflow and security practices.


## Usage

Beatrica offers a CLI interface for specifying a base branch and comparing its differences with the current active branch, generating insightful reviews. Here are examples showcasing its usage with various configurations:

### Basic Usage

To analyze code differences with the `main` branch using the default OpenAI's GPT-4 model, use:

```bash
beatrica --base_branch=main --llm_type=openai
```

This command compares the current active branch against the `main` branch.

### Specifying LLM Type and Model

For a tailored review, specify the LLM (`openai` or `mistralai`) and model name:

```bash
beatrica --base_branch=main --llm_type=mistralai --model_name=mistral-large-latest
```

### Advanced Configuration

Customize further by specifying the API key (from an environment variable or directly), the maximum tokens for the LLM response, and the output format:

```bash
beatrica --base_branch=develop --llm_type=openai --model_name=gpt-4-0125-preview --api_key=YOUR_API_KEY --max_tokens=1000 --output=beatrica_review.txt
```

## Example Output

An example output of Beatrica reviewing changes between the current active branch and the `main` branch is:

```
Analyzing differences with base branch main using OpenAI GPT-4-0125-preview...
Tracking changes...
✅  Changes tracked.
✅  Found 2 changes.
Initializing language model...
Generating code embeddings...
✅  Embeddings generated.
Checking if Beatrica can review the changes...
✅ 1 changes found for review.
Starting the review process...
Reviewing changes ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:34
✅  Review process completed.
Aggregating reviews...
Aggregating reviews ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:20
✅  Reviews aggregated.
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Commit ID                                ┃ Change Description                                              ┃ Review                                             ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ e08642828750dc15786c1166898fe30fa500c17c │ Added comment for test_generate_crsid_with_empty_first function │ The commit message "add comment for                │
│                                          │                                                                 │ test_generate_crsid_with_empty_first" could be     │
│                                          │                                                                 │ more descriptive to convey the purpose and         │
│                                          │                                                                 │ importance of the added comment. A suggestion for  │
│                                          │                                                                 │ a more informative commit message is "Explain test │
│                                          │                                                                 │ purpose for CRSID generation with empty first name │
│                                          │                                                                 │ in comments". This provides clear context on the   │
│                                          │                                                                 │ change's significance. While adding a comment to   │
│                                          │                                                                 │ the test function is a step in the right direction │
│                                          │                                                                 │ for code clarity, the comment itself could be more │
│                                          │                                                                 │ descriptive. It should explain not just what is    │
│                                          │                                                                 │ being tested (generate_crsid with an empty first   │
│                                          │                                                                 │ name), but also the expected outcome or behavior   │
│                                          │                                                                 │ of the function under this condition. This would   │
│                                          │                                                                 │ help in understanding the test's intention without │
│                                          │                                                                 │ diving into the implementation details. The test   │
│                                          │                                                                 │ function "test_generate_crsid_with_empty_first()"  │
│                                          │                                                                 │ could have a more descriptive name that reflects   │
│                                          │                                                                 │ the expected behavior or outcome of the test, such │
│                                          │                                                                 │ as                                                 │
│                                          │                                                                 │ "test_crsid_generation_fails_with_empty_first_nam… │
│                                          │                                                                 │ or                                                 │
│                                          │                                                                 │ "test_crsid_generation_handles_empty_first_name_g… │
│                                          │                                                                 │ depending on the expected behavior. This makes it  │
│                                          │                                                                 │ easier to understand the test's purpose at a       │
│                                          │                                                                 │ glance. It is recommended to include input         │
│                                          │                                                                 │ validation in the generate_crsid function to       │
│                                          │                                                                 │ ensure that the arguments passed (first_name and   │
│                                          │                                                                 │ last_name) are strings. This would prevent         │
│                                          │                                                                 │ potential runtime errors and make the function     │
│                                          │                                                                 │ more robust against incorrect usage. Considering   │
│                                          │                                                                 │ the importance of ensuring uniqueness in CRSID     │
│                                          │                                                                 │ generation, the function should include a          │
│                                          │                                                                 │ mechanism to handle scenarios where uniqueness     │
│                                          │                                                                 │ cannot be guaranteed. This could be due to         │
│                                          │                                                                 │ multiple individuals sharing the same first and    │
│                                          │                                                                 │ last names. Implementing a strategy to handle such │
│                                          │                                                                 │ cases gracefully would improve the function's      │
│                                          │                                                                 │ reliability. Adding additional test cases to cover │
│                                          │                                                                 │ edge scenarios, such as both first and last names  │
│                                          │                                                                 │ being empty or containing special characters or    │
│                                          │                                                                 │ numbers, would enhance the test suite's            │
│                                          │                                                                 │ comprehensiveness. This ensures that the function  │
│                                          │                                                                 │ behaves as expected under various inputs.          │
└──────────────────────────────────────────┴─────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────┘
```

## Features

- Analyzes differences between the current active branch and a specified base branch.
- Integration with major LLMs for code review: OpenAI and MistralAI.
- Customizable for different base branches, LLMs, and output formats.
- Simplified CLI for ease of use.

## Contributing

Contributions, issues, and

 feature requests are welcome. For more information, check our [issues page](https://github.com/chigwell/beatrica/issues).

## License

`beatrica` is made available under the [MIT License](https://choosealicense.com/licenses/mit/).

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/chigwell/beatrica",
    "name": "beatrica",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": null,
    "author": "Eugene Evstafev",
    "author_email": "chigwel@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/5e/ca/dbecf5a715bc17b8c5c76e6ee3e96210d6f716f0e0a8cc88156bf35ce357/beatrica-0.0.12.tar.gz",
    "platform": null,
    "description": "[![PyPI version](https://badge.fury.io/py/beatrica.svg)](https://badge.fury.io/py/beatrica)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![Downloads](https://static.pepy.tech/badge/beatrica)](https://pepy.tech/project/beatrica)\n\n# Beatrica\n\n`beatrica` is an innovative Python package that utilizes Large Language Models (LLMs) such as OpenAI's GPT and MistralAI for automating code review processes. It provides insights by analyzing differences between the current active branch and a specified base branch, processing code changes, and generating reviews to improve code quality and collaboration.\n\n## Installation\n\nIntegrate cutting-edge code review automation into your workflow by installing `beatrica` using pip:\n\n```bash\npip install beatrica\n```\n\nCertainly! Here's how you can configure the API key for Beatrica via a parameter or environment variable:\n\n## Configuring the API Key\n\nFor Beatrica to communicate with LLM services like OpenAI or MistralAI, an API key is required. You can provide this API key in two ways:\n\n### Using an Environment Variable\n\nSet the API key as an environment variable before running Beatrica. This method is recommended for keeping your API key secure and not directly visible in command line history.\n\nFor Unix-like systems (Linux/macOS):\n\n```bash\nexport LLM_API_KEY='your_api_key_here'\n```\n\nFor Windows Command Prompt:\n\n```cmd\nset LLM_API_KEY=your_api_key_here\n```\n\nFor Windows PowerShell:\n\n```powershell\n$env:LLM_API_KEY='your_api_key_here'\n```\n\nAfter setting the environment variable, you can run Beatrica without explicitly passing the API key in the command:\n\n```bash\nbeatrica --base_branch=main --llm_type=openai\n```\n\n### Using the Command Line Argument\n\nIf you prefer or need to, you can directly pass the API key as a command line argument. However, be mindful of security implications such as exposing your API key in shell history or logs.\n\n```bash\nbeatrica --base_branch=main --llm_type=openai --api_key='your_api_key_here'\n```\n\nChoose the method that best suits your workflow and security practices.\n\n\n## Usage\n\nBeatrica offers a CLI interface for specifying a base branch and comparing its differences with the current active branch, generating insightful reviews. Here are examples showcasing its usage with various configurations:\n\n### Basic Usage\n\nTo analyze code differences with the `main` branch using the default OpenAI's GPT-4 model, use:\n\n```bash\nbeatrica --base_branch=main --llm_type=openai\n```\n\nThis command compares the current active branch against the `main` branch.\n\n### Specifying LLM Type and Model\n\nFor a tailored review, specify the LLM (`openai` or `mistralai`) and model name:\n\n```bash\nbeatrica --base_branch=main --llm_type=mistralai --model_name=mistral-large-latest\n```\n\n### Advanced Configuration\n\nCustomize further by specifying the API key (from an environment variable or directly), the maximum tokens for the LLM response, and the output format:\n\n```bash\nbeatrica --base_branch=develop --llm_type=openai --model_name=gpt-4-0125-preview --api_key=YOUR_API_KEY --max_tokens=1000 --output=beatrica_review.txt\n```\n\n## Example Output\n\nAn example output of Beatrica reviewing changes between the current active branch and the `main` branch is:\n\n```\nAnalyzing differences with base branch main using OpenAI GPT-4-0125-preview...\nTracking changes...\n\u2705  Changes tracked.\n\u2705  Found 2 changes.\nInitializing language model...\nGenerating code embeddings...\n\u2705  Embeddings generated.\nChecking if Beatrica can review the changes...\n\u2705 1 changes found for review.\nStarting the review process...\nReviewing changes \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:34\n\u2705  Review process completed.\nAggregating reviews...\nAggregating reviews \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:20\n\u2705  Reviews aggregated.\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 Commit ID                                \u2503 Change Description                                              \u2503 Review                                             \u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 e08642828750dc15786c1166898fe30fa500c17c \u2502 Added comment for test_generate_crsid_with_empty_first function \u2502 The commit message \"add comment for                \u2502\n\u2502                                          \u2502                                                                 \u2502 test_generate_crsid_with_empty_first\" could be     \u2502\n\u2502                                          \u2502                                                                 \u2502 more descriptive to convey the purpose and         \u2502\n\u2502                                          \u2502                                                                 \u2502 importance of the added comment. A suggestion for  \u2502\n\u2502                                          \u2502                                                                 \u2502 a more informative commit message is \"Explain test \u2502\n\u2502                                          \u2502                                                                 \u2502 purpose for CRSID generation with empty first name \u2502\n\u2502                                          \u2502                                                                 \u2502 in comments\". This provides clear context on the   \u2502\n\u2502                                          \u2502                                                                 \u2502 change's significance. While adding a comment to   \u2502\n\u2502                                          \u2502                                                                 \u2502 the test function is a step in the right direction \u2502\n\u2502                                          \u2502                                                                 \u2502 for code clarity, the comment itself could be more \u2502\n\u2502                                          \u2502                                                                 \u2502 descriptive. It should explain not just what is    \u2502\n\u2502                                          \u2502                                                                 \u2502 being tested (generate_crsid with an empty first   \u2502\n\u2502                                          \u2502                                                                 \u2502 name), but also the expected outcome or behavior   \u2502\n\u2502                                          \u2502                                                                 \u2502 of the function under this condition. This would   \u2502\n\u2502                                          \u2502                                                                 \u2502 help in understanding the test's intention without \u2502\n\u2502                                          \u2502                                                                 \u2502 diving into the implementation details. The test   \u2502\n\u2502                                          \u2502                                                                 \u2502 function \"test_generate_crsid_with_empty_first()\"  \u2502\n\u2502                                          \u2502                                                                 \u2502 could have a more descriptive name that reflects   \u2502\n\u2502                                          \u2502                                                                 \u2502 the expected behavior or outcome of the test, such \u2502\n\u2502                                          \u2502                                                                 \u2502 as                                                 \u2502\n\u2502                                          \u2502                                                                 \u2502 \"test_crsid_generation_fails_with_empty_first_nam\u2026 \u2502\n\u2502                                          \u2502                                                                 \u2502 or                                                 \u2502\n\u2502                                          \u2502                                                                 \u2502 \"test_crsid_generation_handles_empty_first_name_g\u2026 \u2502\n\u2502                                          \u2502                                                                 \u2502 depending on the expected behavior. This makes it  \u2502\n\u2502                                          \u2502                                                                 \u2502 easier to understand the test's purpose at a       \u2502\n\u2502                                          \u2502                                                                 \u2502 glance. It is recommended to include input         \u2502\n\u2502                                          \u2502                                                                 \u2502 validation in the generate_crsid function to       \u2502\n\u2502                                          \u2502                                                                 \u2502 ensure that the arguments passed (first_name and   \u2502\n\u2502                                          \u2502                                                                 \u2502 last_name) are strings. This would prevent         \u2502\n\u2502                                          \u2502                                                                 \u2502 potential runtime errors and make the function     \u2502\n\u2502                                          \u2502                                                                 \u2502 more robust against incorrect usage. Considering   \u2502\n\u2502                                          \u2502                                                                 \u2502 the importance of ensuring uniqueness in CRSID     \u2502\n\u2502                                          \u2502                                                                 \u2502 generation, the function should include a          \u2502\n\u2502                                          \u2502                                                                 \u2502 mechanism to handle scenarios where uniqueness     \u2502\n\u2502                                          \u2502                                                                 \u2502 cannot be guaranteed. This could be due to         \u2502\n\u2502                                          \u2502                                                                 \u2502 multiple individuals sharing the same first and    \u2502\n\u2502                                          \u2502                                                                 \u2502 last names. Implementing a strategy to handle such \u2502\n\u2502                                          \u2502                                                                 \u2502 cases gracefully would improve the function's      \u2502\n\u2502                                          \u2502                                                                 \u2502 reliability. Adding additional test cases to cover \u2502\n\u2502                                          \u2502                                                                 \u2502 edge scenarios, such as both first and last names  \u2502\n\u2502                                          \u2502                                                                 \u2502 being empty or containing special characters or    \u2502\n\u2502                                          \u2502                                                                 \u2502 numbers, would enhance the test suite's            \u2502\n\u2502                                          \u2502                                                                 \u2502 comprehensiveness. This ensures that the function  \u2502\n\u2502                                          \u2502                                                                 \u2502 behaves as expected under various inputs.          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n## Features\n\n- Analyzes differences between the current active branch and a specified base branch.\n- Integration with major LLMs for code review: OpenAI and MistralAI.\n- Customizable for different base branches, LLMs, and output formats.\n- Simplified CLI for ease of use.\n\n## Contributing\n\nContributions, issues, and\n\n feature requests are welcome. For more information, check our [issues page](https://github.com/chigwell/beatrica/issues).\n\n## License\n\n`beatrica` is made available under the [MIT License](https://choosealicense.com/licenses/mit/).\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Beatrica is a tool for code review automation using large language models.",
    "version": "0.0.12",
    "project_urls": {
        "Homepage": "https://github.com/chigwell/beatrica"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f436ad54b40f2e2d55731c148bf5633fd4534d9efed42c6e0c1d63c3b2ac13ec",
                "md5": "068e939a7be819d095971030fe05146c",
                "sha256": "9201afbc15f6e100bcda700b7f780cc57e9623c64ed7ea821ed0b814d7851c8e"
            },
            "downloads": -1,
            "filename": "beatrica-0.0.12-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "068e939a7be819d095971030fe05146c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 20590,
            "upload_time": "2024-04-15T09:45:24",
            "upload_time_iso_8601": "2024-04-15T09:45:24.996218Z",
            "url": "https://files.pythonhosted.org/packages/f4/36/ad54b40f2e2d55731c148bf5633fd4534d9efed42c6e0c1d63c3b2ac13ec/beatrica-0.0.12-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5ecadbecf5a715bc17b8c5c76e6ee3e96210d6f716f0e0a8cc88156bf35ce357",
                "md5": "a81cd2eb024e09d017920a4d17c42753",
                "sha256": "358a1215b18413253ba9d98520bbf11055d86cf77dd015fbe2b4f8f5104d2c31"
            },
            "downloads": -1,
            "filename": "beatrica-0.0.12.tar.gz",
            "has_sig": false,
            "md5_digest": "a81cd2eb024e09d017920a4d17c42753",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 22523,
            "upload_time": "2024-04-15T09:45:29",
            "upload_time_iso_8601": "2024-04-15T09:45:29.527939Z",
            "url": "https://files.pythonhosted.org/packages/5e/ca/dbecf5a715bc17b8c5c76e6ee3e96210d6f716f0e0a8cc88156bf35ce357/beatrica-0.0.12.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-15 09:45:29",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "chigwell",
    "github_project": "beatrica",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "beatrica"
}
        
Elapsed time: 0.61808s