Best Python code snippet using playwright-python
samplers.py
Source:samplers.py
...40 def __call__(self, batch_size, **kwargs):41 raise NotImplementedError42 def set_replay(self, replay=None):43 pass44 def _validate_contexts(self, contexts):45 """Validate if contexts have right spec.46 Args:47 contexts: A [batch_size, num_contexts_dim] tensor.48 Raises:49 ValueError: If shape or dtype mismatches that of spec.50 """51 if contexts[0].shape != self._context_spec.shape:52 raise ValueError('contexts has invalid shape %s wrt spec shape %s' %53 (contexts[0].shape, self._context_spec.shape))54 if contexts.dtype != self._context_spec.dtype:55 raise ValueError('contexts has invalid dtype %s wrt spec dtype %s' %56 (contexts.dtype, self._context_spec.dtype))57@gin.configurable58class ZeroSampler(BaseSampler):59 """Zero sampler."""60 def __call__(self, batch_size, **kwargs):61 """Sample a batch of context.62 Args:63 batch_size: Batch size.64 Returns:65 Two [batch_size, num_context_dims] tensors.66 """67 contexts = tf.zeros(68 dtype=self._context_spec.dtype,69 shape=[70 batch_size,71 ] + self._context_spec.shape.as_list())72 return contexts, contexts73@gin.configurable74class BinarySampler(BaseSampler):75 """Binary sampler."""76 def __init__(self, probs=0.5, *args, **kwargs):77 """Constructor."""78 super(BinarySampler, self).__init__(*args, **kwargs)79 self._probs = probs80 def __call__(self, batch_size, **kwargs):81 """Sample a batch of context."""82 spec = self._context_spec83 contexts = tf.random_uniform(84 shape=[85 batch_size,86 ] + spec.shape.as_list(), dtype=tf.float32)87 contexts = tf.cast(tf.greater(contexts, self._probs), dtype=spec.dtype)88 return contexts, contexts89@gin.configurable90class RandomSampler(BaseSampler):91 """Random sampler."""92 def __call__(self, batch_size, **kwargs):93 """Sample a batch of context.94 Args:95 batch_size: Batch size.96 Returns:97 Two [batch_size, num_context_dims] tensors.98 """99 spec = self._context_spec100 context_range = self._context_range101 if isinstance(context_range[0], (int, float)):102 contexts = tf.random_uniform(103 shape=[104 batch_size,105 ] + spec.shape.as_list(),106 minval=context_range[0],107 maxval=context_range[1],108 dtype=spec.dtype)109 elif isinstance(context_range[0], (list, tuple, np.ndarray)):110 assert len(spec.shape.as_list()) == 1111 assert spec.shape.as_list()[0] == len(context_range[0])112 assert spec.shape.as_list()[0] == len(context_range[1])113 contexts = tf.concat(114 [115 tf.random_uniform(116 shape=[117 batch_size, 1,118 ] + spec.shape.as_list()[1:],119 minval=context_range[0][i],120 maxval=context_range[1][i],121 dtype=spec.dtype) for i in range(spec.shape.as_list()[0])122 ],123 axis=1)124 else: raise NotImplementedError(context_range)125 self._validate_contexts(contexts)126 state, next_state = kwargs['state'], kwargs['next_state']127 if state is not None and next_state is not None:128 pass129 #contexts = tf.concat(130 # [tf.random_normal(tf.shape(state[:, :self._k]), dtype=tf.float64) +131 # tf.random_shuffle(state[:, :self._k]),132 # contexts[:, self._k:]], 1)133 return contexts, contexts134@gin.configurable135class ScheduledSampler(BaseSampler):136 """Scheduled sampler."""137 def __init__(self,138 scope='default',139 values=None,140 scheduler='cycle',141 scheduler_params=None,142 *args, **kwargs):143 """Construct sampler.144 Args:145 scope: Scope name.146 values: A list of numbers or [num_context_dim] Numpy arrays147 representing the values to cycle.148 scheduler: scheduler type.149 scheduler_params: scheduler parameters.150 *args: arguments.151 **kwargs: keyword arguments.152 """153 super(ScheduledSampler, self).__init__(*args, **kwargs)154 self._scope = scope155 self._values = values156 self._scheduler = scheduler157 self._scheduler_params = scheduler_params or {}158 assert self._values is not None and len(159 self._values), 'must provide non-empty values.'160 self._n = len(self._values)161 # TODO(shanegu): move variable creation outside. resolve tf.cond problem.162 self._count = 0163 self._i = tf.Variable(164 tf.zeros(shape=(), dtype=tf.int32),165 name='%s-scheduled_sampler_%d' % (self._scope, self._count))166 self._values = tf.constant(self._values, dtype=self._context_spec.dtype)167 def __call__(self, batch_size, **kwargs):168 """Sample a batch of context.169 Args:170 batch_size: Batch size.171 Returns:172 Two [batch_size, num_context_dims] tensors.173 """174 spec = self._context_spec175 next_op = self._next(self._i)176 with tf.control_dependencies([next_op]):177 value = self._values[self._i]178 if value.get_shape().as_list():179 values = tf.tile(180 tf.expand_dims(value, 0), (batch_size,) + (1,) * spec.shape.ndims)181 else:182 values = value + tf.zeros(183 shape=[184 batch_size,185 ] + spec.shape.as_list(), dtype=spec.dtype)186 self._validate_contexts(values)187 self._count += 1188 return values, values189 def _next(self, i):190 """Return op that increments pointer to next value.191 Args:192 i: A tensorflow integer variable.193 Returns:194 Op that increments pointer.195 """196 if self._scheduler == 'cycle':197 inc = ('inc' in self._scheduler_params and198 self._scheduler_params['inc']) or 1199 return tf.assign(i, tf.mod(i+inc, self._n))200 else:201 raise NotImplementedError(self._scheduler)202@gin.configurable203class ReplaySampler(BaseSampler):204 """Replay sampler."""205 def __init__(self,206 prefetch_queue_capacity=2,207 override_indices=None,208 state_indices=None,209 *args,210 **kwargs):211 """Construct sampler.212 Args:213 prefetch_queue_capacity: Capacity for prefetch queue.214 override_indices: Override indices.215 state_indices: Select certain indices from state dimension.216 *args: arguments.217 **kwargs: keyword arguments.218 """219 super(ReplaySampler, self).__init__(*args, **kwargs)220 self._prefetch_queue_capacity = prefetch_queue_capacity221 self._override_indices = override_indices222 self._state_indices = state_indices223 def set_replay(self, replay):224 """Set replay.225 Args:226 replay: A replay buffer.227 """228 self._replay = replay229 def __call__(self, batch_size, **kwargs):230 """Sample a batch of context.231 Args:232 batch_size: Batch size.233 Returns:234 Two [batch_size, num_context_dims] tensors.235 """236 batch = self._replay.GetRandomBatch(batch_size)237 next_states = batch[4]238 if self._prefetch_queue_capacity > 0:239 batch_queue = slim.prefetch_queue.prefetch_queue(240 [next_states],241 capacity=self._prefetch_queue_capacity,242 name='%s/batch_context_queue' % self._scope)243 next_states = batch_queue.dequeue()244 if self._override_indices is not None:245 assert self._context_range is not None and isinstance(246 self._context_range[0], (int, long, float))247 next_states = tf.concat(248 [249 tf.random_uniform(250 shape=next_states[:, :1].shape,251 minval=self._context_range[0],252 maxval=self._context_range[1],253 dtype=next_states.dtype)254 if i in self._override_indices else next_states[:, i:i + 1]255 for i in range(self._context_spec.shape.as_list()[0])256 ],257 axis=1)258 if self._state_indices is not None:259 next_states = tf.concat(260 [261 next_states[:, i:i + 1]262 for i in range(self._context_spec.shape.as_list()[0])263 ],264 axis=1)265 self._validate_contexts(next_states)266 return next_states, next_states267@gin.configurable268class TimeSampler(BaseSampler):269 """Time Sampler."""270 def __init__(self, minval=0, maxval=1, timestep=-1, *args, **kwargs):271 """Construct sampler.272 Args:273 minval: Min value integer.274 maxval: Max value integer.275 timestep: Time step between states and next_states.276 *args: arguments.277 **kwargs: keyword arguments.278 """279 super(TimeSampler, self).__init__(*args, **kwargs)280 assert self._context_spec.shape.as_list() == [1]281 self._minval = minval282 self._maxval = maxval283 self._timestep = timestep284 def __call__(self, batch_size, **kwargs):285 """Sample a batch of context.286 Args:287 batch_size: Batch size.288 Returns:289 Two [batch_size, num_context_dims] tensors.290 """291 if self._maxval == self._minval:292 contexts = tf.constant(293 self._maxval, shape=[batch_size, 1], dtype=tf.int32)294 else:295 contexts = tf.random_uniform(296 shape=[batch_size, 1],297 dtype=tf.int32,298 maxval=self._maxval,299 minval=self._minval)300 next_contexts = tf.maximum(contexts + self._timestep, 0)301 return tf.cast(302 contexts, dtype=self._context_spec.dtype), tf.cast(303 next_contexts, dtype=self._context_spec.dtype)304@gin.configurable305class ConstantSampler(BaseSampler):306 """Constant sampler."""307 def __init__(self, value=None, *args, **kwargs):308 """Construct sampler.309 Args:310 value: A list or Numpy array for values of the constant.311 *args: arguments.312 **kwargs: keyword arguments.313 """314 super(ConstantSampler, self).__init__(*args, **kwargs)315 self._value = value316 def __call__(self, batch_size, **kwargs):317 """Sample a batch of context.318 Args:319 batch_size: Batch size.320 Returns:321 Two [batch_size, num_context_dims] tensors.322 """323 spec = self._context_spec324 value_ = tf.constant(self._value, shape=spec.shape, dtype=spec.dtype)325 values = tf.tile(326 tf.expand_dims(value_, 0), (batch_size,) + (1,) * spec.shape.ndims)327 self._validate_contexts(values)328 return values, values329@gin.configurable330class DirectionSampler(RandomSampler):331 """Direction sampler."""332 def __call__(self, batch_size, **kwargs):333 """Sample a batch of context.334 Args:335 batch_size: Batch size.336 Returns:337 Two [batch_size, num_context_dims] tensors.338 """339 spec = self._context_spec340 context_range = self._context_range341 if isinstance(context_range[0], (int, float)):342 contexts = tf.random_uniform(343 shape=[344 batch_size,345 ] + spec.shape.as_list(),346 minval=context_range[0],347 maxval=context_range[1],348 dtype=spec.dtype)349 elif isinstance(context_range[0], (list, tuple, np.ndarray)):350 assert len(spec.shape.as_list()) == 1351 assert spec.shape.as_list()[0] == len(context_range[0])352 assert spec.shape.as_list()[0] == len(context_range[1])353 contexts = tf.concat(354 [355 tf.random_uniform(356 shape=[357 batch_size, 1,358 ] + spec.shape.as_list()[1:],359 minval=context_range[0][i],360 maxval=context_range[1][i],361 dtype=spec.dtype) for i in range(spec.shape.as_list()[0])362 ],363 axis=1)364 else: raise NotImplementedError(context_range)365 self._validate_contexts(contexts)366 if 'sampler_fn' in kwargs:367 other_contexts = kwargs['sampler_fn']()368 else:369 other_contexts = contexts370 state, next_state = kwargs['state'], kwargs['next_state']371 if state is not None and next_state is not None:372 my_context_range = (np.array(context_range[1]) - np.array(context_range[0])) / 2 * np.ones(spec.shape.as_list())373 contexts = tf.concat(374 [0.1 * my_context_range[:self._k] *375 tf.random_normal(tf.shape(state[:, :self._k]), dtype=state.dtype) +376 tf.random_shuffle(state[:, :self._k]) - state[:, :self._k],377 other_contexts[:, self._k:]], 1)378 #contexts = tf.Print(contexts,379 # [contexts, tf.reduce_max(contexts, 0),...
test_html.py
Source:test_html.py
1"""2test_html_contexts.py3Copyright 2015 Andres Riancho4This file is part of w3af, http://w3af.org/ .5w3af is free software; you can redistribute it and/or modify6it under the terms of the GNU General Public License as published by7the Free Software Foundation version 2 of the License.8w3af is distributed in the hope that it will be useful,9but WITHOUT ANY WARRANTY; without even the implied warranty of10MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11GNU General Public License for more details.12You should have received a copy of the GNU General Public License13along with w3af; if not, write to the Free Software14Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA15"""16import os17from w3af.core.data.context.tests.context_test import ContextTest18from w3af.core.data.context.context import get_context19from w3af.core.data.context.context.html import (HtmlTag,20 CSSText,21 HtmlAttr,22 HtmlText,23 ScriptText,24 HtmlComment,25 HtmlTagClose,26 HtmlAttrNoQuote,27 HtmlAttrBackticks,28 HtmlAttrSingleQuote,29 HtmlAttrDoubleQuote)30class TestHTMLContext(ContextTest):31 SAMPLES_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),32 'samples')33 def test_payload_only_payload(self):34 html = 'PAYLOAD'35 contexts = get_context(html, 'PAYLOAD')36 self.assertEqual(len(contexts), 1)37 self.assertIsInstance(contexts[0], HtmlText)38 def test_payload_empty(self):39 html = ''40 self.assertEqual(get_context(html, 'PAYLOAD'), [])41 def test_payload_in_html_text(self):42 html = """43 <html>44 <body>45 PAYLOAD46 </body>47 </html>48 """49 contexts = get_context(html, 'PAYLOAD')50 self.assertEqual(len(contexts), 1)51 self.assertIsInstance(contexts[0], HtmlText)52 def test_payload_in_html_text_with_lower(self):53 html = """54 <html>55 <body>56 %s57 </body>58 </html>59 """60 payload = 'PAYLOAD'61 contexts = get_context(html % payload.lower(), payload)62 self.assertEqual(len(contexts), 1)63 self.assertIsInstance(contexts[0], HtmlText)64 def test_payload_html_inside_comment(self):65 html = """66 <html>67 <!-- <body>PAYLOAD</body> -->68 </html>69 """70 contexts = get_context(html, 'PAYLOAD')71 self.assertEqual(len(contexts), 1)72 self.assertIsInstance(contexts[0], HtmlComment)73 def test_tag_attr_double_quote(self):74 html = """75 <html>76 <tag attr="PAYLOAD" />77 </html>78 """79 contexts = get_context(html, 'PAYLOAD')80 self.assertEqual(len(contexts), 1)81 self.assertIsInstance(contexts[0], HtmlAttrDoubleQuote)82 def test_tag_attr_single_double_quote(self):83 html = """84 <html>85 <tag spam='eggs' attr="PAYLOAD" />86 </html>87 """88 contexts = get_context(html, 'PAYLOAD')89 self.assertEqual(len(contexts), 1)90 self.assertIsInstance(contexts[0], HtmlAttrDoubleQuote)91 def test_payload_a_single_quote(self):92 html = """93 <html>94 <a foo='PAYLOAD'>95 bar96 </a>97 </html>98 """99 contexts = get_context(html, 'PAYLOAD')100 self.assertEqual(len(contexts), 1)101 self.assertIsInstance(contexts[0], HtmlAttrSingleQuote)102 def test_payload_a_single_quote_with_escape(self):103 html = """104 <html>105 <a foo='PAYLOAD''>106 bar107 </a>108 </html>109 """110 contexts = get_context(html, 'PAYLOAD')111 self.assertEqual(len(contexts), 1)112 self.assertIsInstance(contexts[0], HtmlAttrSingleQuote)113 def test_payload_a_double_quote_with_escape(self):114 html = """115 <html>116 <a foo="PAYLOAD"">117 bar118 </a>119 </html>120 """121 contexts = get_context(html, 'PAYLOAD')122 self.assertEqual(len(contexts), 1)123 self.assertIsInstance(contexts[0], HtmlAttrDoubleQuote)124 def test_payload_backtick(self):125 html = """126 <html>127 <a foo=`PAYLOAD`>128 bar129 </a>130 </html>131 """132 contexts = get_context(html, 'PAYLOAD')133 self.assertEqual(len(contexts), 1)134 self.assertIsInstance(contexts[0], HtmlAttrBackticks)135 def test_payload_attr_value_no_separator(self):136 html = """137 <html>138 <a foo=PAYLOAD bar=loops>139 bar140 </a>141 </html>142 """143 contexts = get_context(html, 'PAYLOAD')144 self.assertEqual(len(contexts), 1)145 self.assertIsInstance(contexts[0], HtmlAttrNoQuote)146 def test_payload_in_html_text_complex(self):147 html = """148 <html>149 <tag>foo</tag>150 PAYLOAD151 <tag>bar</tag>152 </html>153 """154 contexts = get_context(html, 'PAYLOAD')155 self.assertEqual(len(contexts), 1)156 self.assertIsInstance(contexts[0], HtmlText)157 def test_payload_broken_double_open(self):158 html = """159 <html>160 <tag>foo161 PAYLOAD162 <tag>bar</tag>163 </html>164 """165 contexts = get_context(html, 'PAYLOAD')166 self.assertEqual(len(contexts), 1)167 self.assertIsInstance(contexts[0], HtmlText)168 def test_payload_script_broken_double_close(self):169 html = """170 <html>171 <script>foo</script>172 PAYLOAD173 </script>174 </html>175 """176 contexts = get_context(html, 'PAYLOAD')177 self.assertEqual(len(contexts), 1)178 self.assertIsInstance(contexts[0], ScriptText)179 def test_payload_confuse_parser(self):180 html = """181 <html>182 <a attr="</a>">PAYLOAD</a>183 </html>184 """185 contexts = get_context(html, 'PAYLOAD')186 self.assertEqual(len(contexts), 1)187 self.assertIsInstance(contexts[0], HtmlText)188 def test_payload_text_with_quotes(self):189 html = """190 <html>191 <a>Quoting the great Linus Torvalds: "PAYLOAD<"</a>192 </html>193 """194 contexts = get_context(html, 'PAYLOAD')195 self.assertEqual(len(contexts), 1)196 context = contexts[0]197 self.assertIsInstance(context, HtmlText)198 self.assertFalse(context.can_break())199 def test_payload_text_with_start_quote(self):200 html = """201 <html>202 <a>Quoting the great Linus Torvalds: "PAYLOAD<</a>203 </html>204 """205 contexts = get_context(html, '"PAYLOAD<')206 self.assertEqual(len(contexts), 1)207 context = contexts[0]208 self.assertIsInstance(context, HtmlText)209 def test_payload_text_with_end_quote(self):210 html = """211 <html>212 <a>Quoting the great Linus Torvalds: PAYLOAD<"</a>213 </html>214 """215 contexts = get_context(html, 'PAYLOAD<"')216 self.assertEqual(len(contexts), 1)217 context = contexts[0]218 self.assertIsInstance(context, HtmlText)219 def test_payload_tag_name(self):220 html = """221 <PAYLOAD></x>222 </foo>223 """224 contexts = get_context(html, 'PAYLOAD')225 self.assertEqual(len(contexts), 1, contexts)226 self.assertIsInstance(contexts[0], HtmlTag)227 def test_payload_tag_name_close(self):228 html = """229 <foo>230 </PAYLOAD>231 """232 contexts = get_context(html, 'PAYLOAD')233 self.assertEqual(len(contexts), 1, contexts)234 self.assertIsInstance(contexts[0], HtmlTagClose)235 def test_payload_tag_attr_key(self):236 html = """237 <a PAYLOAD="/xyz">foo</a>238 """239 contexts = get_context(html, 'PAYLOAD')240 self.assertEqual(len(contexts), 1, contexts)241 context = contexts[0]242 self.assertIsInstance(context, HtmlAttr)243 def test_django_500_sample(self):244 html = file(os.path.join(self.SAMPLES_DIR, 'django-500.html')).read()245 contexts = get_context(html, 'QUBD5 =')246 self.assertEqual(len(contexts), 9)247 for context in contexts:248 self.assertIsInstance(context, HtmlText)249 def test_payload_html_comment_with_single_quote(self):250 """251 A single quote inside an HTML comment seems to break parsing by252 "extending" the HTML comment context. See the "quote_comment.html"253 file, specifically the section which says:254 "I'm a single quote, and I break stuff."255 Before fixing this bug, if you removed that single quote, this test256 passed.257 """258 html = """259 <!DOCTYPE html>260 <html>261 <!--262 I'm a single quote, and I break stuff.263 -->264 <a href="http://external/abc/PAYLOAD">Check link href</a>265 </html>266 """267 contexts = get_context(html, 'PAYLOAD')268 self.assertEqual(len(contexts), 1, contexts)269 self.assertIsInstance(contexts[0], HtmlAttrDoubleQuote)270 def test_payload_html_comment_with_tag_attr_inside(self):271 html = """272 <!DOCTYPE html>273 <html>274 <!--275 <a href="PAYLOAD"></a>276 -->277 <a href="http://external/abc/PAYLOAD">Check link href</a>278 </html>279 """280 contexts = get_context(html, 'PAYLOAD')281 self.assertEqual(len(contexts), 2, contexts)282 self.assertIsInstance(contexts[0], HtmlComment)283 self.assertIsInstance(contexts[1], HtmlAttrDoubleQuote)284 def test_payload_html_comment_with_tag_text_inside(self):285 html = """286 <!DOCTYPE html>287 <html>288 <!--289 <a href="">PAYLOAD</a>290 -->291 <a href="http://external/abc/PAYLOAD">Check link href</a>292 </html>293 """294 contexts = get_context(html, 'PAYLOAD')295 self.assertEqual(len(contexts), 2, contexts)296 self.assertIsInstance(contexts[0], HtmlComment)297 self.assertIsInstance(contexts[1], HtmlAttrDoubleQuote)298 def test_broken_1(self):299 html = """300 <a PAYLOAD="/xyz301 """302 contexts = get_context(html, 'PAYLOAD')303 self.assertEqual(len(contexts), 0, contexts)304 def test_broken_2(self):305 html = """306 <a PAYLOAD="/xyz" /<307 """308 contexts = get_context(html, 'PAYLOAD')309 self.assertEqual(len(contexts), 0, contexts)310 def test_broken_3(self):311 html = """312 <a PAYLOAD="/xyz"><313 """314 contexts = get_context(html, 'PAYLOAD')315 self.assertEqual(len(contexts), 1, contexts)316 self.assertIsInstance(contexts[0], HtmlAttr)317 def test_broken_4(self):318 html = """319 <a PAYLOAD="/xyz"></320 """321 contexts = get_context(html, 'PAYLOAD')322 self.assertEqual(len(contexts), 1, contexts)323 self.assertIsInstance(contexts[0], HtmlAttr)324 def test_broken_5(self):325 html = """326 <a foo="/xyz"></PAYLOAD327 """328 contexts = get_context(html, 'PAYLOAD')329 self.assertEqual(len(contexts), 0, contexts)330 def test_script_text(self):331 html = """332 <script>foo(); bar(PAYLOAD);</script>333 """334 contexts = get_context(html, 'PAYLOAD')335 self.assertEqual(len(contexts), 1, contexts)336 self.assertIsInstance(contexts[0], ScriptText)337 def test_style_text(self):338 html = """339 <style>foo(); bar(PAYLOAD);</style>340 """341 contexts = get_context(html, 'PAYLOAD')342 self.assertEqual(len(contexts), 1, contexts)343 self.assertIsInstance(contexts[0], CSSText)344 def test_script_text_comment(self):345 html = """346 <script type="text/javascript">347 <!--348 foo(); bar(PAYLOAD);349 //-->350 </script>351 """352 contexts = get_context(html, 'PAYLOAD')353 self.assertEqual(len(contexts), 1, contexts)354 self.assertIsInstance(contexts[0], ScriptText)355 def test_payload_inside_noscript_1(self):356 html = """357 <html>358 <body>359 <noscript>360 PAYLOAD361 </noscript>362 </body>363 </html>364 """365 contexts = get_context(html, 'PAYLOAD')366 self.assertEqual(len(contexts), 0)367 def test_payload_inside_noscript_2(self):368 html = """369 <html>370 <noscript>371 <a onmouseover="PAYLOAD">link</a>372 </noscript>373 </html>374 """375 contexts = get_context(html, 'PAYLOAD')...
stack_context.py
Source:stack_context.py
1#!/usr/bin/env python2#3# Copyright 2010 Facebook4#5# Licensed under the Apache License, Version 2.0 (the "License"); you may6# not use this file except in compliance with the License. You may obtain7# a copy of the License at8#9# http://www.apache.org/licenses/LICENSE-2.010#11# Unless required by applicable law or agreed to in writing, software12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the14# License for the specific language governing permissions and limitations15# under the License.16"""`StackContext` allows applications to maintain threadlocal-like state17that follows execution as it moves to other execution contexts.18The motivating examples are to eliminate the need for explicit19``async_callback`` wrappers (as in `tornado.web.RequestHandler`), and to20allow some additional context to be kept for logging.21This is slightly magic, but it's an extension of the idea that an22exception handler is a kind of stack-local state and when that stack23is suspended and resumed in a new context that state needs to be24preserved. `StackContext` shifts the burden of restoring that state25from each call site (e.g. wrapping each `.AsyncHTTPClient` callback26in ``async_callback``) to the mechanisms that transfer control from27one context to another (e.g. `.AsyncHTTPClient` itself, `.IOLoop`,28thread pools, etc).29Example usage::30 @contextlib.contextmanager31 def die_on_error():32 try:33 yield34 except Exception:35 logging.error("exception in asynchronous operation",exc_info=True)36 sys.exit(1)37 with StackContext(die_on_error):38 # Any exception thrown here *or in callback and its descendants*39 # will cause the process to exit instead of spinning endlessly40 # in the ioloop.41 http_client.fetch(url, callback)42 ioloop.start()43Most applications shouldn't have to work with `StackContext` directly.44Here are a few rules of thumb for when it's necessary:45* If you're writing an asynchronous library that doesn't rely on a46 stack_context-aware library like `tornado.ioloop` or `tornado.iostream`47 (for example, if you're writing a thread pool), use48 `.stack_context.wrap()` before any asynchronous operations to capture the49 stack context from where the operation was started.50* If you're writing an asynchronous library that has some shared51 resources (such as a connection pool), create those shared resources52 within a ``with stack_context.NullContext():`` block. This will prevent53 ``StackContexts`` from leaking from one request to another.54* If you want to write something like an exception handler that will55 persist across asynchronous calls, create a new `StackContext` (or56 `ExceptionStackContext`), and make your asynchronous calls in a ``with``57 block that references your `StackContext`.58"""59from __future__ import absolute_import, division, print_function, with_statement60import sys61import threading62from .util import raise_exc_info63class StackContextInconsistentError(Exception):64 pass65class _State(threading.local):66 def __init__(self):67 self.contexts = (tuple(), None)68_state = _State()69class StackContext(object):70 """Establishes the given context as a StackContext that will be transferred.71 Note that the parameter is a callable that returns a context72 manager, not the context itself. That is, where for a73 non-transferable context manager you would say::74 with my_context():75 StackContext takes the function itself rather than its result::76 with StackContext(my_context):77 The result of ``with StackContext() as cb:`` is a deactivation78 callback. Run this callback when the StackContext is no longer79 needed to ensure that it is not propagated any further (note that80 deactivating a context does not affect any instances of that81 context that are currently pending). This is an advanced feature82 and not necessary in most applications.83 """84 def __init__(self, context_factory):85 self.context_factory = context_factory86 self.contexts = []87 self.active = True88 def _deactivate(self):89 self.active = False90 # StackContext protocol91 def enter(self):92 context = self.context_factory()93 self.contexts.append(context)94 context.__enter__()95 def exit(self, type, value, traceback):96 context = self.contexts.pop()97 context.__exit__(type, value, traceback)98 # Note that some of this code is duplicated in ExceptionStackContext99 # below. ExceptionStackContext is more common and doesn't need100 # the full generality of this class.101 def __enter__(self):102 self.old_contexts = _state.contexts103 self.new_contexts = (self.old_contexts[0] + (self,), self)104 _state.contexts = self.new_contexts105 try:106 self.enter()107 except:108 _state.contexts = self.old_contexts109 raise110 return self._deactivate111 def __exit__(self, type, value, traceback):112 try:113 self.exit(type, value, traceback)114 finally:115 final_contexts = _state.contexts116 _state.contexts = self.old_contexts117 # Generator coroutines and with-statements with non-local118 # effects interact badly. Check here for signs of119 # the stack getting out of sync.120 # Note that this check comes after restoring _state.context121 # so that if it fails things are left in a (relatively)122 # consistent state.123 if final_contexts is not self.new_contexts:124 raise StackContextInconsistentError(125 'stack_context inconsistency (may be caused by yield '126 'within a "with StackContext" block)')127 # Break up a reference to itself to allow for faster GC on CPython.128 self.new_contexts = None129class ExceptionStackContext(object):130 """Specialization of StackContext for exception handling.131 The supplied ``exception_handler`` function will be called in the132 event of an uncaught exception in this context. The semantics are133 similar to a try/finally clause, and intended use cases are to log134 an error, close a socket, or similar cleanup actions. The135 ``exc_info`` triple ``(type, value, traceback)`` will be passed to the136 exception_handler function.137 If the exception handler returns true, the exception will be138 consumed and will not be propagated to other exception handlers.139 """140 def __init__(self, exception_handler):141 self.exception_handler = exception_handler142 self.active = True143 def _deactivate(self):144 self.active = False145 def exit(self, type, value, traceback):146 if type is not None:147 return self.exception_handler(type, value, traceback)148 def __enter__(self):149 self.old_contexts = _state.contexts150 self.new_contexts = (self.old_contexts[0], self)151 _state.contexts = self.new_contexts152 return self._deactivate153 def __exit__(self, type, value, traceback):154 try:155 if type is not None:156 return self.exception_handler(type, value, traceback)157 finally:158 final_contexts = _state.contexts159 _state.contexts = self.old_contexts160 if final_contexts is not self.new_contexts:161 raise StackContextInconsistentError(162 'stack_context inconsistency (may be caused by yield '163 'within a "with StackContext" block)')164 # Break up a reference to itself to allow for faster GC on CPython.165 self.new_contexts = None166class NullContext(object):167 """Resets the `StackContext`.168 Useful when creating a shared resource on demand (e.g. an169 `.AsyncHTTPClient`) where the stack that caused the creating is170 not relevant to future operations.171 """172 def __enter__(self):173 self.old_contexts = _state.contexts174 _state.contexts = (tuple(), None)175 def __exit__(self, type, value, traceback):176 _state.contexts = self.old_contexts177def _remove_deactivated(contexts):178 """Remove deactivated handlers from the chain"""179 # Clean ctx handlers180 stack_contexts = tuple([h for h in contexts[0] if h.active])181 # Find new head182 head = contexts[1]183 while head is not None and not head.active:184 head = head.old_contexts[1]185 # Process chain186 ctx = head187 while ctx is not None:188 parent = ctx.old_contexts[1]189 while parent is not None:190 if parent.active:191 break192 ctx.old_contexts = parent.old_contexts193 parent = parent.old_contexts[1]194 ctx = parent195 return (stack_contexts, head)196def wrap(fn):197 """Returns a callable object that will restore the current `StackContext`198 when executed.199 Use this whenever saving a callback to be executed later in a200 different execution context (either in a different thread or201 asynchronously in the same thread).202 """203 # Check if function is already wrapped204 if fn is None or hasattr(fn, '_wrapped'):205 return fn206 # Capture current stack head207 # TODO: Any other better way to store contexts and update them in wrapped function?208 cap_contexts = [_state.contexts]209 if not cap_contexts[0][0] and not cap_contexts[0][1]:210 # Fast path when there are no active contexts.211 def null_wrapper(*args, **kwargs):212 try:213 current_state = _state.contexts214 _state.contexts = cap_contexts[0]215 return fn(*args, **kwargs)216 finally:217 _state.contexts = current_state218 null_wrapper._wrapped = True219 return null_wrapper220 def wrapped(*args, **kwargs):221 ret = None222 try:223 # Capture old state224 current_state = _state.contexts225 # Remove deactivated items226 cap_contexts[0] = contexts = _remove_deactivated(cap_contexts[0])227 # Force new state228 _state.contexts = contexts229 # Current exception230 exc = (None, None, None)231 top = None232 # Apply stack contexts233 last_ctx = 0234 stack = contexts[0]235 # Apply state236 for n in stack:237 try:238 n.enter()239 last_ctx += 1240 except:241 # Exception happened. Record exception info and store top-most handler242 exc = sys.exc_info()243 top = n.old_contexts[1]244 # Execute callback if no exception happened while restoring state245 if top is None:246 try:247 ret = fn(*args, **kwargs)248 except:249 exc = sys.exc_info()250 top = contexts[1]251 # If there was exception, try to handle it by going through the exception chain252 if top is not None:253 exc = _handle_exception(top, exc)254 else:255 # Otherwise take shorter path and run stack contexts in reverse order256 while last_ctx > 0:257 last_ctx -= 1258 c = stack[last_ctx]259 try:260 c.exit(*exc)261 except:262 exc = sys.exc_info()263 top = c.old_contexts[1]264 break265 else:266 top = None267 # If if exception happened while unrolling, take longer exception handler path268 if top is not None:269 exc = _handle_exception(top, exc)270 # If exception was not handled, raise it271 if exc != (None, None, None):272 raise_exc_info(exc)273 finally:274 _state.contexts = current_state275 return ret276 wrapped._wrapped = True277 return wrapped278def _handle_exception(tail, exc):279 while tail is not None:280 try:281 if tail.exit(*exc):282 exc = (None, None, None)283 except:284 exc = sys.exc_info()285 tail = tail.old_contexts[1]286 return exc287def run_with_stack_context(context, func):288 """Run a coroutine ``func`` in the given `StackContext`.289 It is not safe to have a ``yield`` statement within a ``with StackContext``290 block, so it is difficult to use stack context with `.gen.coroutine`.291 This helper function runs the function in the correct context while292 keeping the ``yield`` and ``with`` statements syntactically separate.293 Example::294 @gen.coroutine295 def incorrect():296 with StackContext(ctx):297 # ERROR: this will raise StackContextInconsistentError298 yield other_coroutine()299 @gen.coroutine300 def correct():301 yield run_with_stack_context(StackContext(ctx), other_coroutine)302 .. versionadded:: 3.1303 """304 with context:...
bench_presentation.py
Source:bench_presentation.py
1"""Performance tests for the presentation module."""2from pydicom._uid_dict import UID_dictionary3from pydicom.uid import UID4from pynetdicom3 import StorageSOPClassList5from pynetdicom3.presentation import PresentationContext, PresentationService6from pynetdicom3.utils import PresentationContextManager7class TimePresentationContext:8 def setup(self):9 self.contexts = []10 for x in range(500):11 self.contexts.append(12 PresentationContext(1,13 '1.2.840.10008.5.1.4.1.1.2',14 ['1.2.840.10008.1.2',15 '1.2.840.10008.1.2.1',16 '1.2.840.10008.1.2.2'])17 )18 def time_create_single_transfer_syntax(self):19 """Time the creation of 100 presentation contexts with a single ts"""20 for x in range(500):21 PresentationContext(22 1,23 '1.2.840.10008.5.1.4.1.1.2',24 ['1.2.840.10008.1.2']25 )26 def time_create_double_transfer_syntax(self):27 for x in range(500):28 PresentationContext(29 1,30 '1.2.840.10008.5.1.4.1.1.2',31 ['1.2.840.10008.1.2', '1.2.840.10008.1.2.1']32 )33 def time_create_triple_transfer_syntax(self):34 for x in range(500):35 PresentationContext(36 1,37 '1.2.840.10008.5.1.4.1.1.2',38 [39 '1.2.840.10008.1.2',40 '1.2.840.10008.1.2.1',41 '1.2.840.10008.1.2.2'42 ]43 )44 def time_create_from_sop(self):45 """Test the time taken to create a PresentationContext from every46 available standard DICOM UID.47 """48 for uid in UID_dictionary:49 PresentationContext(50 1,51 uid,52 [53 '1.2.840.10008.1.2',54 '1.2.840.10008.1.2.1',55 '1.2.840.10008.1.2.2'56 ]57 )58 def time_create_from_sop_list(self):59 """Test the time taken to create Presentation Contexts using the60 predefined SOP Classes from the pyndx.sop_class module.61 """62 for ii, sop_class in enumerate(StorageSOPClassList):63 PresentationContext(64 ii * 2 + 1,65 sop_class.UID,66 [67 '1.2.840.10008.1.2',68 '1.2.840.10008.1.2.1',69 '1.2.840.10008.1.2.2'70 ]71 )72class TimePresentationAcceptorRoleNegotiation(object):73 """Time presentation context negotiation as acceptor with SCP/SCU Role74 Selection75 """76 def setup(self):77 # Requestor presentation contexts - max 12678 self.requestor_contexts = []79 self.requestor_transfer_syntaxes = ['1.2.840.10008.1.2',80 '1.2.840.10008.1.2.1',81 '1.2.840.10008.1.2.2']82 for ii, sop in enumerate(StorageSOPClassList):83 context = PresentationContext(ii * 2 + 1,84 sop.UID,85 ['1.2.840.10008.1.2',86 '1.2.840.10008.1.2.1',87 '1.2.840.10008.1.2.2'])88 context.SCP = True89 context.SCU = True90 self.requestor_contexts.append(context)91 # Acceptor presentation contexts - no max92 self.acceptor_contexts = []93 self.acceptor_transfer_syntaxes = ['1.2.840.10008.1.2',94 '1.2.840.10008.1.2.1',95 '1.2.840.10008.1.2.2']96 for uid in UID_dictionary:97 context = PresentationContext(1,98 uid,99 ['1.2.840.10008.1.2',100 '1.2.840.10008.1.2.1',101 '1.2.840.10008.1.2.2'])102 context.SCP = True103 context.SCU = False104 self.acceptor_contexts.append(context)105 def time_ps_ac_role(self):106 """Time a presentation service with SCP/SCU role negotiation."""107 presentation = PresentationService()108 presentation.negotiate_as_requestor(self.requestor_contexts,109 self.acceptor_contexts)110 def time_pcm_ac_role(self):111 """Time PresentationContextManager with SCP/SCU role negotiation."""112 pcm = PresentationContextManager()113 pcm.requestor_contexts = self.requestor_contexts114 pcm.acceptor_contexts = self.acceptor_contexts115class TimePresentationRequestorRoleNegotiation(object):116 """Time presentation context negotiation as requestor with SCP/SCU Role117 Selection118 """119 def setup(self):120 # Requestor presentation contexts - max 126121 self.requestor_contexts = []122 self.requestor_transfer_syntaxes = ['1.2.840.10008.1.2',123 '1.2.840.10008.1.2.1',124 '1.2.840.10008.1.2.2']125 for ii, sop in enumerate(StorageSOPClassList):126 context = PresentationContext(ii * 2 + 1,127 sop.UID,128 ['1.2.840.10008.1.2',129 '1.2.840.10008.1.2.1',130 '1.2.840.10008.1.2.2'])131 context.SCP = True132 context.SCU = True133 self.requestor_contexts.append(context)134 # Acceptor presentation contexts - no max135 self.acceptor_contexts = []136 self.acceptor_transfer_syntaxes = ['1.2.840.10008.1.2',137 '1.2.840.10008.1.2.1',138 '1.2.840.10008.1.2.2']139 for uid in UID_dictionary:140 context = PresentationContext(1,141 uid,142 ['1.2.840.10008.1.2'])143 context.Result = 0x00144 context.SCP = True145 context.SCU = True146 self.acceptor_contexts.append(context)147 def time_ps_rq_role(self):148 """Time a presentation service with SCP/SCU role negotiation."""149 presentation = PresentationService()150 presentation.negotiate_as_requestor(self.requestor_contexts,151 self.acceptor_contexts)152 def time_pcm_rq_role(self):153 """Time PresentationContextManager with SCP/SCU role negotiation."""154 pcm = PresentationContextManager()155 pcm.requestor_contexts = self.requestor_contexts156 pcm.acceptor_contexts = self.acceptor_contexts157class TimePresentationAcceptor(object):158 """Time presentation context negotiation as acceptor"""159 def setup(self):160 # Requestor presentation contexts - max 126161 self.requestor_contexts = []162 self.requestor_transfer_syntaxes = ['1.2.840.10008.1.2',163 '1.2.840.10008.1.2.1',164 '1.2.840.10008.1.2.2']165 for ii, sop in enumerate(StorageSOPClassList):166 self.requestor_contexts.append(167 PresentationContext(ii * 2 + 1,168 sop.UID,169 ['1.2.840.10008.1.2',170 '1.2.840.10008.1.2.1',171 '1.2.840.10008.1.2.2'])172 )173 # Acceptor presentation contexts - no max174 self.acceptor_contexts = []175 self.acceptor_transfer_syntaxes = ['1.2.840.10008.1.2',176 '1.2.840.10008.1.2.1',177 '1.2.840.10008.1.2.2']178 for uid in UID_dictionary:179 self.acceptor_contexts.append(180 PresentationContext(1,181 uid,182 ['1.2.840.10008.1.2',183 '1.2.840.10008.1.2.1',184 '1.2.840.10008.1.2.2'])185 )186 def time_ps_ac_basic(self):187 """Time a basic presentation service negotiation"""188 presentation = PresentationService()189 presentation.negotiate_as_acceptor(self.requestor_contexts,190 self.acceptor_contexts)191 def time_pcm_basic(self):192 """Time a basic PresentationContextManager negotiation"""193 pcm = PresentationContextManager()194 pcm.requestor_contexts = self.requestor_contexts195 pcm.acceptor_contexts = self.acceptor_contexts196 accepted = pcm.accepted197class TimePresentationRequestor(object):198 """Time presentation context negotiation as requestor"""199 def setup(self):200 # Requestor presentation contexts - max 126201 self.requestor_contexts = []202 self.requestor_transfer_syntaxes = ['1.2.840.10008.1.2',203 '1.2.840.10008.1.2.1',204 '1.2.840.10008.1.2.2']205 for ii, sop in enumerate(StorageSOPClassList):206 self.requestor_contexts.append(207 PresentationContext(ii * 2 + 1,208 sop.UID,209 ['1.2.840.10008.1.2',210 '1.2.840.10008.1.2.1',211 '1.2.840.10008.1.2.2'])212 )213 # Acceptor presentation contexts - no max214 self.acceptor_contexts = []215 self.acceptor_transfer_syntaxes = ['1.2.840.10008.1.2',216 '1.2.840.10008.1.2.1',217 '1.2.840.10008.1.2.2']218 for uid in UID_dictionary:219 context = PresentationContext(1,220 uid,221 ['1.2.840.10008.1.2'])222 context.Result = 0x00223 self.acceptor_contexts.append(context)224 def time_ps_rq_basic(self):225 """Time a basic presentation service negotiation."""226 presentation = PresentationService()227 presentation.negotiate_as_requestor(self.requestor_contexts,228 self.acceptor_contexts)229 def time_pcm_rq_basic(self):230 """Time a basic PresentationContextManager negotiation"""231 pcm = PresentationContextManager()232 pcm.requestor_contexts = self.requestor_contexts...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!