Beispiel #1
0
    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'))
Beispiel #2
0
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)
Beispiel #3
0
    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()'))
Beispiel #4
0
    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)
Beispiel #5
0
    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()'))
Beispiel #6
0
    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')))
Beispiel #7
0
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')
Beispiel #8
0
    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'))
Beispiel #9
0
    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'))