diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-bison.spec | 712 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 714 insertions, 0 deletions
@@ -0,0 +1 @@ +/bison-0.1.3.macosx-10.15-x86_64.tar.gz diff --git a/python-bison.spec b/python-bison.spec new file mode 100644 index 0000000..fae4068 --- /dev/null +++ b/python-bison.spec @@ -0,0 +1,712 @@ +%global _empty_manifest_terminate_build 0 +Name: python-bison +Version: 0.1.3 +Release: 1 +Summary: Python application configuration +License: MIT +URL: https://github.com/edaniszewski/bison +Source0: https://mirrors.aliyun.com/pypi/web/packages/7e/ca/24c64e66d81924aeaee9db3085f0d5a355463fb8c1a187e441e5e1e68797/bison-0.1.3.macosx-10.15-x86_64.tar.gz +BuildArch: noarch + +Requires: python3-pyyaml + +%description +<p align="center"> + <a href="https://pypi.python.org/pypi/bison"><img src="https://img.shields.io/pypi/v/bison.svg"></a> + <a href="LICENSE"><img src="https://img.shields.io/github/license/edaniszewski/bison.svg"></a> + +<h1 align="center">bison</h1> +</p> + +<p align="center">Python application configuration</p> + + +## What is Bison? +Bison is a configuration solution for Python applications that aims to be simple +and intuitive. It supports: +* reading from YAML config files +* reading from environment variables +* setting explicit values +* setting defaults +* configuration validation +* configuration access/manipulation with dot notation + +Instead of implementing custom configuration reading and parsing, you can use +Bison to handle it for you. + +Bison was inspired by [Viper][viper] and the lack of good +application configuration solutions for Python (at least, in my opinion). Documentation +for Bison can be found on [ReadtheDocs][docs] + +Bison uses the following precedence order. Each item in the list takes precedence +over the item below it. +- override (e.g. calling `Bison.set()`) +- environment +- config file +- defaults + +## Installation +Bison can be installed with `pip` +``` +pip install bison +``` +or with `pipenv` +``` +pipenv install bison +``` + +## Using Bison +### Creating a configuration Scheme +A configuration scheme is not required by Bison, but having one allows you to set default +values for configuration fields as well as do configuration validation. It is pretty easy +to create a new Scheme: + +```python +scheme = bison.Scheme() +``` + +A Scheme is really just a container for configuration options, so without any options, a +Scheme is somewhat useless. + +#### Configuration Options +There are currently three types of configuration options: +- `bison.Option` +- `bison.DictOption` +- `bison.ListOption` + +Their intended functionality should be mostly obvious from their names. An `Option` represents +a singular value in a configuration. A `DictOption` represents a dictionary or mapping of values +in a configuration. A `ListOption` represents a list of values in a configuration. + +See the [documentation][docs] for more on how options can be configured. + +Any number of options can be added to a Scheme, but as a simple example we can define a Scheme +which expects a key "log", and a key "count". + +```python +scheme = bison.Scheme( + bison.Option('log'), + bison.Option('count'), +) +``` + +#### Configuration Validation +Validation operates based on the constraints set on the options. Above, there are no +constraints (other than the need for those keys to exist), so any value for "log" and +"count" will pass validation. + +An option can be constrained in different ways by using its keyword arguments. For example, +to ensure the value for "count" is an integer, +```python +bison.Option('count', field_type=int) +``` + +Or, to restrict the values to a set of choices +```python +bison.Option('log', choices=['debug', 'info', 'warn', 'error']) +``` + +The [documentation][docs] goes into more detail about other validation settings. + +#### Setting Defaults +If a default value is not set on an option, it is considered required. In these cases, +if the key specified by that value is not present in the parse configuration, it will +cause a validation failure. + +If a default value is set, then the absence of that field in the configuration will not +cause a validation failure. + +```python +bison.Option('log', default='info') +``` + +### Configuring Bison +Once you have a Scheme to use (if you'd like to), it will need to be passed to a Bison +object to manage the config building. + +```python +scheme = bison.Scheme() +config = bison.Bison(scheme) +``` + +There are a few options that can be set on the Bison object to change how it +searches for and builds the unified configuration. + +For reading configuration files +```python +config.config_name = 'config' # name of the config file (no extension) +config.add_config_paths( # paths to look in for the config file + '.', + '/tmp/app' +) +config.config_format = bison.YAML # the config format to use +``` + +For reading environment variables +```python +config.env_prefix = "MY_APP" # the prefix to use for environment variables +config.auto_env = True # automatically bind all options to env variables based on their key +``` + +### Building the unified config +Once the scheme has been set (if using) and Bison has been configured, the only thing +left to do is to read in all the config sources and parse them into a unified config. +This is done simply with +```python +config.parse() +``` + +### Example +Below is a complete example for parsing a hypothetical application configuration which +is described by the following YAML config. +```yaml +log: debug +port: 5000 +settings: + requests: + timeout: 3 +backends: + - host: 10.1.2.3 + port: 5001 + - host: 10.1.2.4 + port: 5013 + - host: 10.1.2.5 + port: 5044 +``` + +```python +import bison + +# the scheme for the configuration. this allows us to set defaults +# and validate configuration data +config_scheme = bison.Scheme( + bison.Option('log', default='info', choices=['debug', 'info', 'warn', 'error']), + bison.Option('port', field_type=int), + bison.DictOption('settings', scheme=bison.Scheme( + bison.DictOption('requests', scheme=bison.Scheme( + bison.Option('timeout', field_type=int) + )) + )), + bison.ListOption('backends', member_scheme=bison.Scheme( + bison.Option('host', field_type=str), + bison.Option('port', field_type=int) + )) +) + +# create a new Bison instance to store and manage configuration data +config = bison.Bison(scheme=config_scheme) + +# set the config file name to 'app' (default is 'config') and set the +# search paths to '.' and '/tmp/app/config' +config.config_name = 'app' +config.add_config_paths('.', '/tmp/app/config') + +# set the environment variable prefix and enable auto-env +config.env_prefix = 'MY_APP' +config.auto_env = True + +# finally, parse the config sources to build the unified configuration +config.parse() +``` + +See the [example](example) directory for this example along with demonstrations +of how to access configuration data. + +## Future Work +There is more that can be done to improve Bison and expand its functionality. If +you wish to contribute, open a pull request. If you have questions or feature requests, +open an issue. Below are some high level ideas for future improvements: + +* Support additional configuration formats (JSON, TOML, ...) +* Versioned configurations + + +[docs]: http://readthedocs +[viper]: https://github.com/spf13/viper + + + +%package -n python3-bison +Summary: Python application configuration +Provides: python-bison +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-bison +<p align="center"> + <a href="https://pypi.python.org/pypi/bison"><img src="https://img.shields.io/pypi/v/bison.svg"></a> + <a href="LICENSE"><img src="https://img.shields.io/github/license/edaniszewski/bison.svg"></a> + +<h1 align="center">bison</h1> +</p> + +<p align="center">Python application configuration</p> + + +## What is Bison? +Bison is a configuration solution for Python applications that aims to be simple +and intuitive. It supports: +* reading from YAML config files +* reading from environment variables +* setting explicit values +* setting defaults +* configuration validation +* configuration access/manipulation with dot notation + +Instead of implementing custom configuration reading and parsing, you can use +Bison to handle it for you. + +Bison was inspired by [Viper][viper] and the lack of good +application configuration solutions for Python (at least, in my opinion). Documentation +for Bison can be found on [ReadtheDocs][docs] + +Bison uses the following precedence order. Each item in the list takes precedence +over the item below it. +- override (e.g. calling `Bison.set()`) +- environment +- config file +- defaults + +## Installation +Bison can be installed with `pip` +``` +pip install bison +``` +or with `pipenv` +``` +pipenv install bison +``` + +## Using Bison +### Creating a configuration Scheme +A configuration scheme is not required by Bison, but having one allows you to set default +values for configuration fields as well as do configuration validation. It is pretty easy +to create a new Scheme: + +```python +scheme = bison.Scheme() +``` + +A Scheme is really just a container for configuration options, so without any options, a +Scheme is somewhat useless. + +#### Configuration Options +There are currently three types of configuration options: +- `bison.Option` +- `bison.DictOption` +- `bison.ListOption` + +Their intended functionality should be mostly obvious from their names. An `Option` represents +a singular value in a configuration. A `DictOption` represents a dictionary or mapping of values +in a configuration. A `ListOption` represents a list of values in a configuration. + +See the [documentation][docs] for more on how options can be configured. + +Any number of options can be added to a Scheme, but as a simple example we can define a Scheme +which expects a key "log", and a key "count". + +```python +scheme = bison.Scheme( + bison.Option('log'), + bison.Option('count'), +) +``` + +#### Configuration Validation +Validation operates based on the constraints set on the options. Above, there are no +constraints (other than the need for those keys to exist), so any value for "log" and +"count" will pass validation. + +An option can be constrained in different ways by using its keyword arguments. For example, +to ensure the value for "count" is an integer, +```python +bison.Option('count', field_type=int) +``` + +Or, to restrict the values to a set of choices +```python +bison.Option('log', choices=['debug', 'info', 'warn', 'error']) +``` + +The [documentation][docs] goes into more detail about other validation settings. + +#### Setting Defaults +If a default value is not set on an option, it is considered required. In these cases, +if the key specified by that value is not present in the parse configuration, it will +cause a validation failure. + +If a default value is set, then the absence of that field in the configuration will not +cause a validation failure. + +```python +bison.Option('log', default='info') +``` + +### Configuring Bison +Once you have a Scheme to use (if you'd like to), it will need to be passed to a Bison +object to manage the config building. + +```python +scheme = bison.Scheme() +config = bison.Bison(scheme) +``` + +There are a few options that can be set on the Bison object to change how it +searches for and builds the unified configuration. + +For reading configuration files +```python +config.config_name = 'config' # name of the config file (no extension) +config.add_config_paths( # paths to look in for the config file + '.', + '/tmp/app' +) +config.config_format = bison.YAML # the config format to use +``` + +For reading environment variables +```python +config.env_prefix = "MY_APP" # the prefix to use for environment variables +config.auto_env = True # automatically bind all options to env variables based on their key +``` + +### Building the unified config +Once the scheme has been set (if using) and Bison has been configured, the only thing +left to do is to read in all the config sources and parse them into a unified config. +This is done simply with +```python +config.parse() +``` + +### Example +Below is a complete example for parsing a hypothetical application configuration which +is described by the following YAML config. +```yaml +log: debug +port: 5000 +settings: + requests: + timeout: 3 +backends: + - host: 10.1.2.3 + port: 5001 + - host: 10.1.2.4 + port: 5013 + - host: 10.1.2.5 + port: 5044 +``` + +```python +import bison + +# the scheme for the configuration. this allows us to set defaults +# and validate configuration data +config_scheme = bison.Scheme( + bison.Option('log', default='info', choices=['debug', 'info', 'warn', 'error']), + bison.Option('port', field_type=int), + bison.DictOption('settings', scheme=bison.Scheme( + bison.DictOption('requests', scheme=bison.Scheme( + bison.Option('timeout', field_type=int) + )) + )), + bison.ListOption('backends', member_scheme=bison.Scheme( + bison.Option('host', field_type=str), + bison.Option('port', field_type=int) + )) +) + +# create a new Bison instance to store and manage configuration data +config = bison.Bison(scheme=config_scheme) + +# set the config file name to 'app' (default is 'config') and set the +# search paths to '.' and '/tmp/app/config' +config.config_name = 'app' +config.add_config_paths('.', '/tmp/app/config') + +# set the environment variable prefix and enable auto-env +config.env_prefix = 'MY_APP' +config.auto_env = True + +# finally, parse the config sources to build the unified configuration +config.parse() +``` + +See the [example](example) directory for this example along with demonstrations +of how to access configuration data. + +## Future Work +There is more that can be done to improve Bison and expand its functionality. If +you wish to contribute, open a pull request. If you have questions or feature requests, +open an issue. Below are some high level ideas for future improvements: + +* Support additional configuration formats (JSON, TOML, ...) +* Versioned configurations + + +[docs]: http://readthedocs +[viper]: https://github.com/spf13/viper + + + +%package help +Summary: Development documents and examples for bison +Provides: python3-bison-doc +%description help +<p align="center"> + <a href="https://pypi.python.org/pypi/bison"><img src="https://img.shields.io/pypi/v/bison.svg"></a> + <a href="LICENSE"><img src="https://img.shields.io/github/license/edaniszewski/bison.svg"></a> + +<h1 align="center">bison</h1> +</p> + +<p align="center">Python application configuration</p> + + +## What is Bison? +Bison is a configuration solution for Python applications that aims to be simple +and intuitive. It supports: +* reading from YAML config files +* reading from environment variables +* setting explicit values +* setting defaults +* configuration validation +* configuration access/manipulation with dot notation + +Instead of implementing custom configuration reading and parsing, you can use +Bison to handle it for you. + +Bison was inspired by [Viper][viper] and the lack of good +application configuration solutions for Python (at least, in my opinion). Documentation +for Bison can be found on [ReadtheDocs][docs] + +Bison uses the following precedence order. Each item in the list takes precedence +over the item below it. +- override (e.g. calling `Bison.set()`) +- environment +- config file +- defaults + +## Installation +Bison can be installed with `pip` +``` +pip install bison +``` +or with `pipenv` +``` +pipenv install bison +``` + +## Using Bison +### Creating a configuration Scheme +A configuration scheme is not required by Bison, but having one allows you to set default +values for configuration fields as well as do configuration validation. It is pretty easy +to create a new Scheme: + +```python +scheme = bison.Scheme() +``` + +A Scheme is really just a container for configuration options, so without any options, a +Scheme is somewhat useless. + +#### Configuration Options +There are currently three types of configuration options: +- `bison.Option` +- `bison.DictOption` +- `bison.ListOption` + +Their intended functionality should be mostly obvious from their names. An `Option` represents +a singular value in a configuration. A `DictOption` represents a dictionary or mapping of values +in a configuration. A `ListOption` represents a list of values in a configuration. + +See the [documentation][docs] for more on how options can be configured. + +Any number of options can be added to a Scheme, but as a simple example we can define a Scheme +which expects a key "log", and a key "count". + +```python +scheme = bison.Scheme( + bison.Option('log'), + bison.Option('count'), +) +``` + +#### Configuration Validation +Validation operates based on the constraints set on the options. Above, there are no +constraints (other than the need for those keys to exist), so any value for "log" and +"count" will pass validation. + +An option can be constrained in different ways by using its keyword arguments. For example, +to ensure the value for "count" is an integer, +```python +bison.Option('count', field_type=int) +``` + +Or, to restrict the values to a set of choices +```python +bison.Option('log', choices=['debug', 'info', 'warn', 'error']) +``` + +The [documentation][docs] goes into more detail about other validation settings. + +#### Setting Defaults +If a default value is not set on an option, it is considered required. In these cases, +if the key specified by that value is not present in the parse configuration, it will +cause a validation failure. + +If a default value is set, then the absence of that field in the configuration will not +cause a validation failure. + +```python +bison.Option('log', default='info') +``` + +### Configuring Bison +Once you have a Scheme to use (if you'd like to), it will need to be passed to a Bison +object to manage the config building. + +```python +scheme = bison.Scheme() +config = bison.Bison(scheme) +``` + +There are a few options that can be set on the Bison object to change how it +searches for and builds the unified configuration. + +For reading configuration files +```python +config.config_name = 'config' # name of the config file (no extension) +config.add_config_paths( # paths to look in for the config file + '.', + '/tmp/app' +) +config.config_format = bison.YAML # the config format to use +``` + +For reading environment variables +```python +config.env_prefix = "MY_APP" # the prefix to use for environment variables +config.auto_env = True # automatically bind all options to env variables based on their key +``` + +### Building the unified config +Once the scheme has been set (if using) and Bison has been configured, the only thing +left to do is to read in all the config sources and parse them into a unified config. +This is done simply with +```python +config.parse() +``` + +### Example +Below is a complete example for parsing a hypothetical application configuration which +is described by the following YAML config. +```yaml +log: debug +port: 5000 +settings: + requests: + timeout: 3 +backends: + - host: 10.1.2.3 + port: 5001 + - host: 10.1.2.4 + port: 5013 + - host: 10.1.2.5 + port: 5044 +``` + +```python +import bison + +# the scheme for the configuration. this allows us to set defaults +# and validate configuration data +config_scheme = bison.Scheme( + bison.Option('log', default='info', choices=['debug', 'info', 'warn', 'error']), + bison.Option('port', field_type=int), + bison.DictOption('settings', scheme=bison.Scheme( + bison.DictOption('requests', scheme=bison.Scheme( + bison.Option('timeout', field_type=int) + )) + )), + bison.ListOption('backends', member_scheme=bison.Scheme( + bison.Option('host', field_type=str), + bison.Option('port', field_type=int) + )) +) + +# create a new Bison instance to store and manage configuration data +config = bison.Bison(scheme=config_scheme) + +# set the config file name to 'app' (default is 'config') and set the +# search paths to '.' and '/tmp/app/config' +config.config_name = 'app' +config.add_config_paths('.', '/tmp/app/config') + +# set the environment variable prefix and enable auto-env +config.env_prefix = 'MY_APP' +config.auto_env = True + +# finally, parse the config sources to build the unified configuration +config.parse() +``` + +See the [example](example) directory for this example along with demonstrations +of how to access configuration data. + +## Future Work +There is more that can be done to improve Bison and expand its functionality. If +you wish to contribute, open a pull request. If you have questions or feature requests, +open an issue. Below are some high level ideas for future improvements: + +* Support additional configuration formats (JSON, TOML, ...) +* Versioned configurations + + +[docs]: http://readthedocs +[viper]: https://github.com/spf13/viper + + + +%prep +%autosetup -n bison.macosx-10.15-x86_64-0.1.3 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-bison -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Tue Jun 20 2023 Python_Bot <Python_Bot@openeuler.org> - 0.1.3-1 +- Package Spec generated @@ -0,0 +1 @@ +a4609c5ede7b71836cdc1b4d80c9957d bison-0.1.3.macosx-10.15-x86_64.tar.gz |