diff options
author | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2020-09-02 21:08:27 +0200 |
---|---|---|
committer | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2020-09-02 21:08:27 +0200 |
commit | d2923e95beaa61df08e0dad7cccdbf04f80d1ec9 (patch) | |
tree | edf5ff4359d159cf9b29b28ebe455ae2969774ab | |
parent | c96febf5d0a272b215397869f6a3569b9a8b8382 (diff) |
New command: update a field in the results of a query
-rw-r--r-- | lesana/collection.py | 12 | ||||
-rw-r--r-- | lesana/command.py | 26 | ||||
-rwxr-xr-x | scripts/lesana | 1 | ||||
-rw-r--r-- | tests/test_collection.py | 32 |
4 files changed, 71 insertions, 0 deletions
diff --git a/lesana/collection.py b/lesana/collection.py index 4bec594..25b86e5 100644 --- a/lesana/collection.py +++ b/lesana/collection.py @@ -452,6 +452,18 @@ class Collection(object): repo.index.remove([f_path]) os.remove(f_path) + def update_field(self, query, field, value): + self.start_search(query) + changed = [] + for e in self.get_all_search_results(): + e.data[field] = value + changed.append(e) + self.save_entries(changed) + self.git_add_files([ + os.path.join(self.itemdir, e.fname) for e in changed + ]) + self.update_cache([e.fname for e in changed]) + def get_template(self, template_fname, searchpath='.'): env = jinja2.Environment( loader=jinja2.FileSystemLoader( diff --git a/lesana/command.py b/lesana/command.py index f2f3e56..c2bdf28 100644 --- a/lesana/command.py +++ b/lesana/command.py @@ -331,3 +331,29 @@ class Remove(Command): def main(self): collection = self.collection_class(self.args.collection) collection.remove_entries(eids=self.args.entries) + + +class Update(Command): + arguments = [ + (['--collection', '-c'], dict( + help='The collection to work on (default .)', + )), + (['--field', '-f'], dict( + help='The field to change', + )), + (['--value', '-t'], dict( + help='The value to set', + )), + (['query'], dict( + help='Xapian query to search in the collection', + nargs='+' + )), + ] + + def main(self): + collection = self.collection_class(self.args.collection) + collection.update_field( + ' '.join(self.args.query), + field=self.args.field, + value=self.args.value + ) diff --git a/scripts/lesana b/scripts/lesana index 408aa2c..5591b3b 100755 --- a/scripts/lesana +++ b/scripts/lesana @@ -15,6 +15,7 @@ class Lesana(): ('show', lesana.command.Show()), ('index', lesana.command.Index()), ('search', lesana.command.Search()), + ('update', lesana.command.Update()), ('export', lesana.command.Export()), ('init', lesana.command.Init()), ('rm', lesana.command.Remove()), diff --git a/tests/test_collection.py b/tests/test_collection.py index e97e912..eb57fb0 100644 --- a/tests/test_collection.py +++ b/tests/test_collection.py @@ -154,6 +154,38 @@ class testCollection(unittest.TestCase): self.assertIn('11189ee4: Another item', res) +class testSimpleCollection(unittest.TestCase): + def setUp(self): + self.tmpdir = tempfile.mkdtemp() + shutil.copytree('tests/data/simple', self.tmpdir, dirs_exist_ok=True) + self.collection = lesana.Collection(self.tmpdir) + + def tearDown(self): + shutil.rmtree(self.tmpdir) + + def test_update(self): + self.collection.update_field('Item', field="position", value="new_pos") + with open(os.path.join( + self.collection.basedir, + 'items', + '11189ee47ddf4796b718a483b379f976.yaml' + )) as fp: + self.assertIn("new_pos", fp.read()) + pass + self.assertEqual( + self.collection.entry_from_eid( + "11189ee47ddf4796b718a483b379f976" + ).data['position'], + "new_pos" + ) + + self.assertIsNone( + self.collection.entry_from_eid( + "8b69b063b2a64db7b5714294a69255c7" + ).data['position'] + ) + + class testEntries(unittest.TestCase): def setUp(self): self.collection = lesana.Collection('tests/data/simple') |