Best Python code snippet using localstack_python
decorators.py
Source:decorators.py
1import traceback2import logging3import time4import sys5import activitystreams as as_parser6import eventlet7from functools import wraps8from datetime import datetime9from uuid import uuid4 as uuid10from dino import validation11from dino import environ12from dino import utils13from dino.exceptions import NoSuchUserException14from dino.config import ConfigKeys15from dino.config import SessionKeys16from dino.config import ErrorCodes17logger = logging.getLogger()18def timeit(_logger, tag: str):19 def factory(view_func):20 @wraps(view_func)21 def decorator(*args, **kwargs):22 failed = False23 before = time.time()24 try:25 return view_func(*args, **kwargs)26 except Exception as e:27 failed = True28 _logger.exception(traceback.format_exc())29 _logger.error(tag + '... FAILED')30 environ.env.capture_exception(sys.exc_info())31 raise e32 finally:33 if not failed:34 the_time = (time.time()-before)*100035 if tag.startswith('on_') and environ.env.stats is not None:36 environ.env.stats.timing('api.' + tag, the_time)37 else:38 _logger.debug(tag + '... %.2fms' % the_time)39 return decorator40 return factory41def locked_method(method):42 """Method decorator. Requires a lock object at self._lock"""43 def newmethod(self, *args, **kwargs):44 with self._lock:45 return method(self, *args, **kwargs)46 return newmethod47def _delayed_disconnect(sid: str):48 environ.env.disconnect_by_sid(sid)49def respond_with(gn_event_name=None, should_disconnect=False, emit_response=True):50 def factory(view_func):51 @wraps(view_func)52 def decorator(*args, **kwargs):53 tb = None54 try:55 status_code, data = view_func(*args, **kwargs)56 except Exception as e:57 environ.env.stats.incr(gn_event_name + '.exception')58 tb = traceback.format_exc()59 logger.error('%s: %s' % (gn_event_name, str(e)))60 environ.env.capture_exception(sys.exc_info())61 if should_disconnect and environ.env.config.get(ConfigKeys.DISCONNECT_ON_FAILED_LOGIN, False):62 eventlet.spawn_after(seconds=1, func=_delayed_disconnect, sid=environ.env.request.sid)63 return 500, str(e)64 finally:65 if tb is not None:66 logger.exception(tb)67 if status_code != 200:68 logger.warning('in decorator, status_code: %s, data: %s' % (status_code, str(data)))69 if should_disconnect and environ.env.config.get(ConfigKeys.DISCONNECT_ON_FAILED_LOGIN, False):70 eventlet.spawn_after(seconds=1, func=_delayed_disconnect, sid=environ.env.request.sid)71 # in some cases the callback is enough72 if emit_response:73 response_message = environ.env.response_formatter(status_code, data)74 environ.env.emit(gn_event_name, response_message)75 return status_code, None76 return decorator77 return factory78def count_connections(connect_type=None):79 def factory(view_func):80 @wraps(view_func)81 def decorator(*args, **kwargs):82 try:83 if connect_type == 'connect':84 environ.env.stats.incr('connections')85 elif connect_type == 'disconnect':86 environ.env.stats.decr('connections')87 else:88 logger.warning('unknown connect type "%s"' % connect_type)89 except Exception as e:90 logger.error('could not record statistics: %s' % str(e))91 environ.env.capture_exception(sys.exc_info())92 return view_func(*args, **kwargs)93 return decorator94 return factory95def pre_process(validation_name, should_validate_request=True):96 def factory(view_func):97 @wraps(view_func)98 def decorator(*a, **k):99 def _pre_process(*args, **kwargs):100 if not hasattr(validation.request, validation_name):101 raise RuntimeError('no such attribute on validation.request: %s' % validation_name)102 try:103 data = args[0]104 if 'actor' not in data:105 data['actor'] = dict()106 # let the server determine the publishing time of the event, not the client107 # use default time format, since activity streams only accept RFC3339 format108 data['published'] = datetime.utcnow().strftime(ConfigKeys.DEFAULT_DATE_FORMAT)109 data['id'] = str(uuid())110 if should_validate_request:111 data['actor']['id'] = str(environ.env.session.get(SessionKeys.user_id.value))112 user_name = environ.env.session.get(SessionKeys.user_name.value)113 if user_name is None or len(user_name.strip()) == 0:114 try:115 user_name = utils.get_user_name_for(data['actor']['id'])116 except NoSuchUserException:117 error_msg = '[%s] no user found for user_id "%s" in session' % \118 (validation_name, str(data['actor']['id']))119 logger.error(error_msg)120 return ErrorCodes.NO_USER_IN_SESSION, error_msg121 data['actor']['displayName'] = utils.b64e(user_name)122 activity = as_parser.parse(data)123 # the login request will not have user id in session yet, which this would check124 if should_validate_request:125 is_valid, error_msg = validation.request.validate_request(activity)126 if not is_valid:127 logger.error('[%s] validation failed, error message: %s' % (validation_name, str(error_msg)))128 return ErrorCodes.VALIDATION_ERROR, error_msg129 is_valid, status_code, message = getattr(validation.request, validation_name)(activity)130 if is_valid:131 all_ok = True132 if validation_name in environ.env.event_validator_map:133 for validator in environ.env.event_validator_map[validation_name]:134 all_ok, status_code, msg = validator(data, activity)135 if not all_ok:136 logger.warning(137 '[%s] validator "%s" failed: %s' %138 (validation_name, str(validator), str(msg)))139 break140 if all_ok:141 args = (data, activity)142 status_code, message = view_func(*args, **kwargs)143 except Exception as e:144 logger.error('%s: %s' % (validation_name, str(e)))145 logger.exception(traceback.format_exc())146 environ.env.stats.incr('event.' + validation_name + '.exception')147 environ.env.capture_exception(sys.exc_info())148 return ErrorCodes.UNKNOWN_ERROR, str(e)149 if status_code == 200:150 environ.env.stats.incr('event.' + validation_name + '.count')151 else:152 environ.env.stats.incr('event.' + validation_name + '.error')153 logger.warning('in decorator for %s, status_code: %s, message: %s' %154 (validation_name, status_code, str(message)))155 return status_code, message156 start = time.time()157 exception_occurred = False158 try:159 environ.env.stats.incr('event.' + validation_name + '.count')160 return _pre_process(*a, **k)161 except:162 exception_occurred = True163 environ.env.stats.incr('event.' + validation_name + '.exception')164 raise165 finally:166 if not exception_occurred:167 environ.env.stats.timing('event.' + validation_name, (time.time()-start)*1000)168 return decorator...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!