immutable-config 1.0
Create immutable namedtuple from dict
Requires Python: >=3.6
Keywords: immutable,frozendict,frozenset,frozenlist

===========
Readme File
===========

.. image:: https://app.travis-ci.com/dduraipandian/immutable.svg?token=HYyTsSU9ynxiqecjxoc5&branch=main
    :target: https://travis-ci.com/dduraipandian/immutable
    :alt: Travis CI

.. image:: https://codecov.io/gh/dduraipandian/immutable/branch/main/graph/badge.svg
  :target: https://codecov.io/gh/dduraipandian/immutable
  :alt: codecov test coverage

.. image:: https://img.shields.io/badge/License-MIT-blue.svg
  :target: https://opensource.org/licenses/MIT
  :alt: MIT License



Immutable
---------
.. inclusion-marker-do-not-remove-start

Immutable library helps to convert python dictionary to namedtuples and converting values to immutable datastructure
recursively. Namedtuples, by default, are immutable.
You can't modify them. But If you have nested data structures, you can still modify them.

Immutable library tries to provides a function to convert them immutable and creates namedtuple from the converted dict.

Dict    -> MappingProxyType

List    -> Tuple

Set     -> Frozenset

UseCase
=======
When "global variables as configuration" should be shared across the project, library will help to make
config immutable.

.. inclusion-marker-do-not-remove-end


.. topic:: **How to install**

    .. code-block:: html

        pip install immutable

.. topic:: **Requirements**

    Python 3.6 and above


Code Example
============

.. code-block:: python

    from immutable.immutable import immutable

    LOGGING = {
        'formatters': {
            'verbose': {
                'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
                'style': '{',
            },
            'simple': {
                'format': '{levelname} {message}',
                'style': '{',
            },
        },
        'loggers': {
            'django': {
                'handlers': ['console'],
                'propagate': True,
            },
            'django.request': {
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': False,
            },
            'myproject.custom': {
                'handlers': {'console', 'mail_admins'},
                'level': 'INFO',
                'filters': ['special']
            }
        }
    }

    config = immutable('LoggingConfig', LOGGING, only_const=False, recursive=True)


Options
=======
only_const (default = False)
----------------------------
It will create namedtuple from all dictionary keys. When it is set to :code:`True`,
it will only create namedtuple from :code:`constants` (all caps variables).

recursive (default = False)
---------------------------
Only first level of key-vales are immuted, when it is set to :code:`False`. When it is set to :code:`True`,
all the key-values are traversed and converted to immutable.

clone (default = True)
----------------------
Clone the given dictionary and mutates it. deepcopy is a costly operation when dictionary is to
many levels of nested with basic python data structure (list, tuple, set, dict).

Setting it to :code:`False` will improve the performance, but it will mutate the data given to immutable function.
So use :code:`False`, when you do not need to access the data after making it immutable.

properties
----------
Immutable function takes all the key from data given and creates namedtuple from that. If you want to create namedtuple
with selected keys, you can pass properties :code:`iterable` to filter from data.

License
=======

This project is licensed under the MIT License - see the `LICENSE <LICENSE>`_ file for details