PKMSG=!environmental/safe_types.pyfrom .safe_parser import make_safe safe_bool = make_safe(bool) safe_list = make_safe(list) safe_set = make_safe(set) safe_tuple = make_safe(tuple) PKMSG]ddenvironmental/__init__.py#!/usr/bin/env python3 import functools from .property_maker import env_property from .safe_types import safe_bool, safe_list, safe_set, safe_tuple __all__ = ['Bool', 'Complex', 'Float', 'Int', 'List', 'Str', 'Set', 'Tuple'] Bool = functools.partial(env_property, safe_bool) Complex = functools.partial(env_property, complex) Float = functools.partial(env_property, float) Int = functools.partial(env_property, int) List = functools.partial(env_property, safe_list) Str = functools.partial(env_property, str) Set = functools.partial(env_property, safe_set) Tuple = functools.partial(env_property, safe_tuple) PKR\G3ȣQQenvironmental/property_maker.py#!/usr/bin/env python3 import os NOT_SET = object() def env_property(converter: type, key: str, default=NOT_SET): def getter(self): value = os.environ.get(key, default) if value is NOT_SET: raise AttributeError('{key} is not set.'.format(key=key)) elif value is default: return value else: return converter(value) def setter(self, value): os.environ[key] = str(converter(value)) # use converter to ensure it will store the right type new_property = property(getter, setter) return new_property PKMSGAenvironmental/safe_parser.py#!/usr/bin/env python3 import ast def make_safe(wanted_type: type): def _safe(representation: str): if isinstance(representation, wanted_type): return representation elif isinstance(representation, str): return wanted_type(ast.literal_eval(representation)) else: raise ValueError("Can't parse '{}' as a '{}'".format(representation, wanted_type.__name__)) return _safe PK`S\G=Ov v +environmental-1.2.dist-info/DESCRIPTION.rst.. image:: https://travis-ci.org/zalando/environmental.svg?branch=master :target: https://travis-ci.org/zalando/environmental :alt: Build Status .. image:: https://coveralls.io/repos/zalando/environmental/badge.svg?branch=master :target: https://coveralls.io/r/zalando/environmental?branch=master :alt: Code Coverage .. image:: https://pypip.in/version/environmental/badge.svg :target: https://pypi.python.org/pypi/environmental :alt: Latest Version .. image:: https://pypip.in/status/environmental/badge.svg :target: https://pypi.python.org/pypi/environmental :alt: Development Status .. image:: https://img.shields.io/pypi/l/environmental.svg :target: https://github.com/zalando/environmental/blob/master/LICENSE :alt: License environmental ============= Map a python configuration from environment variables. Overview -------- **environmental** allows you to map class properties to environment variables. By using **environmental** you can keep your configuration in a single class your IDE understands and have convenient and safe type conversions between the strings stored in your environment and python types. The created properties are also writable so if you assign to them they will change on your environment and will be available to your child processes. Installation ------------ .. code-block:: bash $ sudo pip3 install --upgrade environmental Example ------- .. code-block:: python import environmental import os class Configuration: port = environmental.Int('MY_APPLICATION_HTTP_PORT', 80) name = environmental.Str('MY_APPLICATION_NAME', 'Name') config = Configuration() config.port = 8080 assert os.environ['MY_APPLICATION_HTTP_PORT'] == '8080' assert isinstance(os.environ['MY_APPLICATION_HTTP_PORT'], str) assert config.port == 8080 assert isinstance(config.port, int) Caveats ------- Modifying mutable objects in the configuration (like lists) will not work: .. code-block:: python import os, environmental class Configuration: list = environmental.List('LIST') os.environ['LIST'] = "[]" assert config.list == [] config.list.append('test') assert config.list == [] But doing something that reassigns the variable will: .. code-block:: python config.list += ['test'] assert config.list == ['test'] License ------- Copyright 2015 Zalando SE Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. PK`S\Gx6)environmental-1.2.dist-info/metadata.json{"classifiers": ["Programming Language :: Python", "Programming Language :: Python :: 3", "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Operating System :: OS Independent"], "extensions": {"python.details": {"contacts": [{"name": "Zalando SE", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/zalando/environmental"}}}, "generator": "bdist_wheel (0.26.0)", "license": "Apache License Version 2.0", "metadata_version": "2.0", "name": "environmental", "summary": "Map a python configuration from environment variables", "test_requires": [{"requires": ["pytest", "pytest-cov"]}], "version": "1.2"}PK`S\GJi)environmental-1.2.dist-info/top_level.txtenvironmental PK`S\Gndnn!environmental-1.2.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.26.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any PK`S\Ga a $environmental-1.2.dist-info/METADATAMetadata-Version: 2.0 Name: environmental Version: 1.2 Summary: Map a python configuration from environment variables Home-page: https://github.com/zalando/environmental Author: Zalando SE Author-email: UNKNOWN License: Apache License Version 2.0 Platform: UNKNOWN Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: Operating System :: OS Independent .. image:: https://travis-ci.org/zalando/environmental.svg?branch=master :target: https://travis-ci.org/zalando/environmental :alt: Build Status .. image:: https://coveralls.io/repos/zalando/environmental/badge.svg?branch=master :target: https://coveralls.io/r/zalando/environmental?branch=master :alt: Code Coverage .. image:: https://pypip.in/version/environmental/badge.svg :target: https://pypi.python.org/pypi/environmental :alt: Latest Version .. image:: https://pypip.in/status/environmental/badge.svg :target: https://pypi.python.org/pypi/environmental :alt: Development Status .. image:: https://img.shields.io/pypi/l/environmental.svg :target: https://github.com/zalando/environmental/blob/master/LICENSE :alt: License environmental ============= Map a python configuration from environment variables. Overview -------- **environmental** allows you to map class properties to environment variables. By using **environmental** you can keep your configuration in a single class your IDE understands and have convenient and safe type conversions between the strings stored in your environment and python types. The created properties are also writable so if you assign to them they will change on your environment and will be available to your child processes. Installation ------------ .. code-block:: bash $ sudo pip3 install --upgrade environmental Example ------- .. code-block:: python import environmental import os class Configuration: port = environmental.Int('MY_APPLICATION_HTTP_PORT', 80) name = environmental.Str('MY_APPLICATION_NAME', 'Name') config = Configuration() config.port = 8080 assert os.environ['MY_APPLICATION_HTTP_PORT'] == '8080' assert isinstance(os.environ['MY_APPLICATION_HTTP_PORT'], str) assert config.port == 8080 assert isinstance(config.port, int) Caveats ------- Modifying mutable objects in the configuration (like lists) will not work: .. code-block:: python import os, environmental class Configuration: list = environmental.List('LIST') os.environ['LIST'] = "[]" assert config.list == [] config.list.append('test') assert config.list == [] But doing something that reassigns the variable will: .. code-block:: python config.list += ['test'] assert config.list == ['test'] License ------- Copyright 2015 Zalando SE Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. PK`S\G}:͹YY"environmental-1.2.dist-info/RECORDenvironmental/__init__.py,sha256=Nqeuv2VgvPV4eYqT8WR4D0XbiTCL-2uH9_6s_MjdWjE,612 environmental/property_maker.py,sha256=8pryG3qNRXHiorwy7ZugDzDpCUlPJ3g-3haBkFAloMQ,593 environmental/safe_parser.py,sha256=SwBdwBGiqDBM1rDQlACD0ii4pa5np3Sav1ynBuqH3Lo,440 environmental/safe_types.py,sha256=oHNhg5SzHKh-ynvqqvLzdKwqfy-sMK7ymQvUmjPmcqE,148 environmental-1.2.dist-info/DESCRIPTION.rst,sha256=wTTfEUL55iHkR3HXYIY7g0Tdd0iqTrfmpkK_25-Bd4w,2934 environmental-1.2.dist-info/METADATA,sha256=SvwrLby0aSeVSmM5DlFyGtX7x0AU2UrzkJnp9HKsedc,3425 environmental-1.2.dist-info/RECORD,, environmental-1.2.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 environmental-1.2.dist-info/metadata.json,sha256=oYSSVjwxQcn9284su437XSAnfRC_nXwnQFlV9vNdvIY,688 environmental-1.2.dist-info/top_level.txt,sha256=kk33_5KJfvuIc60dtGxRSb9tYY2wBewQGpisTZhnw-8,14 PKMSG=!environmental/safe_types.pyPKMSG]ddenvironmental/__init__.pyPKR\G3ȣQQhenvironmental/property_maker.pyPKMSGAenvironmental/safe_parser.pyPK`S\G=Ov v +environmental-1.2.dist-info/DESCRIPTION.rstPK`S\Gx6)environmental-1.2.dist-info/metadata.jsonPK`S\GJi)environmental-1.2.dist-info/top_level.txtPK`S\Gndnn!environmental-1.2.dist-info/WHEELPK`S\Ga a $environmental-1.2.dist-info/METADATAPK`S\G}:͹YY"C%environmental-1.2.dist-info/RECORDPK (