def config_from_settings(cls, settings: Settings): """Class method for configuring a Mail instance from a molten.Settings object. Supports Setting key names in Upper or Lower case. """ _mail_settings = { k.lower(): v for k, v in settings.items() if k.startswith("MAIL_") or k.startswith("mail_") } return cls( server=_mail_settings.get("mail_server", "localhost"), user=_mail_settings.get("mail_username"), password=_mail_settings.get("mail_password"), port=_mail_settings.get("mail_port", 25), use_tls=_mail_settings.get("mail_use_tls", False), use_ssl=_mail_settings.get("mail_use_ssl", False), default_sender=_mail_settings.get("mail_default_sender"), debug=_mail_settings.get("mail_debug", False), max_emails=_mail_settings.get("mail_max_emails"), suppress_send=_mail_settings.get("mail_suppress_send", False), ascii_attachments=_mail_settings.get("mail_ascii_attachements", False), )
def get_botx_wsgi_api( messages: List[APIMessage], requests: List[APIRequest], errors: Dict[Type[BotXMethod], Tuple[int, Any]], ) -> App: """Generate BotX API mock. Arguments: messages: list of message that were sent from bot and should be extended. requests: all requests that were sent from bot. errors: errors to be generated by mocked API. Returns: Generated BotX API mock for using with httpx. """ return App( components=[ SettingsComponent( Settings(messages=messages, requests=requests, errors=errors), ), ], routes=list(_create_molten_routes()), middleware=[error_middleware], parsers=[JSONParser()], )
def test_app(): settings = Settings({ 'database_engine_dsn': 'sqlite://', 'identity_server': 'http://localhost', 'secret_key': 'fake_secret', }) app = create_app( settings=settings, components=[ SettingsComponent(settings), SQLAlchemyEngineComponent(), SQLAlchemySessionComponent(), # RequestSessionComponent(), MockProvider(AuthProviderComponent), ], ) yield app
def create_app(middleware=None, components=None, settings=None): if settings is None: settings = Settings({ 'database_engine_dsn': os.environ['SQLALCHEMY_URI'], 'identity_server': os.environ['IDENTITY_SERVER'], 'secret_key': os.environ['SECRET_KEY'], }) if middleware is None: middleware = [ ResponseRendererMiddleware(), SQLAlchemyMiddleware(), auth_middleware, ] if components is None: components = [ SettingsComponent(settings), SQLAlchemyEngineComponent(), SQLAlchemySessionComponent(), RequestSessionComponent(), AuthProviderComponent(), ManagerComponent(ChoreInstanceManager), ManagerComponent(ChoreDefinitionManager), UserProviderComponent(), ] app = App( routes=[ Route('/login', login, method='POST', name='login'), Include( '/api', routes, namespace='api', ) ], middleware=middleware, components=components, ) return app
def middleware(jwt_identity: JWTIdentity, settings: Settings) -> Any: white_list = settings.get("JWT_AUTH_WHITELIST", []) if ( getattr(handler, "allow_anonymous", False) or handler.__name__ in white_list ): return handler() # TODO change this error message to something more sensible. if jwt_identity is None: raise HTTPError( HTTP_401, response="UNAUTHORIZED", headers={"WWW-Authenticate": "Bearer"}, ) try: jwt_identity.token.validate() except TokenValidationError as err: raise HTTPError( HTTP_401, response={"status": 401, "error_message": str(err)}, headers={"WWW-Authenticate": "Bearer"}, ) if hasattr(handler, "claims"): claim_errors = [ {k: v} for k, v in handler.claims.items() if k not in jwt_identity.token or v != jwt_identity.token.get(k) ] if claim_errors: raise HTTPError( HTTP_403, response={"status": 403, "error_message": claim_errors}, ) return handler()
Route, Settings, SettingsComponent, QueryParams, HTTP_204, HTTP_400, Response, ) from molten_mail import MailComponent, Mail, Message # Replace with your own SMTP parameters settings = Settings( { "MAIL_SERVER": "smtp.example.com", "MAIL_USERNAME": "******", "MAIL_PASSWORD": "******", "MAIL_PORT": 587, "MAIL_USE_TLS": True, "MAIL_DEFAULT_SENDER": "*****@*****.**", } ) def send_message(params: QueryParams, mail: Mail): """Emails an email address provided in the query string""" addresses = params.get_all("email") if not addresses: return Response( HTTP_400, content="Provide emails in the query params to send a welcome message", ) msg = Message(
from molten import App, Route, Settings, SettingsComponent, testing def index(settings: Settings) -> dict: return settings app = App( components=[SettingsComponent(Settings({"database_dsn": "sqlite://"}))], routes=[Route("/", index)], ) client = testing.TestClient(app) def test_apps_can_load_settings(): # Given that I have an app that uses settings # When I make a request to that handler response = client.get(app.reverse_uri("index")) # Then I should get back a successful response assert response.status_code == 200 # And the response should contain the settings assert response.json() == { "database_dsn": "sqlite://", }
def resolve(self, settings: Settings): return Redis.from_url(settings.strict_get("redis.url"))
def app_settings(): return Settings({"JWT_SECRET_KEY": SECRET, "JWT_ALGORITHM": "HS256"})