def test_not_exists(self): mapping = {"EXISTS": True} with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") speckenv.env("EXISTS", mapping=mapping, warn=True) speckenv.env("NOT", mapping=mapping, warn=True) self.assertEqual(len(w), 1) self.assertIn("Key 'NOT' not available in environment", f"{w[0].message}")
def _srv_env(conn, path): mapping = {} with tempfile.NamedTemporaryFile() as f: conn.get(path, f.name) speckenv.read_speckenv(f.name, mapping=mapping) return lambda *a, **kw: speckenv.env(*a, **kw, mapping=mapping)
def default_env(*args, **kwargs): if not getattr(default_env, "_loaded", False): path = os.path.join(os.path.expanduser("~"), ".box.env") if os.path.isfile(path): speckenv.read_speckenv(path) default_env._loaded = True return speckenv.env(*args, **kwargs)
def patch_dj_email_url(): if "dj_email_url" in sys.modules: return m = ModuleType("dj_email_url") m.config = lambda name="EMAIL_URL", default="smtp://": django_email_url( env(name, default=default, warn=True)) m.parse = django_email_url sys.modules["dj_email_url"] = m
def patch_django_cache_url(): if "django_cache_url" in sys.modules: return m = ModuleType("django_cache_url") m.config = lambda name="CACHE_URL": django_cache_url( env(name, default="locmem://", warn=True)) m.parse = django_cache_url sys.modules["django_cache_url"] = m
def patch_dj_database_url(): if "dj_database_url" in sys.modules: return m = ModuleType("dj_database_url") m.config = lambda name="DATABASE_URL": django_database_url( env(name, required=True)) m.parse = django_database_url sys.modules["dj_database_url"] = m
def remote_env(*args, **kwargs): global REMOTE_ENV if REMOTE_ENV is None: REMOTE_ENV = {} with TemporaryDirectory() as d: get("%(box_domain)s/.env" % env, d) speckenv.read_speckenv(os.path.join(d, ".env"), mapping=REMOTE_ENV) kwargs["mapping"] = REMOTE_ENV return speckenv.env(*args, **kwargs)
def default_env(*args, **kwargs): if not getattr(default_env, '_loaded', False): path = os.path.join( os.path.expanduser('~'), '.box.env', ) if os.path.isfile(path): speckenv.read_speckenv(path) default_env._loaded = True return speckenv.env(*args, **kwargs)
def test_custom_mapping(self): mapping = {} with tempfile.NamedTemporaryFile() as f: f.write(b""" CUSTOM_MAPPING=yes """) f.seek(0) speckenv.read_speckenv(f.name, mapping=mapping) self.assertNotIn("CUSTOM_MAPPING", os.environ) self.assertEqual(speckenv.env("CUSTOM_MAPPING", mapping=mapping), "yes")
def test_read(self): # Bare value self.assertEqual(os.environ.get("ALLOWED_HOSTS"), "['*']") # literal_eval'ed value self.assertEqual(speckenv.env("ALLOWED_HOSTS"), ["*"]) self.assertEqual(speckenv.env("ALLOWED_HOSTS", coerce=tuple), ("*", )) # First not-commented out value self.assertEqual(speckenv.env("COMMENTED"), "no") # Not defined values self.assertEqual(speckenv.env("UNDEFINED"), None) self.assertIs(speckenv.env("UNDEFINED", coerce=bool), False) self.assertRaises(Exception, speckenv.env, "UNDEFINED", required=True) # Defaults self.assertEqual(speckenv.env("DEFAULT"), None) self.assertEqual(speckenv.env("DEFAULT", default=42), 42) self.assertEqual(speckenv.env("COMMENTED", default=42), "no") self.assertIs(speckenv.env("COMMENTED", default="bla", coerce=bool), True) self.assertNotIn("NO_EQUAL_SIGN", os.environ)
import os import sys import types from collections import defaultdict from django.utils.translation import gettext_lazy as _ import dj_database_url import dj_email_url from speckenv import env BASE_DIR = os.path.dirname(os.path.dirname(__file__)) SECRET_KEY = env("SECRET_KEY", required=True) DEBUG = env("DEBUG", default=bool({"runserver"}.intersection(sys.argv))) TESTING = env("TESTING", default="test" in sys.argv) LIVE = env("LIVE", default=False) ALLOWED_HOSTS = env("ALLOWED_HOSTS", default=[]) ADMINS = MANAGERS = [("Matthias Kestenholz", "*****@*****.**")] DEFAULT_FROM_EMAIL = SERVER_EMAIL = "*****@*****.**" BCC = env("BCC", default=[row[1] for row in MANAGERS]) DEBUG_TOOLBAR = DEBUG and not TESTING INSTALLED_APPS = [ a for a in [ "workbench", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions",
from datetime import datetime import re import requests from speckenv import read_speckenv, env read_speckenv() token = env('TOKEN', required=True) groups = [group.split(':') for group in env('GROUPS', required=True).split()] def users(): response = requests.get( 'https://slack.com/api/users.list', params={ 'token': token, 'limit': 1000, 'presence': 'false', }, ).json() return {member['id']: member['name'] for member in response['members']} def fetch(channel): response = requests.get( 'https://slack.com/api/conversations.history', params={ 'token': token, 'channel': channel, 'count': 1000, 'oldest': datetime.now().timestamp() - 86400 - 3600,
def test_int_as_string(self): self.assertEqual(speckenv.env("COMMENT_INT", coerce=str), "42")
def test_inline_comment_int(self): # Works because ast.literal_eval also knows how to handle comments... self.assertEqual(speckenv.env("COMMENT_INT"), 42)
def test_inline_comment_str_quoted(self): """Line looks like it has a comment, but we cannot be sure.""" self.assertEqual(speckenv.env("COMMENT_STR_QUOTED"), "value # TEST")
def _local_env(path=".env"): mapping = {} speckenv.read_speckenv(config.base / path, mapping=mapping) return lambda *a, **kw: speckenv.env(*a, **kw, mapping=mapping)