FIX bugs witth added time.

Actually implement set of added time in repository.
Changes storage of added time (now as datetime.datetime).
main
Olivier Mangin 11 years ago
parent d2ba13700f
commit ad29b27412

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

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

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

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

Loading…
Cancel
Save