def test_dive_copy_with_buddy(self): """ Test copying a dive with a buddy """ fl = '{}/dive_copy_logbook.uddf'.format(self.tdir) kl.copy_dive(self.fin, 1, fl) nodes = ku.find(fl, '//uddf:dive') dn = next(nodes) self.assertEquals('2009-09-19T13:10:23', ku.xp_first(dn, './/uddf:datetime/text()')) self.assertEquals('b1', ku.xp_first(dn, './/uddf:link/@ref'))
def enum_dives(files, total=1): """ Enumerate dives with day dive number (when UDDF 3.2 is introduced) and total dive number. :Parameters: files Collection of UDDF files having dives to enumerate. total Start of total dive number. """ fields = ('id', 'date') queries = ( ku.XPath('@id'), ku.XPath('uddf:informationbeforedive/uddf:datetime/text()'), ) parsers = (str, lambda dt: ku.dparse(dt).date()) fnodes = ((f, n) for f in files for n in ku.find(f, ku.XP_FIND_DIVES, nodes=None, dives=None)) data = ((f, ku.dive_data(n, fields, queries, parsers)) for f, n in fnodes) data = ( (item[0], item[1].id, item[1].date) for item in data) # flatten data data = sorted(data, key=itemgetter(2)) # enumerate dives with _day_ dive number and flatten the groups data = ichain( enumerate(g, 1) for k, g in itertools.groupby(data, itemgetter(2))) # enumerate dives with total dive number and transform into # { (f, id) => (n, k) } cache = dict( ((v[0], v[1]), (n, k)) for n, (k, v) in enumerate(data, total)) # update data for f in files: doc = ku.parse(f) for n in ku.XP_FIND_DIVES(doc, nodes=None, dives=None): id = n.get('id') dnn = ku.xp_first(n, 'uddf:informationbeforedive/uddf:divenumber') if dnn is None: pn = ku.xp_first( n, 'uddf:informationbeforedive/uddf:internaldivenumber') if pn is None: pn = ku.xp_first( n, 'uddf:informationbeforedive/uddf:datetime') *_, dnn = ku.create_node('uddf:divenumber') pn.addprevious(dnn) dnn.text = str(cache[f, id][0]) ku.save(doc.getroot(), f)
def test_dive_copy(self): """ Test copying dive """ fl = '{}/dive_copy_logbook.uddf'.format(self.tdir) kl.copy_dives([self.fin], ['1'], None, fl) nodes = ku.find(fl, '//uddf:dive') dn = next(nodes) self.assertTrue(next(nodes, None) is None) self.assertEquals('2009-09-19T13:10:23', ku.xp_first(dn, './/uddf:datetime/text()')) self.assertEquals('30.2', ku.xp_first(dn, './/uddf:greatestdepth/text()')) self.assertEquals('20', ku.xp_first(dn, './/uddf:diveduration/text()'))
def test_find_with_dive_number(self): """ Test finding dive nodes from UDDF files with dive number """ nodes = list( kl.find_dive_nodes([self.f1, self.f2, self.f3], None, '299-302')) self.assertEquals(3, len(nodes)) ids = [ku.xp_first(n, '@id') for n in nodes] self.assertEquals(['d01'] * 3, ids)
def test_dive_add(self): """ Test adding dive with time, depth and duration """ f = '{}/dive_add.uddf'.format(self.tdir) d = kd.Dive(datetime=datetime(2010, 1, 2, 5, 7), depth=33.0, duration=3540) kl.add_dive(d, f) nodes = ku.find(f, '//uddf:dive') dn = next(nodes) self.assertTrue(next(nodes, None) is None) self.assertEquals('2010-01-02T05:07:00', ku.xp_first(dn, './/uddf:datetime/text()')) self.assertEquals('33.0', ku.xp_first(dn, './/uddf:greatestdepth/text()')) self.assertEquals('3540', ku.xp_first(dn, './/uddf:diveduration/text()'))
def test_dive_copy_with_buddies(self): """ Test dive copying with dive buddies """ fl = '{}/dive_copy_logbook.uddf'.format(self.tdir) kl.copy_dive(self.fin, 2, fl) nodes = ku.find(fl, '//uddf:dive') dn = next(nodes) self.assertEquals('2010-10-30T13:24:43', ku.xp_first(dn, './/uddf:datetime/text()')) self.assertEquals(('b1', 'b2'), tuple(ku.xp(dn, './/uddf:link/@ref')))
def copy_dives(files, nodes, n_dives, lfile): """ Copy dive nodes to logbook file. The logbook file is created if it does not exist. :Parameters: files Collection of files. nodes Collection of dive ranges. n_dives Numeric range of total dive number, `None` if any dive. lfile Logbook file. """ if os.path.exists(lfile): doc = et.parse(lfile).getroot() else: doc = ku.create() dives = find_dive_nodes(files, nodes, n_dives) gases = find_dive_gas_nodes(files, nodes) _, rg = ku.create_node('uddf:profiledata/uddf:repetitiongroup', parent=doc) gn = ku.xp_first(doc, 'uddf:gasdefinitions') existing = gn is not None if not existing: *_, gn = ku.create_node('uddf:gasdefinitions', parent=doc) with ku.NodeCopier(doc) as nc: copied = False for n in gases: copied = nc.copy(n, gn) is not None or copied if not existing and not copied: p = gn.getparent() p.remove(gn) copied = False for n in dives: copied = nc.copy(n, rg) is not None or copied if copied: ku.reorder(doc) ku.save(doc, lfile) else: log.debug('no dives copied')
def test_dive_add_with_buddy(self): """ Test adding dive with time, depth, duration and buddy """ f = '{}/dive_add_buddy.uddf'.format(self.tdir) doc = ku.create() ku.create_buddy_data(doc, id='b1', fname='F', lname='N') ku.save(doc, f) d = kd.Dive(datetime=datetime(2010, 1, 2, 5, 7), depth=33.0, duration=3540) kl.add_dive(d, f, qbuddies=['b1']) nodes = ku.find(f, '//uddf:dive') dn = next(nodes) self.assertEquals('b1', ku.xp_first(dn, './/uddf:link/@ref'))
def test_dive_add_with_site(self): """ Test adding dive with time, depth, duration and dive site """ f = '{}/dive_add_site.uddf'.format(self.tdir) doc = ku.create() ku.create_site_data(doc, id='s1', location='L1', name='N1') ku.save(doc, f) d = kd.Dive(datetime=datetime(2010, 1, 2, 5, 7), depth=33.0, duration=3102) kl.add_dive(d, f, qsite='s1') nodes = ku.find(f, '//uddf:dive') dn = next(nodes) self.assertEquals('s1', ku.xp_first(dn, './/uddf:link/@ref'))