Skip to content

Commit

Permalink
MD to RST
Browse files Browse the repository at this point in the history
  • Loading branch information
cdgriffith committed Mar 11, 2017
1 parent bff677f commit a264b40
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 119 deletions.
118 changes: 0 additions & 118 deletions README.md

This file was deleted.

131 changes: 131 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
Box
===

Python dictionaries with recursive dot notation access.

.. code:: python
from box import Box
my_box = Box({"owner": "Mr. Powers",
"contents": ["blue crushed-velvet suit",
"frilly lace crava",
"gold medallion with peace symbol",
"Italian shoes",
"tie-dyed socks"],
"affiliates": {
"Vanessa": "Sexy",
"Dr Evil": "Not groovy",
"Scott Evil": "Doesn't want to take over family business"
}})
my_box.affiliates.Vanessa == my_box['affiliates']['Vanessa']
my_box.funny_line = "They tried to steal my lucky charms!"
my_box['funny_line']
# 'They tried to steal my luck charms!'
my_box.credits = {'Austin Powers': "Mike Myers", "Vanessa Kensington": "Elizabeth Hurley"}
# <Box: {'Austin Powers': 'Mike Myers', 'Vanessa Kensington': 'Elizabeth Hurley'}>
Install
-------

.. code:: bash
pip install python-box
(Don't see a box package, but alas, can't claim the name for some reason.)

Box is tested on python 2.6+, 3.3+ and PyPy2, and should work on other
interpreters as well. If it does not install with this command, please
open a ticket with the error you are experiencing!

Overview
--------

This module provides two main classes `Box` and `ConfigBox`.
They are designed to be easy drop in replacements for dictionaries,
with the latter having tools for dealing with config files.

`Box` is designed to transparently act as a dictionary, thanks to Python's
duck typing capabilities, but add dot notation access like classes do. Any sub
dictionaries or ones set after initiation will be automatically converted to
a `Box` object. You can always run `.to_dict()` on it to return the object
and all sub objects back into a regular dictionary.


.. code:: python
# Will only convert outermost object
dict(my_box)
# {'owner': 'Mr. Powers', 'affiliates': <Box: {'Vanessa': 'Sexy',
# 'Dr Evil': 'Not groovy', 'Scott Evil': "Doesn't want to take over family business"}>,
# 'credits': <Box: {'Austin Powers': 'Mike Myers', 'Vanessa Kensington': 'Elizabeth Hurley'}>}
my_box.to_dict()
# {'owner': 'Mr. Powers', 'affiliates': {'Vanessa': 'Sexy',
# 'Dr Evil': 'Not groovy', 'Scott Evil': "Doesn't want to take over family business"},
# 'credits': {'Austin Powers': 'Mike Myers', 'Vanessa Kensington': 'Elizabeth Hurley'}}
This module was pulled from my other project, reusables, so it has support for
a `ConfigBox`.

test_config.ini

.. code:: ini
[General]
example=A regular string
[Examples]
my_bool=yes
anint=234
exampleList=234,123,234,543
floatly=4.4
With the combination of reusables and ConfigBox you can easily read python
config values into python types. It supports `list`, `bool`, `int` and `float`.

.. code:: python
import reusables
from box import ConfigBox
config = ConfigBox(reusables.config_dict("test_config.ini"))
# <ConfigBox: {'General': {'example': 'A regular string'},
# 'Examples': {'my_bool': 'yes', 'anint': '234', 'examplelist': '234,123,234,543', 'floatly': '4.4'}}>
config.Examples.list('examplelist')
# ['234', '123', '234', '543']
config.Examples.float('floatly')
# 4.4
Similar Libraries
-----------------

**Bunch**

Does not work recursively.

**EasyDict**

EasyDict not have a way to make sub items recursively back into a regular dictionary.

Both EasyDicts `str` and `repr` print a dictionary look alike, `Box` makes it clear in repr
that it is a unique object.

**addict**

Is a default dictionary, as in it will never fail on lookup.
It also goes into lists and makes those into sub objects as.


2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

attrs = dict(re.findall(r"__([a-z]+)__ *= *['\"](.+)['\"]", reuse_content))

with open("README.md", "r") as readme_file:
with open("README.rst", "r") as readme_file:
long_description = readme_file.read()

setup(
Expand Down

0 comments on commit a264b40

Please sign in to comment.