本文整理汇总了Python中contextlib.ExitStack.callback方法的典型用法代码示例。如果您正苦于以下问题:Python ExitStack.callback方法的具体用法?Python ExitStack.callback怎么用?Python ExitStack.callback使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类contextlib.ExitStack
的用法示例。
在下文中一共展示了ExitStack.callback方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: TestZip
# 需要导入模块: from contextlib import ExitStack [as 别名]
# 或者: from contextlib.ExitStack import callback [as 别名]
class TestZip(unittest.TestCase):
def setUp(self):
# Find the path to the example.*.whl so we can add it to the front of
# sys.path, where we'll then try to find the metadata thereof.
self.resources = ExitStack()
self.addCleanup(self.resources.close)
wheel = self.resources.enter_context(
path('importlib_metadata.tests.data',
'example-21.12-py3-none-any.whl'))
sys.path.insert(0, str(wheel))
self.resources.callback(sys.path.pop, 0)
def test_zip_version(self):
self.assertEqual(importlib_metadata.version('example'), '21.12')
def test_zip_entry_points(self):
parser = importlib_metadata.entry_points('example')
entry_point = parser.get('console_scripts', 'example')
self.assertEqual(entry_point, 'example:main')
def test_missing_metadata(self):
distribution = importlib_metadata.distribution('example')
self.assertIsNone(distribution.read_text('does not exist'))
def test_case_insensitive(self):
self.assertEqual(importlib_metadata.version('Example'), '21.12')
示例2: build_context
# 需要导入模块: from contextlib import ExitStack [as 别名]
# 或者: from contextlib.ExitStack import callback [as 别名]
def build_context(self, environ):
"""
Start a request context.
:param environ: A WSGI environment.
:return: A context manager for the request. When the context
manager exits, the request context variables are destroyed and
all cleanup hooks are run.
.. note:: This method is intended for internal use; Findig will
call this method internally on its own. It is *not* re-entrant
with a single request.
"""
self.__run_startup_hooks()
ctx.app = self
ctx.url_adapter = adapter = self.url_map.bind_to_environ(environ)
ctx.request = self.request_class(environ) # ALWAYS set this after adapter
rule, url_values = adapter.match(return_rule=True)
dispatcher = self #self.get_dispatcher(rule)
# Set up context variables
ctx.url_values = url_values
ctx.dispatcher = dispatcher
ctx.resource = dispatcher.get_resource(rule)
context = ExitStack()
context.callback(self.__cleanup)
# Add all the application's context managers to
# the exit stack. If any of them return a value,
# we'll add the value to the application context
# with the function name.
for hook in self.context_hooks:
retval = context.enter_context(hook())
if retval is not None:
setattr(ctx, hook.__name__, retval)
return context
示例3: TestMain
# 需要导入模块: from contextlib import ExitStack [as 别名]
# 或者: from contextlib.ExitStack import callback [as 别名]
class TestMain(unittest.TestCase):
def setUp(self):
old_log_level = log.getEffectiveLevel()
self.addCleanup(log.setLevel, old_log_level)
self.resources = ExitStack()
# Create a new event loop, and arrange for that loop to end almost
# immediately. This will allow the calls to main() in these tests to
# also exit almost immediately. Otherwise, the foreground test
# process will hang.
#
# I think this introduces a race condition. It depends on whether the
# call_later() can possibly run before the run_forever() does, or could
# cause it to not complete all its tasks. In that case, you'd likely
# get an error or warning on stderr, which may or may not cause the
# test to fail. I've only seen this happen once and don't have enough
# information to know for sure.
default_loop = asyncio.get_event_loop()
loop = asyncio.new_event_loop()
loop.call_later(0.1, loop.stop)
self.resources.callback(asyncio.set_event_loop, default_loop)
asyncio.set_event_loop(loop)
self.addCleanup(self.resources.close)
@unittest.skipIf(pwd is None, 'No pwd module available')
def test_setuid(self):
with patch('os.setuid') as mock:
main(args=())
mock.assert_called_with(pwd.getpwnam('nobody').pw_uid)
@unittest.skipIf(pwd is None, 'No pwd module available')
def test_setuid_permission_error(self):
mock = self.resources.enter_context(
patch('os.setuid', side_effect=PermissionError))
stderr = StringIO()
self.resources.enter_context(patch('sys.stderr', stderr))
with self.assertRaises(SystemExit) as cm:
main(args=())
self.assertEqual(cm.exception.code, 1)
mock.assert_called_with(pwd.getpwnam('nobody').pw_uid)
self.assertEqual(
stderr.getvalue(),
'Cannot setuid "nobody"; try running with -n option.\n')
@unittest.skipIf(pwd is None, 'No pwd module available')
def test_setuid_no_pwd_module(self):
self.resources.enter_context(patch('aiosmtpd.main.pwd', None))
stderr = StringIO()
self.resources.enter_context(patch('sys.stderr', stderr))
with self.assertRaises(SystemExit) as cm:
main(args=())
self.assertEqual(cm.exception.code, 1)
self.assertEqual(
stderr.getvalue(),
'Cannot import module "pwd"; try running with -n option.\n')
@unittest.skipUnless(has_setuid, 'setuid is unvailable')
def test_n(self):
self.resources.enter_context(patch('aiosmtpd.main.pwd', None))
self.resources.enter_context(
patch('os.setuid', side_effect=PermissionError))
# Just to short-circuit the main() function.
self.resources.enter_context(
patch('aiosmtpd.main.partial', side_effect=RuntimeError))
# Getting the RuntimeError means that a SystemExit was never
# triggered in the setuid section.
self.assertRaises(RuntimeError, main, ('-n',))
@unittest.skipUnless(has_setuid, 'setuid is unvailable')
def test_nosetuid(self):
self.resources.enter_context(patch('aiosmtpd.main.pwd', None))
self.resources.enter_context(
patch('os.setuid', side_effect=PermissionError))
# Just to short-circuit the main() function.
self.resources.enter_context(
patch('aiosmtpd.main.partial', side_effect=RuntimeError))
# Getting the RuntimeError means that a SystemExit was never
# triggered in the setuid section.
self.assertRaises(RuntimeError, main, ('--nosetuid',))
def test_debug_0(self):
# For this test, the runner will have already set the log level so it
# may not be logging.ERROR.
log = logging.getLogger('mail.log')
default_level = log.getEffectiveLevel()
with patch.object(log, 'info'):
main(('-n',))
self.assertEqual(log.getEffectiveLevel(), default_level)
def test_debug_1(self):
# Mock the logger to eliminate console noise.
with patch.object(logging.getLogger('mail.log'), 'info'):
main(('-n', '-d'))
self.assertEqual(log.getEffectiveLevel(), logging.INFO)
def test_debug_2(self):
# Mock the logger to eliminate console noise.
with patch.object(logging.getLogger('mail.log'), 'info'):
main(('-n', '-dd'))
self.assertEqual(log.getEffectiveLevel(), logging.DEBUG)
#.........这里部分代码省略.........
示例4: TestCase
# 需要导入模块: from contextlib import ExitStack [as 别名]
# 或者: from contextlib.ExitStack import callback [as 别名]
class TestCase(unittest.TestCase):
def setUp(self):
super(TestCase, self).setUp()
self.__all_cleanups = ExitStack()
def tearDown(self):
self.__all_cleanups.close()
unittest.TestCase.tearDown(self)
def addCleanup(self, function, *args, **kws):
self.__all_cleanups.callback(function, *args, **kws)
def assertIs(self, expr1, expr2, msg=None):
if expr1 is not expr2:
standardMsg = '%r is not %r' % (expr1, expr2)
self.fail(self._formatMessage(msg, standardMsg))
def assertIn(self, member, container, msg=None):
if member not in container:
standardMsg = '%r not found in %r' % (member, container)
self.fail(self._formatMessage(msg, standardMsg))
def assertNotIn(self, member, container, msg=None):
if member in container:
standardMsg = '%r unexpectedly found in %r'
standardMsg = standardMsg % (member, container)
self.fail(self._formatMessage(msg, standardMsg))
def assertIsNone(self, value, msg=None):
if value is not None:
standardMsg = '%r is not None'
standardMsg = standardMsg % (value)
self.fail(self._formatMessage(msg, standardMsg))
def assertIsInstance(self, obj, cls, msg=None):
"""Same as self.assertTrue(isinstance(obj, cls)), with a nicer
default message."""
if not isinstance(obj, cls):
standardMsg = '%s is not an instance of %r' % (repr(obj), cls)
self.fail(self._formatMessage(msg, standardMsg))
def assertDictContainsSubset(self, expected, actual, msg=None):
missing = []
mismatched = []
for k, v in expected.items():
if k not in actual:
missing.append(k)
elif actual[k] != v:
mismatched.append('%r, expected: %r, actual: %r'
% (k, v, actual[k]))
if len(missing) == 0 and len(mismatched) == 0:
return
standardMsg = ''
if missing:
standardMsg = 'Missing: %r' % ','.join(m for m in missing)
if mismatched:
if standardMsg:
standardMsg += '; '
standardMsg += 'Mismatched values: %s' % ','.join(mismatched)
self.fail(self._formatMessage(msg, standardMsg))
示例5: validate
# 需要导入模块: from contextlib import ExitStack [as 别名]
# 或者: from contextlib.ExitStack import callback [as 别名]
def validate(self, data):
Schema = self.__class__
s = self._schema
e = self._error
i = self._ignore_extra_keys
flavor = _priority(s)
if flavor == ITERABLE:
data = Schema(type(s), error=e).validate(data)
o = Or(*s, error=e, schema=Schema, ignore_extra_keys=i)
return type(data)(o.validate(d) for d in data)
if flavor == DICT:
exitstack = ExitStack()
data = Schema(dict, error=e).validate(data)
new = type(data)() # new - is a dict of the validated values
coverage = set() # matched schema keys
# for each key and value find a schema entry matching them, if any
sorted_skeys = sorted(s, key=self._dict_key_priority)
for skey in sorted_skeys:
if hasattr(skey, "reset"):
exitstack.callback(skey.reset)
with exitstack:
# Evaluate dictionaries last
data_items = sorted(data.items(), key=lambda value: isinstance(value[1], dict))
for key, value in data_items:
for skey in sorted_skeys:
svalue = s[skey]
try:
nkey = Schema(skey, error=e).validate(key)
except SchemaError:
pass
else:
if isinstance(skey, Hook):
# As the content of the value makes little sense for
# keys with a hook, we reverse its meaning:
# we will only call the handler if the value does match
# In the case of the forbidden key hook,
# we will raise the SchemaErrorForbiddenKey exception
# on match, allowing for excluding a key only if its
# value has a certain type, and allowing Forbidden to
# work well in combination with Optional.
try:
nvalue = Schema(svalue, error=e).validate(value)
except SchemaError:
continue
skey.handler(nkey, data, e)
else:
try:
nvalue = Schema(svalue, error=e, ignore_extra_keys=i).validate(value)
except SchemaError as x:
k = "Key '%s' error:" % nkey
raise SchemaError([k] + x.autos, [e] + x.errors)
else:
new[nkey] = nvalue
coverage.add(skey)
break
required = set(k for k in s if not self._is_optional_type(k))
if not required.issubset(coverage):
missing_keys = required - coverage
s_missing_keys = ", ".join(repr(k) for k in sorted(missing_keys, key=repr))
raise SchemaMissingKeyError("Missing key%s: %s" % (_plural_s(missing_keys), s_missing_keys), e)
if not self._ignore_extra_keys and (len(new) != len(data)):
wrong_keys = set(data.keys()) - set(new.keys())
s_wrong_keys = ", ".join(repr(k) for k in sorted(wrong_keys, key=repr))
raise SchemaWrongKeyError(
"Wrong key%s %s in %r" % (_plural_s(wrong_keys), s_wrong_keys, data), e.format(data) if e else None
)
# Apply default-having optionals that haven't been used:
defaults = set(k for k in s if type(k) is Optional and hasattr(k, "default")) - coverage
for default in defaults:
new[default.key] = default.default() if callable(default.default) else default.default
return new
if flavor == TYPE:
if isinstance(data, s) and not (isinstance(data, bool) and s == int):
return data
else:
raise SchemaUnexpectedTypeError(
"%r should be instance of %r" % (data, s.__name__), e.format(data) if e else None
)
if flavor == VALIDATOR:
try:
return s.validate(data)
except SchemaError as x:
raise SchemaError([None] + x.autos, [e] + x.errors)
except BaseException as x:
raise SchemaError(
"%r.validate(%r) raised %r" % (s, data, x), self._error.format(data) if self._error else None
)
if flavor == CALLABLE:
f = _callable_str(s)
try:
if s(data):
return data
except SchemaError as x:
raise SchemaError([None] + x.autos, [e] + x.errors)
except BaseException as x:
raise SchemaError("%s(%r) raised %r" % (f, data, x), self._error.format(data) if self._error else None)
raise SchemaError("%s(%r) should evaluate to True" % (f, data), e)
#.........这里部分代码省略.........
示例6: TestMain
# 需要导入模块: from contextlib import ExitStack [as 别名]
# 或者: from contextlib.ExitStack import callback [as 别名]
class TestMain(TestCase):
def setUp(self):
super().setUp()
self._resources = ExitStack()
self.addCleanup(self._resources.close)
# Capture builtin print() output.
self._stdout = StringIO()
self._stderr = StringIO()
self._resources.enter_context(
patch('argparse._sys.stdout', self._stdout))
# Capture stderr since this is where argparse will spew to.
self._resources.enter_context(
patch('argparse._sys.stderr', self._stderr))
def test_help(self):
with self.assertRaises(SystemExit) as cm:
main(('--help',))
self.assertEqual(cm.exception.code, 0)
lines = self._stdout.getvalue().splitlines()
self.assertTrue(lines[0].startswith('Usage'),
lines[0])
self.assertTrue(lines[1].startswith(' ubuntu-image'),
lines[1])
def test_debug(self):
with ExitStack() as resources:
mock = resources.enter_context(
patch('ubuntu_image.__main__.logging.basicConfig'))
resources.enter_context(patch(
'ubuntu_image.__main__.ModelAssertionBuilder',
EarlyExitModelAssertionBuilder))
# Prevent actual main() from running.
resources.enter_context(patch('ubuntu_image.__main__.main'))
code = main(('--debug', 'model.assertion'))
self.assertEqual(code, 0)
mock.assert_called_once_with(level=logging.DEBUG)
def test_no_debug(self):
with ExitStack() as resources:
mock = resources.enter_context(
patch('ubuntu_image.__main__.logging.basicConfig'))
resources.enter_context(patch(
'ubuntu_image.__main__.ModelAssertionBuilder',
EarlyExitModelAssertionBuilder))
# Prevent actual main() from running.
resources.enter_context(patch('ubuntu_image.__main__.main'))
code = main(('model.assertion',))
self.assertEqual(code, 0)
mock.assert_not_called()
def test_state_machine_exception(self):
with ExitStack() as resources:
resources.enter_context(patch(
'ubuntu_image.__main__.ModelAssertionBuilder',
CrashingModelAssertionBuilder))
mock = resources.enter_context(patch(
'ubuntu_image.__main__._logger.exception'))
code = main(('model.assertion',))
self.assertEqual(code, 1)
self.assertEqual(
mock.call_args_list[-1], call('Crash in state machine'))
def test_state_machine_snap_command_fails(self):
# The `snap prepare-image` command fails and main exits with non-zero.
#
# This tests needs to run the actual snap() helper function, not
# the testsuite-wide mock. This is appropriate since we're
# mocking it ourselves here.
if NosePlugin.snap_mocker is not None:
NosePlugin.snap_mocker.patcher.stop()
self._resources.callback(NosePlugin.snap_mocker.patcher.start)
self._resources.enter_context(patch(
'ubuntu_image.helpers.subprocess_run',
return_value=SimpleNamespace(
returncode=1,
stdout='command stdout',
stderr='command stderr',
check_returncode=check_returncode,
)))
self._resources.enter_context(LogCapture())
self._resources.enter_context(patch(
'ubuntu_image.__main__.ModelAssertionBuilder',
XXXModelAssertionBuilder))
workdir = self._resources.enter_context(TemporaryDirectory())
imgfile = os.path.join(workdir, 'my-disk.img')
code = main(('--until', 'prepare_filesystems',
'--channel', 'edge',
'--workdir', workdir,
'--output', imgfile,
'model.assertion'))
self.assertEqual(code, 1)
def test_no_arguments(self):
with self.assertRaises(SystemExit) as cm:
main(())
self.assertEqual(cm.exception.code, 2)
lines = self._stderr.getvalue().splitlines()
self.assertTrue(
lines[0].startswith('Warning: for backwards compatibility'),
lines[0])
#.........这里部分代码省略.........