Merge branch 'lego-feature/gitignore'

This commit is contained in:
kez 2023-01-18 12:19:00 -08:00
commit b7b2a6f1f0
23 changed files with 1 additions and 771 deletions

3
.gitignore vendored
View File

@ -2,5 +2,4 @@
__pycache__
*.pyc
.egg*
/packages/txt-to-html/lektor_txt_to_html.egg-info/
/packages/xml-to-html/lektor_xml_to_html.egg-info/
packages/**/*.egg-info

View File

@ -1,454 +0,0 @@
Metadata-Version: 2.1
Name: environs
Version: 8.0.0
Summary: simplified environment variable parsing
Home-page: https://github.com/sloria/environs
Author: Steven Loria
Author-email: sloria1@gmail.com
License: MIT
Project-URL: Issues, https://github.com/sloria/environs/issues
Project-URL: Changelog, https://github.com/sloria/environs/blob/master/CHANGELOG.md
Description: # environs: simplified environment variable parsing
[![Latest version](https://badgen.net/pypi/v/environs)](https://pypi.org/project/environs/)
[![Build Status](https://dev.azure.com/sloria/sloria/_apis/build/status/sloria.environs?branchName=master)](https://dev.azure.com/sloria/sloria/_build/latest?definitionId=12&branchName=master)
[![marshmallow 2/3 compatible](https://badgen.net/badge/marshmallow/2,3?list=1)](https://marshmallow.readthedocs.io/en/latest/upgrading.html)
[![Black code style](https://badgen.net/badge/code%20style/black/000)](https://github.com/ambv/black)
**environs** is a Python library for parsing environment variables.
It allows you to store configuration separate from your code, as per
[The Twelve-Factor App](https://12factor.net/config) methodology.
## Contents
- [Features](#features)
- [Install](#install)
- [Basic usage](#basic-usage)
- [Supported types](#supported-types)
- [Reading .env files](#reading-env-files)
- [Reading a specific file](#reading-a-specific-file)
- [Handling prefixes](#handling-prefixes)
- [Proxied variables](#proxied-variables)
- [Validation](#validation)
- [Deferred validation](#deferred-validation)
- [Serialization](#serialization)
- [Defining custom parser behavior](#defining-custom-parser-behavior)
- [Usage with Flask](#usage-with-flask)
- [Usage with Django](#usage-with-django)
- [Why...?](#why)
- [Why envvars?](#why-envvars)
- [Why not os.environ?](#why-not-osenviron)
- [Why another library?](#why-another-library)
- [License](#license)
## Features
- Type-casting
- Read `.env` files into `os.environ` (useful for local development)
- Validation
- Define custom parser behavior
- Framework-agnostic, but integrates well with [Flask](#usage-with-flask) and [Django](#usage-with-django)
## Install
pip install environs
## Basic usage
With some environment variables set...
```bash
export GITHUB_USER=sloria
export MAX_CONNECTIONS=100
export SHIP_DATE='1984-06-25'
export TTL=42
export ENABLE_LOGIN=true
export GITHUB_REPOS=webargs,konch,ped
export COORDINATES=23.3,50.0
export LOG_LEVEL=DEBUG
```
Parse them with environs...
```python
from environs import Env
env = Env()
env.read_env() # read .env file, if it exists
# required variables
gh_user = env("GITHUB_USER") # => 'sloria'
secret = env("SECRET") # => raises error if not set
# casting
max_connections = env.int("MAX_CONNECTIONS") # => 100
ship_date = env.date("SHIP_DATE") # => datetime.date(1984, 6, 25)
ttl = env.timedelta("TTL") # => datetime.timedelta(0, 42)
log_level = env.log_level("LOG_LEVEL") # => logging.DEBUG
# providing a default value
enable_login = env.bool("ENABLE_LOGIN", False) # => True
enable_feature_x = env.bool("ENABLE_FEATURE_X", False) # => False
# parsing lists
gh_repos = env.list("GITHUB_REPOS") # => ['webargs', 'konch', 'ped']
coords = env.list("COORDINATES", subcast=float) # => [23.3, 50.0]
```
## Supported types
The following are all type-casting methods of `Env`:
- `env.str`
- `env.bool`
- `env.int`
- `env.float`
- `env.decimal`
- `env.list` (accepts optional `subcast` keyword argument)
- `env.dict` (accepts optional `subcast` keyword argument)
- `env.json`
- `env.datetime`
- `env.date`
- `env.timedelta` (assumes value is an integer in seconds)
- `env.url`
- `env.uuid`
- `env.log_level`
- `env.path` (casts to a [`pathlib.Path`](https://docs.python.org/3/library/pathlib.html))
## Reading `.env` files
```bash
# .env
DEBUG=true
PORT=4567
```
Call `Env.read_env` before parsing variables.
```python
from environs import Env
env = Env()
# Read .env into os.environ
env.read_env()
env.bool("DEBUG") # => True
env.int("PORT") # => 4567
```
### Reading a specific file
By default, `Env.read_env` will look for a `.env` file in current
directory and (if no .env exists in the CWD) recurse
upwards until a `.env` file is found.
You can also read a specific file:
```python
from environs import Env
with open(".env.test", "w") as fobj:
fobj.write("A=foo\n")
fobj.write("B=123\n")
env = Env()
env.read_env(".env.test", recurse=False)
assert env("A") == "foo"
assert env.int("B") == 123
```
## Handling prefixes
```python
# export MYAPP_HOST=lolcathost
# export MYAPP_PORT=3000
with env.prefixed("MYAPP_"):
host = env("HOST", "localhost") # => 'lolcathost'
port = env.int("PORT", 5000) # => 3000
# nested prefixes are also supported:
# export MYAPP_DB_HOST=lolcathost
# export MYAPP_DB_PORT=10101
with env.prefixed("MYAPP_"):
with env.prefixed("DB_"):
db_host = env("HOST", "lolcathost")
db_port = env.int("PORT", 10101)
```
## Proxied variables
```python
# export MAILGUN_LOGIN=sloria
# export SMTP_LOGIN={{MAILGUN_LOGIN}}
smtp_login = env("SMTP_LOGIN") # =>'sloria'
```
## Validation
```python
# export TTL=-2
# export NODE_ENV='invalid'
# export EMAIL='^_^'
from environs import Env
from marshmallow.validate import OneOf, Length, Email
env = Env()
# simple validator
env.int("TTL", validate=lambda n: n > 0)
# => Environment variable "TTL" invalid: ['Invalid value.']
# using marshmallow validators
env.str(
"NODE_ENV",
validate=OneOf(
["production", "development"], error="NODE_ENV must be one of: {choices}"
),
)
# => Environment variable "NODE_ENV" invalid: ['NODE_ENV must be one of: production, development']
# multiple validators
env.str("EMAIL", validate=[Length(min=4), Email()])
# => Environment variable "EMAIL" invalid: ['Shorter than minimum length 4.', 'Not a valid email address.']
```
## Deferred validation
By default, a validation error is raised immediately upon calling a parser method for an invalid environment variable.
To defer validation and raise an exception with the combined error messages for all invalid variables, pass `eager=False` to `Env`.
Call `env.seal()` after all variables have been parsed.
```python
# export TTL=-2
# export NODE_ENV='invalid'
# export EMAIL='^_^'
from environs import Env
from marshmallow.validate import OneOf, Email, Length, Range
env = Env(eager=False)
TTL = env.int("TTL", validate=Range(min=0, max=100))
NODE_ENV = env.str(
"NODE_ENV",
validate=OneOf(
["production", "development"], error="NODE_ENV must be one of: {choices}"
),
)
EMAIL = env.str("EMAIL", validate=[Length(min=4), Email()])
env.seal()
# environs.EnvValidationError: Environment variables invalid: {'TTL': ['Must be greater than or equal to 0 and less than or equal to 100.'], 'NODE_ENV': ['NODE_ENV must be one of: production, development'], 'EMAIL': ['Shorter than minimum length 4.', 'Not a valid email address.']}
```
`env.seal()` validates all parsed variables and prevents further parsing (calling a parser method will raise an error).
## Serialization
```python
# serialize to a dictionary of simple types (numbers and strings)
env.dump()
# {'COORDINATES': [23.3, 50.0],
# 'ENABLE_FEATURE_X': False,
# 'ENABLE_LOGIN': True,
# 'GITHUB_REPOS': ['webargs', 'konch', 'ped'],
# 'GITHUB_USER': 'sloria',
# 'MAX_CONNECTIONS': 100,
# 'MYAPP_HOST': 'lolcathost',
# 'MYAPP_PORT': 3000,
# 'SHIP_DATE': '1984-06-25',
# 'TTL': 42}
```
## Defining custom parser behavior
```python
# export DOMAIN='http://myapp.com'
# export COLOR=invalid
from furl import furl
# Register a new parser method for paths
@env.parser_for("furl")
def furl_parser(value):
return furl(value)
domain = env.furl("DOMAIN") # => furl('https://myapp.com')
# Custom parsers can take extra keyword arguments
@env.parser_for("enum")
def enum_parser(value, choices):
if value not in choices:
raise environs.EnvError("Invalid!")
return value
color = env.enum("COLOR", choices=["black"]) # => raises EnvError
```
## Usage with Flask
```python
# myapp/settings.py
from environs import Env
env = Env()
env.read_env()
# Override in .env for local development
DEBUG = env.bool("FLASK_DEBUG", default=False)
# SECRET_KEY is required
SECRET_KEY = env.str("SECRET_KEY")
```
Load the configuration after you initialize your app.
```python
# myapp/app.py
from flask import Flask
app = Flask(__name__)
app.config.from_object("myapp.settings")
```
For local development, use a `.env` file to override the default
configuration.
```bash
# .env
DEBUG=true
SECRET_KEY="not so secret"
```
Note: Because environs depends on [python-dotenv](https://github.com/theskumar/python-dotenv),
the `flask` CLI will automatically read .env and .flaskenv files.
## Usage with Django
environs includes a number of helpers for parsing connection URLs. To
install environs with django support:
pip install environs[django]
Use `env.dj_db_url`, `env.dj_cache_url` and `env.dj_email_url` to parse the `DATABASE_URL`, `CACHE_URL`
and `EMAIL_URL` environment variables, respectively.
For more details on URL patterns, see the following projects that environs is using for converting URLs.
* [dj-database-url](https://github.com/jacobian/dj-database-url)
* [django-cache-url](https://github.com/epicserve/django-cache-url)
* [dj-email-url](https://github.com/migonzalvar/dj-email-url)
Basic example:
```python
# myproject/settings.py
from environs import Env
env = Env()
env.read_env()
# Override in .env for local development
DEBUG = env.bool("DEBUG", default=False)
# SECRET_KEY is required
SECRET_KEY = env.str("SECRET_KEY")
# Parse database URLs, e.g. "postgres://localhost:5432/mydb"
DATABASES = {"default": env.dj_db_url("DATABASE_URL")}
# Parse email URLs, e.g. "smtp://"
email = env.dj_email_url("EMAIL_URL", default="smtp://")
EMAIL_HOST = email["EMAIL_HOST"]
EMAIL_PORT = email["EMAIL_PORT"]
EMAIL_HOST_PASSWORD = email["EMAIL_HOST_PASSWORD"]
EMAIL_HOST_USER = email["EMAIL_HOST_USER"]
EMAIL_USE_TLS = email["EMAIL_USE_TLS"]
# Parse cache URLS, e.g "redis://localhost:6379/0"
CACHES = {"default": env.dj_cache_url("CACHE_URL")}
```
For local development, use a `.env` file to override the default
configuration.
```bash
# .env
DEBUG=true
SECRET_KEY="not so secret"
```
For a more complete example, see
[django_example.py](https://github.com/sloria/environs/blob/master/examples/django_example.py)
in the `examples/` directory.
## Why\...?
### Why envvars?
See [The 12-factor App](http://12factor.net/config) section on
[configuration](http://12factor.net/config).
### Why not `os.environ`?
While `os.environ` is enough for simple use cases, a typical application
will need a way to manipulate and validate raw environment variables.
environs abstracts common tasks for handling environment variables.
environs will help you
- cast envvars to the correct type
- specify required envvars
- define default values
- validate envvars
- parse list and dict values
- parse dates, datetimes, and timedeltas
- parse proxied variables
- serialize your configuration to JSON, YAML, etc.
### Why another library?
There are many great Python libraries for parsing environment variables.
In fact, most of the credit for environs\' public API goes to the
authors of [envparse](https://github.com/rconradharris/envparse) and
[django-environ](https://github.com/joke2k/django-environ).
environs aims to meet three additional goals:
1. Make it easy to extend parsing behavior and develop plugins.
2. Leverage the deserialization and validation functionality provided
by a separate library (marshmallow).
3. Clean up redundant API.
See [this GitHub
issue](https://github.com/rconradharris/envparse/issues/12#issue-151036722)
which details specific differences with envparse.
## License
MIT licensed. See the
[LICENSE](https://github.com/sloria/environs/blob/master/LICENSE) file
for more details.
Keywords: environment variables parsing config configuration 12factor envvars
Platform: UNKNOWN
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Typing :: Typed
Requires-Python: >=3.5.3
Description-Content-Type: text/markdown

View File

@ -1,16 +0,0 @@
CHANGELOG.md
CONTRIBUTING.md
LICENSE
MANIFEST.in
README.md
pyproject.toml
setup.cfg
setup.py
environs/__init__.py
environs/py.typed
environs.egg-info/PKG-INFO
environs.egg-info/SOURCES.txt
environs.egg-info/dependency_links.txt
environs.egg-info/not-zip-safe
environs.egg-info/requires.txt
environs.egg-info/top_level.txt

View File

@ -1,2 +0,0 @@
marshmallow>=2.7.0
python-dotenv

View File

@ -1 +0,0 @@
environs

View File

@ -1,106 +0,0 @@
Metadata-Version: 1.1
Name: lektor-envvars
Version: 18.6.12.4
Summary: A Lektor plugin making environment variables available in templates.
Home-page: https://www.github.com/elbaschid/lektor-envvars
Author: Sebastian Vetter
Author-email: seb@roadsi.de
License: MIT
Description: lektor-envvars
##############
.. image:: https://circleci.com/gh/elbaschid/lektor-envvars.svg?style=svg
:target: https://circleci.com/gh/elbaschid/lektor-envvars
Why this project?
-----------------
**TL;DR** You can use environment variables in your Lektor templates.
I've been working with `Lektor <https://www.getlektor.com/docs/plugins/>`_ as as
static site generator in quite a few projects and really enjoy it. Most recently
I work on a project that used an environment variable to create slightly
different version of the site for ``development``, ``staging`` and ``production``.
Lektor doesn't have a way to add *environment variables* into the templates, so
I started building my own little plugin.
How to install it in Lektor
---------------------------
You can easily install this plugin following the `Lektor docs
<https://www.getlektor.com/docs/plugins/>`_. All you need to do is run::
$ lektor plugin add lektor-envvars
This will automatically install the plugin and add it to your project
configuration.
Using environment variables
---------------------------
You are able to access environment variables using the ``envvars`` function
inside your Jinja2 template. This function is added whenever lektor is running
a new build.
All environment variables are prefixed with ``LEKTOR_`` by default. Let's look
at a simple example with an environment varialbe ``LEKTOR_DEBUG=true``::
$ export LEKTOR_DEBUG=true
You can access this variable inside any Jinja2 template::
{{ envvars('DEBUG') }}
which will display ``true`` instead.
Converting values
-----------------
That's a great start but what if you want this to be a boolean value instead of
the string ``true``? You simply convert the value::
{{ envvars('DEBUG', bool) }}
or you can now even do::
{% if envvars('DEBUG', bool) %}
...
{% endif %}
Custom prefixes (or no prefix)
------------------------------
If you don't like the ``LEKTOR_`` prefix, you can either use your own prefix by
setting the prefix in the ``configs/lektor-envvars.ini`` file::
[envvars]
prefix = MY_OWN_
You can now use ``MY_OWN_DEBUG`` instead of ``LEKTOR_DEBUG``. This means that
all environment variables need to be prefixed with ``MY_OWN_`` now instead.
You can also ignore the prefix all together::
{{ envvars('DEBUG', no_prefix=True) }}
which will give you access to the environment variable ``DEBUG``.
License
-------
This code is licensed under the `MIT License`_.
.. _`MIT License`: https://github.com/elbaschid/lektor-envvars/blob/master/LICENSE
Platform: UNKNOWN
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: Implementation :: CPython

View File

@ -1,11 +0,0 @@
LICENSE
MANIFEST.in
README.rst
lektor_envvars.py
setup.cfg
setup.py
lektor_envvars.egg-info/PKG-INFO
lektor_envvars.egg-info/SOURCES.txt
lektor_envvars.egg-info/dependency_links.txt
lektor_envvars.egg-info/entry_points.txt
lektor_envvars.egg-info/top_level.txt

View File

@ -1,3 +0,0 @@
[lektor.plugins]
envvars = lektor_envvars:EnvvarsPlugin

View File

@ -1 +0,0 @@
lektor_envvars

View File

@ -1,10 +0,0 @@
Metadata-Version: 1.0
Name: lektor-i18n
Version: 0.2
Summary: UNKNOWN
Home-page: https://github.com/numericube/lektor-i18n-plugin
Author: NumeriCube
Author-email: support@numericube.com
License: GPL
Description: UNKNOWN
Platform: UNKNOWN

View File

@ -1,8 +0,0 @@
README
lektor_i18n.py
setup.py
lektor_i18n.egg-info/PKG-INFO
lektor_i18n.egg-info/SOURCES.txt
lektor_i18n.egg-info/dependency_links.txt
lektor_i18n.egg-info/entry_points.txt
lektor_i18n.egg-info/top_level.txt

View File

@ -1,3 +0,0 @@
[lektor.plugins]
i18n = lektor_i18n:I18NPlugin

View File

@ -1 +0,0 @@
lektor_i18n

View File

@ -1,131 +0,0 @@
Metadata-Version: 2.1
Name: lektor-npm-support
Version: 0.1.4
Summary: Adds support for using npm/yarn to build assets in Lektor
Home-page: http://github.com/sterin/lektor-npm-support
Author: Baruch Sterin
Author-email: lektor-npm-support@bsterin.com
License: BSD
Description: # lektor-npm-support
[![Build Status](https://travis-ci.org/sterin/lektor-npm-support.svg)](https://travis-ci.org/sterin/lektor-npm-support)
[![Build status](https://ci.appveyor.com/api/projects/status/6op1csefpi9l8hbg?svg=true)](https://ci.appveyor.com/project/sterin/lektor-npm-support)
[![Code Coverage](https://codecov.io/gh/sterin/lektor-npm-support/branch/master/graph/badge.svg)](https://codecov.io/gh/sterin/lektor-npm-support)
`lektor-npm-support` makes it easy to use [Parcel](https://parcel.js.org), [webpack](https://webpack.js.org), [browserify](http://browserify.org/), or any other tool to build assets for [Lektor](https://github.com/lektor/lektor) projects.
## Enabling the Plugin
To enable the plugin, run this command while inside your Lektor project directory:
```bash
lektor plugins add lektor-npm-support
```
## Example: Creating a [Parcel](https://parceljs.org/) Project
Create a `parcel/` folder and inside that folder create the following files:
### `configs/npm-support.ini`
This file instructs the plugin how to generate the assets:
```ini
[parcel]
npm = yarn
watch_script = watch
build_script = build
```
* The section name `[parcel]` is the name of the folder where the Parcel project is located.
* `npm` is the package manager command used to build the project. This example will use [Yarn](https://yarnpkg.com).
* `watch_script` is the npm script used in `lektor server -f npm`,
* `build_script` is the npm script used in `lektor build -f npm`.
This plugin supports more than one such entry.
### `parcel/package.json`
This is a standard `package.json` file. It should contain two entries in the `scripts` section. The `build` script is used during `lektor build -f npm`, and the `watch` script is used during `lektor server -f npm`.
```json
{
"name": "my-parcel-project",
"version": "1.0.0",
"scripts": {
"watch": "NODE_ENV=development parcel --out-dir=../assets/static/gen --out-file=main.js --public-url=./assets/ main.js",
"build": "NODE_ENV=production parcel build --out-dir=../assets/static/gen --out-file=main.js --public-url=./assets/ main.js"
},
"private": true
}
```
Now we can use `yarn add` to add Parcel, [Babel](https://babeljs.io/) and [Sass](https://sass-lang.com/):
```
$ cd </path/to/your/lektor/project>/parcel
$ yarn add parcel-bundler babel-preset-env node-sass
```
### `parcel/babelr.rc`
Next up is a simple Babel config file, using the recommended `env` preset.
```json
{
"presets": ["env"]
}
```
### `parcel/main.scss`
A simple SCSS file.
```scss
body {
border: 10px solid red;
}
```
### `parcel/main.js`
A simple Javascript file that imports the SCSS file so that Parcel will know to include it as well.
```javascript
import './main.scss';
```
## Running the Server
Now you're ready to go. When you run `lektor server` nothing wil happen,
instead you need to now run it as `lektor server -f npm` which
will enable the Parcel build. Parcel will automatically build your files
into `assets/static/gen` and this is where Lektor will then pick up the
files. This is done so that you can ship the generated assets
to others that might not have these tools, which simplifies using a
Lektor website that use this plugin.
## Manual Builds
To manually trigger a build that also invokes webpack you can use `lektor build -f npm`.
## Including The Files
Now you need to include the files in your template. This will do it:
```html
<link rel="stylesheet" href="{{ '/static/gen/main.css'| asseturl }}">
<script type=text/javascript src="{{ '/static/gen/main.js'| asseturl }}" charset="utf-8"></script>
```
## Complete Working Example
The `examples` folder of this repository contains working projects.
## Credits
This plugin is based on the official [lektor-webpack-support](https://github.com/lektor/lektor-webpack-support) Lektor plugin by [Armin Ronacher](http://lucumr.pocoo.org/about/).
Platform: UNKNOWN
Description-Content-Type: text/markdown

View File

@ -1,12 +0,0 @@
CHANGELOG.md
LICENSE.md
MANIFEST.in
README.md
lektor_npm_support.py
setup.cfg
setup.py
lektor_npm_support.egg-info/PKG-INFO
lektor_npm_support.egg-info/SOURCES.txt
lektor_npm_support.egg-info/dependency_links.txt
lektor_npm_support.egg-info/entry_points.txt
lektor_npm_support.egg-info/top_level.txt

View File

@ -1,3 +0,0 @@
[lektor.plugins]
npm-support = lektor_npm_support:NPMSupportPlugin

View File

@ -1 +0,0 @@
lektor_npm_support