FIX bugs witth added time.

Actually implement set of added time in repository.
Changes storage of added time (now as datetime.datetime).
This commit is contained in:
Olivier Mangin 2014-04-17 19:15:04 +02:00
parent d2ba13700f
commit ad29b27412
4 changed files with 38 additions and 16 deletions

View File

@ -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])

View File

@ -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

View File

@ -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)

View File

@ -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):