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 ..configs import config
from ..uis import get_ui from ..uis import get_ui
class InvalidQuery(ValueError): class InvalidQuery(ValueError):
pass pass
@ -24,7 +25,8 @@ def parser(subparsers):
def date_added(np): def date_added(np):
n, p = np n, p = np
return p.metadata['added'] return p.added
def command(args): def command(args):
ui = get_ui() ui = get_ui()
@ -59,6 +61,7 @@ def _get_field_value(query_block):
def _lower(s, lower=True): def _lower(s, lower=True):
return s.lower() if lower else s return s.lower() if lower else s
def _check_author_match(paper, query, case_sensitive=False): def _check_author_match(paper, query, case_sensitive=False):
"""Only checks within last names.""" """Only checks within last names."""
if not 'author' in paper.bibentry: 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']]) for p in paper.bibentry['author']])
def _check_tag_match(paper, query, case_sensitive=False): def _check_tag_match(paper, query, case_sensitive=False):
return any([query in _lower(t, lower=(not case_sensitive)) return any([query in _lower(t, lower=(not case_sensitive))
for t in paper.tags]) for t in paper.tags])

@ -1,11 +1,20 @@
import copy import copy
import collections from dateutil.parser import parse as datetime_parse
import datetime
from . import bibstruct 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): class Paper(object):
""" Paper class. """ Paper class.
@ -20,19 +29,15 @@ class Paper(object):
def __init__(self, bibdata, citekey=None, metadata=None): def __init__(self, bibdata, citekey=None, metadata=None):
self.citekey = citekey self.citekey = citekey
self.metadata = metadata self.metadata = _clean_metadata(metadata)
self.bibdata = bibdata self.bibdata = bibdata
_, self.bibentry = bibstruct.get_entry(self.bibdata) _, self.bibentry = bibstruct.get_entry(self.bibdata)
if self.metadata is None:
self.metadata = copy.deepcopy(DEFAULT_META)
if self.citekey is None: if self.citekey is None:
self.citekey = bibstruct.extract_citekey(self.bibdata) self.citekey = bibstruct.extract_citekey(self.bibdata)
bibstruct.check_citekey(self.citekey) bibstruct.check_citekey(self.citekey)
self.metadata['tags'] = set(self.metadata.get('tags', []))
def __eq__(self, other): def __eq__(self, other):
return (isinstance(self, Paper) and type(other) is type(self) return (isinstance(self, Paper) and type(other) is type(self)
and self.bibdata == other.bibdata and self.bibdata == other.bibdata
@ -88,10 +93,11 @@ class Paper(object):
# added date # added date
# Added time, supposed to be stored as datetime object
@property @property
def added(self): def added(self):
datetime.datetime.strptime(self.metadata['added'], '%Y-%m-%d %H:%M:%S') return self.metadata.get('added', None)
@added.setter @added.setter
def added(self, value): 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 import itertools
from datetime import datetime
from . import bibstruct from . import bibstruct
from . import events from . import events
@ -66,7 +67,8 @@ class Repository(object):
if (not overwrite) and (self.databroker.exists(paper.citekey, both=False) if (not overwrite) and (self.databroker.exists(paper.citekey, both=False)
or (paper.citekey in self)): or (paper.citekey in self)):
raise CiteKeyCollision('citekey {} already in use'.format(paper.citekey)) 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_bibdata(paper.citekey, paper.bibdata)
self.databroker.push_metadata(paper.citekey, paper.metadata) self.databroker.push_metadata(paper.citekey, paper.metadata)
self.citekeys.add(paper.citekey) self.citekeys.add(paper.citekey)

@ -1,4 +1,5 @@
import unittest import unittest
from datetime import datetime
import dotdot import dotdot
import fake_env import fake_env
@ -46,11 +47,20 @@ class TestPushPaper(TestRepo):
self.assertEquals(orig, retrieved) self.assertEquals(orig, retrieved)
def test_pushes_paper_metadata(self): 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)) self.repo.push_paper(Paper(fixtures.doe_bibdata, metadata=orig))
retrieved = self.repo.databroker.pull_metadata('Doe2013') retrieved = self.repo.databroker.pull_metadata('Doe2013')
self.assertEquals(orig, retrieved) 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): class TestUpdatePaper(TestRepo):

Loading…
Cancel
Save