From 64efe5712156c98feb7372915a0d90bb639eee6a Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Tue, 28 Mar 2017 17:27:16 +0300 Subject: Implement implicitly persistent variable storage --- fail-tests/fail.stdout-diff | 2 +- yarnutils/__init__.py | 1 + yarnutils/vars.py | 47 +++++++++++++++++++++++++++++++++++++++++++++ yarnutils/vars_tests.py | 43 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 yarnutils/vars.py create mode 100644 yarnutils/vars_tests.py diff --git a/fail-tests/fail.stdout-diff b/fail-tests/fail.stdout-diff index c574866..b4fe31a 100644 --- a/fail-tests/fail.stdout-diff +++ b/fail-tests/fail.stdout-diff @@ -1,4 +1,4 @@ --- /dev/null 2017-03-27 15:43:35.669436670 +0300 -+++ fail-tests/fail.stdout-actual 2017-03-28 17:16:53.366886919 +0300 ++++ fail-tests/fail.stdout-actual 2017-03-28 17:27:11.462899536 +0300 @@ -0,0 +1 @@ +this is not empty output to make test fail diff --git a/yarnutils/__init__.py b/yarnutils/__init__.py index 9c3ef7c..0a5e0c4 100644 --- a/yarnutils/__init__.py +++ b/yarnutils/__init__.py @@ -16,3 +16,4 @@ # =*= License: GPL-3+ =*= +from .vars import Variables diff --git a/yarnutils/vars.py b/yarnutils/vars.py new file mode 100644 index 0000000..9404ffa --- /dev/null +++ b/yarnutils/vars.py @@ -0,0 +1,47 @@ +# Copyright 2017 Lars Wirzenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# =*= License: GPL-3+ =*= + + +import os +import yaml + + +class Variables(object): + + _basename = 'vars.yaml' + + def __init__(self, dirname): + self._filename = os.path.join(dirname, self._basename) + self._dict = self._load() + + def _load(self): + if os.path.exists(self._filename): + with open(self._filename) as f: + return yaml.safe_load(f) + else: + return {} + + def _save(self, values): + with open(self._filename, 'w') as f: + return yaml.safe_dump(values, stream=f) + + def __getitem__(self, key): + return self._dict.get(key) + + def __setitem__(self, key, value): + self._dict[key] = value + self._save(self._dict) diff --git a/yarnutils/vars_tests.py b/yarnutils/vars_tests.py new file mode 100644 index 0000000..a49903e --- /dev/null +++ b/yarnutils/vars_tests.py @@ -0,0 +1,43 @@ +# Copyright 2017 Lars Wirzenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# =*= License: GPL-3+ =*= + + +import shutil +import tempfile +import unittest + +import yarnutils + + +class VariablesTests(unittest.TestCase): + + def setUp(self): + self.tempdir = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.tempdir) + + def test_unset_variable_is_None(self): + vars = yarnutils.Variables(self.tempdir) + self.assertEqual(vars['foo'], None) + + def test_set_value_is_persistent(self): + vars1 = yarnutils.Variables(self.tempdir) + vars1['foo'] = 'bar' + vars2 = yarnutils.Variables(self.tempdir) + self.assertEqual(vars1['foo'], vars2['foo']) + self.assertEqual(vars2['foo'], 'bar') -- cgit v1.2.1