repos: 279357123
This data as json
id | node_id | name | full_name | private | owner | html_url | description | fork | created_at | updated_at | pushed_at | homepage | size | stargazers_count | watchers_count | language | has_issues | has_projects | has_downloads | has_wiki | has_pages | forks_count | archived | disabled | open_issues_count | license | topics | forks | open_issues | watchers | default_branch | permissions | temp_clone_token | organization | network_count | subscribers_count | readme | readme_html | allow_forking | visibility | is_template | template_repository | web_commit_signoff_required | has_discussions |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
279357123 | MDEwOlJlcG9zaXRvcnkyNzkzNTcxMjM= | datasette-auth-passwords | simonw/datasette-auth-passwords | 0 | 9599 | https://github.com/simonw/datasette-auth-passwords | Datasette plugin for authentication using passwords | 0 | 2020-07-13T16:34:39Z | 2022-02-10T22:07:52Z | 2022-03-22T01:49:50Z | https://datasette-auth-passwords-demo.datasette.io | 52 | 12 | 12 | Python | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 3 | ["datasette", "datasette-io", "datasette-plugin"] | 0 | 3 | 12 | main | {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false} | 0 | 1 | # datasette-auth-passwords [](https://pypi.org/project/datasette-auth-passwords/) [](https://github.com/simonw/datasette-auth-passwords/releases) [](https://github.com/simonw/datasette-auth-passwords/blob/master/LICENSE) Datasette plugin for authenticating access using passwords ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-auth-passwords ## Demo A demo of this plugin is running at https://datasette-auth-passwords-demo.datasette.io/ The demo is configured to show the `public.db` database to everyone, but the `private.db` database only to logged in users. You can log in at https://datasette-auth-passwords-demo.datasette.io/-/login with username `root` and password `password!`. ## Usage This plugin works based on a list of username/password accounts that are hard-coded into the plugin configuration. First, you'll need to create a password hash. There are three ways to do that: - Install the plugin, then use the interactive tool located at `/-/password-tool` - Use the hosted version of that tool at https://datasette-auth-passwords-demo.datasette.io/-/password-tool - Use the `datasette hash-password` command, described below Now add the following to your `metadata.json`: ```json { "plugins": { "datasette-auth-passwords": { "someusername_password_hash": { "$env": "PASSWORD_HASH_1" } } } } ``` The password hash can now be specified in an environment variable when you run Datasette. You can do that like so: PASSWORD_HASH_1='pbkdf2_sha256$...' \ datasette -m metadata.json Be sure to use single quotes here otherwise the `$` symbols in the password hash may be incorrectly interpreted by your shell. You will now be able to log in to your instance using the form at `/-/login` with `someusername` as the username and the password that you used to create your hash as the password. You can include as many accounts as you like in the configuration, each with different usernames. ### datasette hash-password The plugin exposes a new CLI command, `datasette hash-password`. You can run this without arguments to interactively create a new password hash: ``` % datasette hash-password Password: Repeat for confirmation: pbkdf2_sha256$260000$1513... ``` Or if you want to use it as part of a script, you can add the `--no-confirm` option to generate a hash directly from a value passed to standard input: ``` % echo 'my password' | datasette hash-password --no-confirm pbkdf2_sha256$260000$daa... ``` ### Specifying actors By default, a logged in user will result in an [actor block](https://datasette.readthedocs.io/en/stable/authentication.html#actors) that just contains their username: ```json { "id": "someusername" } ``` You can customize the actor that will be used for a username by including an `"actors"` configuration block, like this: ```json { "plugins": { "datasette-auth-passwords": { "someusername_password_hash": { "$env": "PASSWORD_HASH_1" }, "actors": { "someusername": { "id": "someusername", "name": "Some user" } } } } } ``` ### HTTP Basic authentication option This plugin defaults to implementing login using an HTML form that sets a signed authentication cookie. You can alternatively configure it to use [HTTP Basic authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#basic_authentication_scheme) instead. Do this by adding `"http_basic_auth": true` to the `datasette-auth-passwords` block in your plugin configuration. This option introduces the following behaviour: - Account usernames and passwords are configured in the same way as form-based authentication - Every page within Datasette - even pages that normally do not use authentication, such as static assets - will display a browser login prompt - Users will be unable to log out without closing their browser entirely There is a demo of this mode at https://datasette-auth-passwords-http-basic-demo.datasette.io/ - sign in with username `root` and password `password!` ### Using with datasette publish If you are publishing data using a [datasette publish](https://datasette.readthedocs.io/en/stable/publish.html#datasette-publish) command you can use the `--plugin-secret` option to securely configure your password hashes (see [secret configuration values](https://datasette.readthedocs.io/en/stable/plugins.html#secret-configuration-values)). You would run the command something like this: datasette publish cloudrun mydatabase.db \ --install datasette-auth-passwords \ --plugin-secret datasette-auth-passwords root_password_hash 'pbkdf2_sha256$...' \ --service datasette-auth-passwords-demo This will allow you to log in as username `root` using the password that you used to create the hash. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-auth-passwords python3 -mvenv venv source venv/bin/activate Or if you are using `pipenv`: pipenv shell Now install the dependencies and tests: pip install -e '.[test]' To run the tests: pytest | <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-auth-passwords" class="anchor" aria-hidden="true" href="#user-content-datasette-auth-passwords"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>datasette-auth-passwords</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-auth-passwords/" rel="nofollow"><img src="https://camo.githubusercontent.com/6069887e91e8732eb602a4f9f0294b4fb71295c8f3fd82133d21bdb062694a96/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d617574682d70617373776f7264732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-auth-passwords.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth-passwords/releases"><img src="https://camo.githubusercontent.com/826bb037366364dfa68ab57355193eb9ded8ecb7d137c62e66d8b9502fe9039f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d617574682d70617373776f7264733f6c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-auth-passwords?label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth-passwords/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" style="max-width: 100%;"></a></p> <p dir="auto">Datasette plugin for authenticating access using passwords</p> <h2 dir="auto"><a id="user-content-installation" class="anchor" aria-hidden="true" href="#user-content-installation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Installation</h2> <p dir="auto">Install this plugin in the same environment as Datasette.</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="$ datasette install datasette-auth-passwords"><pre><code>$ datasette install datasette-auth-passwords </code></pre></div> <h2 dir="auto"><a id="user-content-demo" class="anchor" aria-hidden="true" href="#user-content-demo"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Demo</h2> <p dir="auto">A demo of this plugin is running at <a href="https://datasette-auth-passwords-demo.datasette.io/" rel="nofollow">https://datasette-auth-passwords-demo.datasette.io/</a></p> <p dir="auto">The demo is configured to show the <code>public.db</code> database to everyone, but the <code>private.db</code> database only to logged in users.</p> <p dir="auto">You can log in at <a href="https://datasette-auth-passwords-demo.datasette.io/-/login" rel="nofollow">https://datasette-auth-passwords-demo.datasette.io/-/login</a> with username <code>root</code> and password <code>password!</code>.</p> <h2 dir="auto"><a id="user-content-usage" class="anchor" aria-hidden="true" href="#user-content-usage"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Usage</h2> <p dir="auto">This plugin works based on a list of username/password accounts that are hard-coded into the plugin configuration.</p> <p dir="auto">First, you'll need to create a password hash. There are three ways to do that:</p> <ul dir="auto"> <li>Install the plugin, then use the interactive tool located at <code>/-/password-tool</code></li> <li>Use the hosted version of that tool at <a href="https://datasette-auth-passwords-demo.datasette.io/-/password-tool" rel="nofollow">https://datasette-auth-passwords-demo.datasette.io/-/password-tool</a></li> <li>Use the <code>datasette hash-password</code> command, described below</li> </ul> <p dir="auto">Now add the following to your <code>metadata.json</code>:</p> <div class="highlight highlight-source-json position-relative overflow-auto" data-snippet-clipboard-copy-content="{ "plugins": { "datasette-auth-passwords": { "someusername_password_hash": { "$env": "PASSWORD_HASH_1" } } } }"><pre>{ <span class="pl-ent">"plugins"</span>: { <span class="pl-ent">"datasette-auth-passwords"</span>: { <span class="pl-ent">"someusername_password_hash"</span>: { <span class="pl-ent">"$env"</span>: <span class="pl-s"><span class="pl-pds">"</span>PASSWORD_HASH_1<span class="pl-pds">"</span></span> } } } }</pre></div> <p dir="auto">The password hash can now be specified in an environment variable when you run Datasette. You can do that like so:</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="PASSWORD_HASH_1='pbkdf2_sha256$...' \ datasette -m metadata.json"><pre><code>PASSWORD_HASH_1='pbkdf2_sha256$...' \ datasette -m metadata.json </code></pre></div> <p dir="auto">Be sure to use single quotes here otherwise the <code>$</code> symbols in the password hash may be incorrectly interpreted by your shell.</p> <p dir="auto">You will now be able to log in to your instance using the form at <code>/-/login</code> with <code>someusername</code> as the username and the password that you used to create your hash as the password.</p> <p dir="auto">You can include as many accounts as you like in the configuration, each with different usernames.</p> <h3 dir="auto"><a id="user-content-datasette-hash-password" class="anchor" aria-hidden="true" href="#user-content-datasette-hash-password"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>datasette hash-password</h3> <p dir="auto">The plugin exposes a new CLI command, <code>datasette hash-password</code>. You can run this without arguments to interactively create a new password hash:</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="% datasette hash-password Password: Repeat for confirmation: pbkdf2_sha256$260000$1513..."><pre><code>% datasette hash-password Password: Repeat for confirmation: pbkdf2_sha256$260000$1513... </code></pre></div> <p dir="auto">Or if you want to use it as part of a script, you can add the <code>--no-confirm</code> option to generate a hash directly from a value passed to standard input:</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="% echo 'my password' | datasette hash-password --no-confirm pbkdf2_sha256$260000$daa..."><pre><code>% echo 'my password' | datasette hash-password --no-confirm pbkdf2_sha256$260000$daa... </code></pre></div> <h3 dir="auto"><a id="user-content-specifying-actors" class="anchor" aria-hidden="true" href="#user-content-specifying-actors"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Specifying actors</h3> <p dir="auto">By default, a logged in user will result in an <a href="https://datasette.readthedocs.io/en/stable/authentication.html#actors" rel="nofollow">actor block</a> that just contains their username:</p> <div class="highlight highlight-source-json position-relative overflow-auto" data-snippet-clipboard-copy-content="{ "id": "someusername" }"><pre>{ <span class="pl-ent">"id"</span>: <span class="pl-s"><span class="pl-pds">"</span>someusername<span class="pl-pds">"</span></span> }</pre></div> <p dir="auto">You can customize the actor that will be used for a username by including an <code>"actors"</code> configuration block, like this:</p> <div class="highlight highlight-source-json position-relative overflow-auto" data-snippet-clipboard-copy-content="{ "plugins": { "datasette-auth-passwords": { "someusername_password_hash": { "$env": "PASSWORD_HASH_1" }, "actors": { "someusername": { "id": "someusername", "name": "Some user" } } } } }"><pre>{ <span class="pl-ent">"plugins"</span>: { <span class="pl-ent">"datasette-auth-passwords"</span>: { <span class="pl-ent">"someusername_password_hash"</span>: { <span class="pl-ent">"$env"</span>: <span class="pl-s"><span class="pl-pds">"</span>PASSWORD_HASH_1<span class="pl-pds">"</span></span> }, <span class="pl-ent">"actors"</span>: { <span class="pl-ent">"someusername"</span>: { <span class="pl-ent">"id"</span>: <span class="pl-s"><span class="pl-pds">"</span>someusername<span class="pl-pds">"</span></span>, <span class="pl-ent">"name"</span>: <span class="pl-s"><span class="pl-pds">"</span>Some user<span class="pl-pds">"</span></span> } } } } }</pre></div> <h3 dir="auto"><a id="user-content-http-basic-authentication-option" class="anchor" aria-hidden="true" href="#user-content-http-basic-authentication-option"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>HTTP Basic authentication option</h3> <p dir="auto">This plugin defaults to implementing login using an HTML form that sets a signed authentication cookie.</p> <p dir="auto">You can alternatively configure it to use <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#basic_authentication_scheme" rel="nofollow">HTTP Basic authentication</a> instead.</p> <p dir="auto">Do this by adding <code>"http_basic_auth": true</code> to the <code>datasette-auth-passwords</code> block in your plugin configuration.</p> <p dir="auto">This option introduces the following behaviour:</p> <ul dir="auto"> <li>Account usernames and passwords are configured in the same way as form-based authentication</li> <li>Every page within Datasette - even pages that normally do not use authentication, such as static assets - will display a browser login prompt</li> <li>Users will be unable to log out without closing their browser entirely</li> </ul> <p dir="auto">There is a demo of this mode at <a href="https://datasette-auth-passwords-http-basic-demo.datasette.io/" rel="nofollow">https://datasette-auth-passwords-http-basic-demo.datasette.io/</a> - sign in with username <code>root</code> and password <code>password!</code></p> <h3 dir="auto"><a id="user-content-using-with-datasette-publish" class="anchor" aria-hidden="true" href="#user-content-using-with-datasette-publish"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Using with datasette publish</h3> <p dir="auto">If you are publishing data using a <a href="https://datasette.readthedocs.io/en/stable/publish.html#datasette-publish" rel="nofollow">datasette publish</a> command you can use the <code>--plugin-secret</code> option to securely configure your password hashes (see <a href="https://datasette.readthedocs.io/en/stable/plugins.html#secret-configuration-values" rel="nofollow">secret configuration values</a>).</p> <p dir="auto">You would run the command something like this:</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="datasette publish cloudrun mydatabase.db \ --install datasette-auth-passwords \ --plugin-secret datasette-auth-passwords root_password_hash 'pbkdf2_sha256$...' \ --service datasette-auth-passwords-demo"><pre><code>datasette publish cloudrun mydatabase.db \ --install datasette-auth-passwords \ --plugin-secret datasette-auth-passwords root_password_hash 'pbkdf2_sha256$...' \ --service datasette-auth-passwords-demo </code></pre></div> <p dir="auto">This will allow you to log in as username <code>root</code> using the password that you used to create the hash.</p> <h2 dir="auto"><a id="user-content-development" class="anchor" aria-hidden="true" href="#user-content-development"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Development</h2> <p dir="auto">To set up this plugin locally, first checkout the code. Then create a new virtual environment:</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="cd datasette-auth-passwords python3 -mvenv venv source venv/bin/activate"><pre><code>cd datasette-auth-passwords python3 -mvenv venv source venv/bin/activate </code></pre></div> <p dir="auto">Or if you are using <code>pipenv</code>:</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="pipenv shell"><pre><code>pipenv shell </code></pre></div> <p dir="auto">Now install the dependencies and tests:</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="pip install -e '.[test]'"><pre><code>pip install -e '.[test]' </code></pre></div> <p dir="auto">To run the tests:</p> <div class="snippet-clipboard-content position-relative overflow-auto" data-snippet-clipboard-copy-content="pytest"><pre><code>pytest </code></pre></div> </article></div> | 1 | public | 0 |
Links from other tables
- 11 rows from repo in releases