From 0e46b49e9c01c90d4791d1cbae2959e9ca65d3c3 Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Mon, 10 Jun 2019 19:01:08 -0500 Subject: [PATCH] added flush at exit --- README.md | 4 +-- deadsimplekv/__init__.py | 9 +++-- docs/index.html | 75 +++++++++++++++++++++++++++++----------- setup.py | 6 ++-- tests/test_basic.py | 1 + 5 files changed, 66 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index d0200dc..e6b01aa 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ It doesn't do anything crazy. It just takes json serializable data and stores it You can control when and where to read/write, and that's it. -No bloat, only 3 public methods. +No bloat, only 5 public methods. ## Usage @@ -43,4 +43,4 @@ kv.get('my_key') # returns True. kv.delete('my_key') ~~~ -***Warning:*** **Be sure to manually flush when destroying the kv instance (such as by exiting your program) to avoid losing data, as flushes only happen when .put has been called.** \ No newline at end of file +***Warning:*** **Be sure to keep flush_on_exit set to true or manually flush when destroying the kv instance (such as by exiting your program) to avoid losing data.** \ No newline at end of file diff --git a/deadsimplekv/__init__.py b/deadsimplekv/__init__.py index 36d1584..54a2dd3 100644 --- a/deadsimplekv/__init__.py +++ b/deadsimplekv/__init__.py @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -import json, time, math, os +import json, time, math, os, atexit def _is_serializable(data): ''' @@ -28,12 +28,12 @@ def _is_serializable(data): return False class DeadSimpleKV: - def __init__(self, file_path=None, refresh_seconds=0, flush_seconds=0): + def __init__(self, file_path=None, refresh_seconds=0, flush_seconds=0, flush_on_exit=True): ''' Accepts a file path and refresh. If file_path is not set, no data will be written to disk. Refresh is an integer specifying how many seconds should pass before data is re-read from disk. - If refresh_seconds or flush_seconds are set to None they will not be done automatically + If refresh_seconds or flush_seconds are set to None they will not be done automatically (except where flush_on_exit applies) ''' temp_time = DeadSimpleKV._get_epoch() # Initialization time self.file_path = file_path # The file path where we write our data in JSON format @@ -48,6 +48,9 @@ class DeadSimpleKV: self.refresh() except TypeError: pass + + if flush_on_exit: + atexit.register(self.flush) def get(self, key): ''' diff --git a/docs/index.html b/docs/index.html index 41c4d7a..fd44ae7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,14 +3,14 @@ - + deadsimplekv API documentation - + @@ -57,6 +57,9 @@ If not, see https://www.gnu.org/licenses import json, time, math, os def _is_serializable(data): + ''' + Test if something is able to be in JSON format + ''' try: json.dumps(data) return True @@ -86,6 +89,9 @@ class DeadSimpleKV: pass def get(self, key): + ''' + Accepts key, which must be json serializable + ''' self._do_auto_refresh() try: return self._data[key] @@ -93,8 +99,9 @@ class DeadSimpleKV: return None def put(self, key, value): - '''Value setter. Will automatically flush if auto_flush is True and file_path is not None - Will return value error if either key or value are not JSON serializable + ''' + Value setter. Will automatically flush if auto_flush is True and file_path is not None + Will return value error if either key or value are not JSON serializable ''' self._data[key] = value # Set the key @@ -107,12 +114,16 @@ class DeadSimpleKV: return (key, value) def delete(self, key): - '''Deletes value. Will automatically flush if auto_flush is True and file_path is not None''' + ''' + Deletes value. Will automatically flush if auto_flush is True and file_path is not None + ''' del self._data[key] self._do_auto_flush() def refresh(self): - '''Refresh data and then mark time read. Can be manually called''' + ''' + Refresh data and then mark time read. Can be manually called + ''' try: self._data = json.loads(DeadSimpleKV._read_in(self.file_path)) except FileNotFoundError: @@ -120,7 +131,9 @@ class DeadSimpleKV: self._last_refresh = DeadSimpleKV._get_epoch() def flush(self): - '''Write out then mark time flushed. Can be manually called''' + ''' + Write out then mark time flushed. Can be manually called + ''' DeadSimpleKV._write_out(self.file_path, json.dumps(self._data)) self._last_flush = DeadSimpleKV._get_epoch() @@ -131,8 +144,8 @@ class DeadSimpleKV: self.flush() def _do_auto_refresh(self): + # Automatically flush if it is enabled and time to do so if self.refresh_seconds is not None and self.file_path is not None: - # refresh if automatic and time to do so if DeadSimpleKV._get_epoch() - self._last_refresh >= self.refresh_seconds: self.refresh() @@ -192,6 +205,9 @@ class DeadSimpleKV: pass def get(self, key): + ''' + Accepts key, which must be json serializable + ''' self._do_auto_refresh() try: return self._data[key] @@ -199,8 +215,9 @@ class DeadSimpleKV: return None def put(self, key, value): - '''Value setter. Will automatically flush if auto_flush is True and file_path is not None - Will return value error if either key or value are not JSON serializable + ''' + Value setter. Will automatically flush if auto_flush is True and file_path is not None + Will return value error if either key or value are not JSON serializable ''' self._data[key] = value # Set the key @@ -213,12 +230,16 @@ class DeadSimpleKV: return (key, value) def delete(self, key): - '''Deletes value. Will automatically flush if auto_flush is True and file_path is not None''' + ''' + Deletes value. Will automatically flush if auto_flush is True and file_path is not None + ''' del self._data[key] self._do_auto_flush() def refresh(self): - '''Refresh data and then mark time read. Can be manually called''' + ''' + Refresh data and then mark time read. Can be manually called + ''' try: self._data = json.loads(DeadSimpleKV._read_in(self.file_path)) except FileNotFoundError: @@ -226,7 +247,9 @@ class DeadSimpleKV: self._last_refresh = DeadSimpleKV._get_epoch() def flush(self): - '''Write out then mark time flushed. Can be manually called''' + ''' + Write out then mark time flushed. Can be manually called + ''' DeadSimpleKV._write_out(self.file_path, json.dumps(self._data)) self._last_flush = DeadSimpleKV._get_epoch() @@ -237,8 +260,8 @@ class DeadSimpleKV: self.flush() def _do_auto_refresh(self): + # Automatically flush if it is enabled and time to do so if self.refresh_seconds is not None and self.file_path is not None: - # refresh if automatic and time to do so if DeadSimpleKV._get_epoch() - self._last_refresh >= self.refresh_seconds: self.refresh() @@ -300,7 +323,9 @@ If refresh_seconds or flush_seconds are set to None they will not be done automa
Source code
def delete(self, key):
-    '''Deletes value. Will automatically flush if auto_flush is True and file_path is not None'''
+    '''
+        Deletes value. Will automatically flush if auto_flush is True and file_path is not None
+    '''
     del self._data[key]
     self._do_auto_flush()
@@ -313,7 +338,9 @@ If refresh_seconds or flush_seconds are set to None they will not be done automa
Source code
def flush(self):
-    '''Write out then mark time flushed. Can be manually called'''
+    '''
+        Write out then mark time flushed. Can be manually called
+    '''
     DeadSimpleKV._write_out(self.file_path, json.dumps(self._data))
     self._last_flush = DeadSimpleKV._get_epoch()
@@ -322,10 +349,13 @@ If refresh_seconds or flush_seconds are set to None they will not be done automa def get(self, key)
-
+

Accepts key, which must be json serializable

Source code
def get(self, key):
+    '''
+        Accepts key, which must be json serializable
+    '''
     self._do_auto_refresh()
     try:
         return self._data[key]
@@ -342,8 +372,9 @@ Will return value error if either key or value are not JSON serializable

Source code
def put(self, key, value):
-    '''Value setter. Will automatically flush if auto_flush is True and file_path is not None
-    Will return value error if either key or value are not JSON serializable
+    '''
+        Value setter. Will automatically flush if auto_flush is True and file_path is not None
+        Will return value error if either key or value are not JSON serializable
     '''
     self._data[key] = value # Set the key
 
@@ -364,7 +395,9 @@ Will return value error if either key or value are not JSON serializable

Source code
def refresh(self):
-    '''Refresh data and then mark time read. Can be manually called'''
+    '''
+        Refresh data and then mark time read. Can be manually called
+    '''
     try:
         self._data = json.loads(DeadSimpleKV._read_in(self.file_path))
     except FileNotFoundError:
@@ -402,7 +435,7 @@ Will return value error if either key or value are not JSON serializable

diff --git a/setup.py b/setup.py index 969684e..40b5a4f 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,10 @@ from distutils.core import setup -setup(name='deadsimplekv-beardog', - version='0.0.1', +setup(name='deadsimplekv', + version='0.1.1', description='Very simple key-value store for Python', author='Kevin Froman', - author_email='beardog@firemail.cc', + author_email='beardog@mailbox.org', url='https://github.com/beardog108/deadsimplekv', packages=['deadsimplekv'], ) diff --git a/tests/test_basic.py b/tests/test_basic.py index 624a01c..dd4725a 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -23,6 +23,7 @@ def get_test_id(): return str(uuid.uuid4()) + '.dat' class TestInit(unittest.TestCase): + def test_init(self): kv = deadsimplekv.DeadSimpleKV(get_test_id())