stack-lab


Namestack-lab JSON
Version 1.0.0 PyPI version JSON
download
home_pageNone
SummaryA professional and extensible Stack implementation in Python
upload_time2025-08-21 12:35:18
maintainerNone
docs_urlNone
authorNone
requires_pythonNone
licenseMIT License Copyright (c) 2025 Anbu 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 stack data structures python algorithms
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <!-- README.md for stack-lab (v1.0.0) -->
<p align="center">
  <img alt="stack-lab" src="https://raw.githubusercontent.com/anbukumaran1/stack-lab/main/assets/logo.png" width="140" />
</p>

<h1 align="center">stack-lab</h1>
<p align="center"><strong>Production-grade, feature-rich Stack for Python — small, battle-tested, and built to impress.</strong></p>

<div align="center">
  <img src="https://img.shields.io/badge/python-3.9%2B-blue" alt="Python">
  <img src="https://img.shields.io/badge/version-1.0.0-green" alt="Version">
  <img src="https://img.shields.io/badge/license-MIT-yellow" alt="License">
  <img src="https://img.shields.io/badge/build-GitHub%20Actions-lightgrey" alt="CI">
</div>

---

## TL;DR

`stack-lab` is a modern `Stack[T]` implementation for Python with:
- Optional **O(1) `min()` / `max()`** tracking.
- **Capacity** control + multiple overflow strategies.
- **Transactions** (`with` support), **snapshots**, and **observers**.
- Bulk ops, functional helpers, rotation, dedup, and more.
- Clean, typed API ready for production, teaching, or portfolio demos.

---

## Table of contents

- [Installation](#installation)  
- [Quick start](#quick-start)  
- [Full API & Examples](#full-api--examples)  
  - [Construction](#construction)  
  - [Core methods](#core-methods)  
  - [Min / max tracking (O(1))](#min--max-tracking-o1)  
  - [Capacity & OverflowStrategy](#capacity--overflowstrategy)  
  - [Transactions and rollback](#transactions-and-rollback)  
  - [Snapshots & clone](#snapshots--clone)  
  - [Utilities: rotate / unique / map / filter](#utilities-rotate--unique--map--filter)  
  - [Observers](#observers)  
  - [Exceptions](#exceptions)  
- [Testing](#testing)  
- [Publishing & CI notes](#publishing--ci-notes)  
- [Contributing](#contributing)  
- [License & Contact](#license--contact)

---

## Installation

> Development / local install:
```bash
git clone https://github.com/anbukumaran1/stack-lab.git
cd stack-lab
python -m venv .venv
# macOS / Linux:
source .venv/bin/activate
# Windows PowerShell:
# .\.venv\Scripts\Activate.ps1

pip install -e .
pip install -r requirements.txt   # installs pytest
When published to PyPI (future):

bash
Copy
Edit
pip install stack-lab
Quick start
python
Copy
Edit
from stack_lab import Stack, OverflowStrategy

# Simple stack
s = Stack[int]()
s.push(3)
s.push(7)
print(s.pop())   # -> 7

# Stack with min/max tracking
s2 = Stack[int](track_minmax=True)
s2.push_many([5, 2, 9])
print(s2.min(), s2.max())  # -> 2 9
Full API & Examples
NOTE: in examples, # -> comments show expected outputs.

Construction
Signature
Stack(*items, track_minmax=False, maxsize=None, overflow=OverflowStrategy.ERROR, on_change=None)

items: initial elements (left → right = bottom → top).

track_minmax: enable O(1) min() / max() (maintained internally).

maxsize: integer capacity (optional).

overflow: behaviour when capacity reached (see OverflowStrategy).

on_change: iterable of callables or 'print' to attach a console observer.

python
Copy
Edit
s = Stack(1, 2, 3)  # bottom=1, top=3
s = Stack(track_minmax=True)
Core methods
push(item)
Push an item onto the top.

python
Copy
Edit
s = Stack()
s.push(10)
s.push(20)
print(s.peek())  # -> 20
push_many(iterable)
Push many items in order.

python
Copy
Edit
s.push_many([1,2,3])  # pushes 1 then 2 then 3 (3 is top)
pop() -> T
Pop and return top element. Raises StackEmptyError if empty.

python
Copy
Edit
s = Stack()
s.push("a")
print(s.pop())  # -> "a"
pop_many(k) -> List[T]
Pop up to k items; returns list of popped items (top-first).

python
Copy
Edit
s.push_many([1,2,3,4])
print(s.pop_many(2))  # -> [4, 3]
peek() -> T
Return top item without removing. Raises StackEmptyError if empty.

safe_peek() -> Optional[T]
Return top item or None if empty.

clear()
Remove all elements.

to_list() -> List[T]
Shallow copy of the stack data (bottom → top).

from_iterable(iterable, **kwargs) -> Stack
Build a stack from any iterable.

len(stack), item in stack, repr(stack) are supported.

Min / Max tracking (O(1))
To enable fast min() and max():

python
Copy
Edit
s = Stack[int](track_minmax=True)
s.push_many([3, 1, 4])
print(s.min(), s.max())  # -> 1 4
Notes & edge cases

min() / max() require track_minmax=True and a non-empty stack, otherwise raises StackError.

Implementation uses auxiliary stacks to preserve O(1) per operation.

Capacity & OverflowStrategy
maxsize limits stack size. overflow controls what happens when full:

OverflowStrategy.ERROR — raise StackCapacityError.

OverflowStrategy.DROP_OLDEST — remove bottom element(s) to make room for new pushes.

OverflowStrategy.DROP_NEWEST — refuse the incoming push (no-op).

OverflowStrategy.GROW — ignore maxsize and grow (effectively unbounded).

Examples:

python
Copy
Edit
from stack_lab import Stack, OverflowStrategy

s = Stack[int](maxsize=3, overflow=OverflowStrategy.DROP_OLDEST)
s.push_many([1,2,3])  # stack = [1,2,3]
s.push(4)             # drops 1 -> stack = [2,3,4]

s2 = Stack[int](maxsize=2, overflow=OverflowStrategy.ERROR)
s2.push_many([1,2])
# s2.push(3)  # raises StackCapacityError
Tip: Choose DROP_OLDEST for rolling buffers, ERROR when capacity must be enforced strictly.

Transactions and rollback
Transaction support allows multi-step changes to be committed or automatically rolled back on exception.

Context-manager style (recommended):

python
Copy
Edit
s = Stack([1,2,3])
try:
    with s.transaction():
        s.push(99)
        raise RuntimeError("abort")  # causes rollback
except RuntimeError:
    pass

print(s.to_list())  # -> [1,2,3]  (99 rolled back)
Manual API (begin/commit/rollback):

python
Copy
Edit
s.begin()
s.push(4)
s.rollback()  # undoes the push
Behavioral notes

push operations are rolled back by popping them.

pop operations are rolled back by re-pushing popped payloads (attempts to respect capacity).

clear during a transaction does not fully preserve pre-clear state — avoid clear inside transactions if you need precise restores.

Snapshots & clone
Snapshot — immutable capture of stack state (fast, safe):

python
Copy
Edit
snap = s.snapshot()
s.push(5)
s.restore(snap)
Clone / copy — shallow copy:

python
Copy
Edit
s2 = s.copy()   # or s.clone()
Utilities: rotate / unique / map_new / filter_new / find
rotate(k) — cyclically rotate the stack (top moves to bottom for positive k):

python
Copy
Edit
s = Stack.from_iterable([1,2,3,4])  # top=4
s.rotate(1)
print(s.to_list())  # -> [4,1,2,3]
unique(keep="last"|"first") — deduplicate preserving order:

python
Copy
Edit
s = Stack.from_iterable([1,2,3,2,1])
s.unique(keep="last")   # top-most duplicates kept by default
print(s.to_list())      # -> [3,2,1]
map_new(fn) and filter_new(pred) — functional helpers that return new Stack instances:

python
Copy
Edit
s = Stack.from_iterable([1,2,3])
s2 = s.map_new(lambda x: x * 2)   # -> Stack([2,4,6])
s3 = s.filter_new(lambda x: x % 2 == 1)  # -> Stack([1,3])
count(item) and find(item):

python
Copy
Edit
s.count(2)   # number of occurrences
s.find(3)    # index from bottom or None
Observers (hooks)
Attach callbacks to respond to 'push', 'pop', and 'clear' events. A built-in "print" observer is provided for quick logging.

python
Copy
Edit
def logger(event, st):
    print(f"EVENT={event} size={len(st)} top={st.safe_peek()}")

s = Stack(on_change=[logger, "print"])
s.push(10)  # triggers logger and the built-in print observer
Observers are guaranteed not to break core behavior (exceptions inside observers are caught).

Exceptions
StackError — base class

StackEmptyError — operations on empty stack (peek/pop)

StackCapacityError — capacity enforcement errors

StackTransactionError — transaction misuse

Use try/except to handle these in production code.

Testing
We use pytest. Example commands:

bash
Copy
Edit
# inside your venv
pip install -r requirements.txt
pytest -q
Sample unit tests included in tests/test_core.py cover:

basic push/pop/peek

errors on empty pops/peeks

transaction semantics

min/max behavior (when enabled)

Publishing & CI notes
Use pyproject.toml + setuptools for packaging.

Recommended workflow:

Bump version in pyproject.toml and stack_lab/__init__.py.

python -m build

twine upload dist/*

Use a GitHub Actions workflow to run tests and build on push and to publish on tags (protect secrets — store PyPI token in repo settings).

Contributing
Fork, create a branch, add tests, and open a PR.

Keep API backward-compatible or provide a clear migration note in CHANGELOG.md.

Run tests and lint before opening PRs.

Changelog (v1.0.0)
Initial public release: Stack with transactions, min/max tracking, capacity control, snapshots, functional helpers, observers, and utilities.

License & Contact
License: MIT — see LICENSE.
Author: Anbu Kumaran
GitHub: https://github.com/anbukumaran1
Email: anbuku12345@gmail.com

<p align="center"> Built with ❤️ by Anbu — go make something legendary. </p> ```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "stack-lab",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "stack, data structures, python, algorithms",
    "author": null,
    "author_email": "Anbu <your_email@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/6c/3a/8ba3ff20e04b1a966a54b69914e5ba64d6d0daaa2b0cc83c54587c3ec702/stack_lab-1.0.0.tar.gz",
    "platform": null,
    "description": "<!-- README.md for stack-lab (v1.0.0) -->\r\n<p align=\"center\">\r\n  <img alt=\"stack-lab\" src=\"https://raw.githubusercontent.com/anbukumaran1/stack-lab/main/assets/logo.png\" width=\"140\" />\r\n</p>\r\n\r\n<h1 align=\"center\">stack-lab</h1>\r\n<p align=\"center\"><strong>Production-grade, feature-rich Stack for Python \u2014 small, battle-tested, and built to impress.</strong></p>\r\n\r\n<div align=\"center\">\r\n  <img src=\"https://img.shields.io/badge/python-3.9%2B-blue\" alt=\"Python\">\r\n  <img src=\"https://img.shields.io/badge/version-1.0.0-green\" alt=\"Version\">\r\n  <img src=\"https://img.shields.io/badge/license-MIT-yellow\" alt=\"License\">\r\n  <img src=\"https://img.shields.io/badge/build-GitHub%20Actions-lightgrey\" alt=\"CI\">\r\n</div>\r\n\r\n---\r\n\r\n## TL;DR\r\n\r\n`stack-lab` is a modern `Stack[T]` implementation for Python with:\r\n- Optional **O(1) `min()` / `max()`** tracking.\r\n- **Capacity** control + multiple overflow strategies.\r\n- **Transactions** (`with` support), **snapshots**, and **observers**.\r\n- Bulk ops, functional helpers, rotation, dedup, and more.\r\n- Clean, typed API ready for production, teaching, or portfolio demos.\r\n\r\n---\r\n\r\n## Table of contents\r\n\r\n- [Installation](#installation)  \r\n- [Quick start](#quick-start)  \r\n- [Full API & Examples](#full-api--examples)  \r\n  - [Construction](#construction)  \r\n  - [Core methods](#core-methods)  \r\n  - [Min / max tracking (O(1))](#min--max-tracking-o1)  \r\n  - [Capacity & OverflowStrategy](#capacity--overflowstrategy)  \r\n  - [Transactions and rollback](#transactions-and-rollback)  \r\n  - [Snapshots & clone](#snapshots--clone)  \r\n  - [Utilities: rotate / unique / map / filter](#utilities-rotate--unique--map--filter)  \r\n  - [Observers](#observers)  \r\n  - [Exceptions](#exceptions)  \r\n- [Testing](#testing)  \r\n- [Publishing & CI notes](#publishing--ci-notes)  \r\n- [Contributing](#contributing)  \r\n- [License & Contact](#license--contact)\r\n\r\n---\r\n\r\n## Installation\r\n\r\n> Development / local install:\r\n```bash\r\ngit clone https://github.com/anbukumaran1/stack-lab.git\r\ncd stack-lab\r\npython -m venv .venv\r\n# macOS / Linux:\r\nsource .venv/bin/activate\r\n# Windows PowerShell:\r\n# .\\.venv\\Scripts\\Activate.ps1\r\n\r\npip install -e .\r\npip install -r requirements.txt   # installs pytest\r\nWhen published to PyPI (future):\r\n\r\nbash\r\nCopy\r\nEdit\r\npip install stack-lab\r\nQuick start\r\npython\r\nCopy\r\nEdit\r\nfrom stack_lab import Stack, OverflowStrategy\r\n\r\n# Simple stack\r\ns = Stack[int]()\r\ns.push(3)\r\ns.push(7)\r\nprint(s.pop())   # -> 7\r\n\r\n# Stack with min/max tracking\r\ns2 = Stack[int](track_minmax=True)\r\ns2.push_many([5, 2, 9])\r\nprint(s2.min(), s2.max())  # -> 2 9\r\nFull API & Examples\r\nNOTE: in examples, # -> comments show expected outputs.\r\n\r\nConstruction\r\nSignature\r\nStack(*items, track_minmax=False, maxsize=None, overflow=OverflowStrategy.ERROR, on_change=None)\r\n\r\nitems: initial elements (left \u2192 right = bottom \u2192 top).\r\n\r\ntrack_minmax: enable O(1) min() / max() (maintained internally).\r\n\r\nmaxsize: integer capacity (optional).\r\n\r\noverflow: behaviour when capacity reached (see OverflowStrategy).\r\n\r\non_change: iterable of callables or 'print' to attach a console observer.\r\n\r\npython\r\nCopy\r\nEdit\r\ns = Stack(1, 2, 3)  # bottom=1, top=3\r\ns = Stack(track_minmax=True)\r\nCore methods\r\npush(item)\r\nPush an item onto the top.\r\n\r\npython\r\nCopy\r\nEdit\r\ns = Stack()\r\ns.push(10)\r\ns.push(20)\r\nprint(s.peek())  # -> 20\r\npush_many(iterable)\r\nPush many items in order.\r\n\r\npython\r\nCopy\r\nEdit\r\ns.push_many([1,2,3])  # pushes 1 then 2 then 3 (3 is top)\r\npop() -> T\r\nPop and return top element. Raises StackEmptyError if empty.\r\n\r\npython\r\nCopy\r\nEdit\r\ns = Stack()\r\ns.push(\"a\")\r\nprint(s.pop())  # -> \"a\"\r\npop_many(k) -> List[T]\r\nPop up to k items; returns list of popped items (top-first).\r\n\r\npython\r\nCopy\r\nEdit\r\ns.push_many([1,2,3,4])\r\nprint(s.pop_many(2))  # -> [4, 3]\r\npeek() -> T\r\nReturn top item without removing. Raises StackEmptyError if empty.\r\n\r\nsafe_peek() -> Optional[T]\r\nReturn top item or None if empty.\r\n\r\nclear()\r\nRemove all elements.\r\n\r\nto_list() -> List[T]\r\nShallow copy of the stack data (bottom \u2192 top).\r\n\r\nfrom_iterable(iterable, **kwargs) -> Stack\r\nBuild a stack from any iterable.\r\n\r\nlen(stack), item in stack, repr(stack) are supported.\r\n\r\nMin / Max tracking (O(1))\r\nTo enable fast min() and max():\r\n\r\npython\r\nCopy\r\nEdit\r\ns = Stack[int](track_minmax=True)\r\ns.push_many([3, 1, 4])\r\nprint(s.min(), s.max())  # -> 1 4\r\nNotes & edge cases\r\n\r\nmin() / max() require track_minmax=True and a non-empty stack, otherwise raises StackError.\r\n\r\nImplementation uses auxiliary stacks to preserve O(1) per operation.\r\n\r\nCapacity & OverflowStrategy\r\nmaxsize limits stack size. overflow controls what happens when full:\r\n\r\nOverflowStrategy.ERROR \u2014 raise StackCapacityError.\r\n\r\nOverflowStrategy.DROP_OLDEST \u2014 remove bottom element(s) to make room for new pushes.\r\n\r\nOverflowStrategy.DROP_NEWEST \u2014 refuse the incoming push (no-op).\r\n\r\nOverflowStrategy.GROW \u2014 ignore maxsize and grow (effectively unbounded).\r\n\r\nExamples:\r\n\r\npython\r\nCopy\r\nEdit\r\nfrom stack_lab import Stack, OverflowStrategy\r\n\r\ns = Stack[int](maxsize=3, overflow=OverflowStrategy.DROP_OLDEST)\r\ns.push_many([1,2,3])  # stack = [1,2,3]\r\ns.push(4)             # drops 1 -> stack = [2,3,4]\r\n\r\ns2 = Stack[int](maxsize=2, overflow=OverflowStrategy.ERROR)\r\ns2.push_many([1,2])\r\n# s2.push(3)  # raises StackCapacityError\r\nTip: Choose DROP_OLDEST for rolling buffers, ERROR when capacity must be enforced strictly.\r\n\r\nTransactions and rollback\r\nTransaction support allows multi-step changes to be committed or automatically rolled back on exception.\r\n\r\nContext-manager style (recommended):\r\n\r\npython\r\nCopy\r\nEdit\r\ns = Stack([1,2,3])\r\ntry:\r\n    with s.transaction():\r\n        s.push(99)\r\n        raise RuntimeError(\"abort\")  # causes rollback\r\nexcept RuntimeError:\r\n    pass\r\n\r\nprint(s.to_list())  # -> [1,2,3]  (99 rolled back)\r\nManual API (begin/commit/rollback):\r\n\r\npython\r\nCopy\r\nEdit\r\ns.begin()\r\ns.push(4)\r\ns.rollback()  # undoes the push\r\nBehavioral notes\r\n\r\npush operations are rolled back by popping them.\r\n\r\npop operations are rolled back by re-pushing popped payloads (attempts to respect capacity).\r\n\r\nclear during a transaction does not fully preserve pre-clear state \u2014 avoid clear inside transactions if you need precise restores.\r\n\r\nSnapshots & clone\r\nSnapshot \u2014 immutable capture of stack state (fast, safe):\r\n\r\npython\r\nCopy\r\nEdit\r\nsnap = s.snapshot()\r\ns.push(5)\r\ns.restore(snap)\r\nClone / copy \u2014 shallow copy:\r\n\r\npython\r\nCopy\r\nEdit\r\ns2 = s.copy()   # or s.clone()\r\nUtilities: rotate / unique / map_new / filter_new / find\r\nrotate(k) \u2014 cyclically rotate the stack (top moves to bottom for positive k):\r\n\r\npython\r\nCopy\r\nEdit\r\ns = Stack.from_iterable([1,2,3,4])  # top=4\r\ns.rotate(1)\r\nprint(s.to_list())  # -> [4,1,2,3]\r\nunique(keep=\"last\"|\"first\") \u2014 deduplicate preserving order:\r\n\r\npython\r\nCopy\r\nEdit\r\ns = Stack.from_iterable([1,2,3,2,1])\r\ns.unique(keep=\"last\")   # top-most duplicates kept by default\r\nprint(s.to_list())      # -> [3,2,1]\r\nmap_new(fn) and filter_new(pred) \u2014 functional helpers that return new Stack instances:\r\n\r\npython\r\nCopy\r\nEdit\r\ns = Stack.from_iterable([1,2,3])\r\ns2 = s.map_new(lambda x: x * 2)   # -> Stack([2,4,6])\r\ns3 = s.filter_new(lambda x: x % 2 == 1)  # -> Stack([1,3])\r\ncount(item) and find(item):\r\n\r\npython\r\nCopy\r\nEdit\r\ns.count(2)   # number of occurrences\r\ns.find(3)    # index from bottom or None\r\nObservers (hooks)\r\nAttach callbacks to respond to 'push', 'pop', and 'clear' events. A built-in \"print\" observer is provided for quick logging.\r\n\r\npython\r\nCopy\r\nEdit\r\ndef logger(event, st):\r\n    print(f\"EVENT={event} size={len(st)} top={st.safe_peek()}\")\r\n\r\ns = Stack(on_change=[logger, \"print\"])\r\ns.push(10)  # triggers logger and the built-in print observer\r\nObservers are guaranteed not to break core behavior (exceptions inside observers are caught).\r\n\r\nExceptions\r\nStackError \u2014 base class\r\n\r\nStackEmptyError \u2014 operations on empty stack (peek/pop)\r\n\r\nStackCapacityError \u2014 capacity enforcement errors\r\n\r\nStackTransactionError \u2014 transaction misuse\r\n\r\nUse try/except to handle these in production code.\r\n\r\nTesting\r\nWe use pytest. Example commands:\r\n\r\nbash\r\nCopy\r\nEdit\r\n# inside your venv\r\npip install -r requirements.txt\r\npytest -q\r\nSample unit tests included in tests/test_core.py cover:\r\n\r\nbasic push/pop/peek\r\n\r\nerrors on empty pops/peeks\r\n\r\ntransaction semantics\r\n\r\nmin/max behavior (when enabled)\r\n\r\nPublishing & CI notes\r\nUse pyproject.toml + setuptools for packaging.\r\n\r\nRecommended workflow:\r\n\r\nBump version in pyproject.toml and stack_lab/__init__.py.\r\n\r\npython -m build\r\n\r\ntwine upload dist/*\r\n\r\nUse a GitHub Actions workflow to run tests and build on push and to publish on tags (protect secrets \u2014 store PyPI token in repo settings).\r\n\r\nContributing\r\nFork, create a branch, add tests, and open a PR.\r\n\r\nKeep API backward-compatible or provide a clear migration note in CHANGELOG.md.\r\n\r\nRun tests and lint before opening PRs.\r\n\r\nChangelog (v1.0.0)\r\nInitial public release: Stack with transactions, min/max tracking, capacity control, snapshots, functional helpers, observers, and utilities.\r\n\r\nLicense & Contact\r\nLicense: MIT \u2014 see LICENSE.\r\nAuthor: Anbu Kumaran\r\nGitHub: https://github.com/anbukumaran1\r\nEmail: anbuku12345@gmail.com\r\n\r\n<p align=\"center\"> Built with \u2764\ufe0f by Anbu \u2014 go make something legendary. </p> ```\r\n",
    "bugtrack_url": null,
    "license": "MIT License\r\n        \r\n        Copyright (c) 2025 Anbu\r\n        \r\n        Permission is hereby granted, free of charge, to any person obtaining a copy\r\n        of this software and associated documentation files (the \"Software\"), to deal\r\n        in the Software without restriction, including without limitation the rights\r\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n        copies of the Software, and to permit persons to whom the Software is\r\n        furnished to do so, subject to the following conditions:\r\n        \r\n        The above copyright notice and this permission notice shall be included in all\r\n        copies or substantial portions of the Software.\r\n        \r\n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n        SOFTWARE.\r\n        ",
    "summary": "A professional and extensible Stack implementation in Python",
    "version": "1.0.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/anbu/stack-lab/issues",
        "Homepage": "https://github.com/anbu/stack-lab"
    },
    "split_keywords": [
        "stack",
        " data structures",
        " python",
        " algorithms"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e1e159fc732860b3362589c722afbc781d6dfcf518dccc82772eb3e275c7411f",
                "md5": "5ae83600128fcd9d39d4bbcb94a4fce3",
                "sha256": "939ec241dddb5b11153360b0ed6d0d03b0dbddd83015c8e24cdb6f8764b1b66a"
            },
            "downloads": -1,
            "filename": "stack_lab-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5ae83600128fcd9d39d4bbcb94a4fce3",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 14601,
            "upload_time": "2025-08-21T12:35:15",
            "upload_time_iso_8601": "2025-08-21T12:35:15.923916Z",
            "url": "https://files.pythonhosted.org/packages/e1/e1/59fc732860b3362589c722afbc781d6dfcf518dccc82772eb3e275c7411f/stack_lab-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6c3a8ba3ff20e04b1a966a54b69914e5ba64d6d0daaa2b0cc83c54587c3ec702",
                "md5": "ba32128f732e3f415d92008a036ff09e",
                "sha256": "a28cabaf7ce144b3d53a605266ff382389cd666731b8bf3d5a14113e7dc25961"
            },
            "downloads": -1,
            "filename": "stack_lab-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "ba32128f732e3f415d92008a036ff09e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 16784,
            "upload_time": "2025-08-21T12:35:18",
            "upload_time_iso_8601": "2025-08-21T12:35:18.546432Z",
            "url": "https://files.pythonhosted.org/packages/6c/3a/8ba3ff20e04b1a966a54b69914e5ba64d6d0daaa2b0cc83c54587c3ec702/stack_lab-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-21 12:35:18",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "anbu",
    "github_project": "stack-lab",
    "github_not_found": true,
    "lcname": "stack-lab"
}
        
Elapsed time: 0.72111s