python-dotenv
Advanced tools
| # Changelog | ||
| All notable changes to this project will be documented in this file. | ||
| The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this | ||
| project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | ||
| ## [0.21.0] - 2022-09-03 | ||
| ### Added | ||
| * CLI: add support for invocations via 'python -m'. (#395 by @theskumar) | ||
| * `load_dotenv` function now returns `False`. (#388 by @larsks) | ||
| * CLI: add --format= option to list command. (#407 by @sammck) | ||
| ### Fixed | ||
| * Drop Python 3.5 and 3.6 and upgrade GA (#393 by @eggplants) | ||
| * Use `open` instead of `io.open`. (#389 by @rabinadk1) | ||
| * Improve documentation for variables without a value (#390 by @bbc2) | ||
| * Add `parse_it` to Related Projects by (#410 by @naorlivne) | ||
| * Update README.md by (#415 by @harveer07) | ||
| * Improve documentation with direct use of MkDocs by (#398 by @bbc2) | ||
| ## [0.20.0] - 2022-03-24 | ||
| ### Added | ||
| - Add `encoding` (`Optional[str]`) parameter to `get_key`, `set_key` and `unset_key`. | ||
| (#379 by [@bbc2]) | ||
| ### Fixed | ||
| - Use dict to specify the `entry_points` parameter of `setuptools.setup` (#376 by | ||
| [@mgorny]). | ||
| - Don't build universal wheels (#387 by [@bbc2]). | ||
| ## [0.19.2] - 2021-11-11 | ||
| ### Fixed | ||
| - In `set_key`, add missing newline character before new entry if necessary. (#361 by | ||
| [@bbc2]) | ||
| ## [0.19.1] - 2021-08-09 | ||
| ### Added | ||
| - Add support for Python 3.10. (#359 by [@theskumar]) | ||
| ## [0.19.0] - 2021-07-24 | ||
| ### Changed | ||
| - Require Python 3.5 or a later version. Python 2 and 3.4 are no longer supported. (#341 | ||
| by [@bbc2]). | ||
| ### Added | ||
| - The `dotenv_path` argument of `set_key` and `unset_key` now has a type of `Union[str, | ||
| os.PathLike]` instead of just `os.PathLike` (#347 by [@bbc2]). | ||
| - The `stream` argument of `load_dotenv` and `dotenv_values` can now be a text stream | ||
| (`IO[str]`), which includes values like `io.StringIO("foo")` and `open("file.env", | ||
| "r")` (#348 by [@bbc2]). | ||
| ## [0.18.0] - 2021-06-20 | ||
| ### Changed | ||
| - Raise `ValueError` if `quote_mode` isn't one of `always`, `auto` or `never` in | ||
| `set_key` (#330 by [@bbc2]). | ||
| - When writing a value to a .env file with `set_key` or `dotenv set <key> <value>` (#330 | ||
| by [@bbc2]): | ||
| - Use single quotes instead of double quotes. | ||
| - Don't strip surrounding quotes. | ||
| - In `auto` mode, don't add quotes if the value is only made of alphanumeric characters | ||
| (as determined by `string.isalnum`). | ||
| ## [0.17.1] - 2021-04-29 | ||
| ### Fixed | ||
| - Fixed tests for build environments relying on `PYTHONPATH` (#318 by [@befeleme]). | ||
| ## [0.17.0] - 2021-04-02 | ||
| ### Changed | ||
| - Make `dotenv get <key>` only show the value, not `key=value` (#313 by [@bbc2]). | ||
| ### Added | ||
| - Add `--override`/`--no-override` option to `dotenv run` (#312 by [@zueve] and [@bbc2]). | ||
| ## [0.16.0] - 2021-03-27 | ||
| ### Changed | ||
| - The default value of the `encoding` parameter for `load_dotenv` and `dotenv_values` is | ||
| now `"utf-8"` instead of `None` (#306 by [@bbc2]). | ||
| - Fix resolution order in variable expansion with `override=False` (#287 by [@bbc2]). | ||
| ## [0.15.0] - 2020-10-28 | ||
| ### Added | ||
| - Add `--export` option to `set` to make it prepend the binding with `export` (#270 by | ||
| [@jadutter]). | ||
| ### Changed | ||
| - Make `set` command create the `.env` file in the current directory if no `.env` file was | ||
| found (#270 by [@jadutter]). | ||
| ### Fixed | ||
| - Fix potentially empty expanded value for duplicate key (#260 by [@bbc2]). | ||
| - Fix import error on Python 3.5.0 and 3.5.1 (#267 by [@gongqingkui]). | ||
| - Fix parsing of unquoted values containing several adjacent space or tab characters | ||
| (#277 by [@bbc2], review by [@x-yuri]). | ||
| ## [0.14.0] - 2020-07-03 | ||
| ### Changed | ||
| - Privilege definition in file over the environment in variable expansion (#256 by | ||
| [@elbehery95]). | ||
| ### Fixed | ||
| - Improve error message for when file isn't found (#245 by [@snobu]). | ||
| - Use HTTPS URL in package meta data (#251 by [@ekohl]). | ||
| ## [0.13.0] - 2020-04-16 | ||
| ### Added | ||
| - Add support for a Bash-like default value in variable expansion (#248 by [@bbc2]). | ||
| ## [0.12.0] - 2020-02-28 | ||
| ### Changed | ||
| - Use current working directory to find `.env` when bundled by PyInstaller (#213 by | ||
| [@gergelyk]). | ||
| ### Fixed | ||
| - Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]). | ||
| - Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]). | ||
| - Remove warning when last line is empty (#238 by [@bbc2]). | ||
| ## [0.11.0] - 2020-02-07 | ||
| ### Added | ||
| - Add `interpolate` argument to `load_dotenv` and `dotenv_values` to disable interpolation | ||
| (#232 by [@ulyssessouza]). | ||
| ### Changed | ||
| - Use logging instead of warnings (#231 by [@bbc2]). | ||
| ### Fixed | ||
| - Fix installation in non-UTF-8 environments (#225 by [@altendky]). | ||
| - Fix PyPI classifiers (#228 by [@bbc2]). | ||
| ## [0.10.5] - 2020-01-19 | ||
| ### Fixed | ||
| - Fix handling of malformed lines and lines without a value (#222 by [@bbc2]): | ||
| - Don't print warning when key has no value. | ||
| - Reject more malformed lines (e.g. "A: B", "a='b',c"). | ||
| - Fix handling of lines with just a comment (#224 by [@bbc2]). | ||
| ## [0.10.4] - 2020-01-17 | ||
| ### Added | ||
| - Make typing optional (#179 by [@techalchemy]). | ||
| - Print a warning on malformed line (#211 by [@bbc2]). | ||
| - Support keys without a value (#220 by [@ulyssessouza]). | ||
| ## 0.10.3 | ||
| - Improve interactive mode detection ([@andrewsmith])([#183]). | ||
| - Refactor parser to fix parsing inconsistencies ([@bbc2])([#170]). | ||
| - Interpret escapes as control characters only in double-quoted strings. | ||
| - Interpret `#` as start of comment only if preceded by whitespace. | ||
| ## 0.10.2 | ||
| - Add type hints and expose them to users ([@qnighy])([#172]) | ||
| - `load_dotenv` and `dotenv_values` now accept an `encoding` parameter, defaults to `None` | ||
| ([@theskumar])([@earlbread])([#161]) | ||
| - Fix `str`/`unicode` inconsistency in Python 2: values are always `str` now. ([@bbc2])([#121]) | ||
| - Fix Unicode error in Python 2, introduced in 0.10.0. ([@bbc2])([#176]) | ||
| ## 0.10.1 | ||
| - Fix parsing of variable without a value ([@asyncee])([@bbc2])([#158]) | ||
| ## 0.10.0 | ||
| - Add support for UTF-8 in unquoted values ([@bbc2])([#148]) | ||
| - Add support for trailing comments ([@bbc2])([#148]) | ||
| - Add backslashes support in values ([@bbc2])([#148]) | ||
| - Add support for newlines in values ([@bbc2])([#148]) | ||
| - Force environment variables to str with Python2 on Windows ([@greyli]) | ||
| - Drop Python 3.3 support ([@greyli]) | ||
| - Fix stderr/-out/-in redirection ([@venthur]) | ||
| ## 0.9.0 | ||
| - Add `--version` parameter to cli ([@venthur]) | ||
| - Enable loading from current directory ([@cjauvin]) | ||
| - Add 'dotenv run' command for calling arbitrary shell script with .env ([@venthur]) | ||
| ## 0.8.1 | ||
| - Add tests for docs ([@Flimm]) | ||
| - Make 'cli' support optional. Use `pip install python-dotenv[cli]`. ([@theskumar]) | ||
| ## 0.8.0 | ||
| - `set_key` and `unset_key` only modified the affected file instead of | ||
| parsing and re-writing file, this causes comments and other file | ||
| entact as it is. | ||
| - Add support for `export` prefix in the line. | ||
| - Internal refractoring ([@theskumar]) | ||
| - Allow `load_dotenv` and `dotenv_values` to work with `StringIO())` ([@alanjds])([@theskumar])([#78]) | ||
| ## 0.7.1 | ||
| - Remove hard dependency on iPython ([@theskumar]) | ||
| ## 0.7.0 | ||
| - Add support to override system environment variable via .env. | ||
| ([@milonimrod](https://github.com/milonimrod)) | ||
| ([\#63](https://github.com/theskumar/python-dotenv/issues/63)) | ||
| - Disable ".env not found" warning by default | ||
| ([@maxkoryukov](https://github.com/maxkoryukov)) | ||
| ([\#57](https://github.com/theskumar/python-dotenv/issues/57)) | ||
| ## 0.6.5 | ||
| - Add support for special characters `\`. | ||
| ([@pjona](https://github.com/pjona)) | ||
| ([\#60](https://github.com/theskumar/python-dotenv/issues/60)) | ||
| ## 0.6.4 | ||
| - Fix issue with single quotes ([@Flimm]) | ||
| ([\#52](https://github.com/theskumar/python-dotenv/issues/52)) | ||
| ## 0.6.3 | ||
| - Handle unicode exception in setup.py | ||
| ([\#46](https://github.com/theskumar/python-dotenv/issues/46)) | ||
| ## 0.6.2 | ||
| - Fix dotenv list command ([@ticosax](https://github.com/ticosax)) | ||
| - Add iPython Support | ||
| ([@tillahoffmann](https://github.com/tillahoffmann)) | ||
| ## 0.6.0 | ||
| - Drop support for Python 2.6 | ||
| - Handle escaped characters and newlines in quoted values. (Thanks | ||
| [@iameugenejo](https://github.com/iameugenejo)) | ||
| - Remove any spaces around unquoted key/value. (Thanks | ||
| [@paulochf](https://github.com/paulochf)) | ||
| - Added POSIX variable expansion. (Thanks | ||
| [@hugochinchilla](https://github.com/hugochinchilla)) | ||
| ## 0.5.1 | ||
| - Fix find\_dotenv - it now start search from the file where this | ||
| function is called from. | ||
| ## 0.5.0 | ||
| - Add `find_dotenv` method that will try to find a `.env` file. | ||
| (Thanks [@isms](https://github.com/isms)) | ||
| ## 0.4.0 | ||
| - cli: Added `-q/--quote` option to control the behaviour of quotes | ||
| around values in `.env`. (Thanks | ||
| [@hugochinchilla](https://github.com/hugochinchilla)). | ||
| - Improved test coverage. | ||
| [#78]: https://github.com/theskumar/python-dotenv/issues/78 | ||
| [#121]: https://github.com/theskumar/python-dotenv/issues/121 | ||
| [#148]: https://github.com/theskumar/python-dotenv/issues/148 | ||
| [#158]: https://github.com/theskumar/python-dotenv/issues/158 | ||
| [#170]: https://github.com/theskumar/python-dotenv/issues/170 | ||
| [#172]: https://github.com/theskumar/python-dotenv/issues/172 | ||
| [#176]: https://github.com/theskumar/python-dotenv/issues/176 | ||
| [#183]: https://github.com/theskumar/python-dotenv/issues/183 | ||
| [#359]: https://github.com/theskumar/python-dotenv/issues/359 | ||
| [@alanjds]: https://github.com/alanjds | ||
| [@altendky]: https://github.com/altendky | ||
| [@andrewsmith]: https://github.com/andrewsmith | ||
| [@asyncee]: https://github.com/asyncee | ||
| [@bbc2]: https://github.com/bbc2 | ||
| [@befeleme]: https://github.com/befeleme | ||
| [@cjauvin]: https://github.com/cjauvin | ||
| [@earlbread]: https://github.com/earlbread | ||
| [@eggplants]: https://github.com/@eggplants | ||
| [@ekohl]: https://github.com/ekohl | ||
| [@elbehery95]: https://github.com/elbehery95 | ||
| [@Flimm]: https://github.com/Flimm | ||
| [@gergelyk]: https://github.com/gergelyk | ||
| [@gongqingkui]: https://github.com/gongqingkui | ||
| [@greyli]: https://github.com/greyli | ||
| [@harveer07]: https://github.com/@harveer07 | ||
| [@jadutter]: https://github.com/jadutter | ||
| [@larsks]: https://github.com/@larsks | ||
| [@mgorny]: https://github.com/mgorny | ||
| [@naorlivne]: https://github.com/@naorlivne | ||
| [@qnighy]: https://github.com/qnighy | ||
| [@rabinadk1]: https://github.com/@rabinadk1 | ||
| [@sammck]: https://github.com/@sammck | ||
| [@snobu]: https://github.com/snobu | ||
| [@techalchemy]: https://github.com/techalchemy | ||
| [@theskumar]: https://github.com/theskumar | ||
| [@ulyssessouza]: https://github.com/ulyssessouza | ||
| [@venthur]: https://github.com/venthur | ||
| [@x-yuri]: https://github.com/x-yuri | ||
| [@yannham]: https://github.com/yannham | ||
| [@zueve]: https://github.com/zueve | ||
| [Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...HEAD | ||
| [0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0 | ||
| [0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 | ||
| [0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2 | ||
| [0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1 | ||
| [0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0 | ||
| [0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0 | ||
| [0.17.1]: https://github.com/theskumar/python-dotenv/compare/v0.17.0...v0.17.1 | ||
| [0.17.0]: https://github.com/theskumar/python-dotenv/compare/v0.16.0...v0.17.0 | ||
| [0.16.0]: https://github.com/theskumar/python-dotenv/compare/v0.15.0...v0.16.0 | ||
| [0.15.0]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...v0.15.0 | ||
| [0.14.0]: https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.14.0 | ||
| [0.13.0]: https://github.com/theskumar/python-dotenv/compare/v0.12.0...v0.13.0 | ||
| [0.12.0]: https://github.com/theskumar/python-dotenv/compare/v0.11.0...v0.12.0 | ||
| [0.11.0]: https://github.com/theskumar/python-dotenv/compare/v0.10.5...v0.11.0 | ||
| [0.10.5]: https://github.com/theskumar/python-dotenv/compare/v0.10.4...v0.10.5 | ||
| [0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4 |
| Contributing | ||
| ============ | ||
| All the contributions are welcome! Please open [an | ||
| issue](https://github.com/theskumar/python-dotenv/issues/new) or send us | ||
| a pull request. | ||
| Executing the tests: | ||
| $ pip install -r requirements.txt | ||
| $ pip install -e . | ||
| $ flake8 | ||
| $ pytest | ||
| or with [tox](https://pypi.org/project/tox/) installed: | ||
| $ tox | ||
| Documentation is published with [mkdocs](): | ||
| ```shell | ||
| $ pip install -r requirements-docs.txt | ||
| $ pip install -e . | ||
| $ mkdocs serve | ||
| ``` | ||
| Open http://127.0.0.1:8000/ to view the documentation locally. | ||
+246
| # python-dotenv | ||
| [![Build Status][build_status_badge]][build_status_link] | ||
| [![PyPI version][pypi_badge]][pypi_link] | ||
| Python-dotenv reads key-value pairs from a `.env` file and can set them as environment | ||
| variables. It helps in the development of applications following the | ||
| [12-factor](http://12factor.net/) principles. | ||
| - [Getting Started](#getting-started) | ||
| - [Other Use Cases](#other-use-cases) | ||
| * [Load configuration without altering the environment](#load-configuration-without-altering-the-environment) | ||
| * [Parse configuration as a stream](#parse-configuration-as-a-stream) | ||
| * [Load .env files in IPython](#load-env-files-in-ipython) | ||
| - [Command-line Interface](#command-line-interface) | ||
| - [File format](#file-format) | ||
| * [Multiline values](#multiline-values) | ||
| * [Variable expansion](#variable-expansion) | ||
| - [Related Projects](#related-projects) | ||
| - [Acknowledgements](#acknowledgements) | ||
| ## Getting Started | ||
| ```shell | ||
| pip install python-dotenv | ||
| ``` | ||
| If your application takes its configuration from environment variables, like a 12-factor | ||
| application, launching it in development is not very practical because you have to set | ||
| those environment variables yourself. | ||
| To help you with that, you can add Python-dotenv to your application to make it load the | ||
| configuration from a `.env` file when it is present (e.g. in development) while remaining | ||
| configurable via the environment: | ||
| ```python | ||
| from dotenv import load_dotenv | ||
| load_dotenv() # take environment variables from .env. | ||
| # Code of your application, which uses environment variables (e.g. from `os.environ` or | ||
| # `os.getenv`) as if they came from the actual environment. | ||
| ``` | ||
| By default, `load_dotenv` doesn't override existing environment variables. | ||
| To configure the development environment, add a `.env` in the root directory of your | ||
| project: | ||
| ``` | ||
| . | ||
| ├── .env | ||
| └── foo.py | ||
| ``` | ||
| The syntax of `.env` files supported by python-dotenv is similar to that of Bash: | ||
| ```bash | ||
| # Development settings | ||
| DOMAIN=example.org | ||
| ADMIN_EMAIL=admin@${DOMAIN} | ||
| ROOT_URL=${DOMAIN}/app | ||
| ``` | ||
| If you use variables in values, ensure they are surrounded with `{` and `}`, like | ||
| `${DOMAIN}`, as bare variables such as `$DOMAIN` are not expanded. | ||
| You will probably want to add `.env` to your `.gitignore`, especially if it contains | ||
| secrets like a password. | ||
| See the section "File format" below for more information about what you can write in a | ||
| `.env` file. | ||
| ## Other Use Cases | ||
| ### Load configuration without altering the environment | ||
| The function `dotenv_values` works more or less the same way as `load_dotenv`, except it | ||
| doesn't touch the environment, it just returns a `dict` with the values parsed from the | ||
| `.env` file. | ||
| ```python | ||
| from dotenv import dotenv_values | ||
| config = dotenv_values(".env") # config = {"USER": "foo", "EMAIL": "foo@example.org"} | ||
| ``` | ||
| This notably enables advanced configuration management: | ||
| ```python | ||
| import os | ||
| from dotenv import dotenv_values | ||
| config = { | ||
| **dotenv_values(".env.shared"), # load shared development variables | ||
| **dotenv_values(".env.secret"), # load sensitive variables | ||
| **os.environ, # override loaded values with environment variables | ||
| } | ||
| ``` | ||
| ### Parse configuration as a stream | ||
| `load_dotenv` and `dotenv_values` accept [streams][python_streams] via their `stream` | ||
| argument. It is thus possible to load the variables from sources other than the | ||
| filesystem (e.g. the network). | ||
| ```python | ||
| from io import StringIO | ||
| from dotenv import load_dotenv | ||
| config = StringIO("USER=foo\nEMAIL=foo@example.org") | ||
| load_dotenv(stream=config) | ||
| ``` | ||
| ### Load .env files in IPython | ||
| You can use dotenv in IPython. By default, it will use `find_dotenv` to search for a | ||
| `.env` file: | ||
| ```python | ||
| %load_ext dotenv | ||
| %dotenv | ||
| ``` | ||
| You can also specify a path: | ||
| ```python | ||
| %dotenv relative/or/absolute/path/to/.env | ||
| ``` | ||
| Optional flags: | ||
| - `-o` to override existing variables. | ||
| - `-v` for increased verbosity. | ||
| ## Command-line Interface | ||
| A CLI interface `dotenv` is also included, which helps you manipulate the `.env` file | ||
| without manually opening it. | ||
| ```shell | ||
| $ pip install "python-dotenv[cli]" | ||
| $ dotenv set USER foo | ||
| $ dotenv set EMAIL foo@example.org | ||
| $ dotenv list | ||
| USER=foo | ||
| EMAIL=foo@example.org | ||
| $ dotenv list --format=json | ||
| { | ||
| "USER": "foo", | ||
| "EMAIL": "foo@example.org" | ||
| } | ||
| $ dotenv run -- python foo.py | ||
| ``` | ||
| Run `dotenv --help` for more information about the options and subcommands. | ||
| ## File format | ||
| The format is not formally specified and still improves over time. That being said, | ||
| `.env` files should mostly look like Bash files. | ||
| Keys can be unquoted or single-quoted. Values can be unquoted, single- or double-quoted. | ||
| Spaces before and after keys, equal signs, and values are ignored. Values can be followed | ||
| by a comment. Lines can start with the `export` directive, which does not affect their | ||
| interpretation. | ||
| Allowed escape sequences: | ||
| - in single-quoted values: `\\`, `\'` | ||
| - in double-quoted values: `\\`, `\'`, `\"`, `\a`, `\b`, `\f`, `\n`, `\r`, `\t`, `\v` | ||
| ### Multiline values | ||
| It is possible for single- or double-quoted values to span multiple lines. The following | ||
| examples are equivalent: | ||
| ```bash | ||
| FOO="first line | ||
| second line" | ||
| ``` | ||
| ```bash | ||
| FOO="first line\nsecond line" | ||
| ``` | ||
| ### Variable without a value | ||
| A variable can have no value: | ||
| ```bash | ||
| FOO | ||
| ``` | ||
| It results in `dotenv_values` associating that variable name with the value `None` (e.g. | ||
| `{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables. | ||
| This shouldn't be confused with `FOO=`, in which case the variable is associated with the | ||
| empty string. | ||
| ### Variable expansion | ||
| Python-dotenv can interpolate variables using POSIX variable expansion. | ||
| With `load_dotenv(override=True)` or `dotenv_values()`, the value of a variable is the | ||
| first of the values defined in the following list: | ||
| - Value of that variable in the `.env` file. | ||
| - Value of that variable in the environment. | ||
| - Default value, if provided. | ||
| - Empty string. | ||
| With `load_dotenv(override=False)`, the value of a variable is the first of the values | ||
| defined in the following list: | ||
| - Value of that variable in the environment. | ||
| - Value of that variable in the `.env` file. | ||
| - Default value, if provided. | ||
| - Empty string. | ||
| ## Related Projects | ||
| - [Honcho](https://github.com/nickstenning/honcho) - For managing | ||
| Procfile-based applications. | ||
| - [django-dotenv](https://github.com/jpadilla/django-dotenv) | ||
| - [django-environ](https://github.com/joke2k/django-environ) | ||
| - [django-environ-2](https://github.com/sergeyklay/django-environ-2) | ||
| - [django-configuration](https://github.com/jezdez/django-configurations) | ||
| - [dump-env](https://github.com/sobolevn/dump-env) | ||
| - [environs](https://github.com/sloria/environs) | ||
| - [dynaconf](https://github.com/rochacbruno/dynaconf) | ||
| - [parse_it](https://github.com/naorlivne/parse_it) | ||
| ## Acknowledgements | ||
| This project is currently maintained by [Saurabh Kumar](https://saurabh-kumar.com) and | ||
| [Bertrand Bonnefoy-Claudet](https://github.com/bbc2) and would not have been possible | ||
| without the support of these [awesome | ||
| people](https://github.com/theskumar/python-dotenv/graphs/contributors). | ||
| [build_status_badge]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml/badge.svg | ||
| [build_status_link]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml | ||
| [pypi_badge]: https://badge.fury.io/py/python-dotenv.svg | ||
| [pypi_link]: http://badge.fury.io/py/python-dotenv | ||
| [python_streams]: https://docs.python.org/3/library/io.html |
| # Reference | ||
| ::: dotenv |
+23
| site_name: python-dotenv | ||
| repo_url: https://github.com/theskumar/python-dotenv | ||
| edit_uri: "" | ||
| theme: | ||
| name: material | ||
| palette: | ||
| primary: green | ||
| markdown_extensions: | ||
| - mdx_truly_sane_lists | ||
| plugins: | ||
| - mkdocstrings: | ||
| handlers: | ||
| python: | ||
| rendering: | ||
| show_root_heading: yes | ||
| show_submodules: no | ||
| separate_signature: yes | ||
| - search | ||
| nav: | ||
| - Home: index.md | ||
| - Changelog: changelog.md | ||
| - Contributing: contributing.md | ||
| - Reference: reference.md |
| mdx_truly_sane_lists~=1.2 | ||
| mkdocs-include-markdown-plugin~=3.3.0 | ||
| mkdocs-material~=8.2.9 | ||
| mkdocstrings[python]~=0.18.1 | ||
| mkdocs~=1.3.0 |
| """Entry point for cli, enables execution with `python -m dotenv`""" | ||
| from .cli import cli | ||
| if __name__ == "__main__": | ||
| cli() |
+26
-3
@@ -8,2 +8,17 @@ # Changelog | ||
| ## [0.21.0] - 2022-09-03 | ||
| ### Added | ||
| * CLI: add support for invocations via 'python -m'. (#395 by @theskumar) | ||
| * `load_dotenv` function now returns `False`. (#388 by @larsks) | ||
| * CLI: add --format= option to list command. (#407 by @sammck) | ||
| ### Fixed | ||
| * Drop Python 3.5 and 3.6 and upgrade GA (#393 by @eggplants) | ||
| * Use `open` instead of `io.open`. (#389 by @rabinadk1) | ||
| * Improve documentation for variables without a value (#390 by @bbc2) | ||
| * Add `parse_it` to Related Projects by (#410 by @naorlivne) | ||
| * Update README.md by (#415 by @harveer07) | ||
| * Improve documentation with direct use of MkDocs by (#398 by @bbc2) | ||
| ## [0.20.0] - 2022-03-24 | ||
@@ -291,3 +306,2 @@ | ||
| [@Flimm]: https://github.com/Flimm | ||
| [@alanjds]: https://github.com/alanjds | ||
@@ -301,10 +315,17 @@ [@altendky]: https://github.com/altendky | ||
| [@earlbread]: https://github.com/earlbread | ||
| [@eggplants]: https://github.com/@eggplants | ||
| [@ekohl]: https://github.com/ekohl | ||
| [@elbehery95]: https://github.com/elbehery95 | ||
| [@Flimm]: https://github.com/Flimm | ||
| [@gergelyk]: https://github.com/gergelyk | ||
| [@gongqingkui]: https://github.com/gongqingkui | ||
| [@greyli]: https://github.com/greyli | ||
| [@harveer07]: https://github.com/@harveer07 | ||
| [@jadutter]: https://github.com/jadutter | ||
| [@larsks]: https://github.com/@larsks | ||
| [@mgorny]: https://github.com/mgorny | ||
| [@naorlivne]: https://github.com/@naorlivne | ||
| [@qnighy]: https://github.com/qnighy | ||
| [@rabinadk1]: https://github.com/@rabinadk1 | ||
| [@sammck]: https://github.com/@sammck | ||
| [@snobu]: https://github.com/snobu | ||
@@ -319,4 +340,6 @@ [@techalchemy]: https://github.com/techalchemy | ||
| [Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...HEAD | ||
| [0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 | ||
| [Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...HEAD | ||
| [0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0 | ||
| [0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 | ||
| [0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2 | ||
@@ -323,0 +346,0 @@ [0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1 |
+11
-0
@@ -19,1 +19,12 @@ Contributing | ||
| Documentation is published with [mkdocs](): | ||
| ```shell | ||
| $ pip install -r requirements-docs.txt | ||
| $ pip install -e . | ||
| $ mkdocs serve | ||
| ``` | ||
| Open http://127.0.0.1:8000/ to view the documentation locally. | ||
+2
-0
| include LICENSE *.md *.yml *.toml | ||
| include tox.ini | ||
| recursive-include docs *.md | ||
| recursive-include tests *.py | ||
@@ -11,2 +12,3 @@ | ||
| include requirements.txt | ||
| include requirements-docs.txt | ||
| include src/dotenv/py.typed |
+49
-11
| Metadata-Version: 2.1 | ||
| Name: python-dotenv | ||
| Version: 0.20.0 | ||
| Version: 0.21.0 | ||
| Summary: Read key-value pairs from a .env file and set them as environment variables | ||
@@ -10,8 +10,5 @@ Home-page: https://github.com/theskumar/python-dotenv | ||
| Keywords: environment variables,deployments,settings,env,dotenv,configurations,python | ||
| Platform: UNKNOWN | ||
| Classifier: Development Status :: 5 - Production/Stable | ||
| Classifier: Programming Language :: Python | ||
| Classifier: Programming Language :: Python :: 3 | ||
| Classifier: Programming Language :: Python :: 3.5 | ||
| Classifier: Programming Language :: Python :: 3.6 | ||
| Classifier: Programming Language :: Python :: 3.7 | ||
@@ -30,3 +27,3 @@ Classifier: Programming Language :: Python :: 3.8 | ||
| Classifier: Environment :: Web Environment | ||
| Requires-Python: >=3.5 | ||
| Requires-Python: >=3.7 | ||
| Description-Content-Type: text/markdown | ||
@@ -184,2 +181,7 @@ Provides-Extra: cli | ||
| EMAIL=foo@example.org | ||
| $ dotenv list --format=json | ||
| { | ||
| "USER": "foo", | ||
| "EMAIL": "foo@example.org" | ||
| } | ||
| $ dotenv run -- python foo.py | ||
@@ -197,3 +199,3 @@ ``` | ||
| Spaces before and after keys, equal signs, and values are ignored. Values can be followed | ||
| by a comment. Lines can start with the `export` directive, which has no effect on their | ||
| by a comment. Lines can start with the `export` directive, which does not affect their | ||
| interpretation. | ||
@@ -220,2 +222,16 @@ | ||
| ### Variable without a value | ||
| A variable can have no value: | ||
| ```bash | ||
| FOO | ||
| ``` | ||
| It results in `dotenv_values` associating that variable name with the value `None` (e.g. | ||
| `{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables. | ||
| This shouldn't be confused with `FOO=`, in which case the variable is associated with the | ||
| empty string. | ||
| ### Variable expansion | ||
@@ -252,2 +268,3 @@ | ||
| - [dynaconf](https://github.com/rochacbruno/dynaconf) | ||
| - [parse_it](https://github.com/naorlivne/parse_it) | ||
@@ -274,2 +291,17 @@ ## Acknowledgements | ||
| ## [0.21.0] - 2022-09-03 | ||
| ### Added | ||
| * CLI: add support for invocations via 'python -m'. (#395 by @theskumar) | ||
| * `load_dotenv` function now returns `False`. (#388 by @larsks) | ||
| * CLI: add --format= option to list command. (#407 by @sammck) | ||
| ### Fixed | ||
| * Drop Python 3.5 and 3.6 and upgrade GA (#393 by @eggplants) | ||
| * Use `open` instead of `io.open`. (#389 by @rabinadk1) | ||
| * Improve documentation for variables without a value (#390 by @bbc2) | ||
| * Add `parse_it` to Related Projects by (#410 by @naorlivne) | ||
| * Update README.md by (#415 by @harveer07) | ||
| * Improve documentation with direct use of MkDocs by (#398 by @bbc2) | ||
| ## [0.20.0] - 2022-03-24 | ||
@@ -557,3 +589,2 @@ | ||
| [@Flimm]: https://github.com/Flimm | ||
| [@alanjds]: https://github.com/alanjds | ||
@@ -567,10 +598,17 @@ [@altendky]: https://github.com/altendky | ||
| [@earlbread]: https://github.com/earlbread | ||
| [@eggplants]: https://github.com/@eggplants | ||
| [@ekohl]: https://github.com/ekohl | ||
| [@elbehery95]: https://github.com/elbehery95 | ||
| [@Flimm]: https://github.com/Flimm | ||
| [@gergelyk]: https://github.com/gergelyk | ||
| [@gongqingkui]: https://github.com/gongqingkui | ||
| [@greyli]: https://github.com/greyli | ||
| [@harveer07]: https://github.com/@harveer07 | ||
| [@jadutter]: https://github.com/jadutter | ||
| [@larsks]: https://github.com/@larsks | ||
| [@mgorny]: https://github.com/mgorny | ||
| [@naorlivne]: https://github.com/@naorlivne | ||
| [@qnighy]: https://github.com/qnighy | ||
| [@rabinadk1]: https://github.com/@rabinadk1 | ||
| [@sammck]: https://github.com/@sammck | ||
| [@snobu]: https://github.com/snobu | ||
@@ -585,4 +623,6 @@ [@techalchemy]: https://github.com/techalchemy | ||
| [Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...HEAD | ||
| [0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 | ||
| [Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...HEAD | ||
| [0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0 | ||
| [0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 | ||
| [0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2 | ||
@@ -602,3 +642,1 @@ [0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1 | ||
| [0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4 | ||
+21
-1
@@ -149,2 +149,7 @@ # python-dotenv | ||
| EMAIL=foo@example.org | ||
| $ dotenv list --format=json | ||
| { | ||
| "USER": "foo", | ||
| "EMAIL": "foo@example.org" | ||
| } | ||
| $ dotenv run -- python foo.py | ||
@@ -162,3 +167,3 @@ ``` | ||
| Spaces before and after keys, equal signs, and values are ignored. Values can be followed | ||
| by a comment. Lines can start with the `export` directive, which has no effect on their | ||
| by a comment. Lines can start with the `export` directive, which does not affect their | ||
| interpretation. | ||
@@ -185,2 +190,16 @@ | ||
| ### Variable without a value | ||
| A variable can have no value: | ||
| ```bash | ||
| FOO | ||
| ``` | ||
| It results in `dotenv_values` associating that variable name with the value `None` (e.g. | ||
| `{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables. | ||
| This shouldn't be confused with `FOO=`, in which case the variable is associated with the | ||
| empty string. | ||
| ### Variable expansion | ||
@@ -217,2 +236,3 @@ | ||
| - [dynaconf](https://github.com/rochacbruno/dynaconf) | ||
| - [parse_it](https://github.com/naorlivne/parse_it) | ||
@@ -219,0 +239,0 @@ ## Acknowledgements |
+2
-4
@@ -0,1 +1,2 @@ | ||
| black~=22.3.0 | ||
| bumpversion | ||
@@ -5,3 +6,2 @@ click | ||
| ipython | ||
| mock | ||
| pytest-cov | ||
@@ -11,5 +11,3 @@ pytest>=3.9 | ||
| tox | ||
| types-mock | ||
| twine | ||
| wheel | ||
| twine | ||
| portray |
+2
-2
| [bumpversion] | ||
| current_version = 0.20.0 | ||
| current_version = 0.21.0 | ||
| commit = True | ||
@@ -10,3 +10,3 @@ tag = True | ||
| max-line-length = 120 | ||
| exclude = .tox,.git,docs,venv,.venv | ||
| exclude = .tox,.git,docs,venv,.venv,build | ||
@@ -13,0 +13,0 @@ [mypy] |
+4
-7
@@ -1,2 +0,1 @@ | ||
| import io | ||
| from setuptools import setup | ||
@@ -8,3 +7,3 @@ | ||
| for file in files: | ||
| with io.open(file, encoding='utf-8') as f: | ||
| with open(file, encoding='utf-8') as f: | ||
| data.append(f.read()) | ||
@@ -17,3 +16,3 @@ return "\n".join(data) | ||
| meta = {} | ||
| with io.open('./src/dotenv/version.py', encoding='utf-8') as f: | ||
| with open('./src/dotenv/version.py', encoding='utf-8') as f: | ||
| exec(f.read(), meta) | ||
@@ -37,3 +36,3 @@ | ||
| }, | ||
| python_requires=">=3.5", | ||
| python_requires=">=3.7", | ||
| extras_require={ | ||
@@ -44,3 +43,3 @@ 'cli': ['click>=5.0', ], | ||
| "console_scripts": [ | ||
| "dotenv=dotenv.cli:cli", | ||
| "dotenv=dotenv.__main__:cli", | ||
| ], | ||
@@ -53,4 +52,2 @@ }, | ||
| 'Programming Language :: Python :: 3', | ||
| 'Programming Language :: Python :: 3.5', | ||
| 'Programming Language :: Python :: 3.6', | ||
| 'Programming Language :: Python :: 3.7', | ||
@@ -57,0 +54,0 @@ 'Programming Language :: Python :: 3.8', |
+17
-7
@@ -0,2 +1,4 @@ | ||
| import json | ||
| import os | ||
| import shlex | ||
| import sys | ||
@@ -39,3 +41,7 @@ from subprocess import Popen | ||
| @click.pass_context | ||
| def list(ctx: click.Context) -> None: | ||
| @click.option('--format', default='simple', | ||
| type=click.Choice(['simple', 'json', 'shell', 'export']), | ||
| help="The format in which to display the list. Default format is simple, " | ||
| "which displays name=value without quotes.") | ||
| def list(ctx: click.Context, format: bool) -> None: | ||
| '''Display all the stored key/value.''' | ||
@@ -49,4 +55,12 @@ file = ctx.obj['FILE'] | ||
| dotenv_as_dict = dotenv_values(file) | ||
| for k, v in dotenv_as_dict.items(): | ||
| click.echo('%s=%s' % (k, v)) | ||
| if format == 'json': | ||
| click.echo(json.dumps(dotenv_as_dict, indent=2, sort_keys=True)) | ||
| else: | ||
| prefix = 'export ' if format == 'export' else '' | ||
| for k in sorted(dotenv_as_dict): | ||
| v = dotenv_as_dict[k] | ||
| if v is not None: | ||
| if format in ('export', 'shell'): | ||
| v = shlex.quote(v) | ||
| click.echo('%s%s=%s' % (prefix, k, v)) | ||
@@ -163,5 +177,1 @@ | ||
| return p.returncode | ||
| if __name__ == "__main__": | ||
| cli() |
+40
-35
@@ -17,8 +17,3 @@ import io | ||
| if sys.version_info >= (3, 6): | ||
| _PathLike = os.PathLike | ||
| else: | ||
| _PathLike = str | ||
| def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]: | ||
@@ -37,3 +32,3 @@ for mapping in mappings: | ||
| self, | ||
| dotenv_path: Optional[Union[str, _PathLike]], | ||
| dotenv_path: Optional[Union[str, os.PathLike]], | ||
| stream: Optional[IO[str]] = None, | ||
@@ -45,3 +40,3 @@ verbose: bool = False, | ||
| ) -> None: | ||
| self.dotenv_path = dotenv_path # type: Optional[Union[str, _PathLike]] | ||
| self.dotenv_path = dotenv_path # type: Optional[Union[str, os.PathLike]] | ||
| self.stream = stream # type: Optional[IO[str]] | ||
@@ -57,3 +52,3 @@ self._dict = None # type: Optional[Dict[str, Optional[str]]] | ||
| if self.dotenv_path and os.path.isfile(self.dotenv_path): | ||
| with io.open(self.dotenv_path, encoding=self.encoding) as stream: | ||
| with open(self.dotenv_path, encoding=self.encoding) as stream: | ||
| yield stream | ||
@@ -94,2 +89,5 @@ elif self.stream is not None: | ||
| """ | ||
| if not self.dict(): | ||
| return False | ||
| for k, v in self.dict().items(): | ||
@@ -118,3 +116,3 @@ if k in os.environ and not self.override: | ||
| def get_key( | ||
| dotenv_path: Union[str, _PathLike], | ||
| dotenv_path: Union[str, os.PathLike], | ||
| key_to_get: str, | ||
@@ -133,3 +131,3 @@ encoding: Optional[str] = "utf-8", | ||
| def rewrite( | ||
| path: Union[str, _PathLike], | ||
| path: Union[str, os.PathLike], | ||
| encoding: Optional[str], | ||
@@ -139,6 +137,6 @@ ) -> Iterator[Tuple[IO[str], IO[str]]]: | ||
| if not os.path.isfile(path): | ||
| with io.open(path, "w+", encoding=encoding) as source: | ||
| with open(path, "w+", encoding=encoding) as source: | ||
| source.write("") | ||
| with tempfile.NamedTemporaryFile(mode="w+", delete=False, encoding=encoding) as dest: | ||
| with io.open(path, encoding=encoding) as source: | ||
| with open(path, encoding=encoding) as source: | ||
| yield (source, dest) # type: ignore | ||
@@ -154,3 +152,3 @@ except BaseException: | ||
| def set_key( | ||
| dotenv_path: Union[str, _PathLike], | ||
| dotenv_path: Union[str, os.PathLike], | ||
| key_to_set: str, | ||
@@ -204,3 +202,3 @@ value_to_set: str, | ||
| def unset_key( | ||
| dotenv_path: Union[str, _PathLike], | ||
| dotenv_path: Union[str, os.PathLike], | ||
| key_to_unset: str, | ||
@@ -211,6 +209,6 @@ quote_mode: str = "always", | ||
| """ | ||
| Removes a given key from the given .env | ||
| Removes a given key from the given `.env` file. | ||
| If the .env path given doesn't exist, fails | ||
| If the given key doesn't exist in the .env, fails | ||
| If the .env path given doesn't exist, fails. | ||
| If the given key doesn't exist in the .env, fails. | ||
| """ | ||
@@ -321,3 +319,3 @@ if not os.path.exists(dotenv_path): | ||
| def load_dotenv( | ||
| dotenv_path: Union[str, _PathLike, None] = None, | ||
| dotenv_path: Union[str, os.PathLike, None] = None, | ||
| stream: Optional[IO[str]] = None, | ||
@@ -331,12 +329,15 @@ verbose: bool = False, | ||
| - *dotenv_path*: absolute or relative path to .env file. | ||
| - *stream*: Text stream (such as `io.StringIO`) with .env content, used if | ||
| `dotenv_path` is `None`. | ||
| - *verbose*: whether to output a warning the .env file is missing. Defaults to | ||
| `False`. | ||
| - *override*: whether to override the system environment variables with the variables | ||
| in `.env` file. Defaults to `False`. | ||
| - *encoding*: encoding to be used to read the file. | ||
| Parameters: | ||
| dotenv_path: Absolute or relative path to .env file. | ||
| stream: Text stream (such as `io.StringIO`) with .env content, used if | ||
| `dotenv_path` is `None`. | ||
| verbose: Whether to output a warning the .env file is missing. | ||
| override: Whether to override the system environment variables with the variables | ||
| from the `.env` file. | ||
| encoding: Encoding to be used to read the file. | ||
| Returns: | ||
| Bool: True if atleast one environment variable is set elese False | ||
| If both `dotenv_path` and `stream`, `find_dotenv()` is used to find the .env file. | ||
| If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the | ||
| .env file. | ||
| """ | ||
@@ -358,3 +359,3 @@ if dotenv_path is None and stream is None: | ||
| def dotenv_values( | ||
| dotenv_path: Union[str, _PathLike, None] = None, | ||
| dotenv_path: Union[str, os.PathLike, None] = None, | ||
| stream: Optional[IO[str]] = None, | ||
@@ -368,10 +369,14 @@ verbose: bool = False, | ||
| - *dotenv_path*: absolute or relative path to .env file. | ||
| - *stream*: `StringIO` object with .env content, used if `dotenv_path` is `None`. | ||
| - *verbose*: whether to output a warning the .env file is missing. Defaults to | ||
| `False`. | ||
| in `.env` file. Defaults to `False`. | ||
| - *encoding*: encoding to be used to read the file. | ||
| The returned dict will have `None` values for keys without values in the .env file. | ||
| For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in | ||
| `{"foo": None}` | ||
| If both `dotenv_path` and `stream`, `find_dotenv()` is used to find the .env file. | ||
| Parameters: | ||
| dotenv_path: Absolute or relative path to the .env file. | ||
| stream: `StringIO` object with .env content, used if `dotenv_path` is `None`. | ||
| verbose: Whether to output a warning if the .env file is missing. | ||
| encoding: Encoding to be used to read the file. | ||
| If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the | ||
| .env file. | ||
| """ | ||
@@ -378,0 +383,0 @@ if dotenv_path is None and stream is None: |
@@ -1,1 +0,1 @@ | ||
| __version__ = "0.20.0" | ||
| __version__ = "0.21.0" |
| [console_scripts] | ||
| dotenv = dotenv.cli:cli | ||
| dotenv = dotenv.__main__:cli |
| Metadata-Version: 2.1 | ||
| Name: python-dotenv | ||
| Version: 0.20.0 | ||
| Version: 0.21.0 | ||
| Summary: Read key-value pairs from a .env file and set them as environment variables | ||
@@ -10,8 +10,5 @@ Home-page: https://github.com/theskumar/python-dotenv | ||
| Keywords: environment variables,deployments,settings,env,dotenv,configurations,python | ||
| Platform: UNKNOWN | ||
| Classifier: Development Status :: 5 - Production/Stable | ||
| Classifier: Programming Language :: Python | ||
| Classifier: Programming Language :: Python :: 3 | ||
| Classifier: Programming Language :: Python :: 3.5 | ||
| Classifier: Programming Language :: Python :: 3.6 | ||
| Classifier: Programming Language :: Python :: 3.7 | ||
@@ -30,3 +27,3 @@ Classifier: Programming Language :: Python :: 3.8 | ||
| Classifier: Environment :: Web Environment | ||
| Requires-Python: >=3.5 | ||
| Requires-Python: >=3.7 | ||
| Description-Content-Type: text/markdown | ||
@@ -184,2 +181,7 @@ Provides-Extra: cli | ||
| EMAIL=foo@example.org | ||
| $ dotenv list --format=json | ||
| { | ||
| "USER": "foo", | ||
| "EMAIL": "foo@example.org" | ||
| } | ||
| $ dotenv run -- python foo.py | ||
@@ -197,3 +199,3 @@ ``` | ||
| Spaces before and after keys, equal signs, and values are ignored. Values can be followed | ||
| by a comment. Lines can start with the `export` directive, which has no effect on their | ||
| by a comment. Lines can start with the `export` directive, which does not affect their | ||
| interpretation. | ||
@@ -220,2 +222,16 @@ | ||
| ### Variable without a value | ||
| A variable can have no value: | ||
| ```bash | ||
| FOO | ||
| ``` | ||
| It results in `dotenv_values` associating that variable name with the value `None` (e.g. | ||
| `{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables. | ||
| This shouldn't be confused with `FOO=`, in which case the variable is associated with the | ||
| empty string. | ||
| ### Variable expansion | ||
@@ -252,2 +268,3 @@ | ||
| - [dynaconf](https://github.com/rochacbruno/dynaconf) | ||
| - [parse_it](https://github.com/naorlivne/parse_it) | ||
@@ -274,2 +291,17 @@ ## Acknowledgements | ||
| ## [0.21.0] - 2022-09-03 | ||
| ### Added | ||
| * CLI: add support for invocations via 'python -m'. (#395 by @theskumar) | ||
| * `load_dotenv` function now returns `False`. (#388 by @larsks) | ||
| * CLI: add --format= option to list command. (#407 by @sammck) | ||
| ### Fixed | ||
| * Drop Python 3.5 and 3.6 and upgrade GA (#393 by @eggplants) | ||
| * Use `open` instead of `io.open`. (#389 by @rabinadk1) | ||
| * Improve documentation for variables without a value (#390 by @bbc2) | ||
| * Add `parse_it` to Related Projects by (#410 by @naorlivne) | ||
| * Update README.md by (#415 by @harveer07) | ||
| * Improve documentation with direct use of MkDocs by (#398 by @bbc2) | ||
| ## [0.20.0] - 2022-03-24 | ||
@@ -557,3 +589,2 @@ | ||
| [@Flimm]: https://github.com/Flimm | ||
| [@alanjds]: https://github.com/alanjds | ||
@@ -567,10 +598,17 @@ [@altendky]: https://github.com/altendky | ||
| [@earlbread]: https://github.com/earlbread | ||
| [@eggplants]: https://github.com/@eggplants | ||
| [@ekohl]: https://github.com/ekohl | ||
| [@elbehery95]: https://github.com/elbehery95 | ||
| [@Flimm]: https://github.com/Flimm | ||
| [@gergelyk]: https://github.com/gergelyk | ||
| [@gongqingkui]: https://github.com/gongqingkui | ||
| [@greyli]: https://github.com/greyli | ||
| [@harveer07]: https://github.com/@harveer07 | ||
| [@jadutter]: https://github.com/jadutter | ||
| [@larsks]: https://github.com/@larsks | ||
| [@mgorny]: https://github.com/mgorny | ||
| [@naorlivne]: https://github.com/@naorlivne | ||
| [@qnighy]: https://github.com/qnighy | ||
| [@rabinadk1]: https://github.com/@rabinadk1 | ||
| [@sammck]: https://github.com/@sammck | ||
| [@snobu]: https://github.com/snobu | ||
@@ -585,4 +623,6 @@ [@techalchemy]: https://github.com/techalchemy | ||
| [Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...HEAD | ||
| [0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 | ||
| [Unreleased]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...HEAD | ||
| [0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0 | ||
| [0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 | ||
| [0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2 | ||
@@ -602,3 +642,1 @@ [0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1 | ||
| [0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4 | ||
@@ -8,3 +8,4 @@ .editorconfig | ||
| README.md | ||
| pyproject.toml | ||
| mkdocs.yml | ||
| requirements-docs.txt | ||
| requirements.txt | ||
@@ -14,3 +15,8 @@ setup.cfg | ||
| tox.ini | ||
| docs/changelog.md | ||
| docs/contributing.md | ||
| docs/index.md | ||
| docs/reference.md | ||
| src/dotenv/__init__.py | ||
| src/dotenv/__main__.py | ||
| src/dotenv/cli.py | ||
@@ -17,0 +23,0 @@ src/dotenv/ipython.py |
+24
-5
@@ -5,3 +5,3 @@ import os | ||
| import sh | ||
| from typing import Optional | ||
| import dotenv | ||
@@ -12,11 +12,30 @@ from dotenv.cli import cli as dotenv_cli | ||
| def test_list(cli, dotenv_file): | ||
| @pytest.mark.parametrize( | ||
| "format,content,expected", | ||
| ( | ||
| (None, "x='a b c'", '''x=a b c\n'''), | ||
| ("simple", "x='a b c'", '''x=a b c\n'''), | ||
| ("simple", """x='"a b c"'""", '''x="a b c"\n'''), | ||
| ("simple", '''x="'a b c'"''', '''x='a b c'\n'''), | ||
| ("json", "x='a b c'", '''{\n "x": "a b c"\n}\n'''), | ||
| ("shell", "x='a b c'", "x='a b c'\n"), | ||
| ("shell", """x='"a b c"'""", '''x='"a b c"'\n'''), | ||
| ("shell", '''x="'a b c'"''', '''x=''"'"'a b c'"'"''\n'''), | ||
| ("shell", "x='a\nb\nc'", "x='a\nb\nc'\n"), | ||
| ("export", "x='a b c'", '''export x='a b c'\n'''), | ||
| ) | ||
| ) | ||
| def test_list(cli, dotenv_file, format: Optional[str], content: str, expected: str): | ||
| with open(dotenv_file, "w") as f: | ||
| f.write("a=b") | ||
| f.write(content + '\n') | ||
| result = cli.invoke(dotenv_cli, ['--file', dotenv_file, 'list']) | ||
| args = ['--file', dotenv_file, 'list'] | ||
| if format is not None: | ||
| args.extend(['--format', format]) | ||
| assert (result.exit_code, result.output) == (0, result.output) | ||
| result = cli.invoke(dotenv_cli, args) | ||
| assert (result.exit_code, result.output) == (0, expected) | ||
| def test_list_non_existent_file(cli): | ||
@@ -23,0 +42,0 @@ result = cli.invoke(dotenv_cli, ['--file', 'nx_file', 'list']) |
| import os | ||
| from unittest import mock | ||
| import mock | ||
| import pytest | ||
| pytest.importorskip("IPython") | ||
| @mock.patch.dict(os.environ, {}, clear=True) | ||
@@ -7,0 +11,0 @@ def test_ipython_existing_variable_no_override(tmp_path): |
@@ -6,4 +6,4 @@ import io | ||
| import textwrap | ||
| from unittest import mock | ||
| import mock | ||
| import pytest | ||
@@ -263,4 +263,5 @@ import sh | ||
| with mock.patch.object(logger, "info") as mock_info: | ||
| dotenv.load_dotenv('.does_not_exist', verbose=True) | ||
| result = dotenv.load_dotenv('.does_not_exist', verbose=True) | ||
| assert result is False | ||
| mock_info.assert_called_once_with("Python-dotenv could not find configuration file %s.", ".does_not_exist") | ||
@@ -267,0 +268,0 @@ |
+2
-8
@@ -6,4 +6,2 @@ [tox] | ||
| python = | ||
| 3.5: py35, coverage-report | ||
| 3.6: py36, coverage-report | ||
| 3.7: py37, coverage-report | ||
@@ -14,7 +12,6 @@ 3.8: py38, coverage-report | ||
| 3.11: py311, coverage-report | ||
| pypy3: pypy3, coverage-report | ||
| pypy-3.9: pypy3, coverage-report | ||
| [testenv] | ||
| deps = | ||
| mock | ||
| pytest | ||
@@ -24,3 +21,3 @@ coverage | ||
| click | ||
| py{35,36,37,38,39,310,311,py3}: ipython | ||
| py{37,38,39,310,311,py3}: ipython | ||
| commands = coverage run --parallel -m pytest {posargs} | ||
@@ -33,3 +30,2 @@ | ||
| mypy | ||
| types-mock | ||
| commands = | ||
@@ -42,4 +38,2 @@ flake8 src tests | ||
| mypy --python-version=3.7 src tests | ||
| mypy --python-version=3.6 src tests | ||
| mypy --python-version=3.5 src tests | ||
@@ -46,0 +40,0 @@ [testenv:manifest] |
| [tool.portray] | ||
| modules = ["dotenv"] | ||
| [tool.portray.mkdocs] | ||
| repo_url = "https://github.com/theskumar/python-dotenv" |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
148658
21.66%41
17.14%1507
2.66%