1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-24 06:59:52 +01:00

yaml loader: support env var interpolation in loaded YAML using os.expandvar() for any value ${...} (ukwa/ukwa-pywb#14)

This commit is contained in:
Ilya Kreymer 2018-02-24 17:05:31 -08:00 committed by John Berlin
parent 0c1dfba1da
commit ef9051ad6e
No known key found for this signature in database
GPG Key ID: 6EF5E4B442011B02
2 changed files with 45 additions and 2 deletions

View File

@ -11,10 +11,14 @@ import requests
import yaml import yaml
import six import six
from six.moves.urllib.parse import unquote_plus, urlsplit from six.moves.urllib.parse import unquote_plus, urlsplit, urlencode
import time import time
import pkgutil import pkgutil
import base64
import yaml
import cgi
import re
from io import open, BytesIO from io import open, BytesIO
from warcio.limitreader import LimitReader from warcio.limitreader import LimitReader
@ -30,7 +34,21 @@ except ImportError: # pragma: no cover
s3_avail = False s3_avail = False
# ================================================================= # ============================================================================
def init_yaml_env_vars():
env_rx = re.compile(r'\$\{[^}]+\}')
yaml.add_implicit_resolver('!envvar', env_rx)
def envvar_constructor(loader, node):
value = loader.construct_scalar(node)
value = os.path.expandvars(value)
return value
yaml.add_constructor('!envvar', envvar_constructor)
# ============================================================================
def load_py_name(string): def load_py_name(string):
import importlib import importlib
@ -468,3 +486,5 @@ class HMACCookieMaker(object):
# ============================================================================ # ============================================================================
BlockLoader.init_default_loaders() BlockLoader.init_default_loaders()
init_yaml_env_vars()

View File

@ -80,6 +80,7 @@ import six
from six import StringIO from six import StringIO
from io import BytesIO from io import BytesIO
import requests import requests
import yaml
from pywb.utils.loaders import BlockLoader, HMACCookieMaker, to_file_url from pywb.utils.loaders import BlockLoader, HMACCookieMaker, to_file_url
from pywb.utils.loaders import extract_client_cookie from pywb.utils.loaders import extract_client_cookie
@ -168,6 +169,28 @@ def test_err_unknown_loader():
#IOError: No Loader for type: foo #IOError: No Loader for type: foo
def test_yaml_resolve_env():
os.environ['PYWB_PATH'] = './test'
os.environ['PYWB_FOO'] = 'bar'
config = """\
collection:
coll:
index: ${PYWB_PATH}/index
archive: ${PYWB_PATH}/archive/${PYWB_FOO}
other: ${PYWB_NOT}/archive/${PYWB_FOO}
"""
config_data = yaml.load(config)
assert config_data['collection']['coll']['index'] == './test/index'
assert config_data['collection']['coll']['archive'] == './test/archive/bar'
assert config_data['collection']['coll']['other'] == '${PYWB_NOT}/archive/bar'
del os.environ['PYWB_PATH']
del os.environ['PYWB_FOO']
def print_str(string): def print_str(string):
return string.decode('utf-8') if six.PY3 else string return string.decode('utf-8') if six.PY3 else string