diff --git a/.coveragerc b/.coveragerc
new file mode 100644
index 0000000..7ae674c
--- /dev/null
+++ b/.coveragerc
@@ -0,0 +1,3 @@
+[run]
+source = environ/
+omit = environ/test.py
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..14144d7
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: joke2k
+patreon: # Replace with a single Patreon username
+open_collective: joke2k
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..34f75db
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,41 @@
+*.py[cod]
+
+# C extensions
+*.so
+
+# Packages
+*.egg
+*.egg-info
+dist
+build
+docs/_build
+eggs
+parts
+var
+sdist
+develop-eggs
+.installed.cfg
+lib
+lib64
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+.coverage
+.tox
+nosetests.xml
+
+# Translations
+*.mo
+
+# Mr Developer
+.mr.developer.cfg
+.project
+.pydevproject
+.idea
+.projectile
+.ropeproject
+
+# pyenv/pyenv-virtualenv
+.python-version
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..053d8ff
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,59 @@
+language: python
+sudo: false
+python:
+ - "2.7"
+ - "3.4"
+ - "3.5"
+ - "3.6"
+ - "nightly"
+ - "pypy"
+env:
+  matrix:
+   - DJANGO="Django>=1.8,<1.9"
+   - DJANGO="Django>=1.9,<1.10"
+   - DJANGO="Django>=1.10,<1.11"
+   - DJANGO="Django>=1.11,<2.0"
+   - DJANGO="Django>=2.0,<2.1"
+   - DJANGO="https://github.com/django/django/archive/master.tar.gz"
+install:
+ # The default pip doesn't properly support pre-release version specifiers.
+ - pip install -U pip
+ - pip install . coverage $DJANGO
+branches:
+ only:
+  - master
+  - develop
+  - /^feature\/.+/
+  - /^release\/.+/
+  - /^hotfix\/.+/
+  - /^v[\d\.]+/
+script: coverage run --source=environ setup.py test
+matrix:
+  fast_finish: true
+  include:
+    - python: "3.3"
+      env: DJANGO="Django>=1.8,<1.9"
+    # Django 1.11+ supports Python 3.6
+    - python: "3.6"
+      env: DJANGO="Django>=1.11,<2.0"
+    - python: "3.6"
+      env: DJANGO="Django>=2.0,<2.1"
+  exclude:
+    # Django 2.0+ dropped support for Python 2.
+    - python: "2.7"
+      env: DJANGO="Django>=2.0,<2.1"
+    - python: "pypy"
+      env: DJANGO="Django>=2.0,<2.1"
+    - python: "2.7"
+      env: DJANGO="https://github.com/django/django/archive/master.tar.gz"
+    - python: "pypy"
+      env: DJANGO="https://github.com/django/django/archive/master.tar.gz"
+    # Django master dropped support for Python 3.4.
+    - python: "3.4"
+      env: DJANGO="https://github.com/django/django/archive/master.tar.gz"
+  allow_failures:
+    - env: DJANGO="https://github.com/django/django/archive/master.tar.gz"
+after_success:
+  - coverage report
+  - pip install --quiet python-coveralls
+  - coveralls
diff --git a/AUTHORS.rst b/AUTHORS.rst
new file mode 100644
index 0000000..2fd5541
--- /dev/null
+++ b/AUTHORS.rst
@@ -0,0 +1,120 @@
+Generated by https://github.com/pydanny/contributors
+
+  * (◕ᴥ◕) (`@ratson`_)
+  * Adam Dobrawy (`@ad-m`_)
+  * Andrea Crotti (`@AndreaCrotti`_)
+  * Andrew (`@AndBondStyle`_)
+  * Antoine Lorence (`@alorence`_)
+  * Artem.Bernatskyy (`@ArtemBernatskyy`_)
+  * Bachynin Ivan (`@vaniakosmos`_)
+  * Bart Moelans (`@bmoelans`_)
+  * Brian May (`@brianmay`_)
+  * Bruno Alla (`@browniebroke`_)
+  * Chad Saunders (`@chadsaun`_)
+  * Daniel van Flymen (`@dvf`_)
+  * Daniele Faraglia (`@joke2k`_)
+  * David (`@ddiazpinto`_)
+  * David Karchmer (`@dkarchmer`_)
+  * dennis again (`@immerrr`_)
+  * Dinesh Kumar Sharma (`@dinesh829269`_)
+  * Dustin Wyatt (`@dmwyatt`_)
+  * Ed Morley (`@edmorley`_)
+  * Federico Martinez (`@federicoemartinez`_)
+  * `@fedetorre`_
+  * Flavio Curella (`@fcurella`_)
+  * Florian Demmer (`@fdemmer`_)
+  * Ivan Anishchuk (`@IvanAnishchuk`_)
+  * Jack Cushman (`@jcushman`_)
+  * Jafnee (`@Jafnee`_)
+  * Jake Merdich (`@jmerdich`_)
+  * James Hiew (`@jameshiew`_)
+  * Jason Kraus (`@zbyte64`_)
+  * Jaye Doepke (`@jtdoepke`_)
+  * jess (`@monkeywithacupcake`_)
+  * Jimmy Merrild Krag (`@beruic`_)
+  * jjlorenzo (`@jjlorenzo`_)
+  * Johannes Hoppe (`@codingjoe`_)
+  * `@kakkulap`_
+  * `@konoufo`_
+  * konstin (`@konstin`_)
+  * Kosei Kitahara (`@Surgo`_)
+  * Mark Heppner (`@mheppner`_)
+  * Mark Rogaski (`@mrogaski`_)
+  * Matthew Jacobi (`@oppianmatt`_)
+  * Max Arnold (`@max-arnold`_)
+  * Neil Lyons (`@nwjlyons`_)
+  * `@nguyentrantuan`_
+  * Nick Travis (`@ntravis`_)
+  * Norman Schenck (`@normoes`_)
+  * Philippe Luickx (`@philippeluickx`_)
+  * pyup.io bot (`@pyup-bot`_)
+  * Riccardo Magliocchetti (`@xrmx`_)
+  * Santtu Pajukanta (`@japsu`_)
+  * Sardorbek Imomaliev (`@imomaliev`_)
+  * Simon Lundmark Ornstein (`@simlun`_)
+  * `@thaxy`_
+  * Thinh Nguyen (`@Taik`_)
+  * Tibo Beijen (`@TBeijen`_)
+  * Timothy Allen (`@FlipperPA`_)
+  * `@VKen`_
+  * Vladislav Bakin (`@mixkorshun`_)
+  * Vu Chau (`@vuchau`_)
+.. _`@vaniakosmos`: https://github.com/vaniakosmos
+.. _`@mixkorshun`: https://github.com/mixkorshun
+.. _`@thaxy`: https://github.com/thaxy
+.. _`@max-arnold`: https://github.com/max-arnold
+.. _`@brianmay`: https://github.com/brianmay
+.. _`@pyup-bot`: https://github.com/pyup-bot
+.. _`@fdemmer`: https://github.com/fdemmer
+.. _`@Surgo`: https://github.com/Surgo
+.. _`@dmwyatt`: https://github.com/dmwyatt
+.. _`@nwjlyons`: https://github.com/nwjlyons
+.. _`@AndBondStyle`: https://github.com/AndBondStyle
+.. _`@zbyte64`: https://github.com/zbyte64
+.. _`@fedetorre`: https://github.com/fedetorre
+.. _`@normoes`: https://github.com/normoes
+.. _`@alorence`: https://github.com/alorence
+.. _`@ddiazpinto`: https://github.com/ddiazpinto
+.. _`@simlun`: https://github.com/simlun
+.. _`@jcushman`: https://github.com/jcushman
+.. _`@ntravis`: https://github.com/ntravis
+.. _`@ratson`: https://github.com/ratson
+.. _`@jmerdich`: https://github.com/jmerdich
+.. _`@joke2k`: https://github.com/joke2k
+.. _`@edmorley`: https://github.com/edmorley
+.. _`@konoufo`: https://github.com/konoufo
+.. _`@dkarchmer`: https://github.com/dkarchmer
+.. _`@chadsaun`: https://github.com/chadsaun
+.. _`@immerrr`: https://github.com/immerrr
+.. _`@dvf`: https://github.com/dvf
+.. _`@jtdoepke`: https://github.com/jtdoepke
+.. _`@Taik`: https://github.com/Taik
+.. _`@Jafnee`: https://github.com/Jafnee
+.. _`@dinesh829269`: https://github.com/dinesh829269
+.. _`@federicoemartinez`: https://github.com/federicoemartinez
+.. _`@VKen`: https://github.com/VKen
+.. _`@vuchau`: https://github.com/vuchau
+.. _`@xrmx`: https://github.com/xrmx
+.. _`@monkeywithacupcake`: https://github.com/monkeywithacupcake
+.. _`@oppianmatt`: https://github.com/oppianmatt
+.. _`@beruic`: https://github.com/beruic
+.. _`@fcurella`: https://github.com/fcurella
+.. _`@jameshiew`: https://github.com/jameshiew
+.. _`@imomaliev`: https://github.com/imomaliev
+.. _`@japsu`: https://github.com/japsu
+.. _`@IvanAnishchuk`: https://github.com/IvanAnishchuk
+.. _`@konstin`: https://github.com/konstin
+.. _`@nguyentrantuan`: https://github.com/nguyentrantuan
+.. _`@mheppner`: https://github.com/mheppner
+.. _`@browniebroke`: https://github.com/browniebroke
+.. _`@AndreaCrotti`: https://github.com/AndreaCrotti
+.. _`@ad-m`: https://github.com/ad-m
+.. _`@bmoelans`: https://github.com/bmoelans
+.. _`@jjlorenzo`: https://github.com/jjlorenzo
+.. _`@kakkulap`: https://github.com/kakkulap
+.. _`@codingjoe`: https://github.com/codingjoe
+.. _`@ArtemBernatskyy`: https://github.com/ArtemBernatskyy
+.. _`@mrogaski`: https://github.com/mrogaski
+.. _`@philippeluickx`: https://github.com/philippeluickx
+.. _`@FlipperPA`: https://github.com/FlipperPA
+.. _`@TBeijen`: https://github.com/TBeijen
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
new file mode 100644
index 0000000..fe154db
--- /dev/null
+++ b/CHANGELOG.rst
@@ -0,0 +1,130 @@
+Changelog
+=========
+All notable changes to this project will be documented in this file.
+
+The format is *inspired* by `Keep a Changelog <http://keepachangelog.com/en/1.0.0/>`_
+and this project adheres to `Semantic Versioning <http://semver.org/spec/v2.0.0.html>`_.
+
+
+`v0.4.5`_ - 25-June-2018
+--------------------------
+Added
++++++
+  - Support for Django 2.0
+  - Support for smart casting
+  - Support PostgreSQL unix domain socket paths
+  - Tip: Multiple env files
+
+Changed
++++++++
+  - Fix parsing option values None, True and False
+  - Order of importance of engine configuration in db_url_config
+
+Removed
++++++++
+  - Remove django and six dependencies
+
+
+`v0.4.4`_ - 21-August-2017
+--------------------------
+
+Added
++++++
+  - Support for django-redis multiple locations (master/slave, shards)
+  - Support for Elasticsearch2
+  - Support for Mysql-connector
+  - Support for pyodbc
+  - Add __contains__ feature to Environ class
+
+Changed
++++++++
+  - Fix Path subtracting
+
+
+`v0.4.3`_ - 21-August-2017
+--------------------------
+Changed
++++++++
+  - Rollback the default Environ to os.environ
+
+`v0.4.2`_ - 13-April-2017
+-------------------------
+Added
++++++
+  - Confirm support for Django 1.11.
+  - Support for Redshift database URL
+
+Changed
++++++++
+  - Fix uwsgi settings reload problem (#55)
+  - Update support for django-redis urls (#109)
+
+`v0.4.1`_ - 13-November-2016
+----------------------------
+Added
++++++
+  - Add support for Django 1.10
+
+Changed
++++++++
+  - Fix for unsafe characters into URLs
+  - Clarifying warning on missing or unreadable file. Thanks to @nickcatal
+  - Fix support for Oracle urls
+  - Fix support for django-redis
+
+`v0.4.0`_ - 23-September-2015
+-----------------------------
+Added
++++++
+  - New email schemes - smtp+ssl and smtp+tls (smtps would be deprecated)
+  - Add tuple support. Thanks to @anonymouzz
+  - Add LDAP url support for database (django-ldapdb)
+
+Changed
++++++++
+  - Fix non-ascii values (broken in Python 2.x)
+  - redis_cache replaced by django_redis
+  - Fix psql/pgsql url
+
+`v0.3`_ - 03-June-2014
+----------------------
+Added
++++++
+  - Add cache url support
+  - Add email url support
+  - Add search url support
+
+Changed
++++++++
+  - Rewriting README.rst
+
+0.2.1 19-April-2013
+-------------------
+Changed
++++++++
+  - environ/environ.py: Env.__call__ now uses Env.get_value instance method
+
+0.2 16-April-2013
+-----------------
+Changed
++++++++
+  - environ/environ.py, environ/test.py, environ/test_env.txt: add advanced
+    float parsing (comma and dot symbols to separate thousands and decimals)
+  - README.rst, docs/index.rst: fix TYPO in documentation
+
+0.1 2-April-2013
+-----------------
+Added
++++++
+  - initial release
+
+
+.. _v0.4.5: https://github.com/joke2k/django-environ/compare/v0.4.4...v0.4.5
+.. _v0.4.4: https://github.com/joke2k/django-environ/compare/v0.4.3...v0.4.4
+.. _v0.4.3: https://github.com/joke2k/django-environ/compare/v0.4.2...v0.4.3
+.. _v0.4.2: https://github.com/joke2k/django-environ/compare/v0.4.1...v0.4.2
+.. _v0.4.1: https://github.com/joke2k/django-environ/compare/v0.4.0...v0.4.1
+.. _v0.4.0: https://github.com/joke2k/django-environ/compare/v0.3...v0.4.0
+.. _v0.3: https://github.com/joke2k/django-environ/compare/v0.2.1...v0.3
+.. _`Keep a Changelog`: http://keepachangelog.com/en/1.0.0/
+.. _`Semantic Versioning`: http://semver.org/spec/v2.0.0.html
diff --git a/PKG-INFO b/PKG-INFO
deleted file mode 100644
index c412c77..0000000
--- a/PKG-INFO
+++ /dev/null
@@ -1,441 +0,0 @@
-Metadata-Version: 1.1
-Name: django-environ
-Version: 0.4.4
-Summary: Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application.
-Home-page: https://github.com/joke2k/django-environ
-Author: joke2k
-Author-email: joke2k@gmail.com
-License: MIT License
-Description: ==============
-        Django-environ
-        ==============
-        
-        Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application.
-        
-        |pypi| |unix_build| |windows_build| |coverage| |license|
-        
-        
-        This module is a merge of:
-        
-        * `envparse`_
-        * `honcho`_
-        * `dj-database-url`_
-        * `dj-search-url`_
-        * `dj-config-url`_
-        * `django-cache-url`_
-        
-        and inspired by:
-        
-        * `12factor`_
-        * `12factor-django`_
-        * `Two Scoops of Django`_
-        
-        This is your `settings.py` file before you have installed **django-environ**
-        
-        .. code-block:: python
-        
-            import os
-            SITE_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
-        
-            DEBUG = True
-            TEMPLATE_DEBUG = DEBUG
-        
-            DATABASES = {
-                'default': {
-                    'ENGINE': 'django.db.backends.postgresql_psycopg2',
-                    'NAME': 'database',
-                    'USER': 'user',
-                    'PASSWORD': 'githubbedpassword',
-                    'HOST': '127.0.0.1',
-                    'PORT': '8458',
-                },
-                'extra': {
-                    'ENGINE': 'django.db.backends.sqlite3',
-                    'NAME': os.path.join(SITE_ROOT, 'database.sqlite')
-                }
-            }
-        
-            MEDIA_ROOT = os.path.join(SITE_ROOT, 'assets')
-            MEDIA_URL = 'media/'
-            STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
-            STATIC_URL = 'static/'
-        
-            SECRET_KEY = '...im incredibly still here...'
-        
-            CACHES = {
-                'default': {
-                    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
-                    'LOCATION': [
-                        '127.0.0.1:11211', '127.0.0.1:11212', '127.0.0.1:11213',
-                    ]
-                },
-                'redis': {
-                    'BACKEND': 'django_redis.cache.RedisCache',
-                    'LOCATION': '127.0.0.1:6379/1',
-                    'OPTIONS': {
-                        'CLIENT_CLASS': 'django_redis.client.DefaultClient',
-                        'PASSWORD': 'redis-githubbed-password',
-                    }
-                }
-            }
-        
-        After:
-        
-        .. code-block:: python
-        
-            import environ
-            root = environ.Path(__file__) - 3 # three folder back (/a/b/c/ - 3 = /)
-            env = environ.Env(DEBUG=(bool, False),) # set default values and casting
-            environ.Env.read_env() # reading .env file
-        
-            SITE_ROOT = root()
-        
-            DEBUG = env('DEBUG') # False if not in os.environ
-            TEMPLATE_DEBUG = DEBUG
-        
-            DATABASES = {
-                'default': env.db(), # Raises ImproperlyConfigured exception if DATABASE_URL not in os.environ
-                'extra': env.db('SQLITE_URL', default='sqlite:////tmp/my-tmp-sqlite.db')
-            }
-        
-            public_root = root.path('public/')
-        
-            MEDIA_ROOT = public_root('media')
-            MEDIA_URL = 'media/'
-            STATIC_ROOT = public_root('static')
-            STATIC_URL = 'static/'
-        
-            SECRET_KEY = env('SECRET_KEY') # Raises ImproperlyConfigured exception if SECRET_KEY not in os.environ
-        
-            CACHES = {
-                'default': env.cache(),
-                'redis': env.cache('REDIS_URL')
-            }
-        
-        You can also pass ``read_env()`` an explicit path to the ``.env`` file.
-        
-        Create a ``.env`` file:
-        
-        .. code-block:: bash
-        
-            DEBUG=on
-            # DJANGO_SETTINGS_MODULE=myapp.settings.dev
-            SECRET_KEY=your-secret-key
-            DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database
-            # SQLITE_URL=sqlite:///my-local-sqlite.db
-            CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
-            REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=redis-un-githubbed-password
-        
-        
-        How to install
-        ==============
-        
-        ::
-        
-            $ pip install django-environ
-        
-        
-        How to use
-        ==========
-        
-        There are only two classes, ``environ.Env`` and ``environ.Path``
-        
-        .. code-block:: python
-        
-            >>> import environ
-            >>> env = environ.Env(
-                    DEBUG=(bool, False),
-                )
-            >>> env('DEBUG')
-            False
-            >>> env('DEBUG', default=True)
-            True
-        
-            >>> open('.myenv', 'a').write('DEBUG=on')
-            >>> environ.Env.read_env('.myenv') # or env.read_env('.myenv')
-            >>> env('DEBUG')
-            True
-        
-            >>> open('.myenv', 'a').write('\nINT_VAR=1010')
-            >>> env.int('INT_VAR'), env.str('INT_VAR')
-            1010, '1010'
-        
-            >>> open('.myenv', 'a').write('\nDATABASE_URL=sqlite:///my-local-sqlite.db')
-            >>> env.read_env('.myenv')
-            >>> env.db()
-            {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'my-local-sqlite.db', 'HOST': '', 'USER': '', 'PASSWORD': '', 'PORT': ''}
-        
-            >>> root = env.path('/home/myproject/')
-            >>> root('static')
-            '/home/myproject/static'
-        
-        
-        See `cookiecutter-django`_ for a concrete example on using with a django project.
-        
-        
-        Supported Types
-        ===============
-        
-        - str
-        - bool
-        - int
-        - float
-        - json
-        - list (FOO=a,b,c)
-        - tuple (FOO=(a,b,c))
-        - dict (BAR=key=val,foo=bar) #environ.Env(BAR=(dict, {}))
-        - dict (BAR=key=val;foo=1.1;baz=True) #environ.Env(BAR=(dict(value=unicode, cast=dict(foo=float,baz=bool)), {}))
-        - url
-        - path (environ.Path)
-        - db_url
-            -  PostgreSQL: postgres://, pgsql://, psql:// or postgresql://
-            -  PostGIS: postgis://
-            -  MySQL: mysql:// or mysql2://
-            -  MySQL for GeoDjango: mysqlgis://
-            -  SQLITE: sqlite://
-            -  SQLITE with SPATIALITE for GeoDjango: spatialite://
-            -  Oracle: oracle://
-            -  PyODBC: pyodbc://
-            -  Redshift: redshift://
-            -  LDAP: ldap://
-        - cache_url
-            -  Database: dbcache://
-            -  Dummy: dummycache://
-            -  File: filecache://
-            -  Memory: locmemcache://
-            -  Memcached: memcache://
-            -  Python memory: pymemcache://
-            -  Redis: rediscache://
-        - search_url
-            - ElasticSearch: elasticsearch://
-            - Solr: solr://
-            - Whoosh: whoosh://
-            - Xapian: xapian://
-            - Simple cache: simple://
-        - email_url
-            - SMTP: smtp://
-            - SMTP+SSL: smtp+ssl://
-            - SMTP+TLS: smtp+tls://
-            - Console mail: consolemail://
-            - File mail: filemail://
-            - LocMem mail: memorymail://
-            - Dummy mail: dummymail://
-        
-        Tips
-        ====
-        
-        Using unsafe characters in URLs
-        -------------------------------
-        
-        In order to use unsafe characters you have to encode with ``urllib.parse.encode`` before you set into ``.env`` file.
-        
-        .. code-block::
-        
-            DATABASE_URL=mysql://user:%23password@127.0.0.1:3306/dbname
-        
-        
-        See https://perishablepress.com/stop-using-unsafe-characters-in-urls/ for reference.
-        
-        Multiple redis cache locations
-        ------------------------------
-        
-        For redis cache, `multiple master/slave or shard locations <http://niwinz.github.io/django-redis/latest/#_pluggable_clients>`_ can be configured as follows:
-        
-        .. code-block::
-        
-            CACHE_URL='rediscache://master:6379,slave1:6379,slave2:6379/1'
-        
-        Email settings
-        --------------
-        
-        In order to set email configuration for django you can use this code:
-        
-        .. code-block:: python
-        
-            EMAIL_CONFIG = env.email_url(
-                'EMAIL_URL', default='smtp://user@:password@localhost:25')
-        
-            vars().update(EMAIL_CONFIG)
-        
-        
-        SQLite urls
-        -----------
-        
-        SQLite connects to file based databases. The same URL format is used, omitting the hostname,
-        and using the "file" portion as the filename of the database.
-        This has the effect of four slashes being present for an absolute
-        file path: sqlite:////full/path/to/your/database/file.sqlite.
-        
-        
-        Tests
-        =====
-        
-        ::
-        
-            $ git clone git@github.com:joke2k/django-environ.git
-            $ cd django-environ/
-            $ python setup.py test
-        
-        
-        License
-        =======
-        
-        Django-environ is licensed under the MIT License - see the `LICENSE_FILE`_ file for details
-        
-        Changelog
-        =========
-        
-        
-        `0.4.4 - 21-August-2017 <https://github.com/joke2k/django-environ/compare/v0.4.3...v0.4.4>`__
-        ---------------------------------------------------------------------------------------------
-        
-          - Support for django-redis multiple locations (master/slave, shards)
-          - Support for Elasticsearch2
-          - Support for Mysql-connector
-          - Support for pyodbc
-          - Add __contains__ feature to Environ class
-          - Fix Path subtracting
-        
-        
-        `0.4.3 - 21-August-2017 <https://github.com/joke2k/django-environ/compare/v0.4.2...v0.4.3>`__
-        ---------------------------------------------------------------------------------------------
-        
-          - Rollback the default Environ to os.environ
-        
-        `0.4.2 - 13-April-2017 <https://github.com/joke2k/django-environ/compare/v0.4.1...v0.4.2>`__
-        --------------------------------------------------------------------------------------------
-        
-          - Confirm support for Django 1.11.
-          - Support for Redshift database URL
-          - Fix uwsgi settings reload problem (#55)
-          - Update support for django-redis urls (#109)
-        
-        `0.4.1 - 13-November-2016 <https://github.com/joke2k/django-environ/compare/v0.4...v0.4.1>`__
-        ---------------------------------------------------------------------------------------------
-          - Fix for unsafe characters into URLs
-          - Clarifying warning on missing or unreadable file. Thanks to @nickcatal
-          - Add support for Django 1.10.
-          - Fix support for Oracle urls
-          - Fix support for django-redis
-        
-        
-        `0.4.0 - 23-September-2015 <https://github.com/joke2k/django-environ/compare/v0.3...v0.4>`__
-        --------------------------------------------------------------------------------------------
-          - Fix non-ascii values (broken in Python 2.x)
-          - New email schemes - smtp+ssl and smtp+tls (smtps would be deprecated)
-          - redis_cache replaced by django_redis
-          - Add tuple support. Thanks to @anonymouzz
-          - Add LDAP url support for database (django-ldapdb)
-          - Fix psql/pgsql url
-        
-        `0.3 - 03-June-2014 <https://github.com/joke2k/django-environ/compare/v0.2.1...v0.3>`__
-        ---------------------------------------------------------------------------------------
-          - Add cache url support
-          - Add email url support
-          - Add search url support
-          - Rewriting README.rst
-        
-        0.2.1 19-April-2013
-        -------------------
-          - environ/environ.py: Env.__call__ now uses Env.get_value instance method
-        
-        0.2 16-April-2013
-        -----------------
-          - environ/environ.py, environ/test.py, environ/test_env.txt: add advanced
-            float parsing (comma and dot symbols to separate thousands and decimals)
-          - README.rst, docs/index.rst: fix TYPO in documentation
-        
-        0.1 02-April-2013
-        -----------------
-          - initial release
-        
-        Credits
-        =======
-        
-        - `12factor`_
-        - `12factor-django`_
-        - `Two Scoops of Django`_
-        - `rconradharris`_ / `envparse`_
-        - `kennethreitz`_ / `dj-database-url`_
-        - `migonzalvar`_ / `dj-email-url`_
-        - `ghickman`_ / `django-cache-url`_
-        - `dstufft`_ / `dj-search-url`_
-        - `julianwachholz`_ / `dj-config-url`_
-        - `nickstenning`_ / `honcho`_
-        - `envparse`_
-        - `Distribute`_
-        - `modern-package-template`_
-        
-        .. _rconradharris: https://github.com/rconradharris
-        .. _envparse: https://github.com/rconradharris/envparse
-        
-        .. _kennethreitz: https://github.com/kennethreitz
-        .. _dj-database-url: https://github.com/kennethreitz/dj-database-url
-        
-        .. _migonzalvar: https://github.com/migonzalvar
-        .. _dj-email-url: https://github.com/migonzalvar/dj-email-url
-        
-        .. _ghickman: https://github.com/ghickman
-        .. _django-cache-url: https://github.com/ghickman/django-cache-url
-        
-        .. _julianwachholz: https://github.com/julianwachholz
-        .. _dj-config-url: https://github.com/julianwachholz/dj-config-url
-        
-        .. _dstufft: https://github.com/dstufft
-        .. _dj-search-url: https://github.com/dstufft/dj-search-url
-        
-        .. _nickstenning: https://github.com/nickstenning
-        .. _honcho: https://github.com/nickstenning/honcho
-        
-        .. _12factor: http://www.12factor.net/
-        .. _12factor-django: http://www.wellfireinteractive.com/blog/easier-12-factor-django/
-        .. _`Two Scoops of Django`: http://twoscoopspress.org/
-        
-        .. _Distribute: http://pypi.python.org/pypi/distribute
-        .. _`modern-package-template`: http://pypi.python.org/pypi/modern-package-template
-        
-        .. _cookiecutter-django: https://github.com/pydanny/cookiecutter-django
-        
-        .. |pypi| image:: https://img.shields.io/pypi/v/django-environ.svg?style=flat-square&label=version
-            :target: https://pypi.python.org/pypi/django-environ
-            :alt: Latest version released on PyPi
-        
-        .. |coverage| image:: https://img.shields.io/coveralls/joke2k/django-environ/master.svg?style=flat-square
-            :target: https://coveralls.io/r/joke2k/django-environ?branch=master
-            :alt: Test coverage
-        
-        .. |unix_build| image:: https://img.shields.io/travis/joke2k/django-environ/master.svg?style=flat-square&label=unix%20build
-            :target: http://travis-ci.org/joke2k/django-environ
-            :alt: Build status of the master branch on Mac/Linux
-        
-        .. |windows_build|  image:: https://img.shields.io/appveyor/ci/joke2k/django-environ.svg?style=flat-square&label=windows%20build
-            :target: https://ci.appveyor.com/project/joke2k/django-environ
-            :alt: Build status of the master branch on Windows
-        
-        .. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square
-            :target: https://raw.githubusercontent.com/joke2k/django-environ/master/LICENSE.txt
-            :alt: Package license
-        
-        .. _LICENSE_FILE: https://github.com/joke2k/django-environ/blob/master/LICENSE.txt
-        
-Keywords: django environment variables 12factor
-Platform: any
-Classifier: Development Status :: 3 - Alpha
-Classifier: Intended Audience :: Information Technology
-Classifier: Framework :: Django
-Classifier: Framework :: Django :: 1.8
-Classifier: Framework :: Django :: 1.9
-Classifier: Framework :: Django :: 1.10
-Classifier: Framework :: Django :: 1.11
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Utilities
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Framework :: Django
diff --git a/README.rst b/README.rst
index 290fecd..871a822 100644
--- a/README.rst
+++ b/README.rst
@@ -1,172 +1,113 @@
-==============
 Django-environ
 ==============
 
-Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application.
-
-|pypi| |unix_build| |windows_build| |coverage| |license|
-
-
-This module is a merge of:
-
-* `envparse`_
-* `honcho`_
-* `dj-database-url`_
-* `dj-search-url`_
-* `dj-config-url`_
-* `django-cache-url`_
-
-and inspired by:
-
-* `12factor`_
-* `12factor-django`_
-* `Two Scoops of Django`_
-
-This is your `settings.py` file before you have installed **django-environ**
-
-.. code-block:: python
-
-    import os
-    SITE_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
-
-    DEBUG = True
-    TEMPLATE_DEBUG = DEBUG
-
-    DATABASES = {
-        'default': {
-            'ENGINE': 'django.db.backends.postgresql_psycopg2',
-            'NAME': 'database',
-            'USER': 'user',
-            'PASSWORD': 'githubbedpassword',
-            'HOST': '127.0.0.1',
-            'PORT': '8458',
-        },
-        'extra': {
-            'ENGINE': 'django.db.backends.sqlite3',
-            'NAME': os.path.join(SITE_ROOT, 'database.sqlite')
-        }
-    }
-
-    MEDIA_ROOT = os.path.join(SITE_ROOT, 'assets')
-    MEDIA_URL = 'media/'
-    STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
-    STATIC_URL = 'static/'
+|pypi| |unix_build| |windows_build| |coverage| |contributors| |license| |say_thanks|
 
-    SECRET_KEY = '...im incredibly still here...'
+**django-environ** allows you to use `Twelve-factor methodology`_ to configure your Django application with environment variables.
 
-    CACHES = {
-        'default': {
-            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
-            'LOCATION': [
-                '127.0.0.1:11211', '127.0.0.1:11212', '127.0.0.1:11213',
-            ]
-        },
-        'redis': {
-            'BACKEND': 'django_redis.cache.RedisCache',
-            'LOCATION': '127.0.0.1:6379/1',
-            'OPTIONS': {
-                'CLIENT_CLASS': 'django_redis.client.DefaultClient',
-                'PASSWORD': 'redis-githubbed-password',
-            }
-        }
-    }
+|cover|
 
-After:
+.. _settings.py:
 
 .. code-block:: python
 
     import environ
-    root = environ.Path(__file__) - 3 # three folder back (/a/b/c/ - 3 = /)
-    env = environ.Env(DEBUG=(bool, False),) # set default values and casting
-    environ.Env.read_env() # reading .env file
+    env = environ.Env(
+        # set casting, default value
+        DEBUG=(bool, False)
+    )
+    # reading .env file
+    environ.Env.read_env()
 
-    SITE_ROOT = root()
+    # False if not in os.environ
+    DEBUG = env('DEBUG')
 
-    DEBUG = env('DEBUG') # False if not in os.environ
-    TEMPLATE_DEBUG = DEBUG
+    # Raises django's ImproperlyConfigured exception if SECRET_KEY not in os.environ
+    SECRET_KEY = env('SECRET_KEY')
 
+    # Parse database connection url strings like psql://user:pass@127.0.0.1:8458/db
     DATABASES = {
-        'default': env.db(), # Raises ImproperlyConfigured exception if DATABASE_URL not in os.environ
+        # read os.environ['DATABASE_URL'] and raises ImproperlyConfigured exception if not found
+        'default': env.db(),
+        # read os.environ['SQLITE_URL']
         'extra': env.db('SQLITE_URL', default='sqlite:////tmp/my-tmp-sqlite.db')
     }
 
-    public_root = root.path('public/')
-
-    MEDIA_ROOT = public_root('media')
-    MEDIA_URL = 'media/'
-    STATIC_ROOT = public_root('static')
-    STATIC_URL = 'static/'
-
-    SECRET_KEY = env('SECRET_KEY') # Raises ImproperlyConfigured exception if SECRET_KEY not in os.environ
-
     CACHES = {
+        # read os.environ['CACHE_URL'] and raises ImproperlyConfigured exception if not found
         'default': env.cache(),
+        # read os.environ['REDIS_URL']
         'redis': env.cache('REDIS_URL')
     }
 
-You can also pass ``read_env()`` an explicit path to the ``.env`` file.
-
-Create a ``.env`` file:
+See the `similar code, sans django-environ <https://gist.github.com/joke2k/cc30ed2d5ccda52d5b551ccbc17e536b>`_.
 
-.. code-block:: bash
-
-    DEBUG=on
-    # DJANGO_SETTINGS_MODULE=myapp.settings.dev
-    SECRET_KEY=your-secret-key
-    DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database
-    # SQLITE_URL=sqlite:///my-local-sqlite.db
-    CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
-    REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=redis-un-githubbed-password
+::
 
+         _ _                                              _
+        | (_)                                            (_)
+      __| |_  __ _ _ __   __ _  ___ ______ ___ _ ____   ___ _ __ ___  _ __
+     / _` | |/ _` | '_ \ / _` |/ _ \______/ _ \ '_ \ \ / / | '__/ _ \| '_ \
+    | (_| | | (_| | | | | (_| | (_) |    |  __/ | | \ V /| | | | (_) | | | |
+     \__,_| |\__,_|_| |_|\__, |\___/      \___|_| |_|\_/ |_|_|  \___/|_| |_|
+         _/ |             __/ |
+        |__/             |___/
+
+
+The idea of this package is to unify a lot of packages that make the same stuff:
+Take a string from ``os.environ``, parse and cast it to some of useful python typed variables.
+To do that and to use the `12factor`_ approach, some connection strings are expressed as url,
+so this package can parse it and return a ``urllib.parse.ParseResult``.
+These strings from ``os.environ`` are loaded from a `.env` file and filled in ``os.environ`` with ``setdefault`` method,
+to avoid to overwrite the real environ.
+A similar approach is used in `Two Scoops of Django`_ book and explained in `12factor-django`_ article.
+
+Using django-environ you can stop to make a lot of unversioned ``settings_*.py`` to configure your app.
+See `cookiecutter-django`_ for a concrete example on using with a django project.
 
-How to install
-==============
+Feature Support
+---------------
+- Fast and easy multi environment for deploy
+- Fill ``os.environ`` with .env file variables
+- Variables casting (see supported_types_ below)
+- Url variables exploded to django specific package settings
 
-::
+Django-environ officially supports Django 1.8 ~ 2.0.
 
-    $ pip install django-environ
 
+Installation
+------------
 
-How to use
-==========
+.. code-block:: bash
 
-There are only two classes, ``environ.Env`` and ``environ.Path``
+    $ pip install django-environ
 
-.. code-block:: python
+*NOTE: No need to add it to INSTALLED_APPS.*
 
-    >>> import environ
-    >>> env = environ.Env(
-            DEBUG=(bool, False),
-        )
-    >>> env('DEBUG')
-    False
-    >>> env('DEBUG', default=True)
-    True
 
-    >>> open('.myenv', 'a').write('DEBUG=on')
-    >>> environ.Env.read_env('.myenv') # or env.read_env('.myenv')
-    >>> env('DEBUG')
-    True
+Then create a ``.env`` file:
 
-    >>> open('.myenv', 'a').write('\nINT_VAR=1010')
-    >>> env.int('INT_VAR'), env.str('INT_VAR')
-    1010, '1010'
+.. code-block:: bash
 
-    >>> open('.myenv', 'a').write('\nDATABASE_URL=sqlite:///my-local-sqlite.db')
-    >>> env.read_env('.myenv')
-    >>> env.db()
-    {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'my-local-sqlite.db', 'HOST': '', 'USER': '', 'PASSWORD': '', 'PORT': ''}
+    DEBUG=on
+    SECRET_KEY=your-secret-key
+    DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database
+    SQLITE_URL=sqlite:///my-local-sqlite.db
+    CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
+    REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=ungithubbed-secret
 
-    >>> root = env.path('/home/myproject/')
-    >>> root('static')
-    '/home/myproject/static'
+And use it with `settings.py`_ above.
+Don't forget to add ``.env`` in your ``.gitignore`` (tip: add ``.env.example`` with a template of your variables).
 
+Documentation
+-------------
 
-See `cookiecutter-django`_ for a concrete example on using with a django project.
+Documentation is available at `RTFD <http://django-environ.rtfd.io/>`_.
 
+.. _supported_types:
 
-Supported Types
-===============
+Supported types
+---------------
 
 - str
 - bool
@@ -187,6 +128,7 @@ Supported Types
     -  SQLITE: sqlite://
     -  SQLITE with SPATIALITE for GeoDjango: spatialite://
     -  Oracle: oracle://
+    -  MSSQL: mssql://
     -  PyODBC: pyodbc://
     -  Redshift: redshift://
     -  LDAP: ldap://
@@ -214,31 +156,30 @@ Supported Types
     - Dummy mail: dummymail://
 
 Tips
-====
+----
 
 Using unsafe characters in URLs
--------------------------------
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 In order to use unsafe characters you have to encode with ``urllib.parse.encode`` before you set into ``.env`` file.
 
-.. code-block::
+.. code-block:: bash
 
     DATABASE_URL=mysql://user:%23password@127.0.0.1:3306/dbname
 
-
 See https://perishablepress.com/stop-using-unsafe-characters-in-urls/ for reference.
 
 Multiple redis cache locations
-------------------------------
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 For redis cache, `multiple master/slave or shard locations <http://niwinz.github.io/django-redis/latest/#_pluggable_clients>`_ can be configured as follows:
 
-.. code-block::
+.. code-block:: bash
 
     CACHE_URL='rediscache://master:6379,slave1:6379,slave2:6379/1'
 
 Email settings
---------------
+~~~~~~~~~~~~~~
 
 In order to set email configuration for django you can use this code:
 
@@ -249,101 +190,97 @@ In order to set email configuration for django you can use this code:
 
     vars().update(EMAIL_CONFIG)
 
-
 SQLite urls
------------
+~~~~~~~~~~~
 
 SQLite connects to file based databases. The same URL format is used, omitting the hostname,
 and using the "file" portion as the filename of the database.
 This has the effect of four slashes being present for an absolute
-file path: sqlite:////full/path/to/your/database/file.sqlite.
 
+file path: ``sqlite:////full/path/to/your/database/file.sqlite``.
 
-Tests
-=====
+Nested lists
+------------
 
-::
+Some settings such as Django's ``ADMINS`` make use of nested lists. You can use something like this to handle similar cases.
 
-    $ git clone git@github.com:joke2k/django-environ.git
-    $ cd django-environ/
-    $ python setup.py test
+.. code-block:: python
 
+    # DJANGO_ADMINS=John:john@admin.com,Jane:jane@admin.com
+    ADMINS = [x.split(':') for x in env.list('DJANGO_ADMINS')] 
 
-License
-=======
+    # or use more specific function
 
-Django-environ is licensed under the MIT License - see the `LICENSE_FILE`_ file for details
+    from email.utils import getaddresses
 
-Changelog
-=========
+    # DJANGO_ADMINS=Full Name <email-with-name@example.com>,anotheremailwithoutname@example.com
+    ADMINS = getaddresses([env('DJANGO_ADMINS')])
+
+Multiline value
+---------------
+
+You can set a multiline variable value:
+
+.. code-block:: python
 
+    # MULTILINE_TEXT=Hello\\nWorld
+    >>> print env.str('MULTILINE_TEXT', multiline=True)
+    Hello
+    World
 
-`0.4.4 - 21-August-2017 <https://github.com/joke2k/django-environ/compare/v0.4.3...v0.4.4>`__
----------------------------------------------------------------------------------------------
 
-  - Support for django-redis multiple locations (master/slave, shards)
-  - Support for Elasticsearch2
-  - Support for Mysql-connector
-  - Support for pyodbc
-  - Add __contains__ feature to Environ class
-  - Fix Path subtracting
+Proxy value
+-----------
 
+You can set a value prefixed by ``$`` to use as a proxy to another variable value:
 
-`0.4.3 - 21-August-2017 <https://github.com/joke2k/django-environ/compare/v0.4.2...v0.4.3>`__
----------------------------------------------------------------------------------------------
+.. code-block:: python
 
-  - Rollback the default Environ to os.environ
+    # BAR=FOO
+    # PROXY=$BAR
+    >>> print env.str('PROXY')
+    FOO
 
-`0.4.2 - 13-April-2017 <https://github.com/joke2k/django-environ/compare/v0.4.1...v0.4.2>`__
---------------------------------------------------------------------------------------------
+Multiple env files
+------------------
+It is possible to have multiple env files and select one using environment variables.
 
-  - Confirm support for Django 1.11.
-  - Support for Redshift database URL
-  - Fix uwsgi settings reload problem (#55)
-  - Update support for django-redis urls (#109)
+.. code-block:: python
 
-`0.4.1 - 13-November-2016 <https://github.com/joke2k/django-environ/compare/v0.4...v0.4.1>`__
----------------------------------------------------------------------------------------------
-  - Fix for unsafe characters into URLs
-  - Clarifying warning on missing or unreadable file. Thanks to @nickcatal
-  - Add support for Django 1.10.
-  - Fix support for Oracle urls
-  - Fix support for django-redis
+    env = environ.Env()
+    env.read_env(env.str('ENV_PATH', '.env'))
 
+Now ``ENV_PATH=other-env ./manage.py runserver`` uses ``other-env`` while ``./manage.py runserver`` uses ``.env``.
 
-`0.4.0 - 23-September-2015 <https://github.com/joke2k/django-environ/compare/v0.3...v0.4>`__
---------------------------------------------------------------------------------------------
-  - Fix non-ascii values (broken in Python 2.x)
-  - New email schemes - smtp+ssl and smtp+tls (smtps would be deprecated)
-  - redis_cache replaced by django_redis
-  - Add tuple support. Thanks to @anonymouzz
-  - Add LDAP url support for database (django-ldapdb)
-  - Fix psql/pgsql url
+Tests
+=====
 
-`0.3 - 03-June-2014 <https://github.com/joke2k/django-environ/compare/v0.2.1...v0.3>`__
----------------------------------------------------------------------------------------
-  - Add cache url support
-  - Add email url support
-  - Add search url support
-  - Rewriting README.rst
+::
 
-0.2.1 19-April-2013
--------------------
-  - environ/environ.py: Env.__call__ now uses Env.get_value instance method
+    $ git clone git@github.com:joke2k/django-environ.git
+    $ cd django-environ/
+    $ python setup.py test
 
-0.2 16-April-2013
+How to Contribute
 -----------------
-  - environ/environ.py, environ/test.py, environ/test_env.txt: add advanced
-    float parsing (comma and dot symbols to separate thousands and decimals)
-  - README.rst, docs/index.rst: fix TYPO in documentation
+#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Contributor Friendly`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet.
+#. Fork `the repository`_ on GitHub to start making your changes to the **develop** branch (or branch off of it).
+#. Write a test which shows that the bug was fixed or that the feature works as expected.
+#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to `Authors file`_.
 
-0.1 02-April-2013
------------------
-  - initial release
+License
+-------
 
-Credits
-=======
+This project is licensed under the MIT License - see the `License file`_ file for details
+
+Changelog
+---------
+
+See the `Changelog file`_ which format is *inspired* by `Keep a Changelog <http://keepachangelog.com/en/1.0.0/>`_.
 
+Credits
+-------
+- See `Authors file`_
 - `12factor`_
 - `12factor-django`_
 - `Two Scoops of Django`_
@@ -354,7 +291,7 @@ Credits
 - `dstufft`_ / `dj-search-url`_
 - `julianwachholz`_ / `dj-config-url`_
 - `nickstenning`_ / `honcho`_
-- `envparse`_
+- `rconradharris`_ / `envparse`_
 - `Distribute`_
 - `modern-package-template`_
 
@@ -380,6 +317,7 @@ Credits
 .. _honcho: https://github.com/nickstenning/honcho
 
 .. _12factor: http://www.12factor.net/
+.. _`Twelve-factor methodology`: http://www.12factor.net/
 .. _12factor-django: http://www.wellfireinteractive.com/blog/easier-12-factor-django/
 .. _`Two Scoops of Django`: http://twoscoopspress.org/
 
@@ -388,7 +326,7 @@ Credits
 
 .. _cookiecutter-django: https://github.com/pydanny/cookiecutter-django
 
-.. |pypi| image:: https://img.shields.io/pypi/v/django-environ.svg?style=flat-square&label=version
+.. |pypi| image:: https://img.shields.io/pypi/v/django-environ.svg?style=flat-square
     :target: https://pypi.python.org/pypi/django-environ
     :alt: Latest version released on PyPi
 
@@ -396,16 +334,30 @@ Credits
     :target: https://coveralls.io/r/joke2k/django-environ?branch=master
     :alt: Test coverage
 
-.. |unix_build| image:: https://img.shields.io/travis/joke2k/django-environ/master.svg?style=flat-square&label=unix%20build
+.. |unix_build| image:: https://img.shields.io/travis/joke2k/django-environ/master.svg?style=flat-square&logo=travis
     :target: http://travis-ci.org/joke2k/django-environ
     :alt: Build status of the master branch on Mac/Linux
 
-.. |windows_build|  image:: https://img.shields.io/appveyor/ci/joke2k/django-environ.svg?style=flat-square&label=windows%20build
+.. |windows_build|  image:: https://img.shields.io/appveyor/ci/joke2k/django-environ.svg?style=flat-square&logo=windows
     :target: https://ci.appveyor.com/project/joke2k/django-environ
     :alt: Build status of the master branch on Windows
 
+.. |contributors| image:: https://img.shields.io/github/contributors/joke2k/django-environ.svg?style=flat-square
+    :target: https://github.com/joke2k/django-environ/graphs/contributors
+
 .. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square
     :target: https://raw.githubusercontent.com/joke2k/django-environ/master/LICENSE.txt
     :alt: Package license
 
-.. _LICENSE_FILE: https://github.com/joke2k/django-environ/blob/master/LICENSE.txt
+.. |say_thanks| image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg?style=flat-square
+    :target: https://saythanks.io/to/joke2k
+    :alt: Say Thanks!
+
+.. |cover| image:: https://farm2.staticflickr.com/1745/42580036751_35f76a92fe_h.jpg
+    :alt: Photo by Singkham from Pexels
+
+.. _`License file`: https://github.com/joke2k/django-environ/blob/develop/LICENSE.txt
+.. _`Changelog file`: https://github.com/joke2k/django-environ/blob/develop/CHANGELOG.rst
+.. _`Authors file`: https://github.com/joke2k/django-environ/blob/develop/AUTHORS.rst
+.. _`Contributor Friendly`: https://github.com/joke2k/django-environ/issues?direction=desc&labels=contributor-friendly&page=1&sort=updated&state=open
+.. _`the repository`: https://github.com/joke2k/django-environ
\ No newline at end of file
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..6f0d1bd
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,45 @@
+# https://ci.appveyor.com/project/joke2k/django-environ
+build: false
+environment:
+  PYTHONIOENCODING: "utf-8"
+  matrix:
+    - PYTHON: "C:/Python27"
+      DJANGO_VERSION: "Django>=1.8,<1.9"
+
+    - PYTHON: "C:/Python27"
+      DJANGO_VERSION: "Django>=1.9,<1.10"
+
+    - PYTHON: "C:/Python27"
+      DJANGO_VERSION: "Django>=1.10,<1.11"
+
+    - PYTHON: "C:/Python27"
+      DJANGO_VERSION: "Django>=1.11,<2.0"
+
+    - PYTHON: "C:/Python35"
+      DJANGO_VERSION: "Django>=1.8,<1.9"
+
+    - PYTHON: "C:/Python35"
+      DJANGO_VERSION: "Django>=1.9,<1.10"
+
+    - PYTHON: "C:/Python35"
+      DJANGO_VERSION: "Django>=1.10,<1.11"
+
+    - PYTHON: "C:/Python35"
+      DJANGO_VERSION: "Django>=1.11,<2.0"
+
+    - PYTHON: "C:/Python35"
+      DJANGO_VERSION: "Django>=2.0,<2.1"
+
+init:
+  - "ECHO %PYTHON%"
+  - ps: "ls C:/Python*"
+install:
+  - ps: |
+      [Net.ServicePointManager]::SecurityProtocol = 'Tls11, Tls12'
+      (new-object net.webclient).DownloadFile('https://bootstrap.pypa.io/get-pip.py', 'C:/get-pip.py')
+  - "%PYTHON%/python.exe C:/get-pip.py"
+  - "%PYTHON%/Scripts/pip.exe install \"%DJANGO_VERSION%\""
+  - "%PYTHON%/Scripts/pip.exe install -e ."
+test_script:
+  - "%PYTHON%/Scripts/pip.exe --version"
+  - "%PYTHON%/python.exe setup.py test"
diff --git a/debian/changelog b/debian/changelog
index 606799c..f094d78 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+django-environ (0.4.4+git20191018.f0af058-1) UNRELEASED; urgency=medium
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Wed, 06 Nov 2019 18:19:54 +0000
+
 django-environ (0.4.4-2) unstable; urgency=medium
 
   [ Ondřej Nový ]
diff --git a/django_environ.egg-info/PKG-INFO b/django_environ.egg-info/PKG-INFO
deleted file mode 100644
index c412c77..0000000
--- a/django_environ.egg-info/PKG-INFO
+++ /dev/null
@@ -1,441 +0,0 @@
-Metadata-Version: 1.1
-Name: django-environ
-Version: 0.4.4
-Summary: Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application.
-Home-page: https://github.com/joke2k/django-environ
-Author: joke2k
-Author-email: joke2k@gmail.com
-License: MIT License
-Description: ==============
-        Django-environ
-        ==============
-        
-        Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application.
-        
-        |pypi| |unix_build| |windows_build| |coverage| |license|
-        
-        
-        This module is a merge of:
-        
-        * `envparse`_
-        * `honcho`_
-        * `dj-database-url`_
-        * `dj-search-url`_
-        * `dj-config-url`_
-        * `django-cache-url`_
-        
-        and inspired by:
-        
-        * `12factor`_
-        * `12factor-django`_
-        * `Two Scoops of Django`_
-        
-        This is your `settings.py` file before you have installed **django-environ**
-        
-        .. code-block:: python
-        
-            import os
-            SITE_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
-        
-            DEBUG = True
-            TEMPLATE_DEBUG = DEBUG
-        
-            DATABASES = {
-                'default': {
-                    'ENGINE': 'django.db.backends.postgresql_psycopg2',
-                    'NAME': 'database',
-                    'USER': 'user',
-                    'PASSWORD': 'githubbedpassword',
-                    'HOST': '127.0.0.1',
-                    'PORT': '8458',
-                },
-                'extra': {
-                    'ENGINE': 'django.db.backends.sqlite3',
-                    'NAME': os.path.join(SITE_ROOT, 'database.sqlite')
-                }
-            }
-        
-            MEDIA_ROOT = os.path.join(SITE_ROOT, 'assets')
-            MEDIA_URL = 'media/'
-            STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
-            STATIC_URL = 'static/'
-        
-            SECRET_KEY = '...im incredibly still here...'
-        
-            CACHES = {
-                'default': {
-                    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
-                    'LOCATION': [
-                        '127.0.0.1:11211', '127.0.0.1:11212', '127.0.0.1:11213',
-                    ]
-                },
-                'redis': {
-                    'BACKEND': 'django_redis.cache.RedisCache',
-                    'LOCATION': '127.0.0.1:6379/1',
-                    'OPTIONS': {
-                        'CLIENT_CLASS': 'django_redis.client.DefaultClient',
-                        'PASSWORD': 'redis-githubbed-password',
-                    }
-                }
-            }
-        
-        After:
-        
-        .. code-block:: python
-        
-            import environ
-            root = environ.Path(__file__) - 3 # three folder back (/a/b/c/ - 3 = /)
-            env = environ.Env(DEBUG=(bool, False),) # set default values and casting
-            environ.Env.read_env() # reading .env file
-        
-            SITE_ROOT = root()
-        
-            DEBUG = env('DEBUG') # False if not in os.environ
-            TEMPLATE_DEBUG = DEBUG
-        
-            DATABASES = {
-                'default': env.db(), # Raises ImproperlyConfigured exception if DATABASE_URL not in os.environ
-                'extra': env.db('SQLITE_URL', default='sqlite:////tmp/my-tmp-sqlite.db')
-            }
-        
-            public_root = root.path('public/')
-        
-            MEDIA_ROOT = public_root('media')
-            MEDIA_URL = 'media/'
-            STATIC_ROOT = public_root('static')
-            STATIC_URL = 'static/'
-        
-            SECRET_KEY = env('SECRET_KEY') # Raises ImproperlyConfigured exception if SECRET_KEY not in os.environ
-        
-            CACHES = {
-                'default': env.cache(),
-                'redis': env.cache('REDIS_URL')
-            }
-        
-        You can also pass ``read_env()`` an explicit path to the ``.env`` file.
-        
-        Create a ``.env`` file:
-        
-        .. code-block:: bash
-        
-            DEBUG=on
-            # DJANGO_SETTINGS_MODULE=myapp.settings.dev
-            SECRET_KEY=your-secret-key
-            DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database
-            # SQLITE_URL=sqlite:///my-local-sqlite.db
-            CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
-            REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=redis-un-githubbed-password
-        
-        
-        How to install
-        ==============
-        
-        ::
-        
-            $ pip install django-environ
-        
-        
-        How to use
-        ==========
-        
-        There are only two classes, ``environ.Env`` and ``environ.Path``
-        
-        .. code-block:: python
-        
-            >>> import environ
-            >>> env = environ.Env(
-                    DEBUG=(bool, False),
-                )
-            >>> env('DEBUG')
-            False
-            >>> env('DEBUG', default=True)
-            True
-        
-            >>> open('.myenv', 'a').write('DEBUG=on')
-            >>> environ.Env.read_env('.myenv') # or env.read_env('.myenv')
-            >>> env('DEBUG')
-            True
-        
-            >>> open('.myenv', 'a').write('\nINT_VAR=1010')
-            >>> env.int('INT_VAR'), env.str('INT_VAR')
-            1010, '1010'
-        
-            >>> open('.myenv', 'a').write('\nDATABASE_URL=sqlite:///my-local-sqlite.db')
-            >>> env.read_env('.myenv')
-            >>> env.db()
-            {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'my-local-sqlite.db', 'HOST': '', 'USER': '', 'PASSWORD': '', 'PORT': ''}
-        
-            >>> root = env.path('/home/myproject/')
-            >>> root('static')
-            '/home/myproject/static'
-        
-        
-        See `cookiecutter-django`_ for a concrete example on using with a django project.
-        
-        
-        Supported Types
-        ===============
-        
-        - str
-        - bool
-        - int
-        - float
-        - json
-        - list (FOO=a,b,c)
-        - tuple (FOO=(a,b,c))
-        - dict (BAR=key=val,foo=bar) #environ.Env(BAR=(dict, {}))
-        - dict (BAR=key=val;foo=1.1;baz=True) #environ.Env(BAR=(dict(value=unicode, cast=dict(foo=float,baz=bool)), {}))
-        - url
-        - path (environ.Path)
-        - db_url
-            -  PostgreSQL: postgres://, pgsql://, psql:// or postgresql://
-            -  PostGIS: postgis://
-            -  MySQL: mysql:// or mysql2://
-            -  MySQL for GeoDjango: mysqlgis://
-            -  SQLITE: sqlite://
-            -  SQLITE with SPATIALITE for GeoDjango: spatialite://
-            -  Oracle: oracle://
-            -  PyODBC: pyodbc://
-            -  Redshift: redshift://
-            -  LDAP: ldap://
-        - cache_url
-            -  Database: dbcache://
-            -  Dummy: dummycache://
-            -  File: filecache://
-            -  Memory: locmemcache://
-            -  Memcached: memcache://
-            -  Python memory: pymemcache://
-            -  Redis: rediscache://
-        - search_url
-            - ElasticSearch: elasticsearch://
-            - Solr: solr://
-            - Whoosh: whoosh://
-            - Xapian: xapian://
-            - Simple cache: simple://
-        - email_url
-            - SMTP: smtp://
-            - SMTP+SSL: smtp+ssl://
-            - SMTP+TLS: smtp+tls://
-            - Console mail: consolemail://
-            - File mail: filemail://
-            - LocMem mail: memorymail://
-            - Dummy mail: dummymail://
-        
-        Tips
-        ====
-        
-        Using unsafe characters in URLs
-        -------------------------------
-        
-        In order to use unsafe characters you have to encode with ``urllib.parse.encode`` before you set into ``.env`` file.
-        
-        .. code-block::
-        
-            DATABASE_URL=mysql://user:%23password@127.0.0.1:3306/dbname
-        
-        
-        See https://perishablepress.com/stop-using-unsafe-characters-in-urls/ for reference.
-        
-        Multiple redis cache locations
-        ------------------------------
-        
-        For redis cache, `multiple master/slave or shard locations <http://niwinz.github.io/django-redis/latest/#_pluggable_clients>`_ can be configured as follows:
-        
-        .. code-block::
-        
-            CACHE_URL='rediscache://master:6379,slave1:6379,slave2:6379/1'
-        
-        Email settings
-        --------------
-        
-        In order to set email configuration for django you can use this code:
-        
-        .. code-block:: python
-        
-            EMAIL_CONFIG = env.email_url(
-                'EMAIL_URL', default='smtp://user@:password@localhost:25')
-        
-            vars().update(EMAIL_CONFIG)
-        
-        
-        SQLite urls
-        -----------
-        
-        SQLite connects to file based databases. The same URL format is used, omitting the hostname,
-        and using the "file" portion as the filename of the database.
-        This has the effect of four slashes being present for an absolute
-        file path: sqlite:////full/path/to/your/database/file.sqlite.
-        
-        
-        Tests
-        =====
-        
-        ::
-        
-            $ git clone git@github.com:joke2k/django-environ.git
-            $ cd django-environ/
-            $ python setup.py test
-        
-        
-        License
-        =======
-        
-        Django-environ is licensed under the MIT License - see the `LICENSE_FILE`_ file for details
-        
-        Changelog
-        =========
-        
-        
-        `0.4.4 - 21-August-2017 <https://github.com/joke2k/django-environ/compare/v0.4.3...v0.4.4>`__
-        ---------------------------------------------------------------------------------------------
-        
-          - Support for django-redis multiple locations (master/slave, shards)
-          - Support for Elasticsearch2
-          - Support for Mysql-connector
-          - Support for pyodbc
-          - Add __contains__ feature to Environ class
-          - Fix Path subtracting
-        
-        
-        `0.4.3 - 21-August-2017 <https://github.com/joke2k/django-environ/compare/v0.4.2...v0.4.3>`__
-        ---------------------------------------------------------------------------------------------
-        
-          - Rollback the default Environ to os.environ
-        
-        `0.4.2 - 13-April-2017 <https://github.com/joke2k/django-environ/compare/v0.4.1...v0.4.2>`__
-        --------------------------------------------------------------------------------------------
-        
-          - Confirm support for Django 1.11.
-          - Support for Redshift database URL
-          - Fix uwsgi settings reload problem (#55)
-          - Update support for django-redis urls (#109)
-        
-        `0.4.1 - 13-November-2016 <https://github.com/joke2k/django-environ/compare/v0.4...v0.4.1>`__
-        ---------------------------------------------------------------------------------------------
-          - Fix for unsafe characters into URLs
-          - Clarifying warning on missing or unreadable file. Thanks to @nickcatal
-          - Add support for Django 1.10.
-          - Fix support for Oracle urls
-          - Fix support for django-redis
-        
-        
-        `0.4.0 - 23-September-2015 <https://github.com/joke2k/django-environ/compare/v0.3...v0.4>`__
-        --------------------------------------------------------------------------------------------
-          - Fix non-ascii values (broken in Python 2.x)
-          - New email schemes - smtp+ssl and smtp+tls (smtps would be deprecated)
-          - redis_cache replaced by django_redis
-          - Add tuple support. Thanks to @anonymouzz
-          - Add LDAP url support for database (django-ldapdb)
-          - Fix psql/pgsql url
-        
-        `0.3 - 03-June-2014 <https://github.com/joke2k/django-environ/compare/v0.2.1...v0.3>`__
-        ---------------------------------------------------------------------------------------
-          - Add cache url support
-          - Add email url support
-          - Add search url support
-          - Rewriting README.rst
-        
-        0.2.1 19-April-2013
-        -------------------
-          - environ/environ.py: Env.__call__ now uses Env.get_value instance method
-        
-        0.2 16-April-2013
-        -----------------
-          - environ/environ.py, environ/test.py, environ/test_env.txt: add advanced
-            float parsing (comma and dot symbols to separate thousands and decimals)
-          - README.rst, docs/index.rst: fix TYPO in documentation
-        
-        0.1 02-April-2013
-        -----------------
-          - initial release
-        
-        Credits
-        =======
-        
-        - `12factor`_
-        - `12factor-django`_
-        - `Two Scoops of Django`_
-        - `rconradharris`_ / `envparse`_
-        - `kennethreitz`_ / `dj-database-url`_
-        - `migonzalvar`_ / `dj-email-url`_
-        - `ghickman`_ / `django-cache-url`_
-        - `dstufft`_ / `dj-search-url`_
-        - `julianwachholz`_ / `dj-config-url`_
-        - `nickstenning`_ / `honcho`_
-        - `envparse`_
-        - `Distribute`_
-        - `modern-package-template`_
-        
-        .. _rconradharris: https://github.com/rconradharris
-        .. _envparse: https://github.com/rconradharris/envparse
-        
-        .. _kennethreitz: https://github.com/kennethreitz
-        .. _dj-database-url: https://github.com/kennethreitz/dj-database-url
-        
-        .. _migonzalvar: https://github.com/migonzalvar
-        .. _dj-email-url: https://github.com/migonzalvar/dj-email-url
-        
-        .. _ghickman: https://github.com/ghickman
-        .. _django-cache-url: https://github.com/ghickman/django-cache-url
-        
-        .. _julianwachholz: https://github.com/julianwachholz
-        .. _dj-config-url: https://github.com/julianwachholz/dj-config-url
-        
-        .. _dstufft: https://github.com/dstufft
-        .. _dj-search-url: https://github.com/dstufft/dj-search-url
-        
-        .. _nickstenning: https://github.com/nickstenning
-        .. _honcho: https://github.com/nickstenning/honcho
-        
-        .. _12factor: http://www.12factor.net/
-        .. _12factor-django: http://www.wellfireinteractive.com/blog/easier-12-factor-django/
-        .. _`Two Scoops of Django`: http://twoscoopspress.org/
-        
-        .. _Distribute: http://pypi.python.org/pypi/distribute
-        .. _`modern-package-template`: http://pypi.python.org/pypi/modern-package-template
-        
-        .. _cookiecutter-django: https://github.com/pydanny/cookiecutter-django
-        
-        .. |pypi| image:: https://img.shields.io/pypi/v/django-environ.svg?style=flat-square&label=version
-            :target: https://pypi.python.org/pypi/django-environ
-            :alt: Latest version released on PyPi
-        
-        .. |coverage| image:: https://img.shields.io/coveralls/joke2k/django-environ/master.svg?style=flat-square
-            :target: https://coveralls.io/r/joke2k/django-environ?branch=master
-            :alt: Test coverage
-        
-        .. |unix_build| image:: https://img.shields.io/travis/joke2k/django-environ/master.svg?style=flat-square&label=unix%20build
-            :target: http://travis-ci.org/joke2k/django-environ
-            :alt: Build status of the master branch on Mac/Linux
-        
-        .. |windows_build|  image:: https://img.shields.io/appveyor/ci/joke2k/django-environ.svg?style=flat-square&label=windows%20build
-            :target: https://ci.appveyor.com/project/joke2k/django-environ
-            :alt: Build status of the master branch on Windows
-        
-        .. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square
-            :target: https://raw.githubusercontent.com/joke2k/django-environ/master/LICENSE.txt
-            :alt: Package license
-        
-        .. _LICENSE_FILE: https://github.com/joke2k/django-environ/blob/master/LICENSE.txt
-        
-Keywords: django environment variables 12factor
-Platform: any
-Classifier: Development Status :: 3 - Alpha
-Classifier: Intended Audience :: Information Technology
-Classifier: Framework :: Django
-Classifier: Framework :: Django :: 1.8
-Classifier: Framework :: Django :: 1.9
-Classifier: Framework :: Django :: 1.10
-Classifier: Framework :: Django :: 1.11
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Utilities
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Framework :: Django
diff --git a/django_environ.egg-info/SOURCES.txt b/django_environ.egg-info/SOURCES.txt
deleted file mode 100644
index c659daf..0000000
--- a/django_environ.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-LICENSE.txt
-MANIFEST.in
-README.rst
-setup.cfg
-setup.py
-django_environ.egg-info/PKG-INFO
-django_environ.egg-info/SOURCES.txt
-django_environ.egg-info/dependency_links.txt
-django_environ.egg-info/not-zip-safe
-django_environ.egg-info/requires.txt
-django_environ.egg-info/top_level.txt
-environ/__init__.py
-environ/environ.py
-environ/test.py
-environ/test_env.txt
\ No newline at end of file
diff --git a/django_environ.egg-info/dependency_links.txt b/django_environ.egg-info/dependency_links.txt
deleted file mode 100644
index 8b13789..0000000
--- a/django_environ.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/django_environ.egg-info/not-zip-safe b/django_environ.egg-info/not-zip-safe
deleted file mode 100644
index 8b13789..0000000
--- a/django_environ.egg-info/not-zip-safe
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/django_environ.egg-info/requires.txt b/django_environ.egg-info/requires.txt
deleted file mode 100644
index 2b509cb..0000000
--- a/django_environ.egg-info/requires.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-django
-six
diff --git a/django_environ.egg-info/top_level.txt b/django_environ.egg-info/top_level.txt
deleted file mode 100644
index 96bf3cc..0000000
--- a/django_environ.egg-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-environ
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..f472350
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,153 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Django-environ.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Django-environ.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/Django-environ"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Django-environ"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000..aa9efd6
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,243 @@
+# -*- coding: utf-8 -*-
+#
+# Django-environ documentation build configuration file, created by
+# sphinx-quickstart on Mon Apr  1 23:01:04 2013.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+sys.path.insert(0, os.path.dirname(os.path.abspath('.')))
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Django-environ'
+copyright = u'2013-2015, Daniele Faraglia and other contributors'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.4'
+# The full version, including alpha/beta/rc tags.
+release = '0.4.4'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'Django-environdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'Django-environ.tex', u'Django-environ Documentation',
+   u'joke2k', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'django-environ', u'Django-environ Documentation',
+     [u'joke2k'], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output ------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+  ('index', 'Django-environ', u'Django-environ Documentation',
+   u'joke2k', 'Django-environ', "Django-environ allows you to utilize 12factor inspired environment "
+                                "variables to configure your Django application.",
+   'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000..9d113eb
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,64 @@
+Welcome to Django-environ's documentation!
+==========================================
+
+.. automodule:: environ.environ
+
+.. include:: ../README.rst
+
+environ.Env
+===========
+
+..  autoclass:: environ.environ.Env
+
+    ..  autoattribute:: BOOLEAN_TRUE_STRINGS
+    ..  autoattribute:: DB_SCHEMES
+    ..  autoattribute:: DEFAULT_DATABASE_ENV
+    ..  autoattribute:: CACHE_SCHEMES
+    ..  autoattribute:: DEFAULT_CACHE_ENV
+    ..  autoattribute:: EMAIL_SCHEMES
+    ..  autoattribute:: DEFAULT_EMAIL_ENV
+    ..  autoattribute:: SEARCH_SCHEMES
+    ..  autoattribute:: DEFAULT_SEARCH_ENV
+
+    ..  automethod:: __call__
+    ..  automethod:: str
+    ..  automethod:: bool
+    ..  automethod:: int
+    ..  automethod:: float
+    ..  automethod:: json
+    ..  automethod:: list
+    ..  automethod:: dict
+    ..  automethod:: url
+    ..  automethod:: db_url
+    ..  automethod:: cache_url
+    ..  automethod:: email_url
+    ..  automethod:: search_url
+    ..  automethod:: path
+
+    ..  automethod:: read_env
+    ..  automethod:: db_url_config
+    ..  automethod:: cache_url_config
+    ..  automethod:: email_url_config
+    ..  automethod:: search_url_config
+    ..  automethod:: get_value
+    ..  automethod:: parse_value
+
+
+environ.Path
+============
+
+..  autoclass:: environ.environ.Path
+
+    ..  py:attribute:: root -> Retrieve absolute path
+    ..  automethod:: __call__
+    ..  automethod:: path
+    ..  automethod:: file
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 0000000..3bc37ba
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,190 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+	:help
+	echo.Please use `make ^<target^>` where ^<target^> is one of
+	echo.  html       to make standalone HTML files
+	echo.  dirhtml    to make HTML files named index.html in directories
+	echo.  singlehtml to make a single large HTML file
+	echo.  pickle     to make pickle files
+	echo.  json       to make JSON files
+	echo.  htmlhelp   to make HTML files and a HTML help project
+	echo.  qthelp     to make HTML files and a qthelp project
+	echo.  devhelp    to make HTML files and a Devhelp project
+	echo.  epub       to make an epub
+	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+	echo.  text       to make text files
+	echo.  man        to make manual pages
+	echo.  texinfo    to make Texinfo files
+	echo.  gettext    to make PO message catalogs
+	echo.  changes    to make an overview over all changed/added/deprecated items
+	echo.  linkcheck  to check all external links for integrity
+	echo.  doctest    to run all doctests embedded in the documentation if enabled
+	goto end
+)
+
+if "%1" == "clean" (
+	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+	del /q /s %BUILDDIR%\*
+	goto end
+)
+
+if "%1" == "html" (
+	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+	goto end
+)
+
+if "%1" == "dirhtml" (
+	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+	goto end
+)
+
+if "%1" == "singlehtml" (
+	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+	goto end
+)
+
+if "%1" == "pickle" (
+	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the pickle files.
+	goto end
+)
+
+if "%1" == "json" (
+	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the JSON files.
+	goto end
+)
+
+if "%1" == "htmlhelp" (
+	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+	goto end
+)
+
+if "%1" == "qthelp" (
+	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Django-environ.qhcp
+	echo.To view the help file:
+	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Django-environ.ghc
+	goto end
+)
+
+if "%1" == "devhelp" (
+	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished.
+	goto end
+)
+
+if "%1" == "epub" (
+	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The epub file is in %BUILDDIR%/epub.
+	goto end
+)
+
+if "%1" == "latex" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "text" (
+	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The text files are in %BUILDDIR%/text.
+	goto end
+)
+
+if "%1" == "man" (
+	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The manual pages are in %BUILDDIR%/man.
+	goto end
+)
+
+if "%1" == "texinfo" (
+	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
+	goto end
+)
+
+if "%1" == "gettext" (
+	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
+	goto end
+)
+
+if "%1" == "changes" (
+	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.The overview file is in %BUILDDIR%/changes.
+	goto end
+)
+
+if "%1" == "linkcheck" (
+	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+	goto end
+)
+
+if "%1" == "doctest" (
+	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+	goto end
+)
+
+:end
diff --git a/environ/compat.py b/environ/compat.py
new file mode 100644
index 0000000..9b39edc
--- /dev/null
+++ b/environ/compat.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+
+"""
+environ.compat
+~~~~~~~~~~~~~~~
+This module handles import compatibility issues between Python 2 and
+Python 3.
+"""
+
+import sys
+import pkgutil
+
+# -------
+# Pythons
+# -------
+
+# Syntax sugar.
+_ver = sys.version_info
+
+#: Python 2.x?
+is_py2 = (_ver[0] == 2)
+
+#: Python 3.x?
+is_py3 = (_ver[0] == 3)
+
+if is_py2:
+    import urlparse as urlparselib
+    from urllib import quote, unquote_plus
+
+    basestring = basestring
+
+elif is_py3:
+    import urllib.parse as urlparselib
+    quote = urlparselib.quote
+    unquote_plus = urlparselib.unquote_plus
+
+    basestring = str
+
+urlparse = urlparselib.urlparse
+urlunparse = urlparselib.urlunparse
+ParseResult = urlparselib.ParseResult
+parse_qs = urlparselib.parse_qs
+
+if pkgutil.find_loader('simplejson'):
+    import simplejson as json
+else:
+    import json
+
+if pkgutil.find_loader('django'):
+    from django import VERSION as DJANGO_VERSION
+    from django.core.exceptions import ImproperlyConfigured
+else:
+    DJANGO_VERSION = None
+
+    class ImproperlyConfigured(Exception):
+        pass
+
+# back compatibility with django postgresql package
+if DJANGO_VERSION is not None and DJANGO_VERSION < (2, 0):
+    DJANGO_POSTGRES = 'django.db.backends.postgresql_psycopg2'
+else:
+    # https://docs.djangoproject.com/en/2.0/releases/2.0/#id1
+    DJANGO_POSTGRES = 'django.db.backends.postgresql'
+
+# back compatibility with redis_cache package
+if pkgutil.find_loader('redis_cache'):
+    REDIS_DRIVER = 'redis_cache.RedisCache'
+else:
+    REDIS_DRIVER = 'django_redis.cache.RedisCache'
diff --git a/environ/environ.py b/environ/environ.py
index 1365a29..ea4978c 100644
--- a/environ/environ.py
+++ b/environ/environ.py
@@ -2,47 +2,39 @@
 Django-environ allows you to utilize 12factor inspired environment
 variables to configure your Django application.
 """
-import json
+import ast
 import logging
 import os
 import re
 import sys
 import warnings
-
-try:
-    from django.core.exceptions import ImproperlyConfigured
-except ImportError:
-    class ImproperlyConfigured(Exception):
-        pass
-
-from six.moves import urllib
-from six import string_types
+from .compat import (
+    json, urlparselib, urlparse, urlunparse, ParseResult, parse_qs,
+    unquote_plus, DJANGO_POSTGRES, REDIS_DRIVER, ImproperlyConfigured, basestring)
 
 logger = logging.getLogger(__name__)
 
 
-VERSION = '0.4.4'
+VERSION = '0.4.5'
 __author__ = 'joke2k'
 __version__ = tuple(VERSION.split('.'))
 
 
+def _cast(value):
+    # Safely evaluate an expression node or a string containing a Python
+    # literal or container display.
+    # https://docs.python.org/3/library/ast.html#ast.literal_eval
+    try:
+        return ast.literal_eval(value)
+    except ValueError:
+        return value
+
 # return int if possible
 def _cast_int(v):
     return int(v) if hasattr(v, 'isdigit') and v.isdigit() else v
 
 def _cast_urlstr(v):
-    return urllib.parse.unquote_plus(v) if isinstance(v, str) else v
-
-# back compatibility with redis_cache package
-DJANGO_REDIS_DRIVER = 'django_redis.cache.RedisCache'
-DJANGO_REDIS_CACHE_DRIVER = 'redis_cache.RedisCache'
-
-REDIS_DRIVER = DJANGO_REDIS_DRIVER
-try:
-    import redis_cache
-    REDIS_DRIVER = DJANGO_REDIS_CACHE_DRIVER
-except:
-    pass
+    return unquote_plus(v) if isinstance(v, str) else v
 
 
 class NoValue(object):
@@ -66,18 +58,19 @@ class Env(object):
     ENVIRON = os.environ
     NOTSET = NoValue()
     BOOLEAN_TRUE_STRINGS = ('true', 'on', 'ok', 'y', 'yes', '1')
-    URL_CLASS = urllib.parse.ParseResult
+    URL_CLASS = ParseResult
     DEFAULT_DATABASE_ENV = 'DATABASE_URL'
     DB_SCHEMES = {
-        'postgres': 'django.db.backends.postgresql_psycopg2',
-        'postgresql': 'django.db.backends.postgresql_psycopg2',
-        'psql': 'django.db.backends.postgresql_psycopg2',
-        'pgsql': 'django.db.backends.postgresql_psycopg2',
+        'postgres': DJANGO_POSTGRES,
+        'postgresql': DJANGO_POSTGRES,
+        'psql': DJANGO_POSTGRES,
+        'pgsql': DJANGO_POSTGRES,
         'postgis': 'django.contrib.gis.db.backends.postgis',
         'mysql': 'django.db.backends.mysql',
         'mysql2': 'django.db.backends.mysql',
         'mysql-connector': 'mysql.connector.django',
         'mysqlgis': 'django.contrib.gis.db.backends.mysql',
+        'mssql': 'sql_server.pyodbc',
         'oracle': 'django.db.backends.oracle',
         'pyodbc': 'sql_server.pyodbc',
         'redshift': 'django_redshift_backend',
@@ -134,11 +127,14 @@ class Env(object):
 
     # Shortcuts
 
-    def str(self, var, default=NOTSET):
+    def str(self, var, default=NOTSET, multiline=False):
         """
         :rtype: str
         """
-        return self.get_value(var, default=default)
+        value = self.get_value(var, default=default)
+        if multiline:
+            return value.replace('\\n', '\n')
+        return value
 
     def unicode(self, var, default=NOTSET):
         """Helper for python2
@@ -146,6 +142,12 @@ class Env(object):
         """
         return self.get_value(var, cast=str, default=default)
 
+    def bytes(self, var, default=NOTSET, encoding='utf8'):
+        """
+        :rtype: bytes
+        """
+        return self.get_value(var, cast=str).encode(encoding)
+
     def bool(self, var, default=NOTSET):
         """
         :rtype: bool
@@ -192,7 +194,7 @@ class Env(object):
         """
         :rtype: urlparse.ParseResult
         """
-        return self.get_value(var, cast=urllib.parse.urlparse, default=default, parse_default=True)
+        return self.get_value(var, cast=urlparse, default=default, parse_default=True)
 
     def db_url(self, var=DEFAULT_DATABASE_ENV, default=NOTSET, engine=None):
         """Returns a config dictionary, defaulting to DATABASE_URL.
@@ -281,6 +283,9 @@ class Env(object):
             value = value.lstrip('$')
             value = self.get_value(value, cast=cast, default=default)
 
+        if cast is None and default is not None and not isinstance(default, NoValue):
+            cast = type(default)
+
         if value != default or (parse_default and value):
             value = self.parse_value(value, cast)
 
@@ -354,7 +359,7 @@ class Env(object):
         >>> Env.db_url_config('sqlite:////full/path/to/your/file.sqlite')
         {'ENGINE': 'django.db.backends.sqlite3', 'HOST': '', 'NAME': '/full/path/to/your/file.sqlite', 'PASSWORD': '', 'PORT': '', 'USER': ''}
         >>> Env.db_url_config('postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn')
-        {'ENGINE': 'django.db.backends.postgresql_psycopg2', 'HOST': 'ec2-107-21-253-135.compute-1.amazonaws.com', 'NAME': 'd8r82722r2kuvn', 'PASSWORD': 'wegauwhgeuioweg', 'PORT': 5431, 'USER': 'uf07k1i6d8ia0v'}
+        {'ENGINE': 'django.db.backends.postgresql', 'HOST': 'ec2-107-21-253-135.compute-1.amazonaws.com', 'NAME': 'd8r82722r2kuvn', 'PASSWORD': 'wegauwhgeuioweg', 'PORT': 5431, 'USER': 'uf07k1i6d8ia0v'}
 
         """
         if not isinstance(url, cls.URL_CLASS):
@@ -367,18 +372,22 @@ class Env(object):
                     'NAME': ':memory:'
                 }
                 # note: no other settings are required for sqlite
-            url = urllib.parse.urlparse(url)
+            url = urlparse(url)
 
         config = {}
 
         # Remove query strings.
         path = url.path[1:]
-        path = urllib.parse.unquote_plus(path.split('?', 2)[0])
-
-        # if we are using sqlite and we have no path, then assume we
-        # want an in-memory database (this is the behaviour of sqlalchemy)
-        if url.scheme == 'sqlite' and path == '':
-            path = ':memory:'
+        path = unquote_plus(path.split('?', 2)[0])
+
+        if url.scheme == 'sqlite':
+            if path == '':
+                # if we are using sqlite and we have no path, then assume we
+                # want an in-memory database (this is the behaviour of  sqlalchemy)
+                path = ':memory:'
+            if url.netloc:
+                warnings.warn(
+                    'SQLite URL contains host component %r, it will be ignored' % url.netloc, stacklevel=3)
         if url.scheme == 'ldap':
             path = '{scheme}://{hostname}'.format(scheme=url.scheme, hostname=url.hostname)
             if url.port:
@@ -393,6 +402,9 @@ class Env(object):
             'PORT': _cast_int(url.port) or '',
         })
 
+        if url.scheme == 'postgres' and path.startswith('/'):
+            config['HOST'], config['NAME'] = path.rsplit('/', 1)
+
         if url.scheme == 'oracle' and path == '':
             config['NAME'] = config['HOST']
             config['HOST'] = ''
@@ -406,17 +418,20 @@ class Env(object):
 
         if url.query:
             config_options = {}
-            for k, v in urllib.parse.parse_qs(url.query).items():
+            for k, v in parse_qs(url.query).items():
                 if k.upper() in cls._DB_BASE_OPTIONS:
-                    config.update({k.upper(): _cast_int(v[0])})
+                    config.update({k.upper(): _cast(v[0])})
                 else:
                     config_options.update({k: _cast_int(v[0])})
             config['OPTIONS'] = config_options
 
         if engine:
             config['ENGINE'] = engine
-        if url.scheme in Env.DB_SCHEMES:
-            config['ENGINE'] = Env.DB_SCHEMES[url.scheme]
+        else:
+            config['ENGINE'] = url.scheme
+
+        if config['ENGINE'] in Env.DB_SCHEMES:
+            config['ENGINE'] = Env.DB_SCHEMES[config['ENGINE']]
 
         if not config.get('ENGINE', False):
             warnings.warn("Engine not recognized from url: {0}".format(config))
@@ -432,7 +447,7 @@ class Env(object):
         :param backend:
         :return:
         """
-        url = urllib.parse.urlparse(url) if not isinstance(url, cls.URL_CLASS) else url
+        url = urlparse(url) if not isinstance(url, cls.URL_CLASS) else url
 
         location = url.netloc.split(',')
         if len(location) == 1:
@@ -463,8 +478,8 @@ class Env(object):
 
         if url.query:
             config_options = {}
-            for k, v in urllib.parse.parse_qs(url.query).items():
-                opt = {k.upper(): _cast_int(v[0])}
+            for k, v in parse_qs(url.query).items():
+                opt = {k.upper(): _cast(v[0])}
                 if k.upper() in cls._CACHE_BASE_OPTIONS:
                     config.update(opt)
                 else:
@@ -482,11 +497,11 @@ class Env(object):
 
         config = {}
 
-        url = urllib.parse.urlparse(url) if not isinstance(url, cls.URL_CLASS) else url
+        url = urlparse(url) if not isinstance(url, cls.URL_CLASS) else url
 
         # Remove query strings
         path = url.path[1:]
-        path = urllib.parse.unquote_plus(path.split('?', 2)[0])
+        path = unquote_plus(path.split('?', 2)[0])
 
         # Update with environment configuration
         config.update({
@@ -511,7 +526,7 @@ class Env(object):
 
         if url.query:
             config_options = {}
-            for k, v in urllib.parse.parse_qs(url.query).items():
+            for k, v in parse_qs(url.query).items():
                 opt = {k.upper(): _cast_int(v[0])}
                 if k.upper() in cls._EMAIL_BASE_OPTIONS:
                     config.update(opt)
@@ -525,11 +540,11 @@ class Env(object):
     def search_url_config(cls, url, engine=None):
         config = {}
 
-        url = urllib.parse.urlparse(url) if not isinstance(url, cls.URL_CLASS) else url
+        url = urlparse(url) if not isinstance(url, cls.URL_CLASS) else url
 
         # Remove query strings.
         path = url.path[1:]
-        path = urllib.parse.unquote_plus(path.split('?', 2)[0])
+        path = unquote_plus(path.split('?', 2)[0])
 
         if url.scheme not in cls.SEARCH_SCHEMES:
             raise ImproperlyConfigured('Invalid search schema %s' % url.scheme)
@@ -538,7 +553,7 @@ class Env(object):
         # check commons params
         params = {}
         if url.query:
-            params = urllib.parse.parse_qs(url.query)
+            params = parse_qs(url.query)
             if 'EXCLUDED_INDEXES' in params.keys():
                 config['EXCLUDED_INDEXES'] = params['EXCLUDED_INDEXES'][0].split(',')
             if 'INCLUDE_SPELLING' in params.keys():
@@ -557,7 +572,7 @@ class Env(object):
             path = path[:-1]
 
         if url.scheme == 'solr':
-            config['URL'] = urllib.parse.urlunparse(('http',) + url[1:2] + (path,) + ('', '', ''))
+            config['URL'] = urlunparse(('http',) + url[1:2] + (path,) + ('', '', ''))
             if 'TIMEOUT' in params.keys():
                 config['TIMEOUT'] = cls.parse_value(params['TIMEOUT'][0], int)
             return config
@@ -573,7 +588,7 @@ class Env(object):
                 path = ""
                 index = split[0]
 
-            config['URL'] = urllib.parse.urlunparse(('http',) + url[1:2] + (path,) + ('', '', ''))
+            config['URL'] = urlunparse(('http',) + url[1:2] + (path,) + ('', '', ''))
             if 'TIMEOUT' in params.keys():
                 config['TIMEOUT'] = cls.parse_value(params['TIMEOUT'][0], int)
             config['INDEX_NAME'] = index
@@ -616,7 +631,7 @@ class Env(object):
                 return
 
         try:
-            with open(env_file) if isinstance(env_file, string_types) else env_file as f:
+            with open(env_file) if isinstance(env_file, basestring) else env_file as f:
                 content = f.read()
         except IOError:
             warnings.warn(
@@ -627,7 +642,7 @@ class Env(object):
         logger.debug('Read environment variables from: {0}'.format(env_file))
 
         for line in content.splitlines():
-            m1 = re.match(r'\A([A-Za-z_0-9]+)=(.*)\Z', line)
+            m1 = re.match(r'\A(?:export )?([A-Za-z_0-9]+)=(.*)\Z', line)
             if m1:
                 key, val = m1.group(1), m1.group(2)
                 m2 = re.match(r"\A'(.*)'\Z", val)
@@ -723,7 +738,7 @@ class Path(object):
     def __sub__(self, other):
         if isinstance(other, int):
             return self.path('../' * other)
-        elif isinstance(other, string_types):
+        elif isinstance(other, basestring):
             if self.__root__.endswith(other):
                 return Path(self.__root__.rstrip(other))
         raise TypeError(
@@ -753,6 +768,9 @@ class Path(object):
 
     def __getitem__(self, *args, **kwargs):
         return self.__str__().__getitem__(*args, **kwargs)
+    
+    def __fspath__(self):
+        return self.__str__()
 
     def rfind(self, *args, **kwargs):
         return self.__str__().rfind(*args, **kwargs)
@@ -770,9 +788,9 @@ class Path(object):
 
 
 def register_scheme(scheme):
-    for method in dir(urllib.parse):
+    for method in dir(urlparselib):
         if method.startswith('uses_'):
-            getattr(urllib.parse, method).append(scheme)
+            getattr(urlparselib, method).append(scheme)
 
 
 def register_schemes(schemes):
diff --git a/environ/test.py b/environ/test.py
index 78a373f..2325816 100644
--- a/environ/test.py
+++ b/environ/test.py
@@ -1,12 +1,14 @@
 from __future__ import print_function
-import json
 import os
 import sys
 import unittest
+import warnings
 
-from django.core.exceptions import ImproperlyConfigured
+from .compat import (
+    json, DJANGO_POSTGRES, ImproperlyConfigured, REDIS_DRIVER, quote
+)
 
-from environ import Env, Path, REDIS_DRIVER
+from environ import Env, Path
 
 
 class BaseTests(unittest.TestCase):
@@ -18,6 +20,7 @@ class BaseTests(unittest.TestCase):
     SQLITE = 'sqlite:////full/path/to/your/database/file.sqlite'
     ORACLE_TNS = 'oracle://user:password@sid/'
     ORACLE = 'oracle://user:password@host:1521/sid'
+    CUSTOM_BACKEND = 'custom.backend://user:password@example.com:5430/database'
     REDSHIFT = 'redshift://user:password@examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com:5439/dev'
     MEMCACHE = 'memcache://127.0.0.1:11211'
     REDIS = 'rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=secret'
@@ -25,10 +28,12 @@ class BaseTests(unittest.TestCase):
     JSON = dict(one='bar', two=2, three=33.44)
     DICT = dict(foo='bar', test='on')
     PATH = '/home/dev'
+    EXPORTED = 'exported var'
 
     @classmethod
     def generateData(cls):
         return dict(STR_VAR='bar',
+                    MULTILINE_STR_VAR='foo\\nbar',
                     INT_VAR='42',
                     FLOAT_VAR='33.3',
                     FLOAT_COMMA_VAR='33,3',
@@ -51,12 +56,14 @@ class BaseTests(unittest.TestCase):
                     DATABASE_ORACLE_URL=cls.ORACLE,
                     DATABASE_ORACLE_TNS_URL=cls.ORACLE_TNS,
                     DATABASE_REDSHIFT_URL=cls.REDSHIFT,
+                    DATABASE_CUSTOM_BACKEND_URL=cls.CUSTOM_BACKEND,
                     CACHE_URL=cls.MEMCACHE,
                     CACHE_REDIS=cls.REDIS,
                     EMAIL_URL=cls.EMAIL,
                     URL_VAR=cls.URL,
                     JSON_VAR=json.dumps(cls.JSON),
-                    PATH_VAR=cls.PATH)
+                    PATH_VAR=cls.PATH,
+                    EXPORTED_VAR=cls.EXPORTED)
 
     def setUp(self):
         self._old_environ = os.environ
@@ -87,6 +94,11 @@ class EnvTests(BaseTests):
     def test_str(self):
         self.assertTypeAndValue(str, 'bar', self.env('STR_VAR'))
         self.assertTypeAndValue(str, 'bar', self.env.str('STR_VAR'))
+        self.assertTypeAndValue(str, 'foo\\nbar', self.env.str('MULTILINE_STR_VAR'))
+        self.assertTypeAndValue(str, 'foo\nbar', self.env.str('MULTILINE_STR_VAR', multiline=True))
+
+    def test_bytes(self):
+        self.assertTypeAndValue(bytes, b'bar', self.env.bytes('STR_VAR'))
 
     def test_int(self):
         self.assertTypeAndValue(int, 42, self.env('INT_VAR', cast=int))
@@ -114,7 +126,7 @@ class EnvTests(BaseTests):
         self.assertTypeAndValue(bool, False, self.env.bool('BOOL_FALSE_VAR'))
 
     def test_proxied_value(self):
-        self.assertTypeAndValue(str, 'bar', self.env('PROXIED_VAR'))
+        self.assertEqual('bar', self.env('PROXIED_VAR'))
 
     def test_int_list(self):
         self.assertTypeAndValue(list, [42, 33], self.env('INT_LIST', cast=[int]))
@@ -156,15 +168,14 @@ class EnvTests(BaseTests):
         self.assertEqual(None, self.env.url('OTHER_URL', default=None))
 
     def test_url_encoded_parts(self):
-        from six.moves import urllib
         password_with_unquoted_characters = "#password"
-        encoded_url = "mysql://user:%s@127.0.0.1:3306/dbname" % urllib.parse.quote(password_with_unquoted_characters)
+        encoded_url = "mysql://user:%s@127.0.0.1:3306/dbname" % quote(password_with_unquoted_characters)
         parsed_url = self.env.db_url_config(encoded_url)
         self.assertEqual(parsed_url['PASSWORD'], password_with_unquoted_characters)
 
     def test_db_url_value(self):
         pg_config = self.env.db()
-        self.assertEqual(pg_config['ENGINE'], 'django.db.backends.postgresql_psycopg2')
+        self.assertEqual(pg_config['ENGINE'], DJANGO_POSTGRES)
         self.assertEqual(pg_config['NAME'], 'd8r82722')
         self.assertEqual(pg_config['HOST'], 'ec2-107-21-253-135.compute-1.amazonaws.com')
         self.assertEqual(pg_config['USER'], 'uf07k1')
@@ -215,6 +226,14 @@ class EnvTests(BaseTests):
         self.assertEqual(sqlite_config['ENGINE'], 'django.db.backends.sqlite3')
         self.assertEqual(sqlite_config['NAME'], '/full/path/to/your/database/file.sqlite')
 
+        custom_backend_config = self.env.db('DATABASE_CUSTOM_BACKEND_URL')
+        self.assertEqual(custom_backend_config['ENGINE'], 'custom.backend')
+        self.assertEqual(custom_backend_config['NAME'], 'database')
+        self.assertEqual(custom_backend_config['HOST'], 'example.com')
+        self.assertEqual(custom_backend_config['USER'], 'user')
+        self.assertEqual(custom_backend_config['PASSWORD'], 'password')
+        self.assertEqual(custom_backend_config['PORT'], 5430)
+
     def test_cache_url_value(self):
 
         cache_config = self.env.cache_url()
@@ -246,6 +265,16 @@ class EnvTests(BaseTests):
         root = self.env.path('PATH_VAR')
         self.assertTypeAndValue(Path, Path(self.PATH), root)
 
+    def test_smart_cast(self):
+        self.assertEqual(self.env.get_value('STR_VAR', default='string'), 'bar')
+        self.assertEqual(self.env.get_value('BOOL_TRUE_VAR', default=True), True)
+        self.assertEqual(self.env.get_value('BOOL_FALSE_VAR', default=True), False)
+        self.assertEqual(self.env.get_value('INT_VAR', default=1), 42)
+        self.assertEqual(self.env.get_value('FLOAT_VAR', default=1.2), 33.3)
+
+    def test_exported(self):
+        self.assertEqual(self.EXPORTED, self.env('EXPORTED_VAR'))
+
 
 class FileEnvTests(EnvTests):
 
@@ -278,8 +307,8 @@ class SchemaEnvTests(BaseTests):
         self.assertTypeAndValue(int, 42, env('INT_VAR'))
         self.assertTypeAndValue(float, 33.3, env('NOT_PRESENT_VAR'))
 
-        self.assertTypeAndValue(str, 'bar', env('STR_VAR'))
-        self.assertTypeAndValue(str, 'foo', env('NOT_PRESENT2', default='foo'))
+        self.assertEqual('bar', env('STR_VAR'))
+        self.assertEqual('foo', env('NOT_PRESENT2', default='foo'))
 
         self.assertTypeAndValue(list, [42, 33], env('INT_LIST'))
         self.assertTypeAndValue(list, [2], env('DEFAULT_LIST'))
@@ -294,13 +323,21 @@ class DatabaseTestSuite(unittest.TestCase):
         url = 'postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn'
         url = Env.db_url_config(url)
 
-        self.assertEqual(url['ENGINE'], 'django.db.backends.postgresql_psycopg2')
+        self.assertEqual(url['ENGINE'], DJANGO_POSTGRES)
         self.assertEqual(url['NAME'], 'd8r82722r2kuvn')
         self.assertEqual(url['HOST'], 'ec2-107-21-253-135.compute-1.amazonaws.com')
         self.assertEqual(url['USER'], 'uf07k1i6d8ia0v')
         self.assertEqual(url['PASSWORD'], 'wegauwhgeuioweg')
         self.assertEqual(url['PORT'], 5431)
 
+    def test_postgres_parsing_unix_domain_socket(self):
+        url = 'postgres:////var/run/postgresql/db'
+        url = Env.db_url_config(url)
+
+        self.assertEqual(url['ENGINE'], DJANGO_POSTGRES)
+        self.assertEqual(url['NAME'], 'db')
+        self.assertEqual(url['HOST'], '/var/run/postgresql')
+
     def test_postgis_parsing(self):
         url = 'postgis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn'
         url = Env.db_url_config(url)
@@ -358,12 +395,27 @@ class DatabaseTestSuite(unittest.TestCase):
 
         self.assertEqual(url['ENGINE'], 'django.db.backends.sqlite3')
         self.assertEqual(url['NAME'], ':memory:')
+        
+    def test_memory_sqlite_url_warns_about_netloc(self):
+        url = 'sqlite://missing-slash-path'
+        with warnings.catch_warnings(record=True) as w:
+            url = Env.db_url_config(url)
+            self.assertEqual(url['ENGINE'], 'django.db.backends.sqlite3')
+            self.assertEqual(url['NAME'], ':memory:')
+            self.assertEqual(len(w), 1)
+            self.assertTrue(issubclass(w[0].category, UserWarning))
 
     def test_database_options_parsing(self):
         url = 'postgres://user:pass@host:1234/dbname?conn_max_age=600'
         url = Env.db_url_config(url)
         self.assertEqual(url['CONN_MAX_AGE'], 600)
 
+        url = 'postgres://user:pass@host:1234/dbname?conn_max_age=None&autocommit=True&atomic_requests=False'
+        url = Env.db_url_config(url)
+        self.assertEqual(url['CONN_MAX_AGE'], None)
+        self.assertEqual(url['AUTOCOMMIT'], True)
+        self.assertEqual(url['ATOMIC_REQUESTS'], False)
+
         url = 'mysql://user:pass@host:1234/dbname?init_command=SET storage_engine=INNODB'
         url = Env.db_url_config(url)
         self.assertEqual(url['OPTIONS'], {
@@ -384,6 +436,20 @@ class DatabaseTestSuite(unittest.TestCase):
 
 class CacheTestSuite(unittest.TestCase):
 
+    def test_base_options_parsing(self):
+        url = 'memcache://127.0.0.1:11211/?timeout=0&key_prefix=cache_&key_function=foo.get_key&version=1'
+        url = Env.cache_url_config(url)
+
+        self.assertEqual(url['KEY_PREFIX'], 'cache_')
+        self.assertEqual(url['KEY_FUNCTION'], 'foo.get_key')
+        self.assertEqual(url['TIMEOUT'], 0)
+        self.assertEqual(url['VERSION'], 1)
+
+        url = 'redis://127.0.0.1:6379/?timeout=None'
+        url = Env.cache_url_config(url)
+
+        self.assertEqual(url['TIMEOUT'], None)
+
     def test_memcache_parsing(self):
         url = 'memcache://127.0.0.1:11211'
         url = Env.cache_url_config(url)
@@ -496,7 +562,7 @@ class CacheTestSuite(unittest.TestCase):
         self.assertEqual(url['OPTIONS'], {
             'DB': 0
         })
-    
+
     def test_options_parsing(self):
         url = 'filecache:///var/tmp/django_cache?timeout=60&max_entries=1000&cull_frequency=0'
         url = Env.cache_url_config(url)
@@ -665,6 +731,7 @@ class PathTests(unittest.TestCase):
         self.assertEqual(Path('/home/foo/').rfind('/'), str(Path('/home/foo')).rfind('/'))
         self.assertEqual(Path('/home/foo/').find('/home'), str(Path('/home/foo/')).find('/home'))
         self.assertEqual(Path('/home/foo/')[1], str(Path('/home/foo/'))[1])
+        self.assertEqual(Path('/home/foo/').__fspath__(), str(Path('/home/foo/')))
 
         self.assertEqual(~Path('/home'), Path('/'))
         self.assertEqual(Path('/') + 'home', Path('/home'))
diff --git a/environ/test_env.txt b/environ/test_env.txt
index e33078b..f00ce49 100644
--- a/environ/test_env.txt
+++ b/environ/test_env.txt
@@ -22,9 +22,12 @@ EMPTY_LIST=
 INT_VAR=42
 STR_LIST_WITH_SPACES= foo,  bar
 STR_VAR=bar
+MULTILINE_STR_VAR=foo\nbar
 INT_LIST=42,33
 CYRILLIC_VAR=фуубар
 INT_TUPLE=(42,33)
 DATABASE_ORACLE_TNS_URL=oracle://user:password@sid
 DATABASE_ORACLE_URL=oracle://user:password@host:1521/sid
 DATABASE_REDSHIFT_URL=redshift://user:password@examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com:5439/dev
+DATABASE_CUSTOM_BACKEND_URL=custom.backend://user:password@example.com:5430/database
+export EXPORTED_VAR="exported var"
diff --git a/setup.cfg b/setup.cfg
index 9d949f5..47ec0fd 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -7,7 +7,3 @@ files = setup.py environ/environ.py docs/conf.py
 [bdist_wheel]
 universal = 1
 
-[egg_info]
-tag_build = 
-tag_date = 0
-
diff --git a/setup.py b/setup.py
index 8a13843..975d5bb 100644
--- a/setup.py
+++ b/setup.py
@@ -1,54 +1,65 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 from __future__ import unicode_literals
 from setuptools import setup, find_packages
 import io
 import os
 
-here = os.path.abspath(os.path.dirname(__file__))
-README = io.open(os.path.join(here, 'README.rst'), encoding="utf8").read()
 
-version = '0.4.4'
-author = 'joke2k'
-description = "Django-environ allows you to utilize 12factor inspired environment " \
+# Package meta-data.
+NAME = 'django-environ'
+PACKAGE = 'environ'
+DESCRIPTION = "Django-environ allows you to utilize 12factor inspired environment " \
               "variables to configure your Django application."
-install_requires = ['django', 'six']
+URL = 'https://github.com/joke2k/django-environ'
+EMAIL = 'daniele.faraglia@gmail.com'
+AUTHOR = 'joke2k'
+VERSION = '0.4.5'
+LICENSE = 'MIT'
+
+here = os.path.abspath(os.path.dirname(__file__))
+
+# Import the README and use it as the long-description.
+# Note: this will only work if 'README.md' is present in your MANIFEST.in file!
+LONG_DESCRIPTION = '\n' + io.open(os.path.join(here, 'README.rst'), encoding="utf8").read()
 
-setup(name='django-environ',
-      version=version,
-      description=description,
-      long_description=README,
-      classifiers=[
-          # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-          'Development Status :: 3 - Alpha',
-          'Intended Audience :: Information Technology',
-          'Framework :: Django',
-          'Framework :: Django :: 1.8',
-          'Framework :: Django :: 1.9',
-          'Framework :: Django :: 1.10',
-          'Framework :: Django :: 1.11',
-          'Programming Language :: Python',
-          'Programming Language :: Python :: 2',
-          'Programming Language :: Python :: 2.7',
-          'Programming Language :: Python :: 3',
-          'Programming Language :: Python :: 3.4',
-          'Programming Language :: Python :: 3.5',
-          'Programming Language :: Python :: Implementation :: CPython',
-          'Programming Language :: Python :: Implementation :: PyPy',
-          'Topic :: Software Development :: Libraries :: Python Modules',
-          'Topic :: Utilities',
-          'License :: OSI Approved :: MIT License',
-          'Framework :: Django'
-      ],
-      keywords='django environment variables 12factor',
-      author=author,
-      author_email='joke2k@gmail.com',
-      url='https://github.com/joke2k/django-environ',
-      license='MIT License',
-      packages=find_packages(),
-      platforms=["any"],
-      include_package_data=True,
-      test_suite='environ.test.load_suite',
-      zip_safe=False,
-      install_requires=install_requires,
-      )
+setup(
+    name=NAME,
+    version=VERSION,
+    description=DESCRIPTION,
+    long_description=LONG_DESCRIPTION,
+    keywords='django environment variables 12factor',
+    author=AUTHOR,
+    author_email=EMAIL,
+    url=URL,
+    license=LICENSE,
+    packages=find_packages(),
+    platforms=["any"],
+    include_package_data=True,
+    test_suite='environ.test.load_suite',
+    zip_safe=False,
+    classifiers=[
+        # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+        'Development Status :: 3 - Alpha',
+        'Intended Audience :: Information Technology',
+        'Framework :: Django',
+        'Framework :: Django :: 1.8',
+        'Framework :: Django :: 1.9',
+        'Framework :: Django :: 1.10',
+        'Framework :: Django :: 1.11',
+        'Framework :: Django :: 2.0',
+        'Programming Language :: Python',
+        'Programming Language :: Python :: 2',
+        'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3',
+        'Programming Language :: Python :: 3.4',
+        'Programming Language :: Python :: 3.5',
+        'Programming Language :: Python :: Implementation :: CPython',
+        'Programming Language :: Python :: Implementation :: PyPy',
+        'Topic :: Software Development :: Libraries :: Python Modules',
+        'Topic :: Utilities',
+        'License :: OSI Approved :: MIT License',
+        'Framework :: Django'
+    ]
+)