Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/publish-to-test-pypi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Publish Envars to PyPi

on: push

jobs:
build-n-publish:
name: Build and publish to PyPi
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.x"
- name: Install pypa/build
run: >-
python -m
pip install
build
--user
- name: Build a binary wheel and a source tarball
run: >-
python -m
build
--sdist
--wheel
--outdir dist/
.
- name: Publish distribution 📦 to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
95 changes: 74 additions & 21 deletions envars/envars.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,13 @@ def main():
required=False,
action='store_true',
)
parser_print.add_argument(
'-n',
'--no-templating',
required=False,
default=False,
action='store_true',
)
parser_print.add_argument(
'-e',
'--env',
Expand Down Expand Up @@ -147,6 +154,13 @@ def main():
default=False,
action='store_true',
)
parser_print.add_argument(
'-S',
'--secrets_only',
required=False,
default=False,
action='store_true',
)
parser_print.set_defaults(func=print_env)

#
Expand Down Expand Up @@ -248,7 +262,17 @@ def set_systemd_env(args):
if 'RELEASE_SHA' in os.environ:
args.template_var = [f'RELEASE={os.environ.get("RELEASE_SHA")}']
args.var = None
ret = process(args)
ret = process(
args.filename,
args.account,
args.env,
args.var,
args.template_var,
args.decrypt,
True if args.no_templating is False else False,
args.yaml,
args.quote,
)
for val in ret:
parts = val.split("=", 1)
subprocess.run(
Expand Down Expand Up @@ -277,7 +301,17 @@ def execute(args):
vals = envars.get_var(args.var, args.env, args.account)
else:
args.var = None
ret = process(args)
ret = process(
args.filename,
args.account,
args.env,
args.var,
args.template_var,
args.decrypt,
True if args.no_templating is False else False,
args.yaml,
args.quote,
)
for val in ret:
parts = val.split("=", 1)
vals[parts[0]] = parts[1]
Expand Down Expand Up @@ -346,58 +380,77 @@ def add_var(args):


def print_env(args):
ret = process(args)
ret = process(
args.filename,
args.account,
args.env,
args.var,
args.template_var,
args.decrypt,
True if args.no_templating is False else False,
args.yaml,
args.quote,
args.secrets_only,
)
if isinstance(ret, list):
for var in ret:
print(var)
else:
print(ret)


def process(args):
envars = EnVars(args.filename)
def process(
filename, account, env,
var=None, template_var=None, decrypt=False,
templating=True, as_yaml=False, quote=False, secrets_only=False):

envars = EnVars(filename)
envars.load()

if args.account is None:
if account is None:
account = get_account()
else:
account = args.account
account = account

if args.env:
if env:
template_vars = {}
for tvar in flatten(args.template_var):
template_vars[tvar.split('=')[0]] = tvar.split('=')[1]
if template_var:
for tvar in flatten(template_var):
template_vars[tvar.split('=')[0]] = tvar.split('=')[1]

if args.yaml:
if as_yaml:
return (
yaml.dump(
{'envars': envars.build_env(
args.env,
env,
account,
decrypt=args.decrypt,
decrypt=decrypt,
template_vars=template_vars,
templating=templating,
secrets_only=secrets_only,
)},
default_flow_style=False
)
)
else:
env_vars = []
for name, value in envars.build_env(
args.env,
env,
account,
decrypt=args.decrypt,
template_vars=template_vars).items():
if args.quote:
decrypt=decrypt,
template_vars=template_vars,
secrets_only=secrets_only,
templating=templating).items():
if quote:
env_vars.append(f"{name}='{value}'")
else:
env_vars.append(f'{name}={value}')

return env_vars
else:
var = None
if args.var:
var = args.var.upper()
return (envars.print(account, var=var, decrypt=args.decrypt))
if var:
var = var.upper()
return (envars.print(account, var=var, decrypt=decrypt))


def flatten(lis):
Expand Down
48 changes: 30 additions & 18 deletions envars/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,32 +210,44 @@ def get_var(self, var, env, account):
if v.name == var:
return {v.name: v.get_value(env, account, fetch_pstore=True)}

def build_env(self, env, account, decrypt=False, template_vars=None):
def build_env(self, env, account, decrypt=False, template_vars=None, templating=True, secrets_only=False):
logging.debug(f'build_env({env}, {account})')
envars = {}
if env != 'default' and env not in self.envs:
raise (Exception(f'Unknown Env: "{env}"'))

template_vars['STAGE'] = env
# fetch all the non secret values
for v in self.envars:
value = v.get_value(env, account, fetch_pstore=True)
if value and not isinstance(value, Secret):
if v.name not in template_vars.keys():
template_vars[v.name] = value
envars[v.name] = value
if templating and not secrets_only:
template_vars['STAGE'] = env
# fetch all the non secret values
for v in self.envars:
value = v.get_value(env, account, fetch_pstore=True)
if value and not isinstance(value, Secret):
if v.name not in template_vars.keys():
template_vars[v.name] = value
envars[v.name] = value

jenv = jinja2.Environment()
jenv = jinja2.Environment()

# process jinja templates
for var in envars:
envars[var] = jenv.from_string(envars[var]).render(template_vars)
# process jinja templates
if templating:
for var in envars:
envars[var] = jenv.from_string(envars[var]).render(template_vars)

# fetch secrets
for v in self.envars:
value = v.get_value(env, account, decrypt)
if value:
if v.name not in envars:
# fetch secrets
for v in self.envars:
value = v.get_value(env, account, decrypt)
if value:
if v.name not in envars:
envars[v.name] = value

elif secrets_only:
for v in self.envars:
if isinstance(v.get_value(env, account), Secret):
envars[v.name] = v.get_value(env, account, decrypt)
else:
for v in self.envars:
value = v.get_value(env, account, decrypt)
if value:
envars[v.name] = value

return envars
Expand Down
5 changes: 3 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from setuptools import setup

setup(
name='envars',
version='0.1',
name='timeout-envars',
version='0.3',
description='A sample Python package',
long_description='my test long description',
author='Keith Harvey',
author_email='keith.harvey@timeout.com',
packages=['envars'],
Expand Down
Loading