Skip to content

Commit 8fc6948

Browse files
authored
Merge pull request #3 from ErikKalkoken/update-docs
Update docs
2 parents 2dca4ff + 4e8a076 commit 8fc6948

File tree

11 files changed

+159
-107
lines changed

11 files changed

+159
-107
lines changed

CHANGELOG.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Change Log
2+
3+
All notable changes to this project will be documented in this file.
4+
5+
The format is based on [Keep a Changelog](http://keepachangelog.com/)
6+
and this project adheres to [Semantic Versioning](http://semver.org/).
7+
8+
## [Unreleased] - yyyy-mm-dd
9+
10+
### Added
11+
12+
### Changed
13+
14+
### Fixed
15+
16+
## [0.1.0] - 2023-06-05
17+
18+
### Added
19+
20+
- Initial release

docs/_static/custom.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
.logo {
22
overflow-wrap: normal;
33
}
4+
5+
div.sphinxsidebar {
6+
max-height: 100%;
7+
overflow-y: auto;
8+
}

docs/api.rst

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
API Reference
55
===============
66

7+
Complete reference of the public API.
78

89
Queues
910
======
@@ -14,8 +15,3 @@ Exceptions
1415
==========
1516

1617
.. automodule:: aiodiskqueue.exceptions
17-
18-
Storage Engines
19-
===============
20-
21-
.. automodule:: aiodiskqueue.engines

docs/extensions.rst

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
.. currentmodule:: aiodiskqueue
2+
3+
===============
4+
Customization
5+
===============
6+
7+
Storage Engines
8+
===============
9+
10+
aiodiskqueue uses the DbmEngine as default, but you can also select a different storage engine.
11+
12+
Or you can create your own storage engine by inheriting from :class:`.FifoStorageEngine`.
13+
14+
.. automodule:: aiodiskqueue.engines.dbm
15+
16+
.. automodule:: aiodiskqueue.engines.simple
17+
18+
.. automodule:: aiodiskqueue.engines.sqlite
19+
20+
.. automodule:: aiodiskqueue.engines.base

docs/index.rst

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,17 @@
77

88
.. toctree::
99
:hidden:
10-
:maxdepth: 2
10+
:maxdepth: 4
1111

1212
api
13+
extensions
14+
15+
16+
Contens
17+
-------
1318

1419
.. toctree::
15-
:hidden:
16-
:maxdepth: 1
20+
:maxdepth: 2
21+
22+
api
23+
extensions

src/aiodiskqueue/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from aiodiskqueue.exceptions import QueueEmpty, QueueFull
55
from aiodiskqueue.queues import Queue
66

7-
__version__ = "0.1.0b8"
7+
__version__ = "0.1.0"
88

99

1010
__all__ = ["engines", "Queue", "QueueEmpty", "QueueFull"]

src/aiodiskqueue/engines/base.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Engines for storing the queues on disk."""
1+
"""Base class for storage engines."""
22

33
import logging
44
from abc import ABC, abstractmethod
@@ -8,19 +8,25 @@
88
logger = logging.getLogger("aiodiskqueue")
99

1010

11-
class _FifoStorageEngine(ABC):
11+
class FifoStorageEngine(ABC):
1212
"""Base class for all storage engines implementing a FIFO queue."""
1313

1414
def __init__(self, data_path: Path) -> None:
1515
self._data_path = data_path
1616

1717
@abstractmethod
1818
async def initialize(self) -> List[Any]:
19-
"""Initialize data file."""
19+
"""Initialize data file.
20+
21+
:meta private:
22+
"""
2023

2124
@abstractmethod
2225
async def fetch_all(self) -> List[Any]:
23-
"""Return all items in data file."""
26+
"""Return all items in data file.
27+
28+
:meta private:
29+
"""
2430

2531
@abstractmethod
2632
async def add_item(self, item: Any):
@@ -29,6 +35,8 @@ async def add_item(self, item: Any):
2935
Args:
3036
item: Item to be appended
3137
items: All items including the one to be appended
38+
39+
:meta private:
3240
"""
3341

3442
@abstractmethod
@@ -38,4 +46,6 @@ async def remove_item(self):
3846
Args:
3947
item: Item to be removed
4048
items: All items not including the one to be removed
49+
50+
:meta private:
4151
"""

src/aiodiskqueue/engines/dbm.py

Lines changed: 79 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,96 @@
1-
"""Engines for storing the queues on disk."""
1+
"""Engines for storing the queues with DBM."""
22

33
import dbm
44
import logging
55
import pickle
66
from pathlib import Path
77
from typing import Any, List, Optional, Union
88

9-
try:
10-
import aiodbm
11-
except ImportError:
12-
has_aiodbm = False
13-
else:
14-
has_aiodbm = True
9+
import aiodbm
1510

16-
from .base import _FifoStorageEngine
11+
from .base import FifoStorageEngine
1712

1813
logger = logging.getLogger("aiodiskqueue")
1914

20-
if has_aiodbm:
21-
22-
class DbmEngine(_FifoStorageEngine):
23-
"""A queue storage engine using DBM."""
24-
25-
def __init__(self, data_path: Path) -> None:
26-
super().__init__(data_path)
27-
self._data_path_2 = str(data_path.absolute())
28-
29-
HEAD_ID_KEY = "head_id"
30-
TAIL_ID_KEY = "tail_id"
31-
32-
async def initialize(self):
33-
async with aiodbm.open(self._data_path_2, "c") as db:
34-
await db.set("dummy", "test")
35-
await db.delete("dummy")
36-
37-
async def fetch_all(self) -> List[Any]:
38-
try:
39-
async with aiodbm.open(self._data_path_2, "r") as db:
40-
head_id = await self._get_obj(db, self.HEAD_ID_KEY)
41-
tail_id = await self._get_obj(db, self.TAIL_ID_KEY)
42-
if not head_id or not tail_id:
43-
return []
44-
45-
items = []
46-
for item_id in range(head_id, tail_id + 1):
47-
item_key = self._make_item_key(item_id)
48-
item = await self._get_obj(db, item_key)
49-
items.append(item)
50-
except dbm.error:
51-
items = []
5215

53-
return items
16+
class DbmEngine(FifoStorageEngine):
17+
"""A queue storage engine using DBM."""
5418

55-
async def add_item(self, item: Any):
56-
async with aiodbm.open(self._data_path_2, "w") as db:
57-
tail_id = await self._get_obj(db, self.TAIL_ID_KEY)
58-
if tail_id:
59-
item_id = tail_id + 1
60-
is_first = False
61-
else:
62-
item_id = 1
63-
is_first = True
19+
def __init__(self, data_path: Path) -> None:
20+
super().__init__(data_path)
21+
self._data_path_2 = str(data_path.absolute())
6422

65-
await self._set_obj(db, self._make_item_key(item_id), item)
66-
await self._set_obj(db, self.TAIL_ID_KEY, item_id)
23+
_HEAD_ID_KEY = "head_id"
24+
_TAIL_ID_KEY = "tail_id"
6725

68-
if is_first:
69-
await self._set_obj(db, self.HEAD_ID_KEY, item_id)
26+
async def initialize(self):
27+
async with aiodbm.open(self._data_path_2, "c") as db:
28+
await db.set("dummy", "test")
29+
await db.delete("dummy")
7030

71-
async def remove_item(self):
72-
async with aiodbm.open(self._data_path_2, "w") as db:
73-
head_id = await self._get_obj(db, self.HEAD_ID_KEY)
74-
tail_id = await self._get_obj(db, self.TAIL_ID_KEY)
31+
async def fetch_all(self) -> List[Any]:
32+
try:
33+
async with aiodbm.open(self._data_path_2, "r") as db:
34+
head_id = await self._get_obj(db, self._HEAD_ID_KEY)
35+
tail_id = await self._get_obj(db, self._TAIL_ID_KEY)
7536
if not head_id or not tail_id:
76-
raise ValueError("Nothing to remove from an empty database")
77-
item_key = self._make_item_key(head_id)
78-
await db.delete(item_key)
79-
80-
if head_id != tail_id:
81-
# there are items left
82-
await self._set_obj(db, self.HEAD_ID_KEY, head_id + 1)
83-
else:
84-
# was last item
85-
await db.delete(self.HEAD_ID_KEY)
86-
await db.delete(self.TAIL_ID_KEY)
87-
88-
@staticmethod
89-
def _make_item_key(item_id: int) -> str:
90-
return f"item-{item_id}"
91-
92-
@staticmethod
93-
async def _get_obj(db, key: Union[str, bytes]) -> Optional[Any]:
94-
data = await db.get(key)
95-
if not data:
96-
return None
97-
return pickle.loads(data)
98-
99-
@staticmethod
100-
async def _set_obj(db, key: Union[str, bytes], item: Any):
101-
data = pickle.dumps(item)
102-
await db.set(key, data)
37+
return []
38+
39+
items = []
40+
for item_id in range(head_id, tail_id + 1):
41+
item_key = self._make_item_key(item_id)
42+
item = await self._get_obj(db, item_key)
43+
items.append(item)
44+
except dbm.error:
45+
items = []
46+
47+
return items
48+
49+
async def add_item(self, item: Any):
50+
async with aiodbm.open(self._data_path_2, "w") as db:
51+
tail_id = await self._get_obj(db, self._TAIL_ID_KEY)
52+
if tail_id:
53+
item_id = tail_id + 1
54+
is_first = False
55+
else:
56+
item_id = 1
57+
is_first = True
58+
59+
await self._set_obj(db, self._make_item_key(item_id), item)
60+
await self._set_obj(db, self._TAIL_ID_KEY, item_id)
61+
62+
if is_first:
63+
await self._set_obj(db, self._HEAD_ID_KEY, item_id)
64+
65+
async def remove_item(self):
66+
async with aiodbm.open(self._data_path_2, "w") as db:
67+
head_id = await self._get_obj(db, self._HEAD_ID_KEY)
68+
tail_id = await self._get_obj(db, self._TAIL_ID_KEY)
69+
if not head_id or not tail_id:
70+
raise ValueError("Nothing to remove from an empty database")
71+
item_key = self._make_item_key(head_id)
72+
await db.delete(item_key)
73+
74+
if head_id != tail_id:
75+
# there are items left
76+
await self._set_obj(db, self._HEAD_ID_KEY, head_id + 1)
77+
else:
78+
# was last item
79+
await db.delete(self._HEAD_ID_KEY)
80+
await db.delete(self._TAIL_ID_KEY)
81+
82+
@staticmethod
83+
def _make_item_key(item_id: int) -> str:
84+
return f"item-{item_id}"
85+
86+
@staticmethod
87+
async def _get_obj(db, key: Union[str, bytes]) -> Optional[Any]:
88+
data = await db.get(key)
89+
if not data:
90+
return None
91+
return pickle.loads(data)
92+
93+
@staticmethod
94+
async def _set_obj(db, key: Union[str, bytes], item: Any):
95+
data = pickle.dumps(item)
96+
await db.set(key, data)

src/aiodiskqueue/engines/simple.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Engines for storing the queues on disk."""
1+
"""Engines for storing the queues in flat files."""
22

33
import io
44
import logging
@@ -8,12 +8,12 @@
88
import aiofiles
99
import aiofiles.os
1010

11-
from .base import _FifoStorageEngine
11+
from .base import FifoStorageEngine
1212

1313
logger = logging.getLogger("aiodiskqueue")
1414

1515

16-
class PickledList(_FifoStorageEngine):
16+
class PickledList(FifoStorageEngine):
1717
"""This engine stores items as one singular pickled list of items."""
1818

1919
async def initialize(self):
@@ -54,7 +54,7 @@ async def _save_all_items(self, items: List[Any]):
5454
logger.debug("Wrote queue with %d items: %s", len(items), self._data_path)
5555

5656

57-
class PickleSequence(_FifoStorageEngine):
57+
class PickleSequence(FifoStorageEngine):
5858
"""This engine stores items as a sequence of single pickles."""
5959

6060
async def initialize(self):

src/aiodiskqueue/engines/sqlite.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
else:
1313
has_aiosqlite = True
1414

15-
from .base import _FifoStorageEngine
15+
from .base import FifoStorageEngine
1616

1717
logger = logging.getLogger("aiodiskqueue")
1818

1919
if has_aiosqlite:
2020

21-
class SqliteEngine(_FifoStorageEngine):
21+
class SqliteEngine(FifoStorageEngine):
2222
"""A queue storage engine using Sqlite."""
2323

2424
async def initialize(self):

0 commit comments

Comments
 (0)