Source

thg / tests / wconfig_test.py

import os, tempfile, shutil
from nose.tools import *
from nose.plugins.skip import SkipTest
from StringIO import StringIO
from mercurial import config
from tortoisehg.util import wconfig

def setup():
    global _tempdir
    _tempdir = tempfile.mkdtemp()

def teardown():
    shutil.rmtree(_tempdir)


def newrconfig(vals={}):
    c = config.config()
    for k, v in isinstance(vals, dict) and vals.iteritems() or vals:
        sec, it = k.split('.', 1)
        c.set(sec, it, v)
    return c

def newwconfig(vals={}):
    return wconfig.config(newrconfig(vals))

def written(c):
    dest = StringIO()
    c.write(dest)
    return dest.getvalue()

def writetempfile(s):
    fd, path = tempfile.mkstemp(dir=_tempdir)
    os.write(fd, s)
    os.close(fd)
    return path

class _Collector(list):
    def __call__(self, func):
        self.append(func)
        return func

with_rconfig = _Collector()
with_wconfig = _Collector()
with_both = _Collector()


def test_both():
    for e in with_wconfig + with_both:
        if wconfig._hasiniparse:
            yield e
        else:
            def skipped():
                raise SkipTest
            yield skipped

    orighasiniparse = wconfig._hasiniparse
    wconfig._hasiniparse = False
    try:
        for e in with_rconfig + with_both:
            yield e
    finally:
        wconfig._hasiniparse = orighasiniparse


@with_both
def check_copy():
    c = newwconfig({'foo.bar': 'baz'})
    assert_equals(c.__class__, c.copy().__class__)
    assert_equals('baz', c.copy().get('foo', 'bar'))

@with_both
def check_contains():
    c = newwconfig({'foo.bar': 'baz'})
    assert 'foo' in c
    assert 'bar' not in c

@with_both
def check_getitem():
    c = newwconfig({'foo.bar': 'x', 'foo.baz': 'y'})
    assert_equals({'bar': 'x', 'baz': 'y'}, dict(c['foo']))
    assert_equals({}, dict(c['unknown']))

@with_both
def check_getitem_empty_then_set_no_effect():
    c = newwconfig()
    c['unknown']['bar'] = 'baz'
    assert not c.get('unknown', 'bar')

@with_both
def check_set_followed_by_getitem_empty():
    c = newwconfig()
    c['unknown']
    c.set('unknown', 'foo', 'bar')
    assert_equals('bar', c.get('unknown', 'foo'))
    assert_equals('bar', c['unknown']['foo'])

@with_both
def check_dict_contains():
    c = newwconfig({'foo.bar': 'x'})
    assert 'bar' in c['foo']
    assert 'baz' not in c['foo']

@with_both
def check_dict_getitem():
    c = newwconfig({'foo.bar': 'x'})
    assert_equals('x', c['foo']['bar'])
    assert_raises(KeyError, lambda: c['foo']['baz'])

@with_both
def check_dict_setitem():
    c = newwconfig({'foo.bar': 'x'})
    c['foo']['bar'] = 'y'
    c['foo']['baz'] = 'z'
    assert_equals('y', c['foo']['bar'])
    assert_equals('z', c['foo']['baz'])

@with_wconfig  # original config doesn't preserve the order
def check_dict_setitem_preserve_order():
    c = newwconfig([('foo.bar', 'x'), ('foo.baz', 'y')])
    assert_equals(['bar', 'baz'], list(c['foo']))
    c['foo']['bar'] = 'z'
    assert_equals(['bar', 'baz'], list(c['foo']))

@with_both
def check_dict_iter():
    c = newwconfig({'foo.bar': 'x', 'foo.baz': 'y'})
    assert_equals(set(['bar', 'baz']), set(c['foo']))

@with_both
def check_dict_len():
    c = newwconfig({'foo.bar': 'x'})
    assert_equals(1, len(c['foo']))

@with_both
def check_dict_update():
    c = newwconfig({'foo.bar': 'x', 'foo.baz': 'y'})
    c['foo'].update(newwconfig({'foo.bar': 'z', 'foo.baz': 'w'})['foo'])
    assert_equals('z', c['foo']['bar'])
    assert_equals('w', c['foo']['baz'])

@with_both
def check_dict_delitem():
    c = newwconfig({'foo.bar': 'x'})
    del c['foo']['bar']
    assert 'bar' not in c['foo']

@with_both
def check_iter():
    c = newwconfig({'foo.bar': 'x', 'baz.bax': 'y'})
    assert_equals(set(['foo', 'baz']), set(c))

@with_both
def check_update():
    c0 = newwconfig({'foo.bar': 'x', 'foo.blah': 'w'})
    c1 = newwconfig({'foo.bar': 'y', 'baz.bax': 'z'})
    c0.update(c1)
    assert_equals('y', c0.get('foo', 'bar'))
    assert_equals('z', c0.get('baz', 'bax'))
    assert_equals('w', c0.get('foo', 'blah'))

@with_both
def check_get():
    c = newwconfig({'foo.bar': 'baz'})
    assert_equals('baz', c.get('foo', 'bar'))
    assert_equals(None, c.get('foo', 'baz'))
    assert_equals('x', c.get('foo', 'baz', 'x'))

@with_both
def check_source():
    c = newwconfig()
    c.set('foo', 'bar', 'baz', source='blah')
    assert_equals('blah', c.source('foo', 'bar'))

@with_both
def check_sections():
    c = newwconfig({'foo.bar': 'x', 'baz.bax': 'y'})
    assert_equals(['baz', 'foo'], c.sections())

@with_both
def check_items():
    c = newwconfig({'foo.bar': 'x', 'foo.baz': 'y'})
    assert_equals({'bar': 'x', 'baz': 'y'}, dict(c.items('foo')))

@with_both
def check_set():
    c = newwconfig({'foo.bar': 'x'})
    c.set('foo', 'baz', 'y')
    c.set('foo', 'bar', 'w')
    c.set('newsection', 'bax', 'z')
    assert_equals('y', c.get('foo', 'baz'))
    assert_equals('w', c.get('foo', 'bar'))
    assert_equals('z', c.get('newsection', 'bax'))

@with_wconfig  # original config doesn't preserve the order
def check_set_preserve_order():
    c = newwconfig([('foo.bar', 'x'), ('foo.baz', 'y')])
    assert_equals(['bar', 'baz'], list(c['foo']))
    c.set('foo', 'bar', 'z')
    assert_equals(['bar', 'baz'], list(c['foo']))

# TODO: test_parse
# TODO: test_read

@with_wconfig
def check_write_after_set():
    c = newwconfig()
    c.set('foo', 'bar', 'baz')
    assert_equals('[foo]\nbar = baz', written(c).rstrip())

@with_wconfig
def check_write_empty():
    c = newwconfig()
    assert_equals('', written(c).rstrip())

@with_wconfig
def check_write_after_update():
    c = newwconfig()
    c.update(newwconfig({'foo.bar': 'baz'}))
    assert_equals('[foo]\nbar = baz', written(c).rstrip())

@with_wconfig
def check_read_write():
    c = newwconfig()
    s = '[foo]\nbar = baz'
    c.read(path='foo', fp=StringIO(s))
    assert_equals(s, written(c).rstrip())

@with_wconfig
def check_write_after_dict_setitem():
    c = newwconfig({'foo.bar': 'x'})
    c['foo']['bar'] = 'y'
    assert_equals('[foo]\nbar = y', written(c).rstrip())

@with_wconfig
def check_write_after_dict_update():
    c = newwconfig({'foo.bar': 'x'})
    c['foo'].update({'bar': 'y'})
    assert_equals('[foo]\nbar = y', written(c).rstrip())

@with_wconfig
def check_write_after_dict_delitem():
    c = newwconfig({'foo.bar': 'x', 'foo.baz': 'y'})
    del c['foo']['bar']
    assert_equals('[foo]\nbaz = y', written(c).rstrip())

@with_wconfig
def check_read_write_rem():
    c = newwconfig()
    s = '[foo]\nrem = x'
    c.read(path='foo', fp=StringIO(s))
    c.set('foo', 'rem', 'y')
    assert_equals('[foo]\nrem = y', written(c).rstrip())


@with_wconfig
def check_write_conflict_set_set():
    fname = writetempfile('[foo]\nbar = x')
    c0 = wconfig.readfile(fname)
    c1 = wconfig.readfile(fname)
    c1.set('foo', 'bar', 'y')
    wconfig.writefile(c1, fname)
    c0.set('foo', 'bar', 'z')
    wconfig.writefile(c0, fname)

    cr = wconfig.readfile(fname)
    assert_equals('z', cr.get('foo', 'bar'))

@with_wconfig
def check_write_conflict_del_set():
    fname = writetempfile('[foo]\nbar = x')
    c0 = wconfig.readfile(fname)
    c1 = wconfig.readfile(fname)
    del c1['foo']['bar']
    wconfig.writefile(c1, fname)
    c0.set('foo', 'bar', 'z')
    wconfig.writefile(c0, fname)

    cr = wconfig.readfile(fname)
    assert_equals('z', cr.get('foo', 'bar'))

@with_wconfig
def check_write_conflict_set_del():
    fname = writetempfile('[foo]\nbar = x')
    c0 = wconfig.readfile(fname)
    c1 = wconfig.readfile(fname)
    c1.set('foo', 'bar', 'y')
    wconfig.writefile(c1, fname)
    del c0['foo']['bar']
    wconfig.writefile(c0, fname)

    cr = wconfig.readfile(fname)
    assert not cr.get('foo', 'bar')

@with_wconfig
def check_write_conflict_del_del():
    fname = writetempfile('[foo]\nbar = x')
    c0 = wconfig.readfile(fname)
    c1 = wconfig.readfile(fname)
    del c1['foo']['bar']
    wconfig.writefile(c1, fname)
    del c0['foo']['bar']
    wconfig.writefile(c0, fname)  # shouldn't raise KeyError

    cr = wconfig.readfile(fname)
    assert not cr.get('foo', 'bar')

@with_wconfig
def check_write_noconflict_set_set():
    fname = writetempfile('[foo]\nbar = x')
    c0 = wconfig.readfile(fname)
    c1 = wconfig.readfile(fname)
    c1.set('foo', 'baz', 'y')
    wconfig.writefile(c1, fname)
    c0.set('foo', 'bar', 'z')
    wconfig.writefile(c0, fname)  # should not override foo.baz = y

    cr = wconfig.readfile(fname)
    assert_equals('z', cr.get('foo', 'bar'))
    assert_equals('y', cr.get('foo', 'baz'))
    assert not c0.get('foo', 'baz')  # don't reload c1's change implicitly

@with_wconfig
def check_write_noconflict_del():
    fname = writetempfile('[foo]\nbar = x')
    c0 = wconfig.readfile(fname)
    c1 = wconfig.readfile(fname)
    del c1['foo']['bar']
    wconfig.writefile(c1, fname)
    wconfig.writefile(c0, fname)  # shouldn't override del foo.bar

    cr = wconfig.readfile(fname)
    assert not cr.get('foo', 'bar')
    assert c0.get('foo', 'bar')  # don't reload c1's change implicitly


@with_wconfig
def check_write_copied():
    fname = writetempfile('[foo]\nbar = x')
    c0 = wconfig.readfile(fname)
    c1 = c0.copy()
    c1.set('foo', 'baz', 'y')
    wconfig.writefile(c1, fname)

    cr = wconfig.readfile(fname)
    assert_equals('x', cr.get('foo', 'bar'))
    assert_equals('y', cr.get('foo', 'baz'))

@with_wconfig
def check_write_copied_conflict():
    fname = writetempfile('[foo]\nbar = x')
    c0 = wconfig.readfile(fname)
    c1 = c0.copy()
    c0.set('foo', 'bar', 'y')
    wconfig.writefile(c0, fname)
    wconfig.writefile(c1, fname)  # shouldn't override foo.bar = y

    cr = wconfig.readfile(fname)
    assert_equals('y', cr.get('foo', 'bar'))

@with_wconfig
def test_write_copied_rconfig():
    c0 = newrconfig({'foo.bar': 'x'})
    c1 = wconfig.config(c0)
    assert_equals('[foo]\nbar = x', written(c1).rstrip())

@with_both
def check_readfile():
    fname = writetempfile('[foo]\nbar = baz')
    c = wconfig.readfile(fname)
    assert_equals('baz', c.get('foo', 'bar'))

@with_wconfig
def check_writefile():
    c = newwconfig({'foo.bar': 'baz'})
    fname = writetempfile('')
    wconfig.writefile(c, fname)
    assert_equals('[foo]\nbar = baz', open(fname).read().rstrip())
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.