v5.0.0
===================================================================== Excited to bring V5 to life. This includes some BREAKING CHANGES to several aspects of ZSH-type scwrypts. Please refer to the readme for upgrade details (specifically docs/upgrade/v4-to-v5.md) --- New Features ------------------------- - ZSH testing library with basic mock capabilities - new scwrypts environment file format includes metadata and more advanced features like optional parent env overrides, selection inheritence, and improved structurual flexibility - speedup cache for non-CI runs of ZSH-type scwrypts - ${scwryptsmodule} syntax now allows a consistent unique-naming scheme for functions in ZSH-type scwrypts while providing better insight into origin of API calls in other modules - reusable, case-statement-driven argument parsers in ZSH-type scwrypts --- Changes ------------------------------ - several utility function renames in ZSH-type scwrypts to improve consistency - documentation comments included in ZSH libraries - ZSH-type scwrypts now allow library modules to live alongside executables (zsh/lib still supported; autodetection determines default) --- Bug Fixes ---------------------------- - hardened environment checking for REQUIRED_ENV variables; this removes the ability to overwrite variables in local function contexts
This commit is contained in:
@ -1,10 +1,27 @@
|
||||
from os import getenv as os_getenv
|
||||
from json import loads
|
||||
|
||||
from .scwrypts import scwrypts
|
||||
|
||||
from .scwrypts.exceptions import MissingVariableError
|
||||
|
||||
ENV = {}
|
||||
|
||||
def getenv(name, required=True):
|
||||
value = os_getenv(f'{name}__override', os_getenv(name))
|
||||
def getenv(name, required=True, default=None):
|
||||
if ENV.get('configuration') is None or ENV.get('environment') is None:
|
||||
full_environment = loads(
|
||||
scwrypts(
|
||||
name = 'scwrypts/environment/getenv',
|
||||
group = 'scwrypts',
|
||||
_type = 'zsh',
|
||||
executable_args = '-n',
|
||||
args = '--all',
|
||||
).stdout
|
||||
)
|
||||
|
||||
ENV['configuration'] = full_environment['configuration']
|
||||
ENV['environment'] = full_environment['environment']
|
||||
|
||||
value = ENV.get('environment', {}).get(name, default)
|
||||
|
||||
if required and not value:
|
||||
raise MissingVariableError(name)
|
||||
|
@ -5,7 +5,7 @@ from pytest import fixture
|
||||
from .client import request
|
||||
|
||||
|
||||
def test_discord_request(sample, _response):
|
||||
def test_discord_request(sample, _mock_getenv, _response):
|
||||
assert _response == sample.response
|
||||
|
||||
def test_discord_request_client_setup(sample, mock_get_request_client, _mock_getenv, _response):
|
||||
@ -41,7 +41,7 @@ def fixture_mock_get_request_client(sample):
|
||||
|
||||
@fixture(name='_mock_getenv')
|
||||
def fixture_mock_getenv(sample):
|
||||
with patch('scwrypts.http.discord.client.getenv',) as mock:
|
||||
with patch('scwrypts.http.discord.client.getenv') as mock:
|
||||
mock.side_effect = lambda name, **kwargs: {
|
||||
'DISCORD__BOT_TOKEN': sample.bot_token,
|
||||
}[name]
|
||||
@ -49,6 +49,6 @@ def fixture_mock_getenv(sample):
|
||||
|
||||
@fixture(name='_mock_getenv_optional')
|
||||
def fixture_mock_getenv_optional():
|
||||
with patch('scwrypts.http.discord.client.getenv',) as mock:
|
||||
with patch('scwrypts.http.discord.client.getenv') as mock:
|
||||
mock.side_effect = lambda name, **kwargs: None
|
||||
yield mock
|
||||
|
@ -4,9 +4,11 @@ from json import dumps, loads
|
||||
from random import randint, uniform, choice
|
||||
from re import sub
|
||||
from string import printable
|
||||
from typing import Hashable, Callable
|
||||
from typing import Callable
|
||||
from uuid import uuid4
|
||||
|
||||
from collections.abc import Hashable
|
||||
|
||||
from requests import Response, status_codes
|
||||
from yaml import safe_dump
|
||||
|
||||
|
Reference in New Issue
Block a user