pylib-0xe


Namepylib-0xe JSON
Version 0.0.5 PyPI version JSON
download
home_pageNone
SummaryYet Another Python Library
upload_time2024-04-09 11:27:41
maintainerNone
docs_urlNone
authorNone
requires_python>=3.6
licenseThe MIT License (MIT) Copyright © 2023 <copyright holders> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords library buffer reader/writer algorithm datastructure file
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
<h1 align="center" style="display: block; font-size: 2.5em; font-weight: bold; margin-block-start: 1em; margin-block-end: 1em;">
<a name="logo" href="#"><img align="center" src="https://github.com/shamir0xe/pylib/blob/main/assets/logos/pylib.png?raw=true" alt="pylib" style="width:100%;height:100%"/></a>
<br/><br/><strong>pylib</strong>
</h1>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
![Python](https://img.shields.io/badge/Python-3.6%2B-blue)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT)

A python library that helps writing py projects much easier and faster.

## Table of contents

This library covers multiple aspects, including:
<!--toc:start-->
- [Table of contents](#table-of-contents)
- [Installation](#installation)
- [Documentation](#documentation)
  - [Buffer IO](#buffer-io)
  - [Data](#data)
  - [Debug Tools](#debug-tools)
  - [Config](#config)
  - [File](#file)
  - [Json](#json)
  - [Path](#path)
  - [Argument](#argument)
  - [String](#string)
  - [Algorithms](#algorithms)
    - [Graph](#graph)
    - [Math](#math)
    - [Paradigms](#paradigms)
    - [String Processing](#string-processing)
    - [Trees](#trees)
<!--toc:end-->

## Installation

  You can simply install this library through pip, via following commad:

  ```shell
python3 -m pip install pylib-0xe
  ```

## Documentation

### Buffer IO

This module provides several ways to read, write and edit buffers.
You can define `file`, `str` and `standard-input` buffers.

- [Buffer](buffer_io/buffer.py)
- [BufferReader](buffer_io/buffer_reader.py)
- [BufferWriter](buffer_io/buffer_writer.py)
- [StandardInputBuffer](buffer_io/standard_input_buffer.py)
- [StandardOutputBuffer](buffer_io/standard_output_buffer.py)
- [FileBuffer](buffer_io/file_buffer.py)
- [StringBuffer](buffer_io/string_buffer.py)

for example you can simply read a whole file like this:

```python
reader = BufferReader(FileBuffer(file_path, "r+"))
while not reader.end_of_buffer():
    line = reader.next_line()
```

or you can define a string as a buffer and treat it in the same way:

```python
reader = BufferReader(StringBuffer('some awesome text'))
while not reader.end_of_buffer():
    a, b, c = reader.next_int(), reader.next_string(), reader.next_char()
```

you can also read from `standard_input` and write to `standard_output`
in this way:

```python
reader = BufferReader(StandardInputBuffer())
writer = BufferWriter(StandardOutputBuffer())
while not reader.end_of_buffer():
    a, b, c = reader.next_int(), reader.next_string(), reader.next_char()
    writer.write_line(f"We have recieved these: ({a}, {b}, {c})")
```

### Data

- [DataTransferObject](data/data_transfer_object.py):
A tool for converting dictionaries to objects. example:

 ```python
 obj = DataTransferObject.from_dict({'a': 123})
 print(obj.a)
#  123
 ```

DataTransferObject is a dataclass itself. The best practice to use
this dto class is inheritting it as the base
class for your model. For example If your new model is named Bob and
has two parameters `name` and `height` with types `str` and `Optional[int]`
respectively, it should be implemented like this:

```python
@dataclass
class Bob(DataTransferObject):
  name: str
  height: int | None = 185
```

and then you can instantiate it in this way:

```python
  bob_marley = Bob({name: "Bob Marley"})
```

and you can use `bob_marley.name` and `bob_marley.height` in your code
since now on.
Another cool feature of this dto is implementing `mapper` function for
any variable of your choice. It works this way that you can define a
mapper function with this style: `VARIABLENAME_mapper`. It recieves
it's argument from the dictionary you provided to instantiate it and convert
the input to whatever you implement it in the function. This could be
useful if the types of the input data differs from the expected type
provided in the class or if you want to change the value of the variable
in some way before creating it. For example if you want `Bob` to convert it's
name to upper_case letters, it could be implemented like this:

```python
@dataclass
class Bob(DataTransferObject):
  name: str
  height: int | None = 185

  def name_mapper(name: str) -> str:
    return name.lower()

```

- [VariableTypeModifier](data/variable_type_modifier.py):
Converting types by casting it in a better way.

### Debug Tools

- [debug_text](debug_tools/debug_text.py): Alternative way to debuging
the code via prints into the stderr. example:

```python
debug_text('%B%USome Object%E [%c#%%E] -> %r%%E', 12, {"a": 34})
```

<pre>[<u style="text-decoration-style:single"><b>Some Object</b></u> [<font color="#34E2E2">#12</font>] -&gt; <font color="#EF2929">{&apos;a&apos;: 34}</font>]</pre>

- list of options:
  1. %c: cyan color
  1. %r: red color
  1. %b: blue color
  1. %g: green color
  1. %y: yellow color
  1. %H: alternative color
  1. %B: bold text
  1. %U: underlined text
  1. %E: clear modifiers

- [TerminalProcess](debug_tools/terminal_process.py):
A neat progress bar for long tasks.

### Config

- [Config](config/config.py): A facade class to read
json config files easily. I'ts so powerful when you
provide your configs in the hierarchical pattern.
example usage:
under the `configs` folder, you have several .json config files,
or folders containing configs. Let's assume we want to access
`humans.male.height` attribute from `mammals.json`.
We have two approaches to achieve it:
    1. `Config('mammals').get('humans.male.height)`
    2. `Config.read('mammals.humans.male.height)`

  It could have default value if there is no correspond
  attribute was found. like we could have written
  `Config.read(..., default=180)`

### File

- [File](file/file.py): A class that contains some useful
functions to deal with files. Some of them are:
  - `read_json(file_path)`
  - `read_csv(file_path)`
  - `append_to_file(file_path, string)`
  - `get_all_files(directory_path, extension)`

### Json

- [JsonHelper](json/json_helper.py): With this class, you can read,
write and merge `json` files with dot notations.
Selector example (for `file.json`):

```json
{
    "a": {
        "b": {
            "c": {
                "f": "g"
            }
        },
        "d": [1, 2],
        "e": {}
    }
}
```

```python
json_file = File.read_json('file.json')
JsonHelper.selector_get_value(json_file, 'a.b.c.f') # g
JsonHelper.selector_get_value(json_file, 'a.d') # [1, 2]
```

### Path

- [PathHelper](path/path_helper.py):
Provides absolute pathing for the project. Then you can
use releative pathing after reaching the project root. As an example:

```python
path = PathHelper.from_root(__file__, 'assets', 'imgs', '1.png')
```

  It will construct the path from the root of the project to the desired file,
  for this specific example, the file should be accessible under this path:
  `$project_root/assets/imgs/1.png`.
  This function tries to go back from `__file__` directory to reach the `root`
  directory. The default root directories are `src` and `root`. You can
  specify the root directory name by passing the `root_name=YOUR_ROOT_DIR_NAME`
  as a kwarg.
  Then the above example could be rewritten as something like this:

```python
path = PathHelper.from_root(..., root_name="custom_name")
```

The best practice to use it with the custom root directory is to write a new PathHelper
class that extends `PathHelper` and apply your custom `root_name` to it. You can
also get rid of `__file__` argument in this way. It should be implemented
something like this:

  ```python
  from pylib_0xe.path.path_helper import PathHelper as PH


  class PathHelper(PH):
    @classmethod
    def root(cls, *path: str) -> str:
      return cls.from_root(__file__, *path, root_name="custom_name")
  ```

### Argument

- [ArgumentParser](argument/argument_parser.py):
Useful tool to reading arguments passed to a python program executed via command line interface (terminal).
for example if you run your program as follow:

```terminal
python3 main.py --color green --size 2 --fast --O2
```

you can access the arguments through:

```python
ArgumentParser.get_value('color') -> green
ArgumentParser.get_value('size') -> 2
ArgumentParser.is_option('O2') -> true
```

### String

- [StringHelper](string/string_helper.py)
- [HashGenerator](string/hash_generator.py)

### Algorithms

#### Graph

- [flows](algorithms/graph/flows): provides algorithms in max-flow problem, including:
  - [MaxFlow](algorithms/graph/flows/maxflow.py)
- [MST](algorithms/graph/mst.py)
- [TSP](algorithms/graph/tsp.py)

#### Math

- [Geometry](algorithms/math/geometry.py): A neat implemented 2d-geometry
library. Some of the usefull functions that it provides are:
  - `translate(expression, *points)`: recieves arithmatic expression and
  the points afterwards. Returns the answer of the expression. example:
    `translate('* + *.', p1, p2, p3, scalar)` = `((p1 * p2) + p3) *. scalar`
  - `side_sign(p1, p2, p3)`: Returns in which side of the p1->p2 line, p3 is located.
  - `inside_polygon(points, p)`
  - `segment_intersection(l1, l2)`

#### Paradigms

- [DevideAndConquer](algorithms/paradigms/divide_and_conquer):
Implementation of D&D algorithmic paradigm.

#### String Processing

- [LIS](algorithms/string_processing/lis.py): Longest Increasing Subsequence implementation.

#### Trees

- [AvlTree](algorithms/trees/avl_tree)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pylib-0xe",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "library, buffer, reader/writer, algorithm, datastructure, file",
    "author": null,
    "author_email": "shamir0xe <shamir0xe@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/f7/ab/861aabaab43699a1bd3521b1e8864eb776cddb357baa849f6df511e07d36/pylib-0xe-0.0.5.tar.gz",
    "platform": null,
    "description": "\n<h1 align=\"center\" style=\"display: block; font-size: 2.5em; font-weight: bold; margin-block-start: 1em; margin-block-end: 1em;\">\n<a name=\"logo\" href=\"#\"><img align=\"center\" src=\"https://github.com/shamir0xe/pylib/blob/main/assets/logos/pylib.png?raw=true\" alt=\"pylib\" style=\"width:100%;height:100%\"/></a>\n<br/><br/><strong>pylib</strong>\n</h1>\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n![Python](https://img.shields.io/badge/Python-3.6%2B-blue)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT)\n\nA python library that helps writing py projects much easier and faster.\n\n## Table of contents\n\nThis library covers multiple aspects, including:\n<!--toc:start-->\n- [Table of contents](#table-of-contents)\n- [Installation](#installation)\n- [Documentation](#documentation)\n  - [Buffer IO](#buffer-io)\n  - [Data](#data)\n  - [Debug Tools](#debug-tools)\n  - [Config](#config)\n  - [File](#file)\n  - [Json](#json)\n  - [Path](#path)\n  - [Argument](#argument)\n  - [String](#string)\n  - [Algorithms](#algorithms)\n    - [Graph](#graph)\n    - [Math](#math)\n    - [Paradigms](#paradigms)\n    - [String Processing](#string-processing)\n    - [Trees](#trees)\n<!--toc:end-->\n\n## Installation\n\n  You can simply install this library through pip, via following commad:\n\n  ```shell\npython3 -m pip install pylib-0xe\n  ```\n\n## Documentation\n\n### Buffer IO\n\nThis module provides several ways to read, write and edit buffers.\nYou can define `file`, `str` and `standard-input` buffers.\n\n- [Buffer](buffer_io/buffer.py)\n- [BufferReader](buffer_io/buffer_reader.py)\n- [BufferWriter](buffer_io/buffer_writer.py)\n- [StandardInputBuffer](buffer_io/standard_input_buffer.py)\n- [StandardOutputBuffer](buffer_io/standard_output_buffer.py)\n- [FileBuffer](buffer_io/file_buffer.py)\n- [StringBuffer](buffer_io/string_buffer.py)\n\nfor example you can simply read a whole file like this:\n\n```python\nreader = BufferReader(FileBuffer(file_path, \"r+\"))\nwhile not reader.end_of_buffer():\n    line = reader.next_line()\n```\n\nor you can define a string as a buffer and treat it in the same way:\n\n```python\nreader = BufferReader(StringBuffer('some awesome text'))\nwhile not reader.end_of_buffer():\n    a, b, c = reader.next_int(), reader.next_string(), reader.next_char()\n```\n\nyou can also read from `standard_input` and write to `standard_output`\nin this way:\n\n```python\nreader = BufferReader(StandardInputBuffer())\nwriter = BufferWriter(StandardOutputBuffer())\nwhile not reader.end_of_buffer():\n    a, b, c = reader.next_int(), reader.next_string(), reader.next_char()\n    writer.write_line(f\"We have recieved these: ({a}, {b}, {c})\")\n```\n\n### Data\n\n- [DataTransferObject](data/data_transfer_object.py):\nA tool for converting dictionaries to objects. example:\n\n ```python\n obj = DataTransferObject.from_dict({'a': 123})\n print(obj.a)\n#  123\n ```\n\nDataTransferObject is a dataclass itself. The best practice to use\nthis dto class is inheritting it as the base\nclass for your model. For example If your new model is named Bob and\nhas two parameters `name` and `height` with types `str` and `Optional[int]`\nrespectively, it should be implemented like this:\n\n```python\n@dataclass\nclass Bob(DataTransferObject):\n  name: str\n  height: int | None = 185\n```\n\nand then you can instantiate it in this way:\n\n```python\n  bob_marley = Bob({name: \"Bob Marley\"})\n```\n\nand you can use `bob_marley.name` and `bob_marley.height` in your code\nsince now on.\nAnother cool feature of this dto is implementing `mapper` function for\nany variable of your choice. It works this way that you can define a\nmapper function with this style: `VARIABLENAME_mapper`. It recieves\nit's argument from the dictionary you provided to instantiate it and convert\nthe input to whatever you implement it in the function. This could be\nuseful if the types of the input data differs from the expected type\nprovided in the class or if you want to change the value of the variable\nin some way before creating it. For example if you want `Bob` to convert it's\nname to upper_case letters, it could be implemented like this:\n\n```python\n@dataclass\nclass Bob(DataTransferObject):\n  name: str\n  height: int | None = 185\n\n  def name_mapper(name: str) -> str:\n    return name.lower()\n\n```\n\n- [VariableTypeModifier](data/variable_type_modifier.py):\nConverting types by casting it in a better way.\n\n### Debug Tools\n\n- [debug_text](debug_tools/debug_text.py): Alternative way to debuging\nthe code via prints into the stderr. example:\n\n```python\ndebug_text('%B%USome Object%E [%c#%%E] -> %r%%E', 12, {\"a\": 34})\n```\n\n<pre>[<u style=\"text-decoration-style:single\"><b>Some Object</b></u> [<font color=\"#34E2E2\">#12</font>] -&gt; <font color=\"#EF2929\">{&apos;a&apos;: 34}</font>]</pre>\n\n- list of options:\n  1. %c: cyan color\n  1. %r: red color\n  1. %b: blue color\n  1. %g: green color\n  1. %y: yellow color\n  1. %H: alternative color\n  1. %B: bold text\n  1. %U: underlined text\n  1. %E: clear modifiers\n\n- [TerminalProcess](debug_tools/terminal_process.py):\nA neat progress bar for long tasks.\n\n### Config\n\n- [Config](config/config.py): A facade class to read\njson config files easily. I'ts so powerful when you\nprovide your configs in the hierarchical pattern.\nexample usage:\nunder the `configs` folder, you have several .json config files,\nor folders containing configs. Let's assume we want to access\n`humans.male.height` attribute from `mammals.json`.\nWe have two approaches to achieve it:\n    1. `Config('mammals').get('humans.male.height)`\n    2. `Config.read('mammals.humans.male.height)`\n\n  It could have default value if there is no correspond\n  attribute was found. like we could have written\n  `Config.read(..., default=180)`\n\n### File\n\n- [File](file/file.py): A class that contains some useful\nfunctions to deal with files. Some of them are:\n  - `read_json(file_path)`\n  - `read_csv(file_path)`\n  - `append_to_file(file_path, string)`\n  - `get_all_files(directory_path, extension)`\n\n### Json\n\n- [JsonHelper](json/json_helper.py): With this class, you can read,\nwrite and merge `json` files with dot notations.\nSelector example (for `file.json`):\n\n```json\n{\n    \"a\": {\n        \"b\": {\n            \"c\": {\n                \"f\": \"g\"\n            }\n        },\n        \"d\": [1, 2],\n        \"e\": {}\n    }\n}\n```\n\n```python\njson_file = File.read_json('file.json')\nJsonHelper.selector_get_value(json_file, 'a.b.c.f') # g\nJsonHelper.selector_get_value(json_file, 'a.d') # [1, 2]\n```\n\n### Path\n\n- [PathHelper](path/path_helper.py):\nProvides absolute pathing for the project. Then you can\nuse releative pathing after reaching the project root. As an example:\n\n```python\npath = PathHelper.from_root(__file__, 'assets', 'imgs', '1.png')\n```\n\n  It will construct the path from the root of the project to the desired file,\n  for this specific example, the file should be accessible under this path:\n  `$project_root/assets/imgs/1.png`.\n  This function tries to go back from `__file__` directory to reach the `root`\n  directory. The default root directories are `src` and `root`. You can\n  specify the root directory name by passing the `root_name=YOUR_ROOT_DIR_NAME`\n  as a kwarg.\n  Then the above example could be rewritten as something like this:\n\n```python\npath = PathHelper.from_root(..., root_name=\"custom_name\")\n```\n\nThe best practice to use it with the custom root directory is to write a new PathHelper\nclass that extends `PathHelper` and apply your custom `root_name` to it. You can\nalso get rid of `__file__` argument in this way. It should be implemented\nsomething like this:\n\n  ```python\n  from pylib_0xe.path.path_helper import PathHelper as PH\n\n\n  class PathHelper(PH):\n    @classmethod\n    def root(cls, *path: str) -> str:\n      return cls.from_root(__file__, *path, root_name=\"custom_name\")\n  ```\n\n### Argument\n\n- [ArgumentParser](argument/argument_parser.py):\nUseful tool to reading arguments passed to a python program executed via command line interface (terminal).\nfor example if you run your program as follow:\n\n```terminal\npython3 main.py --color green --size 2 --fast --O2\n```\n\nyou can access the arguments through:\n\n```python\nArgumentParser.get_value('color') -> green\nArgumentParser.get_value('size') -> 2\nArgumentParser.is_option('O2') -> true\n```\n\n### String\n\n- [StringHelper](string/string_helper.py)\n- [HashGenerator](string/hash_generator.py)\n\n### Algorithms\n\n#### Graph\n\n- [flows](algorithms/graph/flows): provides algorithms in max-flow problem, including:\n  - [MaxFlow](algorithms/graph/flows/maxflow.py)\n- [MST](algorithms/graph/mst.py)\n- [TSP](algorithms/graph/tsp.py)\n\n#### Math\n\n- [Geometry](algorithms/math/geometry.py): A neat implemented 2d-geometry\nlibrary. Some of the usefull functions that it provides are:\n  - `translate(expression, *points)`: recieves arithmatic expression and\n  the points afterwards. Returns the answer of the expression. example:\n    `translate('* + *.', p1, p2, p3, scalar)` = `((p1 * p2) + p3) *. scalar`\n  - `side_sign(p1, p2, p3)`: Returns in which side of the p1->p2 line, p3 is located.\n  - `inside_polygon(points, p)`\n  - `segment_intersection(l1, l2)`\n\n#### Paradigms\n\n- [DevideAndConquer](algorithms/paradigms/divide_and_conquer):\nImplementation of D&D algorithmic paradigm.\n\n#### String Processing\n\n- [LIS](algorithms/string_processing/lis.py): Longest Increasing Subsequence implementation.\n\n#### Trees\n\n- [AvlTree](algorithms/trees/avl_tree)\n",
    "bugtrack_url": null,
    "license": "The MIT License (MIT) Copyright \u00a9 2023 <copyright holders>  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \u201cSoftware\u201d), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \u201cAS IS\u201d, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  ",
    "summary": "Yet Another Python Library",
    "version": "0.0.5",
    "project_urls": {
        "Homepage": "https://github.com/shamir0xe/pylib"
    },
    "split_keywords": [
        "library",
        " buffer",
        " reader/writer",
        " algorithm",
        " datastructure",
        " file"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "76e4cffc770bfea04e53e14388c7457b98ad7b6f7a6687ffa8ae342f16cd2ec1",
                "md5": "a6642351e14953e96195646a964d2f80",
                "sha256": "5ffe183529c1dbd21eee259d684b5c2977c130874560edeecd18ad1abab67f4c"
            },
            "downloads": -1,
            "filename": "pylib_0xe-0.0.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "a6642351e14953e96195646a964d2f80",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 34476,
            "upload_time": "2024-04-09T11:27:39",
            "upload_time_iso_8601": "2024-04-09T11:27:39.329412Z",
            "url": "https://files.pythonhosted.org/packages/76/e4/cffc770bfea04e53e14388c7457b98ad7b6f7a6687ffa8ae342f16cd2ec1/pylib_0xe-0.0.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f7ab861aabaab43699a1bd3521b1e8864eb776cddb357baa849f6df511e07d36",
                "md5": "1bcaa7415596a5e3c70de57f63612545",
                "sha256": "a6408950fca0f14c8ffe426eef6b579d0bd7685505a14359961e34e4710222a0"
            },
            "downloads": -1,
            "filename": "pylib-0xe-0.0.5.tar.gz",
            "has_sig": false,
            "md5_digest": "1bcaa7415596a5e3c70de57f63612545",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 27796,
            "upload_time": "2024-04-09T11:27:41",
            "upload_time_iso_8601": "2024-04-09T11:27:41.703808Z",
            "url": "https://files.pythonhosted.org/packages/f7/ab/861aabaab43699a1bd3521b1e8864eb776cddb357baa849f6df511e07d36/pylib-0xe-0.0.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-09 11:27:41",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "shamir0xe",
    "github_project": "pylib",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "pylib-0xe"
}
        
Elapsed time: 0.24033s