home / content

repos

43 rows where owner = 9599 and permissions = "{"admin": false, "push": false, "pull": false}"

✎ View and edit SQL

This data as json, CSV (advanced)

Suggested facets: homepage, stargazers_count, watchers_count, language, forks_count, open_issues_count, topics, forks, open_issues, watchers, default_branch, network_count, subscribers_count, created_at (date), updated_at (date), pushed_at (date), topics (array)

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
166159072 MDEwOlJlcG9zaXRvcnkxNjYxNTkwNzI= db-to-sqlite simonw/db-to-sqlite 0 simonw 9599 https://github.com/simonw/db-to-sqlite CLI tool for exporting tables or queries from any SQL database to a SQLite file 0 2019-01-17T04:16:48Z 2021-06-11T22:52:12Z 2021-06-11T22:55:56Z   77 226 226 Python 1 1 1 1 0 12 0 0 2 Apache License 2.0 apache-2.0 ["sqlalchemy", "sqlite", "datasette", "datasette-io", "datasette-tool"] 12 2 226 main {"admin": false, "push": false, "pull": false}     12 4 # db-to-sqlite [![PyPI](https://img.shields.io/pypi/v/db-to-sqlite.svg)](https://pypi.python.org/pypi/db-to-sqlite) [![Changelog](https://img.shields.io/github/v/release/simonw/db-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/db-to-sqlite/releases) [![Tests](https://github.com/simonw/db-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/db-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/db-to-sqlite/blob/main/LICENSE) CLI tool for exporting tables or queries from any SQL database to a SQLite file. ## Installation Install from PyPI like so: pip install db-to-sqlite If you want to use it with MySQL, you can install the extra dependency like this: pip install 'db-to-sqlite[mysql]' Installing the `mysqlclient` library on OS X can be tricky - I've found [this recipe](https://gist.github.com/simonw/90ac0afd204cd0d6d9c3135c3888d116) to work (run that before installing `db-to-sqlite`). For PostgreSQL, use this: pip install 'db-to-sqlite[postgresql]' ## Usage Usage: db-to-sqlite [OPTIONS] CONNECTION PATH Load data from any database into SQLite. PATH is a path to the SQLite file to create, e.c. /tmp/my_database.db CONNECTION is a SQLAlchemy connection string, for example: postgresql://localhost/my_database postgresql://username:passwd@localhost/my_database mysql://root@localhost/my_database mysql://username:passwd@localhost/my_database More: https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls Options: --version Show the version and exit. --all Detect and copy all tables --table TEXT Specific tables to copy --skip TEXT When using --all skip these tables --redact TEXT... (table, column) pairs to redact with *** --sql TEXT Optional SQL q… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-db-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-db-to-sqlite"><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>db-to-sqlite</h1> <p><a href="https://pypi.python.org/pypi/db-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/b34869a6692a0e2ab6754463aad8578fe9f594788d99d4fd7ae2d815735d1660/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f64622d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/db-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/db-to-sqlite/releases"><img src="https://camo.githubusercontent.com/0f168b599361c3b2242a18a2b84f49d1c4e5520c7c425a89f43fd1b6f337f299/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f64622d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/db-to-sqlite?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/db-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/db-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/db-to-sqlite/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733…            
168474970 MDEwOlJlcG9zaXRvcnkxNjg0NzQ5NzA= dbf-to-sqlite simonw/dbf-to-sqlite 0 simonw 9599 https://github.com/simonw/dbf-to-sqlite CLI tool for converting DBF files (dBase, FoxPro etc) to SQLite 0 2019-01-31T06:30:46Z 2021-03-23T01:29:41Z 2020-02-16T00:41:20Z   8 25 25 Python 1 1 1 1 0 8 0 0 3 Apache License 2.0 apache-2.0 ["sqlite", "foxpro", "dbf", "dbase", "datasette-io", "datasette-tool"] 8 3 25 master {"admin": false, "push": false, "pull": false}     8 2 # dbf-to-sqlite [![PyPI](https://img.shields.io/pypi/v/dbf-to-sqlite.svg)](https://pypi.python.org/pypi/dbf-to-sqlite) [![Travis CI](https://travis-ci.com/simonw/dbf-to-sqlite.svg?branch=master)](https://travis-ci.com/simonw/dbf-to-sqlite) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/dbf-to-sqlite/blob/master/LICENSE) CLI tool for converting DBF files (dBase, FoxPro etc) to SQLite. ## Installation pip install dbf-to-sqlite ## Usage $ dbf-to-sqlite --help Usage: dbf-to-sqlite [OPTIONS] DBF_PATHS... SQLITE_DB Convert DBF files (dBase, FoxPro etc) to SQLite https://github.com/simonw/dbf-to-sqlite Options: --version Show the version and exit. --table TEXT Table name to use (only valid for single files) -v, --verbose Show what's going on --help Show this message and exit. Example usage: $ dbf-to-sqlite *.DBF database.db This will create a new SQLite database called `database.db` containing one table for each of the `DBF` files in the current directory. Looking for DBF files to try this out on? Try downloading the [Himalayan Database](http://himalayandatabase.com/) of all expeditions that have climbed in the Nepal Himalaya. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-dbf-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-dbf-to-sqlite"><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>dbf-to-sqlite</h1> <p><a href="https://pypi.python.org/pypi/dbf-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/59d39789edaeb918bb1febd34597470b4d6cab449725f3db3c0bb59d3c02551a/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6462662d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/dbf-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://travis-ci.com/simonw/dbf-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/d7e086b366bfa3de03a5c75c2112c011ac4eaf71863fed90253e3b5c28e13f89/68747470733a2f2f7472617669732d63692e636f6d2f73696d6f6e772f6462662d746f2d73716c6974652e7376673f6272616e63683d6d6173746572" alt="Travis CI" data-canonical-src="https://travis-ci.com/simonw/dbf-to-sqlite.svg?branch=master" style="max-width:100%;"></a> <a href="https://github.com/simonw/dbf-to-sqlite/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>CLI tool for converting DBF files (dBase, FoxPr…            
174715153 MDEwOlJlcG9zaXRvcnkxNzQ3MTUxNTM= datasette-jellyfish simonw/datasette-jellyfish 0 simonw 9599 https://github.com/simonw/datasette-jellyfish Datasette plugin adding SQL functions for fuzzy text matching powered by Jellyfish 0 2019-03-09T16:02:01Z 2021-02-06T02:33:49Z 2021-02-06T02:34:18Z https://datasette.io/plugins/datasette-jellyfish 15 9 9 Python 1 1 1 1 0 2 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 2 0 9 main {"admin": false, "push": false, "pull": false}     2 1 # datasette-jellyfish [![PyPI](https://img.shields.io/pypi/v/datasette-jellyfish.svg)](https://pypi.org/project/datasette-jellyfish/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-jellyfish?include_prereleases&label=changelog)](https://github.com/simonw/datasette-jellyfish/releases) [![Tests](https://github.com/simonw/datasette-jellyfish/workflows/Test/badge.svg)](https://github.com/simonw/datasette-jellyfish/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-jellyfish/blob/main/LICENSE) Datasette plugin that adds custom SQL functions for fuzzy string matching, built on top of the [Jellyfish](https://github.com/jamesturk/jellyfish) Python library by James Turk and Michael Stephens. Interactive demos: * [soundex, metaphone, nysiis, match_rating_codex comparison](https://latest-with-plugins.datasette.io/fixtures?sql=SELECT%0D%0A++++soundex%28%3As%29%2C+%0D%0A++++metaphone%28%3As%29%2C+%0D%0A++++nysiis%28%3As%29%2C+%0D%0A++++match_rating_codex%28%3As%29&s=demo). * [distance functions comparison](https://latest-with-plugins.datasette.io/fixtures?sql=SELECT%0D%0A++++levenshtein_distance%28%3As1%2C+%3As2%29%2C%0D%0A++++damerau_levenshtein_distance%28%3As1%2C+%3As2%29%2C%0D%0A++++hamming_distance%28%3As1%2C+%3As2%29%2C%0D%0A++++jaro_similarity%28%3As1%2C+%3As2%29%2C%0D%0A++++jaro_winkler_similarity%28%3As1%2C+%3As2%29%2C%0D%0A++++match_rating_comparison%28%3As1%2C+%3As2%29%3B&s1=barrack+obama&s2=barrack+h+obama) Examples: SELECT soundex("hello"); -- Outputs H400 SELECT metaphone("hello"); -- Outputs HL SELECT nysiis("hello"); -- Outputs HAL SELECT match_rating_codex("hello"); -- Outputs HLL SELECT porter_stem("running"); -- Outputs run SELECT levenshtein_distance("hello", "hello world"); -- Outputs 6 SELECT damerau_levenshtein_distance("hello", "hello world"); -- Outputs 6 SELECT hamming_distance("hello", "hello wor… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-jellyfish" class="anchor" aria-hidden="true" href="#user-content-datasette-jellyfish"><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-jellyfish</h1> <p><a href="https://pypi.org/project/datasette-jellyfish/" rel="nofollow"><img src="https://camo.githubusercontent.com/e05229cfd49e2fc6fbff79424545caee53b94da156d85d3f3bdb39ee9e32aef2/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6a656c6c79666973682e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-jellyfish.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-jellyfish/releases"><img src="https://camo.githubusercontent.com/13a248cf10fa13fb53cb22841b0065f965423a4e0f5c17d19673603b2baca376/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6a656c6c79666973683f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-jellyfish?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-jellyfish/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-jellyfish/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-jellyfish/blob/main/LICENSE"><img src="https://camo.git…            
175550127 MDEwOlJlcG9zaXRvcnkxNzU1NTAxMjc= yaml-to-sqlite simonw/yaml-to-sqlite 0 simonw 9599 https://github.com/simonw/yaml-to-sqlite Utility for converting YAML files to SQLite 0 2019-03-14T04:49:08Z 2021-06-13T09:04:40Z 2021-06-13T04:45:52Z   19 36 36 Python 1 1 1 1 0 2 0 0 0 Apache License 2.0 apache-2.0 ["yaml", "sqlite", "datasette-io", "datasette-tool"] 2 0 36 main {"admin": false, "push": false, "pull": false}     2 1 # yaml-to-sqlite [![PyPI](https://img.shields.io/pypi/v/yaml-to-sqlite.svg)](https://pypi.org/project/yaml-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/simonw/yaml-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/yaml-to-sqlite/releases) [![Tests](https://github.com/simonw/yaml-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/yaml-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/yaml-to-sqlite/blob/main/LICENSE) Load the contents of a YAML file into a SQLite database table. ``` $ yaml-to-sqlite --help Usage: yaml-to-sqlite [OPTIONS] DB_PATH TABLE YAML_FILE Convert YAML files to SQLite Options: --version Show the version and exit. --pk TEXT Column to use as a primary key --single-column TEXT If YAML file is a list of values, populate this column --help Show this message and exit. ``` ## Usage Given a `news.yml` file containing the following: ```yaml - date: 2021-06-05 body: |- [Datasette 0.57](https://docs.datasette.io/en/stable/changelog.html#v0-57) is out with an important security patch. - date: 2021-05-10 body: |- [Django SQL Dashboard](https://simonwillison.net/2021/May/10/django-sql-dashboard/) is a new tool that brings a useful authenticated subset of Datasette to Django projects that are built on top of PostgreSQL. ``` Running this command: ```bash $ yaml-to-sqlite news.db stories news.yml ``` Will create a database file with this schema: ```bash $ sqlite-utils schema news.db CREATE TABLE [stories] ( [date] TEXT, [body] TEXT ); ``` The `--pk` option can be used to set a column as the primary key for the table: ```bash $ yaml-to-sqlite news.db stories news.yml --pk date $ sqlite-utils schema news.db CREATE TABLE [stories] ( [date] TEXT PRIMARY KEY, [body] TEXT ); ``` ## Single column YAML lists The `--single-column` option can be used when the YAML file is a list of values, for … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-yaml-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-yaml-to-sqlite"><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>yaml-to-sqlite</h1> <p><a href="https://pypi.org/project/yaml-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/32afda5e7bc913df42ad343b589f5d20c4fb51d9755037f4af1df86149cd0d94/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f79616d6c2d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/yaml-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/yaml-to-sqlite/releases"><img src="https://camo.githubusercontent.com/83cd14b53497376686dfabbadad49ff0e485a8a84f8266713a3c89fe7181ccbc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f79616d6c2d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/yaml-to-sqlite?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/yaml-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/yaml-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/yaml-to-sqlite/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4…            
184168864 MDEwOlJlcG9zaXRvcnkxODQxNjg4NjQ= datasette-render-html simonw/datasette-render-html 0 simonw 9599 https://github.com/simonw/datasette-render-html Plugin for selectively rendering the HTML is specific columns 0 2019-04-30T01:21:25Z 2020-09-24T04:44:47Z 2021-03-17T03:57:13Z   8 2 2 Python 1 1 1 1 0 2 0 0 1   ["datasette", "datasette-plugin", "datasette-io"] 2 1 2 master {"admin": false, "push": false, "pull": false}     2 1 # datasette-render-html [![PyPI](https://img.shields.io/pypi/v/datasette-render-html.svg)](https://pypi.org/project/datasette-render-html/) [![CircleCI](https://circleci.com/gh/simonw/datasette-render-html.svg?style=svg)](https://circleci.com/gh/simonw/datasette-render-html) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-render-html/blob/master/LICENSE) This Datasette plugin lets you configure Datasette to render specific columns as HTML in the table and row interfaces. This means you can store HTML in those columns and have it rendered as such on those pages. If you have a database called `docs.db` containing a `glossary` table and you want the `definition` column in that table to be rendered as HTML, you would use a `metadata.json` file that looks like this: { "databases": { "docs": { "tables": { "glossary": { "plugins": { "datasette-render-html": { "columns": ["definition"] } } } } } } } ## Security This plugin allows HTML to be rendered exactly as it is stored in the database. As such, you should be sure only to use this against columns with content that you trust - otherwise you could open yourself up to an [XSS attack](https://owasp.org/www-community/attacks/xss/). It's possible to configure this plugin to apply to columns with specific names across whole databases or the full Datasette instance, but doing so is not safe. It could open you up to XSS vulnerabilities where an attacker composes a SQL query that results in a column containing unsafe HTML. As such, you should only use this plugin against specific columns in specific tables, as shown in the example above. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-render-html" class="anchor" aria-hidden="true" href="#user-content-datasette-render-html"><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-render-html</h1> <p><a href="https://pypi.org/project/datasette-render-html/" rel="nofollow"><img src="https://camo.githubusercontent.com/d6cf26d5dc49484049bd4fa79e43a5d4571ca85ca03001436695b0c9c6046bf5/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d72656e6465722d68746d6c2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-render-html.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-render-html" rel="nofollow"><img src="https://camo.githubusercontent.com/27f16d9427d77d3a778994ee51b122ccd4e070ddb3e698e778506b4ac7d88bd2/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d72656e6465722d68746d6c2e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-render-html.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-render-html/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.…            
189321671 MDEwOlJlcG9zaXRvcnkxODkzMjE2NzE= datasette-jq simonw/datasette-jq 0 simonw 9599 https://github.com/simonw/datasette-jq Datasette plugin that adds a custom SQL function for executing jq expressions against JSON values 0 2019-05-30T01:06:31Z 2020-12-24T17:35:27Z 2020-04-09T05:43:43Z   11 10 10 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["jq", "datasette", "datasette-plugin", "datasette-io"] 0 0 10 master {"admin": false, "push": false, "pull": false}     0 2 # datasette-jq [![PyPI](https://img.shields.io/pypi/v/datasette-jq.svg)](https://pypi.org/project/datasette-jq/) [![CircleCI](https://circleci.com/gh/simonw/datasette-jq.svg?style=svg)](https://circleci.com/gh/simonw/datasette-jq) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-jq/blob/master/LICENSE) Datasette plugin that adds custom SQL functions for executing [jq](https://stedolan.github.io/jq/) expressions against JSON values. Install this plugin in the same environment as Datasette to enable the `jq()` SQL function. Usage: select jq( column_with_json, "{top_3: .classifiers[:3], v: .version}" ) See [the jq manual](https://stedolan.github.io/jq/manual/#Basicfilters) for full details of supported expression syntax. ## Interactive demo You can try this plugin out at [datasette-jq-demo.datasette.io](https://datasette-jq-demo.datasette.io/) Sample query: select package, "https://pypi.org/project/" || package || "/" as url, jq(info, "{summary: .info.summary, author: .info.author, versions: .releases|keys|reverse}") from packages [Try this query out](https://datasette-jq-demo.datasette.io/demo?sql=select+package%2C+%22https%3A%2F%2Fpypi.org%2Fproject%2F%22+%7C%7C+package+%7C%7C+%22%2F%22+as+url%2C%0D%0Ajq%28info%2C+%22%7Bsummary%3A+.info.summary%2C+author%3A+.info.author%2C+versions%3A+.releases%7Ckeys%7Creverse%7D%22%29%0D%0Afrom+packages) in the interactive demo. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-jq" class="anchor" aria-hidden="true" href="#user-content-datasette-jq"><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-jq</h1> <p><a href="https://pypi.org/project/datasette-jq/" rel="nofollow"><img src="https://camo.githubusercontent.com/c2171714e633d8829fa1aa20a14db54e2fd581574883e34eb1c684abd5c40963/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6a712e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-jq.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-jq" rel="nofollow"><img src="https://camo.githubusercontent.com/95b100e2cf4b8cda790f4e9b37a3eee67f56566f45acf66097aba367f649209e/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d6a712e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-jq.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-jq/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>Datasette plugin that adds custom SQL functions for executing <a hr…            
190950781 MDEwOlJlcG9zaXRvcnkxOTA5NTA3ODE= datasette-bplist simonw/datasette-bplist 0 simonw 9599 https://github.com/simonw/datasette-bplist Datasette plugin for working with Apple's binary plist format 0 2019-06-09T01:15:01Z 2021-06-07T18:05:00Z 2019-06-09T01:17:19Z   7 9 9 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["bplist", "datasette", "datasette-plugin", "datasette-io"] 0 1 9 master {"admin": false, "push": false, "pull": false}     0 0 # datasette-bplist [![PyPI](https://img.shields.io/pypi/v/datasette-bplist.svg)](https://pypi.org/project/datasette-bplist/) [![CircleCI](https://circleci.com/gh/simonw/datasette-bplist.svg?style=svg)](https://circleci.com/gh/simonw/datasette-bplist) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-bplist/blob/master/LICENSE) Datasette plugin for working with Apple's [binary plist](https://en.wikipedia.org/wiki/Property_list) format. This plugin adds two features: a display hook and a SQL function. The display hook will detect any database values that are encoded using the binary plist format. It will decode them, convert them into JSON and display them pretty-printed in the Datasette UI. The SQL function `bplist_to_json(value)` can be used inside a SQL query to convert a binary plist value into a JSON string. This can then be used with SQLite's `json_extract()` function or with the [datasette-jq](https://github.com/simonw/datasette-jq) plugin to further analyze that data as part of a SQL query. Install this plugin in the same environment as Datasette to enable this new functionality: pip install datasette-bplist ## Trying it out If you use a Mac you already have plenty of SQLite databases that contain binary plist data. One example is the database that powers the Apple Photos app. This database tends to be locked, so you will need to create a copy of the database in order to run queries against it: cp ~/Pictures/Photos\ Library.photoslibrary/database/photos.db /tmp/photos.db The database also makes use of custom SQLite extensions which prevent it from opening in Datasette. You can work around this by exporting the data that you want to experiment with into a new SQLite file. I recommend trying this plugin against the `RKMaster_dataNote` table, which contains plist-encoded EXIF metadata about the photos you have taken. You can export that table into a fresh database like so: sqlite3 /tmp/photos.db ".dump RKMaster_dataNote" | … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-bplist" class="anchor" aria-hidden="true" href="#user-content-datasette-bplist"><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-bplist</h1> <p><a href="https://pypi.org/project/datasette-bplist/" rel="nofollow"><img src="https://camo.githubusercontent.com/a6a0093ab5212f3444dc00643b1dddd80bba4eea970443b0cbab79157ebab0ea/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d62706c6973742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-bplist.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-bplist" rel="nofollow"><img src="https://camo.githubusercontent.com/b4666b829d10d25169928fd8de374c652be7345117ec655c69ba8e6d8b9d2421/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d62706c6973742e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-bplist.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-bplist/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>Datasette plugin fo…            
191022928 MDEwOlJlcG9zaXRvcnkxOTEwMjI5Mjg= datasette-render-binary simonw/datasette-render-binary 0 simonw 9599 https://github.com/simonw/datasette-render-binary Datasette plugin for rendering binary data 0 2019-06-09T15:25:52Z 2021-06-02T09:29:20Z 2019-06-13T16:14:31Z   62 7 7 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 1 7 master {"admin": false, "push": false, "pull": false}     0 1 # datasette-render-binary [![PyPI](https://img.shields.io/pypi/v/datasette-render-binary.svg)](https://pypi.org/project/datasette-render-binary/) [![CircleCI](https://circleci.com/gh/simonw/datasette-render-binary.svg?style=svg)](https://circleci.com/gh/simonw/datasette-render-binary) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-render-binary/blob/master/LICENSE) Datasette plugin for rendering binary data. Install this plugin in the same environment as Datasette to enable this new functionality: pip install datasette-render-binary Binary data in cells will now be rendered as a mixture of characters and octets. ![Screenshot](https://raw.githubusercontent.com/simonw/datasette-render-binary/master/example.png) <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-render-binary" class="anchor" aria-hidden="true" href="#user-content-datasette-render-binary"><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-render-binary</h1> <p><a href="https://pypi.org/project/datasette-render-binary/" rel="nofollow"><img src="https://camo.githubusercontent.com/a83615e99f9534c53bfc77b437ad7e5b60431113905c2dcc6a1832df12ce734a/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d72656e6465722d62696e6172792e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-render-binary.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-render-binary" rel="nofollow"><img src="https://camo.githubusercontent.com/969d0483aca477a61ba4afc0f0aa6ed38f54509ea1376031d455864f01ed217a/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d72656e6465722d62696e6172792e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-render-binary.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-render-binary/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https://img.shields.io/badge/li…            
195087137 MDEwOlJlcG9zaXRvcnkxOTUwODcxMzc= datasette-auth-github simonw/datasette-auth-github 0 simonw 9599 https://github.com/simonw/datasette-auth-github Datasette plugin that authenticates users against GitHub 0 2019-07-03T16:02:53Z 2021-06-03T11:42:54Z 2021-02-25T06:40:17Z https://datasette-auth-github-demo.datasette.io/ 119 34 34 Python 1 1 1 1 0 4 0 0 3 Apache License 2.0 apache-2.0 ["asgi", "datasette", "datasette-plugin", "datasette-io"] 4 3 34 main {"admin": false, "push": false, "pull": false}     4 1 # datasette-auth-github [![PyPI](https://img.shields.io/pypi/v/datasette-auth-github.svg)](https://pypi.org/project/datasette-auth-github/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-auth-github?include_prereleases&label=changelog)](https://github.com/simonw/datasette-auth-github/releases) [![Tests](https://github.com/simonw/datasette-auth-github/workflows/Test/badge.svg)](https://github.com/simonw/datasette-auth-github/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-auth-github/blob/main/LICENSE) Datasette plugin that authenticates users against GitHub. <!-- toc --> - [Setup instructions](#setup-instructions) - [The authenticated actor](#the-authenticated-actor) - [Restricting access to specific users](#restricting-access-to-specific-users) - [Restricting access to specific GitHub organizations or teams](#restricting-access-to-specific-github-organizations-or-teams) - [What to do if a user is removed from an organization or team](#what-to-do-if-a-user-is-removed-from-an-organization-or-team) <!-- tocstop --> ## Setup instructions * Install the plugin: `datasette install datasette-auth-github` * Create a GitHub OAuth app: https://github.com/settings/applications/new * Set the Authorization callback URL to `http://127.0.0.1:8001/-/github-auth-callback` * Create a `metadata.json` file with the following structure: ```json { "title": "datasette-auth-github demo", "plugins": { "datasette-auth-github": { "client_id": {"$env": "GITHUB_CLIENT_ID"}, "client_secret": {"$env": "GITHUB_CLIENT_SECRET"} } } } ``` Now you can start Datasette like this, passing in the secrets as environment variables: $ GITHUB_CLIENT_ID=XXX GITHUB_CLIENT_SECRET=YYY datasette \ fixtures.db -m metadata.json Note that hard-coding secrets in `metadata.json` is a bad idea as they will be visible to anyone who can navigate to `/-/metadata`. Instead, we use Da… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-auth-github" class="anchor" aria-hidden="true" href="#user-content-datasette-auth-github"><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-github</h1> <p><a href="https://pypi.org/project/datasette-auth-github/" rel="nofollow"><img src="https://camo.githubusercontent.com/a3e596637d6128f29e3fcfeb8e50ecbe5c7e1c328e94c5d338238fa0f70a2a86/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d617574682d6769746875622e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-auth-github.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-auth-github/releases"><img src="https://camo.githubusercontent.com/86aa92461a20542b5de5e6d64b24503b5b58f83bf66a98a86bc33ea443ed93b8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d617574682d6769746875623f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-auth-github?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-auth-github/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-auth-github/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-auth-github/blob/main/LICENSE…            
195696804 MDEwOlJlcG9zaXRvcnkxOTU2OTY4MDQ= datasette-cors simonw/datasette-cors 0 simonw 9599 https://github.com/simonw/datasette-cors Datasette plugin for configuring CORS headers 0 2019-07-07T21:03:11Z 2021-02-27T00:31:13Z 2019-07-11T04:40:57Z   11 9 9 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 1 9 master {"admin": false, "push": false, "pull": false}     0 3 # datasette-cors [![PyPI](https://img.shields.io/pypi/v/datasette-cors.svg)](https://pypi.org/project/datasette-cors/) [![CircleCI](https://circleci.com/gh/simonw/datasette-cors.svg?style=svg)](https://circleci.com/gh/simonw/datasette-cors) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-cors/blob/master/LICENSE) Datasette plugin for configuring CORS headers, based on https://github.com/simonw/asgi-cors You can use this plugin to allow JavaScript running on a whitelisted set of domains to make `fetch()` calls to the JSON API provided by your Datasette instance. ## Installation pip install datasette-cors ## Configuration You need to add some configuration to your Datasette `metadata.json` file for this plugin to take effect. To whitelist specific domains, use this: ```json { "plugins": { "datasette-cors": { "hosts": ["https://www.example.com"] } } } ``` You can also whitelist patterns like this: ```json { "plugins": { "datasette-cors": { "host_wildcards": ["https://*.example.com"] } } } ``` ## Testing it To test this plugin out, run it locally by saving one of the above examples as `metadata.json` and running this: $ datasette --memory -m metadata.json Now visit https://www.example.com/ in your browser, open the browser developer console and paste in the following: ```javascript fetch("http://127.0.0.1:8001/:memory:.json?sql=select+sqlite_version%28%29").then(r => r.json()).then(console.log) ``` If the plugin is running correctly, you will see the JSON response output to the console. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-cors" class="anchor" aria-hidden="true" href="#user-content-datasette-cors"><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-cors</h1> <p><a href="https://pypi.org/project/datasette-cors/" rel="nofollow"><img src="https://camo.githubusercontent.com/3f4dc5b1725858ca83723674cadd1a59373f3f4265fb01eb43c91ca9380b24bb/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d636f72732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-cors.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-cors" rel="nofollow"><img src="https://camo.githubusercontent.com/831507d824fb545803ebf51bf318c316eb5f9405e6cc9dabcb4835f356f4053d/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d636f72732e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-cors.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-cors/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>Datasette plugin for configuring CORS heade…            
207630174 MDEwOlJlcG9zaXRvcnkyMDc2MzAxNzQ= datasette-rure simonw/datasette-rure 0 simonw 9599 https://github.com/simonw/datasette-rure Datasette plugin that adds a custom SQL function for executing matches using the Rust regular expression engine 0 2019-09-10T18:09:33Z 2020-12-04T04:26:53Z 2019-09-11T22:59:38Z   19 4 4 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["sqlite", "regular-expressions", "datasette", "datasette-plugin", "datasette-io"] 0 0 4 master {"admin": false, "push": false, "pull": false}     0 1 # datasette-rure [![PyPI](https://img.shields.io/pypi/v/datasette-rure.svg)](https://pypi.org/project/datasette-rure/) [![CircleCI](https://circleci.com/gh/simonw/datasette-rure.svg?style=svg)](https://circleci.com/gh/simonw/datasette-rure) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-rure/blob/master/LICENSE) Datasette plugin that adds a custom SQL function for executing matches using the Rust regular expression engine Install this plugin in the same environment as Datasette to enable the `regexp()` SQL function. $ pip install datasette-rure The plugin is built on top of the [rure-python](https://github.com/davidblewett/rure-python) library by David Blewett. ## regexp() to test regular expressions You can test if a value matches a regular expression like this: select regexp('hi.*there', 'hi there') -- returns 1 select regexp('not.*there', 'hi there') -- returns 0 You can also use SQLite's custom syntax to run matches: select 'hi there' REGEXP 'hi.*there' -- returns 1 This means you can select rows based on regular expression matches - for example, to select every article where the title begins with an E or an F: select * from articles where title REGEXP '^[EF]' Try this out: [REGEXP interactive demo](https://datasette-rure-demo.datasette.io/24ways?sql=select+*+from+articles+where+title+REGEXP+%27%5E%5BEF%5D%27) ## regexp_match() to extract groups You can extract captured subsets of a pattern using `regexp_match()`. select regexp_match('.*( and .*)', title) as n from articles where n is not null -- Returns the ' and X' component of any matching titles, e.g. -- and Recognition -- and Transitions Their Place -- etc This will return the first parenthesis match when called with two arguments. You can call it with three arguments to indicate which match you would like to extract: select regexp_match('.*(and)(.*)', title, 2) as n from articles where n is not null The functio… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-rure" class="anchor" aria-hidden="true" href="#user-content-datasette-rure"><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-rure</h1> <p><a href="https://pypi.org/project/datasette-rure/" rel="nofollow"><img src="https://camo.githubusercontent.com/71217f9bd1b366cef0b2c8147af82aa94cac531801f86b277bb0bf3b1d13c1c1/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d727572652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-rure.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-rure" rel="nofollow"><img src="https://camo.githubusercontent.com/bc58494132e2732aabfe5f64284366a785e96850c5b5b86962a9d94d06f61489/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d727572652e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-rure.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-rure/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>Datasette plugin that adds a custom SQL fun…            
209091256 MDEwOlJlcG9zaXRvcnkyMDkwOTEyNTY= datasette-atom simonw/datasette-atom 0 simonw 9599 https://github.com/simonw/datasette-atom Datasette plugin that adds a .atom output format 0 2019-09-17T15:31:01Z 2021-03-26T02:06:51Z 2021-01-24T23:59:36Z   47 10 10 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 0 10 main {"admin": false, "push": false, "pull": false}     0 2 # datasette-atom [![PyPI](https://img.shields.io/pypi/v/datasette-atom.svg)](https://pypi.org/project/datasette-atom/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-atom?include_prereleases&label=changelog)](https://github.com/simonw/datasette-atom/releases) [![Tests](https://github.com/simonw/datasette-atom/workflows/Test/badge.svg)](https://github.com/simonw/datasette-atom/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-atom/blob/main/LICENSE) Datasette plugin that adds support for generating [Atom feeds](https://validator.w3.org/feed/docs/atom.html) with the results of a SQL query. ## Installation Install this plugin in the same environment as Datasette to enable the `.atom` output extension. $ pip install datasette-atom ## Usage To create an Atom feed you need to define a custom SQL query that returns a required set of columns: * `atom_id` - a unique ID for each row. [This article](https://web.archive.org/web/20080211143232/http://diveintomark.org/archives/2004/05/28/howto-atom-id) has suggestions about ways to create these IDs. * `atom_title` - a title for that row. * `atom_updated` - an [RFC 3339](http://www.faqs.org/rfcs/rfc3339.html) timestamp representing the last time the entry was modified in a significant way. This can usually be the time that the row was created. The following columns are optional: * `atom_content` - content that should be shown in the feed. This will be treated as a regular string, so any embedded HTML tags will be escaped when they are displayed. * `atom_content_html` - content that should be shown in the feed. This will be treated as an HTML string, and will be sanitized using [Bleach](https://github.com/mozilla/bleach) to ensure it does not have any malicious code in it before being returned as part of a `<content type="html">` Atom element. If both are provided, this will be used in place of `atom_content`. * `atom_link` - a URL that should be used a… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-atom" class="anchor" aria-hidden="true" href="#user-content-datasette-atom"><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-atom</h1> <p><a href="https://pypi.org/project/datasette-atom/" rel="nofollow"><img src="https://camo.githubusercontent.com/7957f60f0a749eb9a6313a3c35574dad2554ed586ef3bd67c4f0b768edd28fb2/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d61746f6d2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-atom.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-atom/releases"><img src="https://camo.githubusercontent.com/42a02d342f39e3dc05195df216b9f89fa84de19d94547b4c68a02ec12f0eaf2d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d61746f6d3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-atom?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-atom/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-atom/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-atom/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4…            
214299267 MDEwOlJlcG9zaXRvcnkyMTQyOTkyNjc= datasette-render-timestamps simonw/datasette-render-timestamps 0 simonw 9599 https://github.com/simonw/datasette-render-timestamps Datasette plugin for rendering timestamps 0 2019-10-10T22:50:50Z 2020-10-17T11:09:42Z 2020-03-22T17:57:17Z   17 4 4 Python 1 1 1 1 0 1 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 1 0 4 master {"admin": false, "push": false, "pull": false}     1 2 # datasette-render-timestamps [![PyPI](https://img.shields.io/pypi/v/datasette-render-timestamps.svg)](https://pypi.org/project/datasette-render-timestamps/) [![CircleCI](https://circleci.com/gh/simonw/datasette-render-timestamps.svg?style=svg)](https://circleci.com/gh/simonw/datasette-render-timestamps) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-render-timestamps/blob/master/LICENSE) Datasette plugin for rendering timestamps. ## Installation Install this plugin in the same environment as Datasette to enable this new functionality: pip install datasette-render-timestamps The plugin will then look out for integer numbers that are likely to be timestamps - anything that would be a number of seconds from 5 years ago to 5 years in the future. These will then be rendered in a more readable format. ## Configuration You can disable automatic column detection in favour of explicitly listing the columns that you would like to render using [plugin configuration](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-configuration) in a `metadata.json` file. Add a `"datasette-render-timestamps"` configuration block and use a `"columns"` key to list the columns you would like to treat as timestamp values: ```json { "plugins": { "datasette-render-timestamps": { "columns": ["created", "updated"] } } } ``` This will cause any `created` or `updated` columns in any table to be treated as timestamps and rendered. Save this to `metadata.json` and run datasette with the `--metadata` flag to load this configuration: datasette serve mydata.db --metadata metadata.json To disable automatic timestamp detection entirely, you can use `"columnns": []`. This configuration block can be used at the top level, or it can be applied just to specific databases or tables. Here's how to apply it to just the `entries` table in the `news.db` database: ```json { "databases": { "news": { "tables": … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-render-timestamps" class="anchor" aria-hidden="true" href="#user-content-datasette-render-timestamps"><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-render-timestamps</h1> <p><a href="https://pypi.org/project/datasette-render-timestamps/" rel="nofollow"><img src="https://camo.githubusercontent.com/6c9b69c5f6aca7ab8a2fbe0dd7b4ce1cca3a75f837750f3e7e7a55f9bd03b96f/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d72656e6465722d74696d657374616d70732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-render-timestamps.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-render-timestamps" rel="nofollow"><img src="https://camo.githubusercontent.com/8bf2320ca702efe91ed80467a992e0bd23b979894eaa4854bbc8affacbfaf8bb/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d72656e6465722d74696d657374616d70732e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-render-timestamps.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-render-timestamps/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" dat…            
217216787 MDEwOlJlcG9zaXRvcnkyMTcyMTY3ODc= datasette-haversine simonw/datasette-haversine 0 simonw 9599 https://github.com/simonw/datasette-haversine Datasette plugin that adds a custom SQL function for haversine distances 0 2019-10-24T05:16:14Z 2021-07-28T20:13:38Z 2021-07-28T20:14:24Z   8 1 1 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 0 1 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-haversine [![PyPI](https://img.shields.io/pypi/v/datasette-haversine.svg)](https://pypi.org/project/datasette-haversine/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-haversine?include_prereleases&label=changelog)](https://github.com/simonw/datasette-haversine/releases) [![Tests](https://github.com/simonw/datasette-haversine/workflows/Test/badge.svg)](https://github.com/simonw/datasette-haversine/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-haversine/blob/main/LICENSE) Datasette plugin that adds a custom SQL function for haversine distances Install this plugin in the same environment as Datasette to enable the `haversine()` SQL function. $ pip install datasette-haversine The plugin is built on top of the [haversine](https://github.com/mapado/haversine) library. ## haversine() to calculate distances ```sql select haversine(lat1, lon1, lat2, lon2); ``` This will return the distance in kilometers between the point defined by `(lat1, lon1)` and the point defined by `(lat2, lon2)`. ## Custom units By default `haversine()` returns results in km. You can pass an optional third argument to get results in a different unit: - `ft` for feet - `m` for meters - `in` for inches - `mi` for miles - `nmi` for nautical miles - `km` for kilometers (the default) ```sql select haversine(lat1, lon1, lat2, lon2, 'mi'); ``` <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-haversine" class="anchor" aria-hidden="true" href="#user-content-datasette-haversine"><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-haversine</h1> <p><a href="https://pypi.org/project/datasette-haversine/" rel="nofollow"><img src="https://camo.githubusercontent.com/c15ca12319585eb769d51678b9d275b82c3dd407362c2922244fb4b2e93a9f1e/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d686176657273696e652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-haversine.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-haversine/releases"><img src="https://camo.githubusercontent.com/2a194d8f840f0491df7941d978f40f1fda33b2edbb9b9896269ff963f72d3bfb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d686176657273696e653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-haversine?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-haversine/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-haversine/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-haversine/blob/main/LICENSE"><img src="https://camo.git…            
219372133 MDEwOlJlcG9zaXRvcnkyMTkzNzIxMzM= sqlite-transform simonw/sqlite-transform 0 simonw 9599 https://github.com/simonw/sqlite-transform Tool for running transformations on columns in a SQLite database 0 2019-11-03T22:07:53Z 2021-08-02T22:06:23Z 2021-08-02T22:07:57Z   64 29 29 Python 1 1 1 1 0 1 0 0 0 Apache License 2.0 apache-2.0 ["sqlite", "datasette-io", "datasette-tool"] 1 0 29 main {"admin": false, "push": false, "pull": false}     1 1 # sqlite-transform ![No longer maintained](https://img.shields.io/badge/no%20longer-maintained-red) [![PyPI](https://img.shields.io/pypi/v/sqlite-transform.svg)](https://pypi.org/project/sqlite-transform/) [![Changelog](https://img.shields.io/github/v/release/simonw/sqlite-transform?include_prereleases&label=changelog)](https://github.com/simonw/sqlite-transform/releases) [![Tests](https://github.com/simonw/sqlite-transform/workflows/Test/badge.svg)](https://github.com/simonw/sqlite-transform/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/sqlite-transform/blob/main/LICENSE) Tool for running transformations on columns in a SQLite database. > **:warning: This tool is no longer maintained** > > I added a new tool to [sqlite-utils](https://sqlite-utils.datasette.io/) called [sqlite-utils convert](https://sqlite-utils.datasette.io/en/stable/cli.html#converting-data-in-columns) which provides a super-set of the functionality originally provided here. `sqlite-transform` is no longer maintained, and I recommend switching to using `sqlite-utils convert` instead. ## How to install pip install sqlite-transform ## parsedate and parsedatetime These subcommands will run all values in the specified column through `dateutils.parser.parse()` and replace them with the result, formatted as an ISO timestamp or ISO date. For example, if a row in the database has an `opened` column which contains `10/10/2019 08:10:00 PM`, running the following command: sqlite-transform parsedatetime my.db mytable opened Will result in that value being replaced by `2019-10-10T20:10:00`. Using the `parsedate` subcommand here would result in `2019-10-10` instead. In the case of ambiguous dates such as `03/04/05` these commands both default to assuming American-style `mm/dd/yy` format. You can pass `--dayfirst` to specify that the day should be assumed to be first, or `--yearfirst` for the year. ## jsonsplit The `jsonsplit` subcommand takes columns t… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-sqlite-transform" class="anchor" aria-hidden="true" href="#user-content-sqlite-transform"><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>sqlite-transform</h1> <p><a target="_blank" rel="noopener noreferrer" href="https://camo.githubusercontent.com/818df98789ea0f246ed427c6efefc9450fdab68f50d69b83ecbbda8dda1d82b8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f2532306c6f6e6765722d6d61696e7461696e65642d726564"><img src="https://camo.githubusercontent.com/818df98789ea0f246ed427c6efefc9450fdab68f50d69b83ecbbda8dda1d82b8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f2532306c6f6e6765722d6d61696e7461696e65642d726564" alt="No longer maintained" data-canonical-src="https://img.shields.io/badge/no%20longer-maintained-red" style="max-width:100%;"></a> <a href="https://pypi.org/project/sqlite-transform/" rel="nofollow"><img src="https://camo.githubusercontent.com/607faf62b18abed6c31fc21c85d2e93f7800da5d89495d6df6355b2bb0b11a38/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73716c6974652d7472616e73666f726d2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/sqlite-transform.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/sqlite-transform/releases"><img src="https://camo.githubusercontent.com/351675bc73115e1f71304704ec82e7402dd85f44a866cd2580a9e1ce4194384f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f…            
221802296 MDEwOlJlcG9zaXRvcnkyMjE4MDIyOTY= datasette-template-sql simonw/datasette-template-sql 0 simonw 9599 https://github.com/simonw/datasette-template-sql Datasette plugin for executing SQL queries from templates 0 2019-11-14T23:05:34Z 2021-05-18T17:58:47Z 2021-05-18T17:58:44Z https://datasette.io/plugins/datasette-template-sql 23 6 6 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 1 6 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-template-sql [![PyPI](https://img.shields.io/pypi/v/datasette-template-sql.svg)](https://pypi.org/project/datasette-template-sql/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-template-sql?include_prereleases&label=changelog)](https://github.com/simonw/datasette-template-sql/releases) [![Tests](https://github.com/simonw/datasette-template-sql/workflows/Test/badge.svg)](https://github.com/simonw/datasette-template-sql/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-template-sql/blob/main/LICENSE) Datasette plugin for executing SQL queries from templates. ## Examples [datasette.io](https://datasette.io/) uses this plugin extensively with [custom page templates](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages), check out [simonw/datasette.io](https://github.com/simonw/datasette.io) to see how it works. [www.niche-museums.com](https://www.niche-museums.com/) uses this plugin to run a custom themed website on top of Datasette. The full source code for the site [is here](https://github.com/simonw/museums) - see also [niche-museums.com, powered by Datasette](https://simonwillison.net/2019/Nov/25/niche-museums/). [simonw/til](https://github.com/simonw/til) is another simple example, described in [Using a self-rewriting README powered by GitHub Actions to track TILs](https://simonwillison.net/2020/Apr/20/self-rewriting-readme/). ## Installation Run this command to install the plugin in the same environment as Datasette: $ pip install datasette-template-sql ## Usage This plugin makes a new function, `sql(sql_query)`, available to your Datasette templates. You can use it like this: ```html+jinja {% for row in sql("select 1 + 1 as two, 2 * 4 as eight") %} {% for key in row.keys() %} {{ key }}: {{ row[key] }}<br> {% endfor %} {% endfor %} ``` The plugin will execute SQL against the current database for the page in `database.html`, `table.htm… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-template-sql" class="anchor" aria-hidden="true" href="#user-content-datasette-template-sql"><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-template-sql</h1> <p><a href="https://pypi.org/project/datasette-template-sql/" rel="nofollow"><img src="https://camo.githubusercontent.com/4de02f94922198f24958d43afbaa62802bf36bc44849bdf7bfb630d8bd7d5dde/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d74656d706c6174652d73716c2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-template-sql.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-template-sql/releases"><img src="https://camo.githubusercontent.com/564e7d6e3e049c80e9c446272b50dd5ce9c6d4b573ad51a7f1e9e51756affbcb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d74656d706c6174652d73716c3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-template-sql?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-template-sql/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-template-sql/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-template-sql/blo…            
228485806 MDEwOlJlcG9zaXRvcnkyMjg0ODU4MDY= datasette-configure-asgi simonw/datasette-configure-asgi 0 simonw 9599 https://github.com/simonw/datasette-configure-asgi Datasette plugin for configuring arbitrary ASGI middleware 0 2019-12-16T22:17:10Z 2020-08-25T15:54:32Z 2019-12-16T22:19:49Z   6 1 1 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["asgi", "datasette", "datasette-plugin", "datasette-io"] 0 0 1 master {"admin": false, "push": false, "pull": false}     0 1 # datasette-configure-asgi [![PyPI](https://img.shields.io/pypi/v/datasette-configure-asgi.svg)](https://pypi.org/project/datasette-configure-asgi/) [![CircleCI](https://circleci.com/gh/simonw/datasette-configure-asgi.svg?style=svg)](https://circleci.com/gh/simonw/datasette-configure-asgi) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-configure-asgi/blob/master/LICENSE) Datasette plugin for configuring arbitrary ASGI middleware ## Installation pip install datasette-configure-asgi ## Usage This plugin only takes effect if your `metadata.json` file contains relevant top-level plugin configuration in a `"datasette-configure-asgi"` configuration key. For example, to wrap your Datasette instance in the `asgi-log-to-sqlite` middleware configured to write logs to `/tmp/log.db` you would use the following: ```json { "plugins": { "datasette-configure-asgi": [ { "class": "asgi_log_to_sqlite.AsgiLogToSqlite", "args": { "file": "/tmp/log.db" } } ] } } ``` The `"datasette-configure-asgi"` key should be a list of JSON objects. Each object should have a `"class"` key indicating the class to be used, and an optional `"args"` key providing any necessary arguments to be passed to that class constructor. ## Plugin structure This plugin can be used to wrap your Datasette instance in any ASGI middleware that conforms to the following structure: ```python class SomeAsgiMiddleware: def __init__(self, app, arg1, arg2): self.app = app self.arg1 = arg1 self.arg2 = arg2 async def __call__(self, scope, receive, send): start = time.time() await self.app(scope, receive, send) end = time.time() print("Time taken: {}".format(end - start)) ``` So the middleware is a class with a constructor which takes the wrapped application as a first argument, `app`, followed by further named arguments … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-configure-asgi" class="anchor" aria-hidden="true" href="#user-content-datasette-configure-asgi"><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-configure-asgi</h1> <p><a href="https://pypi.org/project/datasette-configure-asgi/" rel="nofollow"><img src="https://camo.githubusercontent.com/f416823edcf74e9efabbee4be66b7db51784d1eeb1b7fd75286cfcbf16a87815/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d636f6e6669677572652d617367692e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-configure-asgi.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-configure-asgi" rel="nofollow"><img src="https://camo.githubusercontent.com/d9cd8121c1d308429b1b5c4f9a87aee4091dfe95aadeeb9e39336aa91fb737e4/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d636f6e6669677572652d617367692e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-configure-asgi.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-configure-asgi/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https://img.shields…            
240815938 MDEwOlJlcG9zaXRvcnkyNDA4MTU5Mzg= shapefile-to-sqlite simonw/shapefile-to-sqlite 0 simonw 9599 https://github.com/simonw/shapefile-to-sqlite Load shapefiles into a SQLite (optionally SpatiaLite) database 0 2020-02-16T01:55:29Z 2021-03-26T08:39:43Z 2020-08-23T06:00:41Z   54 15 15 Python 1 1 1 1 0 0 0 0 3 Apache License 2.0 apache-2.0 ["sqlite", "gis", "spatialite", "shapefiles", "datasette", "datasette-io", "datasette-tool"] 0 3 15 main {"admin": false, "push": false, "pull": false}     0 1 # shapefile-to-sqlite [![PyPI](https://img.shields.io/pypi/v/shapefile-to-sqlite.svg)](https://pypi.org/project/shapefile-to-sqlite/) [![CircleCI](https://circleci.com/gh/simonw/shapefile-to-sqlite.svg?style=svg)](https://circleci.com/gh/simonw/shapefile-to-sqlite) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/shapefile-to-sqlite/blob/main/LICENSE) Load shapefiles into a SQLite (optionally SpatiaLite) database. Project background: [Things I learned about shapefiles building shapefile-to-sqlite](https://simonwillison.net/2020/Feb/19/shapefile-to-sqlite/) ## How to install $ pip install shapefile-to-sqlite ## How to use You can run this tool against a shapefile file like so: $ shapefile-to-sqlite my.db features.shp This will load the geometries as GeoJSON in a text column. ## Using with SpatiaLite If you have [SpatiaLite](https://www.gaia-gis.it/fossil/libspatialite/index) available you can load them as SpatiaLite geometries like this: $ shapefile-to-sqlite my.db features.shp --spatialite The data will be loaded into a table called `features` - based on the name of the shapefile. You can specify an alternative table name using `--table`: $ shapefile-to-sqlite my.db features.shp --table=places --spatialite The tool will search for the SpatiaLite module in the following locations: - `/usr/lib/x86_64-linux-gnu/mod_spatialite.so` - `/usr/local/lib/mod_spatialite.dylib` If you have installed the module in another location, you can use the `--spatialite_mod=xxx` option to specify where: $ shapefile-to-sqlite my.db features.shp \ --spatialite_mod=/usr/lib/mod_spatialite.dylib You can use the `--spatial-index` option to create a spatial index on the `geometry` column: $ shapefile-to-sqlite my.db features.shp --spatial-index You can omit `--spatialite` if you use either `--spatialite-mod` or `--spatial-index`. ## Projections By default, this tool will attempt to convert geometries in the shapefile to the WGS 84 projec… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-shapefile-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-shapefile-to-sqlite"><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>shapefile-to-sqlite</h1> <p><a href="https://pypi.org/project/shapefile-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/491f86f2d61c3cf6ce08c6c019a47686ccbe35187c465aeb784876d3adcc236b/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f736861706566696c652d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/shapefile-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/shapefile-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/665b44f51d2c08eeb25388a24485a1591ebe793b914807ae371fe96fb242c0aa/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f736861706566696c652d746f2d73716c6974652e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/shapefile-to-sqlite.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/shapefile-to-sqlite/blob/main/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%…            
242260583 MDEwOlJlcG9zaXRvcnkyNDIyNjA1ODM= datasette-mask-columns simonw/datasette-mask-columns 0 simonw 9599 https://github.com/simonw/datasette-mask-columns Datasette plugin that masks specified database columns 0 2020-02-22T01:29:16Z 2021-06-10T19:50:37Z 2021-06-10T19:51:02Z https://datasette.io/plugins/datasette-mask-columns 15 2 2 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 0 2 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-mask-columns [![PyPI](https://img.shields.io/pypi/v/datasette-mask-columns.svg)](https://pypi.org/project/datasette-mask-columns/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-mask-columns?include_prereleases&label=changelog)](https://github.com/simonw/datasette-mask-columns/releases) [![Tests](https://github.com/simonw/datasette-mask-columns/workflows/Test/badge.svg)](https://github.com/simonw/datasette-mask-columns/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-mask-columns/blob/main/LICENSE) Datasette plugin that masks specified database columns ## Installation pip install datasette-mask-columns This depends on plugin hook changes in a not-yet released branch of Datasette. See [issue #678](https://github.com/simonw/datasette/issues/678) for details. ## Usage In your `metadata.json` file add a section like this describing the database and table in which you wish to mask columns: ```json { "databases": { "my-database": { "plugins": { "datasette-mask-columns": { "users": ["password"] } } } } } ``` All SQL queries against the `users` table in `my-database.db` will now return `null` for the `password` column, no matter what value that column actually holds. The table page for `users` will display the text `REDACTED` in the masked column. This visual hint will only be available on the table page; it will not display his text for arbitrary queries against the table. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-mask-columns" class="anchor" aria-hidden="true" href="#user-content-datasette-mask-columns"><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-mask-columns</h1> <p><a href="https://pypi.org/project/datasette-mask-columns/" rel="nofollow"><img src="https://camo.githubusercontent.com/09772a46d884b67ea26bd94868ec94be4bd514fa0a4a8ea3fac1b707801e4d3d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6d61736b2d636f6c756d6e732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-mask-columns.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-mask-columns/releases"><img src="https://camo.githubusercontent.com/f3fb962acca8cb0fd0c0caeb303007c6c199287a95f5b2f9bfb2128bec3b1dc3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6d61736b2d636f6c756d6e733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-mask-columns?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-mask-columns/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-mask-columns/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-mask-columns/blo…            
243887036 MDEwOlJlcG9zaXRvcnkyNDM4ODcwMzY= datasette-configure-fts simonw/datasette-configure-fts 0 simonw 9599 https://github.com/simonw/datasette-configure-fts Datasette plugin for enabling full-text search against selected table columns 0 2020-02-29T01:50:57Z 2020-11-01T02:59:12Z 2020-11-01T02:59:10Z   42 2 2 Python 1 1 1 1 0 0 0 0 2 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 2 2 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-configure-fts [![PyPI](https://img.shields.io/pypi/v/datasette-configure-fts.svg)](https://pypi.org/project/datasette-configure-fts/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-configure-fts?include_prereleases&label=changelog)](https://github.com/simonw/datasette-configure-fts/releases) [![Tests](https://github.com/simonw/datasette-configure-fts/workflows/Test/badge.svg)](https://github.com/simonw/datasette-configure-fts/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-configure-fts/blob/main/LICENSE) Datasette plugin for enabling full-text search against selected table columns ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-configure-fts ## Usage Having installed the plugin, visit `/-/configure-fts` on your Datasette instance to configure FTS for tables on attached writable databases. Any time you have permission to configure FTS for a table a menu item will appear in the table actions menu on the table page. By default only [the root actor](https://datasette.readthedocs.io/en/stable/authentication.html#using-the-root-actor) can access the page - so you'll need to run Datasette with the `--root` option and click on the link shown in the terminal to sign in and access the page. The `configure-fts` permission governs access. You can use permission plugins such as [datasette-permissions-sql](https://github.com/simonw/datasette-permissions-sql) to grant additional access to the write interface. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-configure-fts" class="anchor" aria-hidden="true" href="#user-content-datasette-configure-fts"><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-configure-fts</h1> <p><a href="https://pypi.org/project/datasette-configure-fts/" rel="nofollow"><img src="https://camo.githubusercontent.com/73d7c1152d58fc5ae85794eaf3165fd023270f7f118bde3acaa24522371419b5/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d636f6e6669677572652d6674732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-configure-fts.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-configure-fts/releases"><img src="https://camo.githubusercontent.com/cd5d1f0fe6b01840d00ffa3e5696a7827c30095262f3ea8c4447f0547e16dc17/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d636f6e6669677572652d6674733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-configure-fts?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-configure-fts/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-configure-fts/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-con…            
245670670 MDEwOlJlcG9zaXRvcnkyNDU2NzA2NzA= fec-to-sqlite simonw/fec-to-sqlite 0 simonw 9599 https://github.com/simonw/fec-to-sqlite Save FEC campaign finance data to a SQLite database 0 2020-03-07T16:52:49Z 2020-12-19T05:09:05Z 2020-03-07T18:21:48Z   16 8 8 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["sqlite", "fec", "datasette", "datasette-io", "datasette-tool"] 0 1 8 master {"admin": false, "push": false, "pull": false}     0 2 # fec-to-sqlite [![PyPI](https://img.shields.io/pypi/v/fec-to-sqlite.svg)](https://pypi.org/project/fec-to-sqlite/) [![CircleCI](https://circleci.com/gh/simonw/fec-to-sqlite.svg?style=svg)](https://circleci.com/gh/simonw/fec-to-sqlite) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/fec-to-sqlite/blob/master/LICENSE) Create a SQLite database using FEC campaign contributions data. This tool builds on [fecfile](https://github.com/esonderegger/) by Evan Sonderegger. ## How to install $ pip install fec-to-sqlite ## Usage $ fec-to-sqlite filings filings.db 1146148 This fetches the filing with ID `1146148` and stores it in tables in a SQLite database called `filings.db`. It will create any tables it needs. You can pass more than one filing ID, separated by spaces. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-fec-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-fec-to-sqlite"><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>fec-to-sqlite</h1> <p><a href="https://pypi.org/project/fec-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/93308ffe0f5302a01fe685a905be46fc42abddee239c695af80456aabcd72e94/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6665632d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/fec-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/fec-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/46d17ba2dacfcf6081f8db0a40f9dfd848e9bb2af54c6652e8358a01a88ba2cd/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6665632d746f2d73716c6974652e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/fec-to-sqlite.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/fec-to-sqlite/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>Create a SQLite database using FEC campaign contributio…            
246108561 MDEwOlJlcG9zaXRvcnkyNDYxMDg1NjE= datasette-column-inspect simonw/datasette-column-inspect 0 simonw 9599 https://github.com/simonw/datasette-column-inspect Experimental plugin that adds a column inspector 0 2020-03-09T18:11:00Z 2020-12-09T21:46:10Z 2020-12-09T21:47:38Z   15 1 1 HTML 1 1 1 1 0 0 0 0 3 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 3 1 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-column-inspect [![PyPI](https://img.shields.io/pypi/v/datasette-column-inspect.svg)](https://pypi.org/project/datasette-column-inspect/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-column-inspect?include_prereleases&label=changelog)](https://github.com/simonw/datasette-column-inspect/releases) [![Tests](https://github.com/simonw/datasette-column-inspect/workflows/Test/badge.svg)](https://github.com/simonw/datasette-column-inspect/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-column-inspect/blob/main/LICENSE) Highly experimental Datasette plugin for inspecting columns. ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-column-inspect ## Usage This plugin adds an icon to each column on the table page which opens an inspection side panel. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-column-inspect" class="anchor" aria-hidden="true" href="#user-content-datasette-column-inspect"><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-column-inspect</h1> <p><a href="https://pypi.org/project/datasette-column-inspect/" rel="nofollow"><img src="https://camo.githubusercontent.com/e5f8f5c2f4a6206e386bea29ca46270bc4bb3d12cc3a0126dc181f1cfde0e7ab/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d636f6c756d6e2d696e73706563742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-column-inspect.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-column-inspect/releases"><img src="https://camo.githubusercontent.com/cd438ac87792c14aa871310ac3c1e61a61d71e09601e83e7bc5fabeeb5418242/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d636f6c756d6e2d696e73706563743f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-column-inspect?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-column-inspect/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-column-inspect/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/…            
248999994 MDEwOlJlcG9zaXRvcnkyNDg5OTk5OTQ= datasette-show-errors simonw/datasette-show-errors 0 simonw 9599 https://github.com/simonw/datasette-show-errors Datasette plugin for displaying error tracebacks 0 2020-03-21T15:06:04Z 2020-09-24T00:17:29Z 2020-09-01T00:32:23Z   7 1 1 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["asgi", "datasette", "starlette", "datasette-plugin", "datasette-io"] 0 1 1 master {"admin": false, "push": false, "pull": false}     0 0 # datasette-show-errors [![PyPI](https://img.shields.io/pypi/v/datasette-show-errors.svg)](https://pypi.org/project/datasette-show-errors/) [![CircleCI](https://circleci.com/gh/simonw/datasette-show-errors.svg?style=svg)](https://circleci.com/gh/simonw/datasette-show-errors) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-show-errors/blob/master/LICENSE) Datasette plugin for displaying error tracebacks. **This plugin does not work with current versions of Datasette.** See [issue #2](https://github.com/simonw/datasette-show-errors/issues/2). ## Installation pip install datasette-show-errors ## Usage Installing the plugin will cause any internal error to be displayed with a full traceback, rather than just a generic 500 page. Be careful not to use this in a context that might expose sensitive information. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-show-errors" class="anchor" aria-hidden="true" href="#user-content-datasette-show-errors"><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-show-errors</h1> <p><a href="https://pypi.org/project/datasette-show-errors/" rel="nofollow"><img src="https://camo.githubusercontent.com/b3e198ab4e1253d5eca382cb810057bf1be9b3a78db6f60f57c2a5a269d49304/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d73686f772d6572726f72732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-show-errors.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-show-errors" rel="nofollow"><img src="https://camo.githubusercontent.com/183abdd282beee4022d9443bd5c050fa0a2d8fd024156414206fa188872a7a8e/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d73686f772d6572726f72732e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-show-errors.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-show-errors/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.…            
255460347 MDEwOlJlcG9zaXRvcnkyNTU0NjAzNDc= datasette-clone simonw/datasette-clone 0 simonw 9599 https://github.com/simonw/datasette-clone Create a local copy of database files from a Datasette instance 0 2020-04-13T23:05:41Z 2021-06-08T15:33:21Z 2021-02-22T19:32:36Z   20 2 2 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-tool"] 0 0 2 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-clone [![PyPI](https://img.shields.io/pypi/v/datasette-clone.svg)](https://pypi.org/project/datasette-clone/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-clone?include_prereleases&label=changelog)](https://github.com/simonw/datasette-clone/releases) [![Tests](https://github.com/simonw/datasette-clone/workflows/Test/badge.svg)](https://github.com/simonw/datasette-clone/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-clone/blob/main/LICENSE) Create a local copy of database files from a Datasette instance. See [datasette-clone](https://simonwillison.net/2020/Apr/14/datasette-clone/) on my blog for background on this project. ## How to install $ pip install datasette-clone ## Usage This only works against Datasette instances running immutable databases (with the `-i` option). Databases published using the `datasette publish` command should be compatible with this tool. To download copies of all `.db` files from an instance, run: datasette-clone https://latest.datasette.io You can provide an optional second argument to specify a directory: datasette-clone https://latest.datasette.io /tmp/here-please The command stores its own copy of a `databases.json` manifest and uses it to only download databases that have changed the next time you run the command. It also stores a copy of the instance's `metadata.json` to ensure you have a copy of any source and licensing information for the downloaded databases. If your instance is protected by an API token, you can use `--token` to provide it: datasette-clone https://latest.datasette.io --token=xyz For verbose output showing what the tool is doing, use `-v`. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-clone" class="anchor" aria-hidden="true" href="#user-content-datasette-clone"><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-clone</h1> <p><a href="https://pypi.org/project/datasette-clone/" rel="nofollow"><img src="https://camo.githubusercontent.com/17cc348c1197fd918ac911e525efd416a5d4ca5d3f00729cbf85c930ac5dbde6/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d636c6f6e652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-clone.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-clone/releases"><img src="https://camo.githubusercontent.com/9f8615567ed0f9b4d38d5f69dafcc8ae2fa97aa13895779172645064f16fcc9f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d636c6f6e653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-clone?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-clone/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-clone/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-clone/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb…            
261634807 MDEwOlJlcG9zaXRvcnkyNjE2MzQ4MDc= datasette-media simonw/datasette-media 0 simonw 9599 https://github.com/simonw/datasette-media Datasette plugin for serving media based on a SQL query 0 2020-05-06T02:42:57Z 2021-05-03T05:04:39Z 2020-07-30T23:39:29Z   70 11 11 Python 1 1 1 1 0 0 0 0 8 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 8 11 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-media [![PyPI](https://img.shields.io/pypi/v/datasette-media.svg)](https://pypi.org/project/datasette-media/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-media?include_prereleases&label=changelog)](https://github.com/simonw/datasette-media/releases) [![CircleCI](https://circleci.com/gh/simonw/datasette-media.svg?style=svg)](https://circleci.com/gh/simonw/datasette-media) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-media/blob/master/LICENSE) Datasette plugin for serving media based on a SQL query. Use this when you have a database table containing references to files on disk - or binary content stored in BLOB columns - that you would like to be able to serve to your users. ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-media ### HEIC image support Modern iPhones save their photos using the [HEIC image format](https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format). Processing these images requires an additional dependency, [pyheif](https://pypi.org/project/pyheif/). You can include this dependency by running: $ pip install datasette-media[heif] ## Usage You can use this plugin to configure Datasette to serve static media based on SQL queries to an underlying database table. Media will be served from URLs that start with `/-/media/`. The full URL to each media asset will look like this: /-/media/type-of-media/media-key `type-of-media` will correspond to a configured SQL query, and might be something like `photo`. `media-key` will be an identifier that is used as part of the underlying SQL query to find which file should be served. ### Serving static files from disk The following ``metadata.json`` configuration will cause this plugin to serve files from disk, based on queries to a database table called `apple_photos`. ```json { "plugins": { "datasette-media": { "photo": { "sql": "select … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-media" class="anchor" aria-hidden="true" href="#user-content-datasette-media"><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-media</h1> <p><a href="https://pypi.org/project/datasette-media/" rel="nofollow"><img src="https://camo.githubusercontent.com/e54db370ebd4d8d68a1054cdb8186da706ee7e8e725a8543b6681404e49bff00/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6d656469612e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-media.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-media/releases"><img src="https://camo.githubusercontent.com/45b31e5abfda86f1f9f9396856b3e703513fbfd980f2070daf1fa3fcb898214b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6d656469613f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-media?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-media" rel="nofollow"><img src="https://camo.githubusercontent.com/3f836c0fc5a36c2afcce223b886456440cf30d4f4cff3c009a40c730fcc0a66d/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d6d656469612e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circle…            
271408895 MDEwOlJlcG9zaXRvcnkyNzE0MDg4OTU= datasette-permissions-sql simonw/datasette-permissions-sql 0 simonw 9599 https://github.com/simonw/datasette-permissions-sql Datasette plugin for configuring permission checks using SQL queries 0 2020-06-10T23:48:13Z 2020-06-12T07:06:12Z 2020-06-12T07:06:15Z   25 0 0 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "datasette-io"] 0 0 0 master {"admin": false, "push": false, "pull": false}     0 1 # datasette-permissions-sql [![PyPI](https://img.shields.io/pypi/v/datasette-permissions-sql.svg)](https://pypi.org/project/datasette-permissions-sql/) [![CircleCI](https://circleci.com/gh/simonw/datasette-permissions-sql.svg?style=svg)](https://circleci.com/gh/simonw/datasette-permissions-sql) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-permissions-sql/blob/master/LICENSE) Datasette plugin for configuring permission checks using SQL queries ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-permissions-sql ## Usage First, read up on how Datasette's [authentication and permissions system](https://datasette.readthedocs.io/en/latest/authentication.html) works. This plugin lets you define rules containing SQL queries that are executed to see if the currently authenticated actor has permission to perform certain actions. Consider a canned query which authenticated users should only be able to execute if a row in the `users` table says that they are a member of staff. That `users` table in the `mydatabase.db` database could look like this: | id | username | is_staff | |--|--------|--------| | 1 | cleopaws | 0 | | 2 | simon | 1 | Authenticated users have an `actor` that looks like this: ```json { "id": 2, "username": "simon" } ``` To configure the canned query to only be executable by staff users, add the following to your `metadata.json`: ```json { "plugins": { "datasette-permissions-sql": [ { "action": "view-query", "resource": ["mydatabase", "promote_to_staff"], "sql": "SELECT * FROM users WHERE is_staff = 1 AND id = :actor_id" } ] }, "databases": { "mydatabase": { "queries": { "promote_to_staff": { "sql": "UPDATE users SET is is_staff=1 WHERE id=:id", "write": true } } }… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-permissions-sql" class="anchor" aria-hidden="true" href="#user-content-datasette-permissions-sql"><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-permissions-sql</h1> <p><a href="https://pypi.org/project/datasette-permissions-sql/" rel="nofollow"><img src="https://camo.githubusercontent.com/898a57540c5f63707e7d55e28f18598cd101ae1b7cbad1ff71ead7f4a12174f4/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7065726d697373696f6e732d73716c2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-permissions-sql.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/simonw/datasette-permissions-sql" rel="nofollow"><img src="https://camo.githubusercontent.com/587e99cf6d88c2bcfe530b5748d7f0f2ed638809bec3aa914244b7bf2ddcdc82/68747470733a2f2f636972636c6563692e636f6d2f67682f73696d6f6e772f6461746173657474652d7065726d697373696f6e732d73716c2e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/simonw/datasette-permissions-sql.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-permissions-sql/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https:/…            
273609879 MDEwOlJlcG9zaXRvcnkyNzM2MDk4Nzk= datasette-saved-queries simonw/datasette-saved-queries 0 simonw 9599 https://github.com/simonw/datasette-saved-queries Datasette plugin that lets users save and execute queries 0 2020-06-20T00:20:42Z 2020-09-24T05:08:37Z 2020-08-15T23:38:46Z   12 2 2 Python 1 1 1 1 0 0 0 0 1   ["datasette", "datasette-plugin", "datasette-io"] 0 1 2 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-saved-queries [![PyPI](https://img.shields.io/pypi/v/datasette-saved-queries.svg)](https://pypi.org/project/datasette-saved-queries/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-saved-queries?label=changelog)](https://github.com/simonw/datasette-saved-queries/releases) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-saved-queries/blob/master/LICENSE) Datasette plugin that lets users save and execute queries ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-saved-queries ## Usage When the plugin is installed Datasette will automatically create a `saved_queries` table in the first connected database when it starts up. It also creates a `save_query` writable canned query which you can use to save new queries. Queries that you save will be added to the query list on the database page. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-saved-queries python -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><a id="user-content-datasette-saved-queries" class="anchor" aria-hidden="true" href="#user-content-datasette-saved-queries"><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-saved-queries</h1> <p><a href="https://pypi.org/project/datasette-saved-queries/" rel="nofollow"><img src="https://camo.githubusercontent.com/1be37b6bd17b348b570a8c0e73486d46c1b1a3a2f3f0e88d360ea41dd85b6cdb/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d73617665642d717565726965732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-saved-queries.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-saved-queries/releases"><img src="https://camo.githubusercontent.com/5e0c781e8fb49e961b9a45d559f6d6e77aa1269954ba59f648e7855e44dd4fe8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d73617665642d717565726965733f6c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-saved-queries?label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-saved-queries/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-ca…            
274264484 MDEwOlJlcG9zaXRvcnkyNzQyNjQ0ODQ= sqlite-generate simonw/sqlite-generate 0 simonw 9599 https://github.com/simonw/sqlite-generate Tool for generating demo SQLite databases 0 2020-06-22T23:36:44Z 2021-02-27T15:25:26Z 2021-02-27T15:25:24Z https://sqlite-generate-demo.datasette.io/ 56 17 17 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["sqlite", "datasette-io", "datasette-tool"] 0 0 17 main {"admin": false, "push": false, "pull": false}     0 2 # sqlite-generate [![PyPI](https://img.shields.io/pypi/v/sqlite-generate.svg)](https://pypi.org/project/sqlite-generate/) [![Changelog](https://img.shields.io/github/v/release/simonw/sqlite-generate?label=changelog)](https://github.com/simonw/sqlite-generate/releases) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/sqlite-generate/blob/master/LICENSE) Tool for generating demo SQLite databases ## Installation Install this plugin using `pip`: $ pip install sqlite-generate ## Demo You can see a demo of the database generated using this command running in [Datasette](https://github.com/simonw/datasette) at https://sqlite-generate-demo.datasette.io/ The demo is generated using the following command: sqlite-generate demo.db --seed seed --fts --columns=10 --fks=0,3 --pks=0,2 ## Usage To generate a SQLite database file called `data.db` with 10 randomly named tables in it, run the following: sqlite-generate data.db You can use the `--tables` option to generate a different number of tables: sqlite-generate data.db --tables 20 You can run the command against the same database file multiple times to keep adding new tables, using different settings for each batch of generated tables. By default each table will contain a random number of rows between 0 and 200. You can customize this with the `--rows` option: sqlite-generate data.db --rows 20 This will insert 20 rows into each table. sqlite-generate data.db --rows 500,2000 This inserts a random number of rows between 500 and 2000 into each table. Each table will have 5 columns. You can change this using `--columns`: sqlite-generate data.db --columns 10 `--columns` can also accept a range: sqlite-generate data.db --columns 5,15 You can control the random number seed used with the `--seed` option. This will result in the exact same database file being created by multiple runs of the tool: sqlite-generate data.db --seed=myseed By default each table will contain betwee… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-sqlite-generate" class="anchor" aria-hidden="true" href="#user-content-sqlite-generate"><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>sqlite-generate</h1> <p><a href="https://pypi.org/project/sqlite-generate/" rel="nofollow"><img src="https://camo.githubusercontent.com/f0bc12d9a036f8faadbe40bbc37caa416eadf33d6694322ca385c16f2302b575/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73716c6974652d67656e65726174652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/sqlite-generate.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/sqlite-generate/releases"><img src="https://camo.githubusercontent.com/8acbae82ad62477a2630aee86e3c2c6c498a06acc6fd6d6c08e51779ea3905de/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f73716c6974652d67656e65726174653f6c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/sqlite-generate?label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/sqlite-generate/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%;"…            
275615947 MDEwOlJlcG9zaXRvcnkyNzU2MTU5NDc= datasette-glitch simonw/datasette-glitch 0 simonw 9599 https://github.com/simonw/datasette-glitch Utilities to help run Datasette on Glitch 0 2020-06-28T15:41:25Z 2020-07-01T22:48:35Z 2020-07-01T22:49:22Z   3 1 1 Python 1 1 1 1 0 0 0 0 0   ["glitch", "datasette", "datasette-plugin", "datasette-io"] 0 0 1 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-glitch [![PyPI](https://img.shields.io/pypi/v/datasette-glitch.svg)](https://pypi.org/project/datasette-glitch/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-glitch?label=changelog)](https://github.com/simonw/datasette-glitch/releases) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-glitch/blob/master/LICENSE) Utilities to help run Datasette on Glitch ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-glitch ## Usage This plugin outputs a special link which will sign you into Datasette as the root user. Click Tools -> Logs in the Glitch editor interface after your app starts to see the link. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-glitch" class="anchor" aria-hidden="true" href="#user-content-datasette-glitch"><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-glitch</h1> <p><a href="https://pypi.org/project/datasette-glitch/" rel="nofollow"><img src="https://camo.githubusercontent.com/da8d1e55f6fa2edbfe632b0cb5b8b97a65d75b3e74cfe2c32992720b136f7fe3/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d676c697463682e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-glitch.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-glitch/releases"><img src="https://camo.githubusercontent.com/8609928bfae188a41e14d2e647a1805211a59fce8f113e4f3bc7a5e8dbcd44b6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d676c697463683f6c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-glitch?label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-glitch/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-…            
275624346 MDEwOlJlcG9zaXRvcnkyNzU2MjQzNDY= datasette-init simonw/datasette-init 0 simonw 9599 https://github.com/simonw/datasette-init Ensure specific tables and views exist on startup 0 2020-06-28T16:26:29Z 2021-06-14T19:43:55Z 2020-07-01T22:47:09Z   9 1 1 Python 1 1 1 1 0 0 0 0 0   [] 0 0 1 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-init [![PyPI](https://img.shields.io/pypi/v/datasette-init.svg)](https://pypi.org/project/datasette-init/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-init?label=changelog)](https://github.com/simonw/datasette-init/releases) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-init/blob/master/LICENSE) Ensure specific tables and views exist on startup ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-init ## Usage This plugin is configured using `metadata.json` (or `metadata.yaml`). ### Creating tables Add a block like this that specifies the tables you would like to ensure exist: ```json { "plugins": { "datasette-init": { "my_database": { "tables": { "dogs": { "columns": { "id": "integer", "name": "text", "age": "integer", "weight": "float" }, "pk": "id" } } } } } } ``` Any tables that do not yet exist will be created when Datasette first starts. Valid column types are `"integer"`, `"text"`, `"float"` and `"blob"`. The `"pk"` is optional, and is used to define the primary key. To define a compound primary key (across more than one column) use a list of column names here: ```json "pk": ["id1", "id2"] ``` ### Creating views The plugin can also be used to create views: ```json { "plugins": { "datasette-init": { "my_database": { "views": { "my_view": "select 1 + 1" } } } } } ``` Each view in the ``"views"`` block will be created when the Database first starts. If a view with the same name already exists it will be replaced with the new definition. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-init python3 -mvenv venv source venv/bin/activate Or if you are usin… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-init" class="anchor" aria-hidden="true" href="#user-content-datasette-init"><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-init</h1> <p><a href="https://pypi.org/project/datasette-init/" rel="nofollow"><img src="https://camo.githubusercontent.com/83fefe5c408de5ede9ce3a712c8133a53de0da3cea828b513827c7d14c4c3cb2/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d696e69742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-init.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-init/releases"><img src="https://camo.githubusercontent.com/c60721d7193f69d423216b711462556b27b48be0c5b33e74b1831a2daea05bdc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d696e69743f6c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-init?label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-init/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…            
291339086 MDEwOlJlcG9zaXRvcnkyOTEzMzkwODY= airtable-export simonw/airtable-export 0 simonw 9599 https://github.com/simonw/airtable-export Export Airtable data to YAML, JSON or SQLite files on disk 0 2020-08-29T19:51:37Z 2021-06-08T17:30:30Z 2021-04-09T23:41:52Z https://datasette.io/tools/airtable-export 41 33 33 Python 1 1 1 1 0 5 0 0 6 Apache License 2.0 apache-2.0 ["yaml", "airtable", "airtable-api", "datasette-io", "datasette-tool"] 5 6 33 main {"admin": false, "push": false, "pull": false}     5 3 # airtable-export [![PyPI](https://img.shields.io/pypi/v/airtable-export.svg)](https://pypi.org/project/airtable-export/) [![Changelog](https://img.shields.io/github/v/release/simonw/airtable-export?include_prereleases&label=changelog)](https://github.com/simonw/airtable-export/releases) [![Tests](https://github.com/simonw/airtable-export/workflows/Test/badge.svg)](https://github.com/simonw/airtable-export/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/airtable-export/blob/master/LICENSE) Export Airtable data to files on disk ## Installation Install this tool using `pip`: $ pip install airtable-export ## Usage You will need to know the following information: - Your Airtable base ID - this is a string starting with `app...` - Your Airtable API key - this is a string starting with `key...` - The names of each of the tables that you wish to export You can export all of your data to a folder called `export/` by running the following: airtable-export export base_id table1 table2 --key=key This example would create two files: `export/table1.yml` and `export/table2.yml`. Rather than passing the API key using the `--key` option you can set it as an environment variable called `AIRTABLE_KEY`. ## Export options By default the tool exports your data as YAML. You can also export as JSON or as [newline delimited JSON](http://ndjson.org/) using the `--json` or `--ndjson` options: airtable-export export base_id table1 table2 --key=key --ndjson You can pass multiple format options at once. This command will create a `.json`, `.yml` and `.ndjson` file for each exported table: airtable-export export base_id table1 table2 \ --key=key --ndjson --yaml --json ### SQLite database export You can export tables to a SQLite database file using the `--sqlite database.db` option: airtable-export export base_id table1 table2 \ --key=key --sqlite database.db This can be combined with other format options.… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-airtable-export" class="anchor" aria-hidden="true" href="#user-content-airtable-export"><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>airtable-export</h1> <p><a href="https://pypi.org/project/airtable-export/" rel="nofollow"><img src="https://camo.githubusercontent.com/2635595699cd87784148506d703996615d75d6e8d6d0eba3928a886a5ebac963/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6169727461626c652d6578706f72742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/airtable-export.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/airtable-export/releases"><img src="https://camo.githubusercontent.com/361aa58985cc1f5841b899de85bedd6e7ced2a253334b4dc390bd1762b2f8be5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6169727461626c652d6578706f72743f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/airtable-export?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/airtable-export/actions?query=workflow%3ATest"><img src="https://github.com/simonw/airtable-export/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/airtable-export/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802…            
291359358 MDEwOlJlcG9zaXRvcnkyOTEzNTkzNTg= datasette-yaml simonw/datasette-yaml 0 simonw 9599 https://github.com/simonw/datasette-yaml Export Datasette records as YAML 0 2020-08-29T22:32:15Z 2020-12-28T03:20:36Z 2021-05-13T08:59:53Z   7 2 2 Python 1 1 1 1 0 1 0 0 1   ["yaml", "datasette", "datasette-plugin", "datasette-io"] 1 1 2 main {"admin": false, "push": false, "pull": false}     1 1 # datasette-yaml [![PyPI](https://img.shields.io/pypi/v/datasette-yaml.svg)](https://pypi.org/project/datasette-yaml/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-yaml?include_prereleases&label=changelog)](https://github.com/simonw/datasette-yaml/releases) [![Tests](https://github.com/simonw/datasette-yaml/workflows/Test/badge.svg)](https://github.com/simonw/datasette-yaml/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-yaml/blob/main/LICENSE) Export Datasette records as YAML ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-yaml ## Usage Having installed this plugin, every table and query will gain a new `.yaml` export link. You can also construct these URLs directly: `/dbname/tablename.yaml` ## Demo The plugin is running on [covid-19.datasettes.com](https://covid-19.datasettes.co/) - for example [/covid/latest_ny_times_counties_with_populations.yaml](https://covid-19.datasettes.com/covid/latest_ny_times_counties_with_populations.yaml) ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-yaml 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><a id="user-content-datasette-yaml" class="anchor" aria-hidden="true" href="#user-content-datasette-yaml"><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-yaml</h1> <p><a href="https://pypi.org/project/datasette-yaml/" rel="nofollow"><img src="https://camo.githubusercontent.com/46f8a5a11934b044a19fda3d282e8ec32c2f77cc4e73c7dedc7cb6508e72ec3f/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d79616d6c2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-yaml.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-yaml/releases"><img src="https://camo.githubusercontent.com/cfbcacc1ce66a9127dd962a62d240197dca4b780bf0a70e3a9e8c9707779f41c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d79616d6c3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-yaml?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-yaml/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-yaml/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-yaml/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4…            
293164447 MDEwOlJlcG9zaXRvcnkyOTMxNjQ0NDc= datasette-backup simonw/datasette-backup 0 simonw 9599 https://github.com/simonw/datasette-backup Plugin adding backup options to Datasette 0 2020-09-05T22:33:29Z 2020-09-24T00:16:59Z 2020-09-07T02:27:30Z   6 1 1 Python 1 1 1 1 0 0 0 0 3   ["datasette", "datasette-plugin", "datasette-io"] 0 3 1 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-backup [![PyPI](https://img.shields.io/pypi/v/datasette-backup.svg)](https://pypi.org/project/datasette-backup/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-backup?include_prereleases&label=changelog)](https://github.com/simonw/datasette-backup/releases) [![Tests](https://github.com/simonw/datasette-backup/workflows/Test/badge.svg)](https://github.com/simonw/datasette-backup/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-backup/blob/main/LICENSE) Plugin adding backup options to Datasette ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-backup ## Usage Once installed, you can download a SQL backup of any of your databases from: /-/backup/dbname.sql ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-backup 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><a id="user-content-datasette-backup" class="anchor" aria-hidden="true" href="#user-content-datasette-backup"><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-backup</h1> <p><a href="https://pypi.org/project/datasette-backup/" rel="nofollow"><img src="https://camo.githubusercontent.com/1f11324a2eb1c6968d27d839ddad8abfe01ae68a37d8d6b808ecfca2eab6af14/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6261636b75702e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-backup.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-backup/releases"><img src="https://camo.githubusercontent.com/b87d1e53482d2b02fca6a2b3536e7b81b061039c4eb05a353ca71e4bfad2b5e3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6261636b75703f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-backup?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-backup/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-backup/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-backup/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb084…            
305199661 MDEwOlJlcG9zaXRvcnkzMDUxOTk2NjE= sphinx-to-sqlite simonw/sphinx-to-sqlite 0 simonw 9599 https://github.com/simonw/sphinx-to-sqlite Create a SQLite database from Sphinx documentation 0 2020-10-18T21:26:55Z 2020-12-19T05:08:12Z 2020-10-22T04:55:45Z   9 2 2 Python 1 1 1 1 0 0 0 0 2 Apache License 2.0 apache-2.0 ["sqlite", "sphinx", "datasette-io", "datasette-tool"] 0 2 2 main {"admin": false, "push": false, "pull": false}     0 2 # sphinx-to-sqlite [![PyPI](https://img.shields.io/pypi/v/sphinx-to-sqlite.svg)](https://pypi.org/project/sphinx-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/simonw/sphinx-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/sphinx-to-sqlite/releases) [![Tests](https://github.com/simonw/sphinx-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/sphinx-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/sphinx-to-sqlite/blob/master/LICENSE) Create a SQLite database from Sphinx documentation. ## Demo You can see the results of running this tool against the [Datasette documentation](https://docs.datasette.io/) at https://latest-docs.datasette.io/docs/sections ## Installation Install this tool using `pip`: $ pip install sphinx-to-sqlite ## Usage First run `sphinx-build` with the `-b xml` option to create XML files in your `_build/` directory. Then run: $ sphinx-to-sqlite docs.db path/to/_build To build the SQLite database. ## Development To contribute to this tool, first checkout the code. Then create a new virtual environment: cd sphinx-to-sqlite python -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><a id="user-content-sphinx-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-sphinx-to-sqlite"><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>sphinx-to-sqlite</h1> <p><a href="https://pypi.org/project/sphinx-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/877d22c6402df75a56257c7d5a426d35ee787ab139307e4a7060c7d706b4c6cd/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f737068696e782d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/sphinx-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/sphinx-to-sqlite/releases"><img src="https://camo.githubusercontent.com/69509856ca4dd51d3c9e67530adbd0f1f662719a608252a8d9cb5bdc3b90590b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f737068696e782d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/sphinx-to-sqlite?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/sphinx-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/sphinx-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/sphinx-to-sqlite/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0…            
327087207 MDEwOlJlcG9zaXRvcnkzMjcwODcyMDc= datasette-css-properties simonw/datasette-css-properties 0 simonw 9599 https://github.com/simonw/datasette-css-properties Experimental Datasette output plugin using CSS properties 0 2021-01-05T18:38:07Z 2021-01-12T17:43:11Z 2021-01-07T22:07:19Z   10 12 12 Python 1 1 1 1 0 0 0 0 1   ["datasette-plugin", "datasette-io"] 0 1 12 main {"admin": false, "push": false, "pull": false}     0 2 # datasette-css-properties [![PyPI](https://img.shields.io/pypi/v/datasette-css-properties.svg)](https://pypi.org/project/datasette-css-properties/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-css-properties?include_prereleases&label=changelog)](https://github.com/simonw/datasette-css-properties/releases) [![Tests](https://github.com/simonw/datasette-css-properties/workflows/Test/badge.svg)](https://github.com/simonw/datasette-css-properties/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-css-properties/blob/main/LICENSE) Extremely experimental Datasette output plugin using CSS properties, inspired by [Custom Properties as State](https://css-tricks.com/custom-properties-as-state/) by Chris Coyier. More about this project: [APIs from CSS without JavaScript: the datasette-css-properties plugin](https://simonwillison.net/2021/Jan/7/css-apis-no-javascript/) ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-css-properties ## Usage Once installed, this plugin adds a `.css` output format to every query result. This will return the first row in the query as a valid CSS file, defining each column as a custom property: Example: https://latest-with-plugins.datasette.io/fixtures/roadside_attractions.css produces: ```css :root { --pk: '1'; --name: 'The Mystery Spot'; --address: '465 Mystery Spot Road, Santa Cruz, CA 95065'; --latitude: '37.0167'; --longitude: '-122.0024'; } ``` If you link this stylesheet to your page you can then do things like this; ```html <link rel="stylesheet" href="https://latest-with-plugins.datasette.io/fixtures/roadside_attractions.css"> <style> .attraction-name:after { content: var(--name); } </style> <p class="attraction-name">Attraction name: </p> ``` Values will be quoted as CSS strings by default. If you want to return a "raw" value without the quotes - for example to set a CSS property that is nume… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-css-properties" class="anchor" aria-hidden="true" href="#user-content-datasette-css-properties"><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-css-properties</h1> <p><a href="https://pypi.org/project/datasette-css-properties/" rel="nofollow"><img src="https://camo.githubusercontent.com/73ef89bdb78bfff22274d72faf1843c5862cc6072d2df7743d43361fb6f5cace/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6373732d70726f706572746965732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-css-properties.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-css-properties/releases"><img src="https://camo.githubusercontent.com/a67e245842d1c8a894df0cbab28ce5643293cfbe70b75afedcea53403d0750b2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6373732d70726f706572746965733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-css-properties?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-css-properties/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-css-properties/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/…            
331720824 MDEwOlJlcG9zaXRvcnkzMzE3MjA4MjQ= datasette-leaflet simonw/datasette-leaflet 0 simonw 9599 https://github.com/simonw/datasette-leaflet Datasette plugin adding the Leaflet JavaScript library 0 2021-01-21T18:41:19Z 2021-04-20T16:27:35Z 2021-02-01T22:20:28Z   124 3 3 JavaScript 1 1 1 1 0 0 0 0 2   ["datasette", "datasette-plugin", "datasette-io"] 0 2 3 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-leaflet [![PyPI](https://img.shields.io/pypi/v/datasette-leaflet.svg)](https://pypi.org/project/datasette-leaflet/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-leaflet?include_prereleases&label=changelog)](https://github.com/simonw/datasette-leaflet/releases) [![Tests](https://github.com/simonw/datasette-leaflet/workflows/Test/badge.svg)](https://github.com/simonw/datasette-leaflet/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-leaflet/blob/main/LICENSE) Datasette plugin adding the [Leaflet](https://leafletjs.com/) JavaScript library. A growing number of Datasette plugins depend on the Leaflet JavaScript mapping library. They each have their own way of loading Leaflet, which could result in loading it multiple times (with multiple versions) if more than one plugin is installed. This library is intended to solve this problem, by providing a single plugin they can all depend on that loads Leaflet in a reusable way. Plugins that use this: - [datasette-leaflet-freedraw](https://datasette.io/plugins/datasette-leaflet-freedraw) - [datasette-leaflet-geojson](https://datasette.io/plugins/datasette-leaflet-geojson) - [datasette-cluster-map](https://datasette.io/plugins/datasette-cluster-map) ## Installation You can install this plugin like so: datasette install datasette-leaflet Usually this plugin will be a dependency of other plugins, so it should be installed automatically when you install them. ## Usage The plugin makes `leaflet.js` and `leaflet.css` available as static files. It provides two custom template variables with the URLs of those two files. - `{{ datasette_leaflet_url }}` is the URL to the JavaScript - `{{ datasette_leaflet_css_url }}` is the URL to the CSS These URLs are also made available as global JavaScript constants: - `datasette.leaflet.JAVASCRIPT_URL` - `datasette.leaflet.CSS_URL` The JavaScript is packaed as a [JavaScript module](https://developer.m… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-leaflet" class="anchor" aria-hidden="true" href="#user-content-datasette-leaflet"><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-leaflet</h1> <p><a href="https://pypi.org/project/datasette-leaflet/" rel="nofollow"><img src="https://camo.githubusercontent.com/50da3783cf231c9646e762bf20cfd464779db8b979de8627d491b9b4589e37c6/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6c6561666c65742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-leaflet.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-leaflet/releases"><img src="https://camo.githubusercontent.com/8b54c9ff200877b23b90a28f91e1d361b5881fd92bf524df8b412176ce98a505/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6c6561666c65743f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-leaflet?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-leaflet/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-leaflet/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-leaflet/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e9…            
335137108 MDEwOlJlcG9zaXRvcnkzMzUxMzcxMDg= datasette-basemap simonw/datasette-basemap 0 simonw 9599 https://github.com/simonw/datasette-basemap A basemap for Datasette and datasette-leaflet 0 2021-02-02T01:49:09Z 2021-02-03T21:56:20Z 2021-02-03T21:56:18Z https://datasette.io/plugins/datasette-basemap 43 1 1 Python 1 1 1 1 0 0 0 0 0   ["openstreetmap", "mbtiles", "datasette", "datasette-plugin", "datasette-io"] 0 0 1 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-basemap [![PyPI](https://img.shields.io/pypi/v/datasette-basemap.svg)](https://pypi.org/project/datasette-basemap/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-basemap?include_prereleases&label=changelog)](https://github.com/simonw/datasette-basemap/releases) [![Tests](https://github.com/simonw/datasette-basemap/workflows/Test/badge.svg)](https://github.com/simonw/datasette-basemap/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-basemap/blob/main/LICENSE) A basemap for Datasette and datasette-leaflet ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-basemap ## Usage This plugin will make a `basemap` database available containing OpenStreetMap tiles for zoom levels 0-6 in the [mbtiles](https://github.com/mapbox/mbtiles-spec) format. It is designed for use with the [datasette-tiles](https://datasette.io/plugins/datasette-tiles) tile server plugin. ## Demo You can preview this map at https://datasette-tiles-demo.datasette.io/-/tiles/basemap and browse the database directly at https://datasette-tiles-demo.datasette.io/basemap ## License The data bundled with this package is © OpenStreetMap contributors, licensed under the [Open Data Commons Open Database License](https://opendatacommons.org/licenses/odbl/). See [this page](https://www.openstreetmap.org/copyright) for more details. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-basemap 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><a id="user-content-datasette-basemap" class="anchor" aria-hidden="true" href="#user-content-datasette-basemap"><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-basemap</h1> <p><a href="https://pypi.org/project/datasette-basemap/" rel="nofollow"><img src="https://camo.githubusercontent.com/9e2030246117aed0c545320f2597b7cfefec254930d354c648b4a5ef1f695e4d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d626173656d61702e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-basemap.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-basemap/releases"><img src="https://camo.githubusercontent.com/7280ebff6265b28b5c3d37fe294e2bef782ad2cc64e0ca8281b119555e6ac485/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d626173656d61703f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-basemap?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-basemap/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-basemap/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-basemap/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e9…            
335372050 MDEwOlJlcG9zaXRvcnkzMzUzNzIwNTA= download-tiles simonw/download-tiles 0 simonw 9599 https://github.com/simonw/download-tiles Download map tiles and store them in an MBTiles database 0 2021-02-02T17:37:49Z 2021-05-29T07:22:58Z 2021-02-16T04:19:59Z https://datasette.io/tools/download-tiles 26 9 9 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["openstreetmap", "mbtiles", "datasette-io", "datasette-tool"] 0 0 9 main {"admin": false, "push": false, "pull": false}     0 1 # download-tiles [![PyPI](https://img.shields.io/pypi/v/download-tiles.svg)](https://pypi.org/project/download-tiles/) [![Changelog](https://img.shields.io/github/v/release/simonw/download-tiles?include_prereleases&label=changelog)](https://github.com/simonw/download-tiles/releases) [![Tests](https://github.com/simonw/download-tiles/workflows/Test/badge.svg)](https://github.com/simonw/download-tiles/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/download-tiles/blob/master/LICENSE) Download map tiles and store them in an MBTiles database ## Installation Install this tool using `pip`: $ pip install download-tiles ## Usage This tool downloads tiles from a specified [TMS (Tile Map Server)](https://wiki.openstreetmap.org/wiki/TMS) server for a specified bounding box and range of zoom levels and stores those tiles in a MBTiles SQLite database. It is a command-line wrapper around the [Landez](https://github.com/makinacorpus/landez) Python libary. **Please use this tool responsibly**. Consult the usage policies of the tile servers you are interacting with, for example the [OpenStreetMap Tile Usage Policy](https://operations.osmfoundation.org/policies/tiles/). Running the following will download zoom levels 0-3 of OpenStreetMap, 85 tiles total, and store them in a SQLite database called `world.mbtiles`: download-tiles world.mbtiles You can customize which tile and zoom levels are downloaded using command options: `--zoom-levels=0-3` or `-z=0-3` The different zoom levels to download. Specify a single number, e.g. `15`, or a range of numbers e.g. `0-4`. Be careful with this setting as you can easily go over the limits requested by the underlying tile server. `--bbox=3.9,-6.3,14.5,10.2` or `-b=3.9,-6.3,14.5,10.2` The bounding box to fetch. Should be specified as `min-lon,min-lat,max-lon,max-lat`. You can use [bboxfinder.com](http://bboxfinder.com/) to find these for different areas. `--city=london` or `--country=madagas… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-download-tiles" class="anchor" aria-hidden="true" href="#user-content-download-tiles"><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>download-tiles</h1> <p><a href="https://pypi.org/project/download-tiles/" rel="nofollow"><img src="https://camo.githubusercontent.com/82c46313526394b774727137f12ac6fbf6606364edbee19ebd99c951953b04b5/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f646f776e6c6f61642d74696c65732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/download-tiles.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/download-tiles/releases"><img src="https://camo.githubusercontent.com/32d363e282d2f95ba1b135630d328b8b61459c3e97b2b4e2fe1ec629be13d80e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f646f776e6c6f61642d74696c65733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/download-tiles?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/download-tiles/actions?query=workflow%3ATest"><img src="https://github.com/simonw/download-tiles/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/download-tiles/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7…            
342126610 MDEwOlJlcG9zaXRvcnkzNDIxMjY2MTA= datasette-block simonw/datasette-block 0 simonw 9599 https://github.com/simonw/datasette-block Block all access to specific path prefixes 0 2021-02-25T04:51:08Z 2021-02-25T08:18:28Z 2021-02-25T05:03:45Z https://datasette.io/plugins/datasette-block 4 1 1 Python 1 1 1 1 0 0 0 0 0   ["datasette", "datasette-plugin", "datasette-io"] 0 0 1 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-block [![PyPI](https://img.shields.io/pypi/v/datasette-block.svg)](https://pypi.org/project/datasette-block/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-block?include_prereleases&label=changelog)](https://github.com/simonw/datasette-block/releases) [![Tests](https://github.com/simonw/datasette-block/workflows/Test/badge.svg)](https://github.com/simonw/datasette-block/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-block/blob/main/LICENSE) Block all access to specific path prefixes ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-block ## Configuration Add the following to `metadata.json` to block specific path prefixes: ```json { "plugins": { "datasette-block": { "prefixes": ["/all/"] } } } ``` This will cause a 403 error to be returned for any path beginning with `/all/`. This blocking happens as an ASGI wrapper around Datasette. ## Why would you need this? You almost always would not. I use it with `datasette-ripgrep` to block access to static assets for unauthenticated users. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-block 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><a id="user-content-datasette-block" class="anchor" aria-hidden="true" href="#user-content-datasette-block"><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-block</h1> <p><a href="https://pypi.org/project/datasette-block/" rel="nofollow"><img src="https://camo.githubusercontent.com/eedcb03a8e4f528e044cee8db9b02e79782b8a9bccf66bd239701d9d7a991984/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d626c6f636b2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-block.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-block/releases"><img src="https://camo.githubusercontent.com/05cef47f53da7aaccdd3a18a809f166b816ac100f83757b2488082897269f5b4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d626c6f636b3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-block?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-block/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-block/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-block/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb…            
346597557 MDEwOlJlcG9zaXRvcnkzNDY1OTc1NTc= tableau-to-sqlite simonw/tableau-to-sqlite 0 simonw 9599 https://github.com/simonw/tableau-to-sqlite Fetch data from Tableau into a SQLite database 0 2021-03-11T06:12:02Z 2021-06-10T04:40:44Z 2021-04-29T16:11:03Z   212 8 8 Python 1 1 1 1 0 2 0 0 2 Apache License 2.0 apache-2.0 ["datasette-io", "datasette-tool"] 2 2 8 main {"admin": false, "push": false, "pull": false}     2 1 # tableau-to-sqlite [![PyPI](https://img.shields.io/pypi/v/tableau-to-sqlite.svg)](https://pypi.org/project/tableau-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/simonw/tableau-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/tableau-to-sqlite/releases) [![Tests](https://github.com/simonw/tableau-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/tableau-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/tableau-to-sqlite/blob/master/LICENSE) Fetch data from Tableau into a SQLite database. A wrapper around [TableauScraper](https://github.com/bertrandmartel/tableau-scraping/). ## Installation Install this tool using `pip`: $ pip install tableau-to-sqlite ## Usage If you have the URL to a Tableau dashboard like this: https://results.mo.gov/t/COVID19/views/VaccinationsDashboard/Vaccinations You can pass that directly to the tool: tableau-to-sqlite tableau.db \ https://results.mo.gov/t/COVID19/views/VaccinationsDashboard/Vaccinations This will create a SQLite database called `tableau.db` containing one table for each of the worksheets in that dashboard. If the dashboard is hosted on https://public.tableau.com/ you can instead provide the view name. This will be two strings separated by a `/` symbol - something like this: OregonCOVID-19VaccineProviderEnrollment/COVID-19VaccineProviderEnrollment Now run the tool like this: tableau-to-sqlite tableau.db \ OregonCOVID-19VaccineProviderEnrollment/COVID-19VaccineProviderEnrollment ## Get the data as JSON or CSV If you're building a [git scraper](https://simonwillison.net/2020/Oct/9/git-scraping/) you may want to convert the data gathered by this tool to CSV or JSON to check into your repository. You can do that using [sqlite-utils](https://sqlite-utils.datasette.io/). Install it using `pip`: pip install sqlite-utils You can dump out a table as JSON like so: sqlite-utils ro… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-tableau-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-tableau-to-sqlite"><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>tableau-to-sqlite</h1> <p><a href="https://pypi.org/project/tableau-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/bdda6efc6980f655c99f0475b322f27bbc413e7e13e847e55e697dd135d10601/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f7461626c6561752d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/tableau-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/tableau-to-sqlite/releases"><img src="https://camo.githubusercontent.com/fd18da3a8541734c627a9be68134477abe876a8695165916ff7c8c5bbf7269eb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f7461626c6561752d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/tableau-to-sqlite?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/tableau-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/tableau-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/tableau-to-sqlite/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104…            
375546675 MDEwOlJlcG9zaXRvcnkzNzU1NDY2NzU= datasette-placekey simonw/datasette-placekey 0 simonw 9599 https://github.com/simonw/datasette-placekey SQL functions for working with placekeys 0 2021-06-10T02:31:27Z 2021-06-10T02:33:22Z 2021-06-10T02:32:42Z https://datasette.io/plugins/datasette-placekey 3 0 0 Python 1 1 1 1 0 0 0 0 1   ["datasette", "datasette-plugin", "datasette-io", "placekey"] 0 1 0 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-placekey [![PyPI](https://img.shields.io/pypi/v/datasette-placekey.svg)](https://pypi.org/project/datasette-placekey/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-placekey?include_prereleases&label=changelog)](https://github.com/simonw/datasette-placekey/releases) [![Tests](https://github.com/simonw/datasette-placekey/workflows/Test/badge.svg)](https://github.com/simonw/datasette-placekey/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-placekey/blob/main/LICENSE) SQL functions for working with [placekeys](https://www.placekey.io/). ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-placekey ## Usage The following SQL functions are exposed - [documentation here](https://placekey.github.io/placekey-py/placekey.html#module-placekey.placekey). ```sql select geo_to_placekey(33.0896104,129.7900839), placekey_to_geo('@6nh-nhh-kvf'), placekey_to_geo_latitude('@6nh-nhh-kvf'), placekey_to_geo_longitude('@6nh-nhh-kvf'), placekey_to_h3('@6nh-nhh-kvf'), h3_to_placekey('8a30d94e4c87fff'), placekey_to_geojson('@6nh-nhh-kvf'), placekey_to_wkt('@6nh-nhh-kvf'), placekey_format_is_valid('@6nh-nhh-kvf'); ``` ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-placekey 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><a id="user-content-datasette-placekey" class="anchor" aria-hidden="true" href="#user-content-datasette-placekey"><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-placekey</h1> <p><a href="https://pypi.org/project/datasette-placekey/" rel="nofollow"><img src="https://camo.githubusercontent.com/a570339480e04ec2eedd623479156b479b30fafcd8fa2ff60250a22ee4e77ed2/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d706c6163656b65792e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-placekey.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-placekey/releases"><img src="https://camo.githubusercontent.com/120db4c1d380188526a62cbe06a80176d5be627da0b962b724e32422291df31c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d706c6163656b65793f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-placekey?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-placekey/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-placekey/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-placekey/blob/main/LICENSE"><img src="https://camo.githubusercontent…            
393999598 MDEwOlJlcG9zaXRvcnkzOTM5OTk1OTg= datasette-pyinstrument simonw/datasette-pyinstrument 0 simonw 9599 https://github.com/simonw/datasette-pyinstrument Use pyinstrument to analyze Datasette page performance 0 2021-08-08T15:33:29Z 2021-08-08T15:50:54Z 2021-08-08T15:50:52Z   0 0 0 Python 1 1 1 1 0 0 0 0 0   [] 0 0 0 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-pyinstrument [![PyPI](https://img.shields.io/pypi/v/datasette-pyinstrument.svg)](https://pypi.org/project/datasette-pyinstrument/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-pyinstrument?include_prereleases&label=changelog)](https://github.com/simonw/datasette-pyinstrument/releases) [![Tests](https://github.com/simonw/datasette-pyinstrument/workflows/Test/badge.svg)](https://github.com/simonw/datasette-pyinstrument/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-pyinstrument/blob/main/LICENSE) Use pyinstrument to analyze Datasette page performance ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-pyinstrument ## Usage Once installed, adding `?_pyinstrument=1` to any URL within Datasette will replace the output of that page with the pyinstrument profiler results for it. ## Demo You can see the output of this plugin at https://latest-with-plugins.datasette.io/fixtures/sortable?_pyinstrument=1 ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-pyinstrument python3 -mvenv venv source venv/bin/activate Or if you are using `pipenv`: pipenv shell Now install the dependencies and test dependencies: 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><a id="user-content-datasette-pyinstrument" class="anchor" aria-hidden="true" href="#user-content-datasette-pyinstrument"><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-pyinstrument</h1> <p><a href="https://pypi.org/project/datasette-pyinstrument/" rel="nofollow"><img src="https://camo.githubusercontent.com/04eb20d5c908480064bd38f51a23efb993e1ab6cd8731310a7fd8762fbf0e589/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7079696e737472756d656e742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-pyinstrument.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-pyinstrument/releases"><img src="https://camo.githubusercontent.com/82a450100507a691eb342ecf1a1e328c5078b2d42918187061fe0f1255431fd7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7079696e737472756d656e743f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-pyinstrument?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-pyinstrument/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-pyinstrument/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-pyinstrument/blo…            
394107614 MDEwOlJlcG9zaXRvcnkzOTQxMDc2MTQ= datasette-query-links simonw/datasette-query-links 0 simonw 9599 https://github.com/simonw/datasette-query-links Turn SELECT queries returned by a query into links to execute them 0 2021-08-09T01:16:59Z 2021-08-09T04:31:40Z 2021-08-09T02:56:40Z   7 3 3 Python 1 1 1 1 0 0 0 0 0   [] 0 0 3 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-query-links [![PyPI](https://img.shields.io/pypi/v/datasette-query-links.svg)](https://pypi.org/project/datasette-query-links/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-query-links?include_prereleases&label=changelog)](https://github.com/simonw/datasette-query-links/releases) [![Tests](https://github.com/simonw/datasette-query-links/workflows/Test/badge.svg)](https://github.com/simonw/datasette-query-links/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-query-links/blob/main/LICENSE) Turn SELECT queries returned by a query into links to execute them ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-query-links ## Usage This is an experimental plugin, requiring Datasette 0.59a1 or higher. Any SQL query that returns a value that itself looks like a valid SQL query will be converted into a link to execute that SQL query when it is displayed in the Datasette interface. These links will only show for valid SQL query - if a SQL query would return an error it will not be turned into a link. ## Demo * [Here's an example query](https://latest-with-plugins.datasette.io/fixtures?sql=select%0D%0A++%27select+*+from+%5Bfacetable%5D%27+as+query%0D%0Aunion%0D%0Aselect%0D%0A++%27select+sqlite_version()%27%0D%0Aunion%0D%0Aselect%0D%0A++%27select+this+is+invalid+SQL+so+will+not+be+linked%27) showing the plugin in action. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-query-links python3 -mvenv venv source venv/bin/activate Or if you are using `pipenv`: pipenv shell Now install the dependencies and test dependencies: 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><a id="user-content-datasette-query-links" class="anchor" aria-hidden="true" href="#user-content-datasette-query-links"><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-query-links</h1> <p><a href="https://pypi.org/project/datasette-query-links/" rel="nofollow"><img src="https://camo.githubusercontent.com/3ab4d04fcda27408dfd62a12ac76681be62dfafccd5c0fffb3837512e08a60fb/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d71756572792d6c696e6b732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-query-links.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-query-links/releases"><img src="https://camo.githubusercontent.com/2889989730367edad93f0dd54b21beb27e4f8f5b68ae195dec3a4751353b5949/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d71756572792d6c696e6b733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-query-links?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-query-links/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-query-links/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-query-links/blob/main/LICENSE…            

Advanced export

JSON shape: default, array, newline-delimited, object

CSV options:

CREATE TABLE [repos] (
   [id] INTEGER PRIMARY KEY,
   [node_id] TEXT,
   [name] TEXT,
   [full_name] TEXT,
   [private] INTEGER,
   [owner] INTEGER REFERENCES [users]([id]),
   [html_url] TEXT,
   [description] TEXT,
   [fork] INTEGER,
   [created_at] TEXT,
   [updated_at] TEXT,
   [pushed_at] TEXT,
   [homepage] TEXT,
   [size] INTEGER,
   [stargazers_count] INTEGER,
   [watchers_count] INTEGER,
   [language] TEXT,
   [has_issues] INTEGER,
   [has_projects] INTEGER,
   [has_downloads] INTEGER,
   [has_wiki] INTEGER,
   [has_pages] INTEGER,
   [forks_count] INTEGER,
   [archived] INTEGER,
   [disabled] INTEGER,
   [open_issues_count] INTEGER,
   [license] TEXT,
   [topics] TEXT,
   [forks] INTEGER,
   [open_issues] INTEGER,
   [watchers] INTEGER,
   [default_branch] TEXT,
   [permissions] TEXT,
   [temp_clone_token] TEXT,
   [organization] INTEGER REFERENCES [users]([id]),
   [network_count] INTEGER,
   [subscribers_count] INTEGER, [readme] TEXT, [readme_html] TEXT, [allow_forking] INTEGER, [visibility] TEXT, [is_template] INTEGER, [template_repository] TEXT, [web_commit_signoff_required] INTEGER, [has_discussions] INTEGER,
   FOREIGN KEY([license]) REFERENCES [licenses]([key])
);
CREATE INDEX [idx_repos_license]
    ON [repos] ([license]);
CREATE INDEX [idx_repos_organization]
    ON [repos] ([organization]);
CREATE INDEX [idx_repos_owner]
    ON [repos] ([owner]);
Powered by Datasette · Queries took 112.846ms