def test_set(): with tempdir.tempdir(changeto=False) as td1,\ tempdir.tempdir(changeto=False) as td2: s1 = settings.Settings(cfgdir=td1, writeOnExit=False) s2 = settings.Settings(cfgdir=td2, writeOnExit=False) settings.set(s1) with settings.writeFile('file1') as f: f.write('hi!') assert os.listdir(td1) == ['file1'] assert os.listdir(td2) == [] settings.set(s2) with settings.writeFile('file2') as f: f.write('hi!') assert os.listdir(td1) == ['file1'] assert os.listdir(td2) == ['file2'] settings.set(s1) with settings.writeFile('file3') as f: f.write('hi!') assert sorted(os.listdir(td1)) == ['file1', 'file3'] assert os.listdir(td2) == ['file2'] settings.set(s2) with settings.writeFile('file4') as f: f.write('hi!') assert sorted(os.listdir(td1)) == ['file1', 'file3'] assert sorted(os.listdir(td2)) == ['file2', 'file4']
def test_initialise(): # Assuming that initialise() # has not yet been called assert settings.read('nothing') is None assert settings.read('nothing', 'default') == 'default' settings.write('nothing', 'nothing') settings.delete('nothing') assert settings.readFile('nothing') is None settings.writeFile('nothing', 'nothing') settings.deleteFile('nothing') assert settings.filePath() is None assert settings.readAll() == {} assert settings.listFiles() == [] settings.clear() with tests.testdir() as testdir: settings.initialise(cfgid='test', cfgdir=testdir, writeOnExit=False) assert settings.settings.configID == 'test' assert settings.settings.configDir == testdir settings.write('setting', 'value') assert settings.read('setting') == 'value' assert settings.read('nothing') is None
def installColourMap(key): """Attempts to install a previously registered colourmap into the ``[settingsbase]/colourmaps/`` directory. """ # keyerror if not registered cmap = _cmaps[key] # TODO I think the colors attribute is only # available on ListedColormap instances, # so if you ever start using different # mpl types, you might need to revisit # this. data = cmap.mapObj.colors destFile = op.join('colourmaps', '{}.cmap'.format(key)) log.debug('Installing colour map {} to {}'.format(key, destFile)) # Numpy under python 3 will break if # we give it a file opened with mode='wt'. with fslsettings.writeFile(destFile, mode='b') as f: np.savetxt(f, data, '%0.6f') # Update user-added settings cmapNames = fslsettings.read('fsleyes.colourmaps', OrderedDict()) cmapNames[key] = cmap.name fslsettings.write('fsleyes.colourmaps', cmapNames) cmap.installed = True
def _serverloop(callback, ev=None): """Starts a TCP server which runs forever. The server port number is written to the FSLeyes settings directoy in a file called ``cliserver.txt`` (see :mod:`fsl.utils.settings`). Then, every line of text received on the socket is passed to the ``callback`` function. :arg callback: Callback function to which every line that is received is passed. :arg ev: Optional ``threading.Event`` which can be used to signal the server thread to stop. """ if ev is None: ev = threading.Event() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 0)) sock.listen(1) sock.settimeout(1) port = sock.getsockname()[1] with fslsettings.writeFile('cliserver.txt') as f: f.write('{}'.format(port)) atexit.register(fslsettings.deleteFile, 'cliserver.txt') log.debug('CLI server running on port %i', port) while True: try: conn, addr = sock.accept() except socket.timeout: if ev.isSet(): break else: continue log.debug('Connection from %s', addr) with conn: line = conn.makefile().readline().strip() log.debug('Received %s ...', line[:50]) try: callback(line) except Exception as e: log.warning('Callback function raised error: %s', e, exc_info=True)
def test_use(): with tempdir.tempdir(changeto=False) as td1,\ tempdir.tempdir(changeto=False) as td2: s1 = settings.Settings(cfgdir=td1, writeOnExit=False) s2 = settings.Settings(cfgdir=td2, writeOnExit=False) with settings.use(s1): with settings.writeFile('file1') as f: f.write('hi!') assert os.listdir(td1) == ['file1'] assert os.listdir(td2) == [] with settings.use(s2): with settings.writeFile('file2') as f: f.write('hi!') settings.set(s1) with settings.writeFile('file3') as f: f.write('hi!') with settings.use(s2): with settings.writeFile('file4') as f: f.write('hi!') assert sorted(os.listdir(td1)) == ['file1', 'file3'] assert sorted(os.listdir(td2)) == ['file2', 'file4'] # should go back to s1 with settings.writeFile('file5') as f: f.write('hi!') assert sorted(os.listdir(td1)) == ['file1', 'file3', 'file5'] assert sorted(os.listdir(td2)) == ['file2', 'file4'] try: with settings.use(s2): raise Exception('hur') except Exception: pass # should go back to s1 with settings.writeFile('file6') as f: f.write('hi!') assert sorted(os.listdir(td1)) == ['file1', 'file3', 'file5', 'file6'] assert sorted(os.listdir(td2)) == ['file2', 'file4']
def installPlugin(filename): """Copies the given Python file into the FSLeyes settings directory, within a sub-directory called ``plugins``. After the file has been copied, the path to the copy is passed to :func:`loadPlugin`. """ basename = op.splitext(op.basename(filename))[0] dest = 'plugins/{}.py'.format(basename) log.debug('Installing plugin %s', filename) with open(filename, 'rt') as inf, \ fslsettings.writeFile(dest) as outf: outf.write(inf.read()) dest = fslsettings.filePath(dest) try: loadPlugin(dest) except Exception: fslsettings.deleteFile(dest) raise