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:
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.
|
||||||
@ -19,20 +28,16 @@ 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…
x
Reference in New Issue
Block a user