From ad29b274121fca8aafafbb216836e1aa0c179d5a Mon Sep 17 00:00:00 2001 From: Olivier Mangin Date: Thu, 17 Apr 2014 19:15:04 +0200 Subject: [PATCH] FIX bugs witth added time. Actually implement set of added time in repository. Changes storage of added time (now as datetime.datetime). --- pubs/commands/list_cmd.py | 6 +++++- pubs/paper.py | 32 +++++++++++++++++++------------- pubs/repo.py | 4 +++- tests/test_repo.py | 12 +++++++++++- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/pubs/commands/list_cmd.py b/pubs/commands/list_cmd.py index 2acdec6..ae1421f 100644 --- a/pubs/commands/list_cmd.py +++ b/pubs/commands/list_cmd.py @@ -4,6 +4,7 @@ from .. import bibstruct from ..configs import config from ..uis import get_ui + class InvalidQuery(ValueError): pass @@ -24,7 +25,8 @@ def parser(subparsers): def date_added(np): n, p = np - return p.metadata['added'] + return p.added + def command(args): ui = get_ui() @@ -59,6 +61,7 @@ def _get_field_value(query_block): def _lower(s, lower=True): return s.lower() if lower else s + def _check_author_match(paper, query, case_sensitive=False): """Only checks within last names.""" if not 'author' in paper.bibentry: @@ -67,6 +70,7 @@ def _check_author_match(paper, query, case_sensitive=False): for p in paper.bibentry['author']]) + def _check_tag_match(paper, query, case_sensitive=False): return any([query in _lower(t, lower=(not case_sensitive)) for t in paper.tags]) diff --git a/pubs/paper.py b/pubs/paper.py index 1b0a8ba..7798366 100644 --- a/pubs/paper.py +++ b/pubs/paper.py @@ -1,11 +1,20 @@ import copy -import collections -import datetime +from dateutil.parser import parse as datetime_parse from . import bibstruct -#DEFAULT_META = collections.OrderedDict([('docfile', None), ('tags', set()), ('added', )]) -DEFAULT_META = {'docfile': None, 'tags': set(), 'added': None} + +DEFAULT_META = {'docfile': None, 'tags': set()} + + +def _clean_metadata(metadata): + meta = copy.deepcopy(DEFAULT_META) + meta.update(metadata or {}) # handles None metadata + meta['tags'] = set(meta.get('tags', [])) # tags should be a set + if 'added' in meta and isinstance(meta['added'], basestring): + meta['added'] = datetime_parse(meta['added']) + return meta + class Paper(object): """ Paper class. @@ -19,20 +28,16 @@ class Paper(object): """ def __init__(self, bibdata, citekey=None, metadata=None): - self.citekey = citekey - self.metadata = metadata - self.bibdata = bibdata + self.citekey = citekey + self.metadata = _clean_metadata(metadata) + self.bibdata = bibdata _, self.bibentry = bibstruct.get_entry(self.bibdata) - if self.metadata is None: - self.metadata = copy.deepcopy(DEFAULT_META) if self.citekey is None: self.citekey = bibstruct.extract_citekey(self.bibdata) bibstruct.check_citekey(self.citekey) - self.metadata['tags'] = set(self.metadata.get('tags', [])) - def __eq__(self, other): return (isinstance(self, Paper) and type(other) is type(self) and self.bibdata == other.bibdata @@ -88,10 +93,11 @@ class Paper(object): # added date + # Added time, supposed to be stored as datetime object @property def added(self): - datetime.datetime.strptime(self.metadata['added'], '%Y-%m-%d %H:%M:%S') + return self.metadata.get('added', None) @added.setter def added(self, value): - self.metadata['added'] = value.strftime('%Y-%m-%d %H:%M:%S') + self.metadata['added'] = value diff --git a/pubs/repo.py b/pubs/repo.py index da9dccc..3c2058a 100644 --- a/pubs/repo.py +++ b/pubs/repo.py @@ -1,4 +1,5 @@ import itertools +from datetime import datetime from . import bibstruct from . import events @@ -66,7 +67,8 @@ class Repository(object): if (not overwrite) and (self.databroker.exists(paper.citekey, both=False) or (paper.citekey in self)): raise CiteKeyCollision('citekey {} already in use'.format(paper.citekey)) - + if not paper.added: + paper.added = datetime.now() self.databroker.push_bibdata(paper.citekey, paper.bibdata) self.databroker.push_metadata(paper.citekey, paper.metadata) self.citekeys.add(paper.citekey) diff --git a/tests/test_repo.py b/tests/test_repo.py index 296ea07..e1eaff7 100644 --- a/tests/test_repo.py +++ b/tests/test_repo.py @@ -1,4 +1,5 @@ import unittest +from datetime import datetime import dotdot import fake_env @@ -46,11 +47,20 @@ class TestPushPaper(TestRepo): self.assertEquals(orig, retrieved) def test_pushes_paper_metadata(self): - orig = {'docfile': 'dummy', 'tags': set(['tag', 'another'])} + orig = {'docfile': 'dummy', 'tags': set(['tag', 'another']), + 'added': datetime(2012, 12, 12, 12, 12, 12, 12)} self.repo.push_paper(Paper(fixtures.doe_bibdata, metadata=orig)) retrieved = self.repo.databroker.pull_metadata('Doe2013') self.assertEquals(orig, retrieved) + def test_pushes_paper_metadata_set_added(self): + orig = {'docfile': 'dummy', 'tags': set(['tag', 'another'])} + now = datetime.now() + self.repo.push_paper(Paper(fixtures.doe_bibdata, metadata=orig)) + retrieved = self.repo.databroker.pull_metadata('Doe2013') + self.assertIn('added', retrieved) + self.assertTrue(now < retrieved['added']) + class TestUpdatePaper(TestRepo):