2015-11-16 14:04:32 -08:00
|
|
|
# -*- coding: utf-8 -*-
|
2015-05-14 18:18:46 -05:00
|
|
|
"""Tests the xonsh environment."""
|
|
|
|
from __future__ import unicode_literals, print_function
|
|
|
|
import os
|
2016-05-16 00:43:27 -04:00
|
|
|
import tempfile
|
|
|
|
import builtins
|
2016-06-07 15:49:23 +02:00
|
|
|
from tempfile import TemporaryDirectory
|
|
|
|
from xonsh.tools import ON_WINDOWS
|
|
|
|
|
2016-06-27 18:39:10 +03:00
|
|
|
import pytest
|
|
|
|
|
2016-09-25 15:54:31 -04:00
|
|
|
from xonsh.commands_cache import CommandsCache
|
2016-09-15 17:06:35 +03:00
|
|
|
from xonsh.environ import Env, load_static_config, locate_binary
|
2015-05-14 18:18:46 -05:00
|
|
|
|
2016-06-27 18:39:10 +03:00
|
|
|
from tools import skip_if_on_unix
|
2016-05-16 02:02:24 -04:00
|
|
|
|
2015-05-14 18:18:46 -05:00
|
|
|
def test_env_normal():
|
|
|
|
env = Env(VAR='wakka')
|
2016-06-22 17:14:27 -04:00
|
|
|
assert 'wakka' == env['VAR']
|
2015-05-14 18:18:46 -05:00
|
|
|
|
2016-07-04 20:09:55 +03:00
|
|
|
def test_env_contains():
|
|
|
|
env = Env(VAR='wakka')
|
|
|
|
assert 'VAR' in env
|
|
|
|
|
2016-07-01 12:42:07 +03:00
|
|
|
@pytest.mark.parametrize('path', [['/home/wakka'], ['wakka']])
|
|
|
|
def test_env_path_list(path):
|
|
|
|
env = Env(MYPATH=path)
|
|
|
|
assert path == env['MYPATH'].paths
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('path', [
|
|
|
|
['/home/wakka' + os.pathsep + '/home/jawaka'],
|
|
|
|
['wakka' + os.pathsep + 'jawaka']
|
|
|
|
])
|
|
|
|
def test_env_path_str(path):
|
|
|
|
env = Env(MYPATH=path)
|
|
|
|
assert path == env['MYPATH'].paths
|
2015-05-14 18:18:46 -05:00
|
|
|
|
|
|
|
def test_env_detype():
|
|
|
|
env = Env(MYPATH=['wakka', 'jawaka'])
|
2016-06-22 17:14:27 -04:00
|
|
|
assert 'wakka' + os.pathsep + 'jawaka' == env.detype()['MYPATH']
|
2015-05-14 18:18:46 -05:00
|
|
|
|
2016-07-01 12:42:07 +03:00
|
|
|
@pytest.mark.parametrize('path1, path2',[
|
|
|
|
(['/home/wakka', '/home/jawaka'], '/home/woah'),
|
|
|
|
(['wakka', 'jawaka'], 'woah')
|
|
|
|
])
|
|
|
|
def test_env_detype_mutable_access_clear(path1, path2):
|
|
|
|
env = Env(MYPATH=path1)
|
|
|
|
assert path1[0] + os.pathsep + path1[1] == env.detype()['MYPATH']
|
|
|
|
env['MYPATH'][0] = path2
|
2016-06-22 17:14:27 -04:00
|
|
|
assert env._detyped is None
|
2016-07-01 12:42:07 +03:00
|
|
|
assert path2 + os.pathsep + path1[1] == env.detype()['MYPATH']
|
2015-05-14 18:18:46 -05:00
|
|
|
|
|
|
|
def test_env_detype_no_dict():
|
|
|
|
env = Env(YO={'hey': 42})
|
|
|
|
det = env.detype()
|
2016-06-22 17:14:27 -04:00
|
|
|
assert 'YO' not in det
|
2015-05-14 18:18:46 -05:00
|
|
|
|
2016-07-03 22:03:06 +03:00
|
|
|
def test_histcontrol_none():
|
2015-11-28 16:12:41 -07:00
|
|
|
env = Env(HISTCONTROL=None)
|
2016-06-22 17:14:27 -04:00
|
|
|
assert isinstance(env['HISTCONTROL'], set)
|
|
|
|
assert len(env['HISTCONTROL']) == 0
|
2015-11-28 16:12:41 -07:00
|
|
|
|
2016-07-01 12:42:07 +03:00
|
|
|
def test_HISTCONTROL_empty():
|
2016-07-01 21:52:37 +03:00
|
|
|
env = Env(HISTCONTROL='')
|
2016-06-22 17:14:27 -04:00
|
|
|
assert isinstance(env['HISTCONTROL'], set)
|
|
|
|
assert len(env['HISTCONTROL']) == 0
|
2015-11-28 16:12:41 -07:00
|
|
|
|
2016-07-03 22:03:06 +03:00
|
|
|
def test_histcontrol_ignoredups():
|
2016-07-01 21:52:37 +03:00
|
|
|
env = Env(HISTCONTROL='ignoredups')
|
2016-06-22 17:14:27 -04:00
|
|
|
assert isinstance(env['HISTCONTROL'], set)
|
|
|
|
assert len(env['HISTCONTROL']) == 1
|
|
|
|
assert ('ignoredups' in env['HISTCONTROL'])
|
|
|
|
assert ('ignoreerr' not in env['HISTCONTROL'])
|
2015-11-28 16:12:41 -07:00
|
|
|
|
2016-07-03 22:03:06 +03:00
|
|
|
def test_histcontrol_ignoreerr_ignoredups():
|
2016-07-01 21:52:37 +03:00
|
|
|
env = Env(HISTCONTROL='ignoreerr,ignoredups,ignoreerr')
|
2016-06-22 17:14:27 -04:00
|
|
|
assert len(env['HISTCONTROL']) == 2
|
|
|
|
assert ('ignoreerr' in env['HISTCONTROL'])
|
|
|
|
assert ('ignoredups' in env['HISTCONTROL'])
|
2015-11-28 16:12:41 -07:00
|
|
|
|
2016-04-01 01:41:23 -04:00
|
|
|
def test_swap():
|
|
|
|
env = Env(VAR='wakka')
|
2016-06-22 17:14:27 -04:00
|
|
|
assert env['VAR'] == 'wakka'
|
2016-04-01 01:41:23 -04:00
|
|
|
|
|
|
|
# positional arg
|
|
|
|
with env.swap({'VAR': 'foo'}):
|
2016-06-22 17:14:27 -04:00
|
|
|
assert env['VAR'] == 'foo'
|
2016-04-01 01:41:23 -04:00
|
|
|
|
|
|
|
# make sure the environment goes back outside the context manager
|
2016-06-22 17:14:27 -04:00
|
|
|
assert env['VAR'] == 'wakka'
|
2016-04-01 01:41:23 -04:00
|
|
|
|
|
|
|
# kwargs only
|
|
|
|
with env.swap(VAR1='foo', VAR2='bar'):
|
2016-06-22 17:14:27 -04:00
|
|
|
assert env['VAR1'] == 'foo'
|
|
|
|
assert env['VAR2'] == 'bar'
|
2016-04-01 01:41:23 -04:00
|
|
|
|
|
|
|
# positional and kwargs
|
|
|
|
with env.swap({'VAR3': 'baz'}, VAR1='foo', VAR2='bar'):
|
2016-06-22 17:14:27 -04:00
|
|
|
assert env['VAR1'] == 'foo'
|
|
|
|
assert env['VAR2'] == 'bar'
|
|
|
|
assert env['VAR3'] == 'baz'
|
2016-04-01 01:41:23 -04:00
|
|
|
|
|
|
|
# make sure the environment goes back outside the context manager
|
2016-06-22 17:14:27 -04:00
|
|
|
assert env['VAR'] == 'wakka'
|
2016-04-01 01:41:23 -04:00
|
|
|
assert 'VAR1' not in env
|
|
|
|
assert 'VAR2' not in env
|
|
|
|
assert 'VAR3' not in env
|
|
|
|
|
2016-06-27 18:39:10 +03:00
|
|
|
|
|
|
|
@pytest.mark.parametrize('s, exp, loaded',[
|
|
|
|
(b'{"best": "awash"}', {'best': 'awash'}, True), # works
|
|
|
|
(b'["best", "awash"]', {}, False), # fail
|
|
|
|
(b'{"best": "awash"', {}, False) # json fail
|
|
|
|
])
|
|
|
|
def test_load_static_config(s, exp, loaded, tmpdir, xonsh_builtins):
|
2016-05-23 08:42:09 +02:00
|
|
|
env = Env({'XONSH_SHOW_TRACEBACK': False})
|
2016-06-27 18:39:10 +03:00
|
|
|
xonsh_builtins.__xonsh_env__ = env
|
|
|
|
f = tmpdir.join('test_static_config')
|
|
|
|
f.write(s)
|
|
|
|
conf = load_static_config(env, str(f))
|
2016-06-22 17:14:27 -04:00
|
|
|
assert exp == conf
|
|
|
|
assert env['LOADED_CONFIG'] == loaded
|
2016-05-16 02:02:24 -04:00
|
|
|
|
2016-06-27 18:39:10 +03:00
|
|
|
|
|
|
|
@skip_if_on_unix
|
2016-07-01 12:42:07 +03:00
|
|
|
def test_locate_binary_on_windows(xonsh_builtins):
|
2016-06-27 18:39:10 +03:00
|
|
|
files = ('file1.exe', 'FILE2.BAT', 'file3.txt')
|
|
|
|
with TemporaryDirectory() as tmpdir:
|
|
|
|
for fname in files:
|
|
|
|
fpath = os.path.join(tmpdir, fname)
|
|
|
|
with open(fpath, 'w') as f:
|
|
|
|
f.write(fpath)
|
2016-07-01 15:43:16 +03:00
|
|
|
xonsh_builtins.__xonsh_env__.update({
|
|
|
|
'PATH': [tmpdir],
|
|
|
|
'PATHEXT': ['.COM', '.EXE', '.BAT'],
|
|
|
|
})
|
2016-09-25 15:54:31 -04:00
|
|
|
xonsh_builtins.__xonsh_commands_cache__ = CommandsCache()
|
|
|
|
assert locate_binary('file1') == os.path.join(tmpdir, 'file1.exe')
|
|
|
|
assert locate_binary('file1.exe') == os.path.join(tmpdir, 'file1.exe')
|
|
|
|
assert locate_binary('file2') == os.path.join(tmpdir, 'FILE2.BAT')
|
|
|
|
assert locate_binary('file2.bat') == os.path.join(tmpdir, 'FILE2.BAT')
|
2016-07-03 22:03:06 +03:00
|
|
|
assert locate_binary('file3') is None
|
2017-01-30 14:45:35 +02:00
|
|
|
|
|
|
|
|
2017-01-31 10:44:26 +02:00
|
|
|
def test_event_on_envvar_change(xonsh_builtins):
|
2017-01-30 14:45:35 +02:00
|
|
|
env = Env(TEST=0)
|
|
|
|
xonsh_builtins.__xonsh_env__ = env
|
|
|
|
share = []
|
|
|
|
# register
|
2017-01-31 10:44:26 +02:00
|
|
|
@xonsh_builtins.events.on_envvar_change
|
2017-01-30 14:45:35 +02:00
|
|
|
def handler(name, oldvalue, newvalue, **kwargs):
|
2017-01-31 10:44:26 +02:00
|
|
|
share.extend((name, oldvalue, newvalue))
|
2017-01-30 14:45:35 +02:00
|
|
|
|
|
|
|
# trigger
|
|
|
|
env['TEST'] = 1
|
|
|
|
|
|
|
|
assert share == ['TEST', 0, 1]
|
2017-01-30 15:41:48 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_event_on_envvar_new(xonsh_builtins):
|
|
|
|
env = Env()
|
|
|
|
xonsh_builtins.__xonsh_env__ = env
|
|
|
|
share = []
|
|
|
|
# register
|
2017-01-31 10:44:26 +02:00
|
|
|
@xonsh_builtins.events.on_envvar_new
|
|
|
|
def handler(name, value, **kwargs):
|
|
|
|
share.extend((name, value))
|
|
|
|
|
|
|
|
# trigger
|
|
|
|
env['TEST'] = 1
|
|
|
|
|
|
|
|
assert share == ['TEST', 1]
|
|
|
|
|
|
|
|
def test_event_on_envvar_change_from_none_value(xonsh_builtins):
|
|
|
|
env = Env(TEST=None)
|
|
|
|
xonsh_builtins.__xonsh_env__ = env
|
|
|
|
share = []
|
|
|
|
# register
|
|
|
|
@xonsh_builtins.events.on_envvar_change
|
2017-01-30 15:41:48 +02:00
|
|
|
def handler(name, oldvalue, newvalue, **kwargs):
|
2017-01-31 10:44:26 +02:00
|
|
|
share.extend((name, oldvalue, newvalue))
|
2017-01-30 15:41:48 +02:00
|
|
|
|
|
|
|
# trigger
|
|
|
|
env['TEST'] = 1
|
|
|
|
|
|
|
|
assert share == ['TEST', None, 1]
|
2017-01-31 12:26:50 +02:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('val', [1, None, True, 'ok'])
|
|
|
|
def test_event_on_envvar_change_no_fire_when_value_is_same(val, xonsh_builtins):
|
|
|
|
env = Env(TEST=val)
|
|
|
|
xonsh_builtins.__xonsh_env__ = env
|
|
|
|
share = []
|
|
|
|
# register
|
|
|
|
@xonsh_builtins.events.on_envvar_change
|
|
|
|
def handler(name, oldvalue, newvalue, **kwargs):
|
|
|
|
share.extend((name, oldvalue, newvalue))
|
|
|
|
|
|
|
|
|
|
|
|
# trigger
|
|
|
|
env['TEST'] = val
|
|
|
|
|
|
|
|
assert share == []
|
2017-01-31 12:51:26 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_events_on_envvar_called_in_right_order(xonsh_builtins):
|
|
|
|
env = Env()
|
|
|
|
xonsh_builtins.__xonsh_env__ = env
|
|
|
|
share = []
|
|
|
|
# register
|
|
|
|
@xonsh_builtins.events.on_envvar_new
|
|
|
|
def handler(name, value, **kwargs):
|
|
|
|
share[:] = ['new']
|
|
|
|
|
|
|
|
@xonsh_builtins.events.on_envvar_change
|
|
|
|
def handler(name, oldvalue, newvalue, **kwargs):
|
|
|
|
share[:] = ['change']
|
|
|
|
|
|
|
|
# trigger new
|
|
|
|
env['TEST'] = 1
|
|
|
|
|
|
|
|
assert share == ['new']
|
|
|
|
|
|
|
|
# trigger change
|
|
|
|
env['TEST'] = 2
|
|
|
|
|
|
|
|
assert share == ['change']
|
|
|
|
|