diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 85f9ceb..3cbf4b7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,4 +38,5 @@ jobs: python-version: ${{ matrix.python-version }} - name: tests run: | + pip install . make test diff --git a/Makefile b/Makefile index 31de09e..ec8c1b4 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ test: lint: black --check --diff $(FILES_TO_LINT) flake8 $(FILES_TO_LINT) - mypy --strict $(FILES_TO_LINT) + mypy . pytype $(FILES_TO_LINT) coverage: diff --git a/memory_store.py b/memory_store.py deleted file mode 100644 index a59d6f6..0000000 --- a/memory_store.py +++ /dev/null @@ -1,19 +0,0 @@ -class MemoryStorage: - def __init__(self) -> None: - self.data: dict[str, str] = {} - - def set(self, key: str, value: str) -> None: - self.data[key] = value - - def get(self, key: str) -> str: - return self.data.get(key, "") - - def close(self) -> bool: - # NOTE: ideally, I would want this to have () -> None signature, but for some - # reason mypy complains about this: - # - # tests/test_memory_store.py:19: error: "close" of "MemoryStorage" does not - # return a value - # - # check here for more: https://github.com/python/mypy/issues/6549 - return True diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..b352774 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,3 @@ +[mypy] +exclude = venv|setup.py +strict = True diff --git a/requirements_dev.txt b/requirements_dev.txt index c636dba..aefbcb6 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,7 +1 @@ -black>=22.1.0 -coverage>=6.3.2 -flake8>=4.0.1 -ipdb>=0.13.9 -mypy>=0.950 -pytype>=2022.4.26 -pytest>=7.1.2 +-e .[dev] diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..f2baada --- /dev/null +++ b/setup.cfg @@ -0,0 +1,47 @@ +[metadata] +name = caskdb +version = 0.1.0 +description = Disk based Log Structured Hash Table Store +long_description = file: README.md +long_description_content_type = text/markdown +url = https://github.com/avinassh/py-caskdb +author = Avinash Sajjanshetty +author_email = opensource@avi.im +license = MIT +license_file = LICENSE +classifiers = + License :: OSI Approved :: MIT License + Operating System :: OS Independent + Programming Language :: Python :: 3 + Programming Language :: Python :: 3 :: Only + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 + Programming Language :: Python :: 3.12 + Programming Language :: Python :: Implementation :: CPython + Typing :: Typed + +[options] +packages = find: +python_requires = >=3.8 +package_dir = =src + +[options.packages.find] +where = ./src + +[options.extras_require] +dev = + black>=22.1.0 + build>=1.2.1 + coverage>=6.3.2 + flake8>=4.0.1 + ipdb>=0.13.9 + mypy>=1.10.1 + pytest>=7.1.2 + pytype>=2024.4.11 + twine>=5.1.1 + +[options.package_data] +caskdb = + py.typed diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..6068493 --- /dev/null +++ b/setup.py @@ -0,0 +1,3 @@ +from setuptools import setup + +setup() diff --git a/src/caskdb/__init__.py b/src/caskdb/__init__.py new file mode 100644 index 0000000..6bdb237 --- /dev/null +++ b/src/caskdb/__init__.py @@ -0,0 +1,4 @@ +from caskdb.disk_store import DiskStorage +from caskdb.memory_store import MemoryStorage + +__all__ = ["DiskStorage", "MemoryStorage"] diff --git a/disk_store.py b/src/caskdb/disk_store.py similarity index 98% rename from disk_store.py rename to src/caskdb/disk_store.py index 3cd0e99..89f18a7 100644 --- a/disk_store.py +++ b/src/caskdb/disk_store.py @@ -19,11 +19,12 @@ # it also supports dictionary style API too: disk["hamlet"] = "shakespeare" """ + import os.path import time import typing -from format import KeyEntry, encode_kv, decode_kv, HEADER_SIZE, decode_header +from caskdb.format import KeyEntry, encode_kv, decode_kv, HEADER_SIZE, decode_header # We use `file.seek` method to move our cursor to certain byte offset for read # or write operations. The method takes two parameters file.seek(offset, whence). diff --git a/example.py b/src/caskdb/example.py similarity index 92% rename from example.py rename to src/caskdb/example.py index b8a09df..70bffe6 100644 --- a/example.py +++ b/src/caskdb/example.py @@ -1,5 +1,5 @@ -from memory_store import MemoryStorage -from disk_store import DiskStorage +from caskdb.memory_store import MemoryStorage +from caskdb.disk_store import DiskStorage def memory_db() -> None: diff --git a/format.py b/src/caskdb/format.py similarity index 100% rename from format.py rename to src/caskdb/format.py diff --git a/src/caskdb/memory_store.py b/src/caskdb/memory_store.py new file mode 100644 index 0000000..0bae6f5 --- /dev/null +++ b/src/caskdb/memory_store.py @@ -0,0 +1,12 @@ +class MemoryStorage: + def __init__(self) -> None: + self.data: dict[str, str] = {} + + def set(self, key: str, value: str) -> None: + self.data[key] = value + + def get(self, key: str) -> str: + return self.data.get(key, "") + + def close(self) -> None: + return diff --git a/src/caskdb/py.typed b/src/caskdb/py.typed new file mode 100644 index 0000000..d3245e7 --- /dev/null +++ b/src/caskdb/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561. This package uses inline types. diff --git a/tests/test_disk_store.py b/tests/test_disk_store.py index dc84157..05adc0d 100644 --- a/tests/test_disk_store.py +++ b/tests/test_disk_store.py @@ -3,7 +3,7 @@ import typing import unittest -from disk_store import DiskStorage +from caskdb import DiskStorage class TempStorageFile: diff --git a/tests/test_format.py b/tests/test_format.py index 9dd7961..ffc6795 100644 --- a/tests/test_format.py +++ b/tests/test_format.py @@ -5,8 +5,14 @@ import unittest import uuid -from format import encode_header, decode_header, encode_kv, decode_kv, HEADER_SIZE -from format import KeyEntry +from caskdb.format import ( + encode_header, + decode_header, + encode_kv, + decode_kv, + HEADER_SIZE, +) +from caskdb.format import KeyEntry def get_random_header() -> tuple[int, int, int]: diff --git a/tests/test_memory_store.py b/tests/test_memory_store.py index 5950de8..29b0e8c 100644 --- a/tests/test_memory_store.py +++ b/tests/test_memory_store.py @@ -1,6 +1,6 @@ import unittest -from memory_store import MemoryStorage +from caskdb import MemoryStorage class TestInMemoryCaskDB(unittest.TestCase): @@ -15,4 +15,4 @@ def test_invalid_key(self) -> None: def test_close(self) -> None: store = MemoryStorage() - self.assertTrue(store.close()) + store.close()