home / content

repos

102 rows where license = "apache-2.0"

✎ View and edit SQL

This data as json, CSV (advanced)

Suggested facets: owner, homepage, language, has_projects, forks_count, open_issues_count, forks, open_issues, default_branch, permissions, network_count, subscribers_count, template_repository, has_discussions, 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
107914493 MDEwOlJlcG9zaXRvcnkxMDc5MTQ0OTM= datasette simonw/datasette 0 simonw 9599 https://github.com/simonw/datasette An open source multi-tool for exploring and publishing data 0 2017-10-23T00:39:03Z 2022-11-15T23:16:27Z 2022-11-16T03:47:14Z https://datasette.io 5770 6628 6628 Python 1 0 1 1 0 463 0 0 435 Apache License 2.0 apache-2.0 ["asgi", "automatic-api", "csv", "datasets", "datasette", "datasette-io", "docker", "json", "python", "sql", "sqlite"] 463 435 6628 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     463 97     1 public 0   0 1
110509816 MDEwOlJlcG9zaXRvcnkxMTA1MDk4MTY= csvs-to-sqlite simonw/csvs-to-sqlite 0 simonw 9599 https://github.com/simonw/csvs-to-sqlite Convert CSV files into a SQLite database 0 2017-11-13T06:38:21Z 2021-11-18T16:33:39Z 2021-11-18T16:35:33Z   138 655 655 Python 1 1 1 1 0 50 0 0 34 Apache License 2.0 apache-2.0 ["click", "csv", "datasette", "datasette-io", "datasette-tool", "pandas", "python", "sqlite"] 50 34 655 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     50 17 # csvs-to-sqlite [![PyPI](https://img.shields.io/pypi/v/csvs-to-sqlite.svg)](https://pypi.org/project/csvs-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/simonw/csvs-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/csvs-to-sqlite/releases) [![Tests](https://github.com/simonw/csvs-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/csvs-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/csvs-to-sqlite/blob/main/LICENSE) Convert CSV files into a SQLite database. Browse and publish that SQLite database with [Datasette](https://github.com/simonw/datasette). Basic usage: csvs-to-sqlite myfile.csv mydatabase.db This will create a new SQLite database called `mydatabase.db` containing a single table, `myfile`, containing the CSV content. You can provide multiple CSV files: csvs-to-sqlite one.csv two.csv bundle.db The `bundle.db` database will contain two tables, `one` and `two`. This means you can use wildcards: csvs-to-sqlite ~/Downloads/*.csv my-downloads.db If you pass a path to one or more directories, the script will recursively search those directories for CSV files and create tables for each one. csvs-to-sqlite ~/path/to/directory all-my-csvs.db ## Handling TSV (tab-separated values) You can use the `-s` option to specify a different delimiter. If you want to use a tab character you'll need to apply shell escaping like so: csvs-to-sqlite my-file.tsv my-file.db -s $'\t' ## Refactoring columns into separate lookup tables Let's say you have a CSV file that looks like this: county,precinct,office,district,party,candidate,votes Clark,1,President,,REP,John R. Kasich,5 Clark,2,President,,REP,John R. Kasich,0 Clark,3,President,,REP,John R. Kasich,7 ([Real example taken from the Open Elections project](https://github.com/openelections/openelections-data-sd/blob/master/2016/20160607__sd__primary__clark__precinct.csv)) You can n… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-csvs-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-csvs-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>csvs-to-sqlite</h1> <p dir="auto"><a href="https://pypi.org/project/csvs-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/4869c8a624ce3dbf120decc95900d98af23c54cf5c87d65f7164e640a5fcda6b/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f637376732d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/csvs-to-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/csvs-to-sqlite/releases"><img src="https://camo.githubusercontent.com/c0cc260f11a725723219d723be3829d23edfc0962d0e8d191fa2bcd6ceaa749f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f637376732d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/csvs-to-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/csvs-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/csvs-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/csvs-to-sqlite/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9… 1 public 0      
130236762 MDEwOlJlcG9zaXRvcnkxMzAyMzY3NjI= datasette-cluster-map simonw/datasette-cluster-map 0 simonw 9599 https://github.com/simonw/datasette-cluster-map Datasette plugin that shows a map for any data with latitude/longitude columns 0 2018-04-19T15:31:55Z 2021-12-07T21:55:01Z 2021-12-07T19:39:02Z   97 40 40 JavaScript 1 1 1 1 0 10 0 0 12 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "leafletjs"] 10 12 40 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     10 2 # datasette-cluster-map [![PyPI](https://img.shields.io/pypi/v/datasette-cluster-map.svg)](https://pypi.org/project/datasette-cluster-map/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-cluster-map?include_prereleases&label=changelog)](https://github.com/simonw/datasette-cluster-map/releases) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-cluster-map/blob/main/LICENSE) A [Datasette plugin](https://docs.datasette.io/en/stable/plugins.html) that detects tables with `latitude` and `longitude` columns and then plots them on a map using [Leaflet.markercluster](https://github.com/Leaflet/Leaflet.markercluster). More about this project: [Datasette plugins, and building a clustered map visualization](https://simonwillison.net/2018/Apr/20/datasette-plugins/). ## Demo [global-power-plants.datasettes.com](https://global-power-plants.datasettes.com/global-power-plants/global-power-plants) hosts a demo of this plugin running against a database of 33,000 power plants around the world. ![Cluster map demo](https://static.simonwillison.net/static/2020/global-power-plants.png) ## Installation Run `datasette install datasette-cluster-map` to add this plugin to your Datasette virtual environment. Datasette will automatically load the plugin if it is installed in this way. If you are deploying using the `datasette publish` command you can use the `--install` option: datasette publish cloudrun mydb.db --install=datasette-cluster-map If any of your tables have a `latitude` and `longitude` column, a map will be automatically displayed. ## Configuration If your columns are called something else you can configure the column names using [plugin configuration](https://docs.datasette.io/en/stable/plugins.html#plugin-configuration) in a `metadata.json` file. For example, if all of your columns are called `xlat` and `xlng` you can create a `metadata.json` file like this: ```json { "title": "Regular metadata keys can go here too", "p… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-cluster-map" class="anchor" aria-hidden="true" href="#user-content-datasette-cluster-map"><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-cluster-map</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-cluster-map/" rel="nofollow"><img src="https://camo.githubusercontent.com/6450215f6eeea9441e8212cad322848645a5fe49b0a77613b19c24aaf36eec9b/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d636c75737465722d6d61702e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-cluster-map.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-cluster-map/releases"><img src="https://camo.githubusercontent.com/1e99ad2a8a1efa327c27477d9f56b3288ab98216a2860019b872ecdcff59e7e5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d636c75737465722d6d61703f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-cluster-map?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-cluster-map/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417… 1 public 0      
138669673 MDEwOlJlcG9zaXRvcnkxMzg2Njk2NzM= datasette-vega simonw/datasette-vega 0 simonw 9599 https://github.com/simonw/datasette-vega Datasette plugin for visualizing data using Vega 0 2018-06-26T01:40:54Z 2021-12-10T22:20:46Z 2021-12-10T22:20:43Z   59 42 42 JavaScript 1 1 1 1 0 2 0 0 31 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "plugin", "react", "vega"] 2 31 42 master {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     2 2 # datasette-vega [![PyPI](https://img.shields.io/pypi/v/datasette-vega.svg)](https://pypi.org/project/datasette-vega/) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-vega/blob/master/LICENSE) A [Datasette](https://github.com/simonw/datasette) plugin that provides tools for generating charts using [Vega](https://vega.github.io/). ![Datasette Vega interface](https://raw.githubusercontent.com/simonw/datasette-vega/master/datasette-vega.png) Try out the latest master build as a live demo at https://datasette-vega-latest.datasette.io/ or try the latest release installed as a plugin at https://fivethirtyeight.datasettes.com/ To add this to your Datasette installation, install the plugin like so: pip install datasette-vega The plugin will then add itself to every Datasette table view. If you are publishing data using the `datasette publish` command, you can include this plugin like so: datasette publish now mydatabase.db --install=datasette-vega <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-vega" class="anchor" aria-hidden="true" href="#user-content-datasette-vega"><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-vega</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-vega/" rel="nofollow"><img src="https://camo.githubusercontent.com/3daf7c04104904d77b14dde7eb24240a712bd4eca97aa15afa673a306a7ef31a/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d766567612e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-vega.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-vega/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" style="max-width: 100%;"></a></p> <p dir="auto">A <a href="https://github.com/simonw/datasette">Datasette</a> plugin that provides tools for generating charts using <a href="https://vega.github.io/" rel="nofollow">Vega</a>.</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer" href="https://raw.githubusercontent.com/simonw/datasette-vega/master/datasette-vega.png"><img src="https://raw.githubusercontent.com/simonw/datasette-vega/master/datasette-vega.png" alt="Datasett… 1 public 0      
140912432 MDEwOlJlcG9zaXRvcnkxNDA5MTI0MzI= sqlite-utils simonw/sqlite-utils 0 simonw 9599 https://github.com/simonw/sqlite-utils Python CLI utility and library for manipulating SQLite databases 0 2018-07-14T03:21:46Z 2022-11-15T18:12:16Z 2022-11-15T15:53:38Z https://sqlite-utils.datasette.io 1437 1029 1029 Python 1 1 1 1 0 79 0 0 72 Apache License 2.0 apache-2.0 ["cli", "click", "datasette", "datasette-io", "datasette-tool", "python", "sqlite", "sqlite-database"] 79 72 1029 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     79 16 # sqlite-utils [![PyPI](https://img.shields.io/pypi/v/sqlite-utils.svg)](https://pypi.org/project/sqlite-utils/) [![Changelog](https://img.shields.io/github/v/release/simonw/sqlite-utils?include_prereleases&label=changelog)](https://sqlite-utils.datasette.io/en/stable/changelog.html) [![Python 3.x](https://img.shields.io/pypi/pyversions/sqlite-utils.svg?logo=python&logoColor=white)](https://pypi.org/project/sqlite-utils/) [![Tests](https://github.com/simonw/sqlite-utils/workflows/Test/badge.svg)](https://github.com/simonw/sqlite-utils/actions?query=workflow%3ATest) [![Documentation Status](https://readthedocs.org/projects/sqlite-utils/badge/?version=stable)](http://sqlite-utils.datasette.io/en/stable/?badge=stable) [![codecov](https://codecov.io/gh/simonw/sqlite-utils/branch/main/graph/badge.svg)](https://codecov.io/gh/simonw/sqlite-utils) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/sqlite-utils/blob/main/LICENSE) [![discord](https://img.shields.io/discord/823971286308356157?label=discord)](https://discord.gg/Ass7bCAMDw) Python CLI utility and library for manipulating SQLite databases. ## Some feature highlights - [Pipe JSON](https://sqlite-utils.datasette.io/en/stable/cli.html#inserting-json-data) (or [CSV or TSV](https://sqlite-utils.datasette.io/en/stable/cli.html#inserting-csv-or-tsv-data)) directly into a new SQLite database file, automatically creating a table with the appropriate schema - [Run in-memory SQL queries](https://sqlite-utils.datasette.io/en/stable/cli.html#querying-data-directly-using-an-in-memory-database), including joins, directly against data in CSV, TSV or JSON files and view the results - [Configure SQLite full-text search](https://sqlite-utils.datasette.io/en/stable/cli.html#configuring-full-text-search) against your database tables and run search queries against them, ordered by relevance - Run [transformations against your tables](https://sqlite-utils.datasette.io/en/stable/cli.html#transforming-tables) to make schema changes t… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-sqlite-utils" class="anchor" aria-hidden="true" href="#user-content-sqlite-utils"><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-utils</h1> <p dir="auto"><a href="https://pypi.org/project/sqlite-utils/" rel="nofollow"><img src="https://camo.githubusercontent.com/f691f8124616f99c7978ecb2a58841aa6a7ace31234b0c87d392c4ef8db853e4/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73716c6974652d7574696c732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/sqlite-utils.svg" style="max-width: 100%;"></a> <a href="https://sqlite-utils.datasette.io/en/stable/changelog.html" rel="nofollow"><img src="https://camo.githubusercontent.com/b114e00dffe1e5b24d21c5cd11dc97f8a6ab83da51acbb971e5daebeeb47d690/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f73716c6974652d7574696c733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/sqlite-utils?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://pypi.org/project/sqlite-utils/" rel="nofollow"><img src="https://camo.githubusercontent.com/2413fbc1359bcdcf500aa31b497c8c25acf7db3f3fc3a33c540e809c984a189e/68747470733a2f2f696d672e736869656c64732e696f2f707970692f707976657273696f6e732f73716c6974652d7574696c732e7376673f6c6f676f3d707974686f6e266c6f676f436f6c6f723d776869… 1 public 0   0 0
142967347 MDEwOlJlcG9zaXRvcnkxNDI5NjczNDc= datasette-json-html simonw/datasette-json-html 0 simonw 9599 https://github.com/simonw/datasette-json-html Datasette plugin for rendering HTML based on JSON values 0 2018-07-31T05:41:39Z 2022-03-15T04:54:15Z 2022-03-22T01:43:59Z   46 19 19 Python 1 1 1 1 0 1 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "plugin"] 1 0 19 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 4 # datasette-json-html [![PyPI](https://img.shields.io/pypi/v/datasette-json-html.svg)](https://pypi.org/project/datasette-json-html/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-json-html?include_prereleases&label=changelog)](https://github.com/simonw/datasette-json-html/releases) [![Tests](https://github.com/simonw/datasette-json-html/workflows/Test/badge.svg)](https://github.com/simonw/datasette-remote-metadata/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-json-html/blob/main/LICENSE) Datasette plugin for rendering HTML based on JSON values, using the [render_cell plugin hook](https://docs.datasette.io/en/stable/plugin_hooks.html#render-cell-value-column-table-database-datasette). This plugin looks for cell values that match a very specific JSON format and converts them into HTML when they are rendered by the Datasette interface. ## Links { "href": "https://simonwillison.net/", "label": "Simon Willison" } Will be rendered as an `<a href="">` link: <a href="https://simonwillison.net/">Simon Willison</a> You can set a tooltip on the link using a `"title"` key: { "href": "https://simonwillison.net/", "label": "Simon Willison", "title": "My blog" } Produces: <a href="https://simonwillison.net/" title="My blog">Simon Willison</a> You can also include a description, which will be displayed below the link. If descriptions include newlines they will be converted to `<br>` elements: select json_object( "href", "https://simonwillison.net/", "label", "Simon Willison", "description", "This can contain" || x'0a' || "newlines" ) Produces: <strong><a href="https://simonwillison.net/">Simon Willison</a></strong><br>This can contain<br>newlines * [Literal JSON link demo](https://datasette-json-html.datasette.io/demo?sql=select+%27%7B%0D%0A++++%22href%22%3A+%22https%3A%2F%2Fsimonwillison.net%2F%… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-json-html" class="anchor" aria-hidden="true" href="#user-content-datasette-json-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-json-html</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-json-html/" rel="nofollow"><img src="https://camo.githubusercontent.com/6781ecd1fa88174e5228eff74ade944f8f69a051d14df112d9dbc18bd3543551/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6a736f6e2d68746d6c2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-json-html.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-json-html/releases"><img src="https://camo.githubusercontent.com/56a671c6595b71bd6d225b1c6d2ee0c5dbadd9bbbb44e4074ad4afe4c18905ce/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6a736f6e2d68746d6c3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-json-html?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-remote-metadata/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-json-html/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-json-html/blob/main/LICE… 1 public 0      
163790822 MDEwOlJlcG9zaXRvcnkxNjM3OTA4MjI= datasette-sqlite-fts4 simonw/datasette-sqlite-fts4 0 simonw 9599 https://github.com/simonw/datasette-sqlite-fts4 Datasette plugin that adds custom SQL functions for working with SQLite FTS4 0 2019-01-02T03:40:41Z 2022-07-31T16:33:25Z 2022-07-31T14:46:26Z https://datasette.io/plugins/datasette-sqlite-fts4 14 3 3 Python 1 1 1 1 0 1 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "plugin"] 1 0 3 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 2 # datasette-sqlite-fts4 [![PyPI](https://img.shields.io/pypi/v/datasette-sqlite-fts4.svg)](https://pypi.org/project/datasette-sqlite-fts4/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-sqlite-fts4?include_prereleases&label=changelog)](https://github.com/simonw/datasette-sqlite-fts4/releases) [![Tests](https://github.com/simonw/datasette-sqlite-fts4/workflows/Test/badge.svg)](https://github.com/simonw/datasette-sqlite-fts4/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-sqlite-fts4/blob/main/LICENSE) Datasette plugin that exposes the custom SQL functions from [sqlite-fts4](https://github.com/simonw/sqlite-fts4). [Interactive demo](https://datasette-sqlite-fts4.datasette.io/24ways-fts4?sql=select%0D%0A++++json_object%28%0D%0A++++++++"label"%2C+articles.title%2C+"href"%2C+articles.url%0D%0A++++%29+as+article%2C%0D%0A++++articles.author%2C%0D%0A++++rank_score%28matchinfo%28articles_fts%2C+"pcx"%29%29+as+score%2C%0D%0A++++rank_bm25%28matchinfo%28articles_fts%2C+"pcnalx"%29%29+as+bm25%2C%0D%0A++++json_object%28%0D%0A++++++++"pre"%2C+annotate_matchinfo%28matchinfo%28articles_fts%2C+"pcxnalyb"%29%2C+"pcxnalyb"%29%0D%0A++++%29+as+annotated_matchinfo%2C%0D%0A++++matchinfo%28articles_fts%2C+"pcxnalyb"%29+as+matchinfo%2C%0D%0A++++decode_matchinfo%28matchinfo%28articles_fts%2C+"pcxnalyb"%29%29+as+decoded_matchinfo%0D%0Afrom%0D%0A++++articles_fts+join+articles+on+articles.rowid+%3D+articles_fts.rowid%0D%0Awhere%0D%0A++++articles_fts+match+%3Asearch%0D%0Aorder+by+bm25&search=jquery+maps). Read [Exploring search relevance algorithms with SQLite](https://simonwillison.net/2019/Jan/7/exploring-search-relevance-algorithms-sqlite/) for further details on this project. ## Installation pip install datasette-sqlite-fts4 If you are deploying a database using `datasette publish` you can include this plugin using the `--install` option: datasette publish now mydb.db --install=datasette-sqlite-fts4 <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-sqlite-fts4" class="anchor" aria-hidden="true" href="#user-content-datasette-sqlite-fts4"><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-sqlite-fts4</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-sqlite-fts4/" rel="nofollow"><img src="https://camo.githubusercontent.com/97851cd6d6e2680d8da8db28d662851a36db50317ea8909c060aef1d1fcec110/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d73716c6974652d667473342e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-sqlite-fts4.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sqlite-fts4/releases"><img src="https://camo.githubusercontent.com/e86e60059d267b02f60a9af932dbd99e1ec8d011e106ac2e8be952b364fcb7d1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d73716c6974652d667473343f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-sqlite-fts4?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sqlite-fts4/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-sqlite-fts4/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sqli… 1 public 0   0  
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…            
167730071 MDEwOlJlcG9zaXRvcnkxNjc3MzAwNzE= datasette-pretty-json simonw/datasette-pretty-json 0 simonw 9599 https://github.com/simonw/datasette-pretty-json Datasette plugin that pretty-prints any column values that are valid JSON objects or arrays 0 2019-01-26T19:30:43Z 2022-09-24T06:13:11Z 2022-09-28T21:06:31Z   14 8 8 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "json"] 0 1 8 master {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 2 # datasette-pretty-json [![PyPI](https://img.shields.io/pypi/v/datasette-pretty-json.svg)](https://pypi.org/project/datasette-pretty-json/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-pretty-json?include_prereleases&label=changelog)](https://github.com/simonw/datasette-pretty-json/releases) [![Tests](https://github.com/simonw/datasette-pretty-json/workflows/Test/badge.svg)](https://github.com/simonw/datasette-pretty-json/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-pretty-json/blob/main/LICENSE) [Datasette](https://github.com/simonw/datasette) plugin that pretty-prints any column values that are valid JSON objects or arrays. You may also be interested in [datasette-json-html](https://github.com/simonw/datasette-json-html). <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-pretty-json" class="anchor" aria-hidden="true" href="#user-content-datasette-pretty-json"><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-pretty-json</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-pretty-json/" rel="nofollow"><img src="https://camo.githubusercontent.com/3f7d7f3de1cb9fbdf6ac58e04cea35cc1daee4d53bcbcdf5060a0d311db996dc/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7072657474792d6a736f6e2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-pretty-json.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-pretty-json/releases"><img src="https://camo.githubusercontent.com/4fbe6b0ade0a8b75e9200545ca5459c3ba7d546a32ac2f1519417e8c2314d20b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7072657474792d6a736f6e3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-pretty-json?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-pretty-json/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-pretty-json/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-pret… 1 public 0   0  
167759846 MDEwOlJlcG9zaXRvcnkxNjc3NTk4NDY= markdown-to-sqlite simonw/markdown-to-sqlite 0 simonw 9599 https://github.com/simonw/markdown-to-sqlite CLI tool for loading markdown files into a SQLite database 0 2019-01-27T02:04:54Z 2022-05-13T18:09:26Z 2022-05-13T18:09:22Z   13 49 49 Python 1 1 1 1 0 2 0 0 2 Apache License 2.0 apache-2.0 ["datasette-io", "datasette-tool", "markdown", "sqlite", "yaml"] 2 2 49 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     2 3 # markdown-to-sqlite [![PyPI](https://img.shields.io/pypi/v/markdown-to-sqlite.svg)](https://pypi.python.org/pypi/markdown-to-sqlite) [![Changelog](https://img.shields.io/github/v/release/simonw/markdown-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/markdown-to-sqlite/releases) [![Tests](https://github.com/simonw/markdown-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/markdown-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/markdown-to-sqlite/blob/main/LICENSE) CLI tool for loading markdown files into a SQLite database. YAML embedded in the markdown files will be used to populate additional columns. Usage: markdown-to-sqlite [OPTIONS] DBNAME TABLE PATHS... For example: $ markdown-to-sqlite docs.db documents file1.md file2.md ## Breaking change Prior to version 1.0 this argument order was different - markdown files were listed before the database and table. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-markdown-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-markdown-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>markdown-to-sqlite</h1> <p dir="auto"><a href="https://pypi.python.org/pypi/markdown-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/e5aa6980c413976937ea698f111c31b580e6186e9f018673df37b3e9fe1047fb/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6d61726b646f776e2d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/markdown-to-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/markdown-to-sqlite/releases"><img src="https://camo.githubusercontent.com/29f48f8deb508081ca40341be55a1cdbe25dcd7a637e5277a24b82f167643ab6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6d61726b646f776e2d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/markdown-to-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/markdown-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/markdown-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/markdown-to-sqlite/blob/main/LICENSE"><img src="ht… 1 public 0      
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…            
175321497 MDEwOlJlcG9zaXRvcnkxNzUzMjE0OTc= csv-diff simonw/csv-diff 0 simonw 9599 https://github.com/simonw/csv-diff Python CLI tool and library for diffing CSV and JSON files 0 2019-03-13T01:11:26Z 2022-07-29T20:01:02Z 2022-07-29T20:00:59Z   34 198 198 Python 1 1 1 1 0 29 0 0 18 Apache License 2.0 apache-2.0 ["click", "csv", "datasette-io", "datasette-tool", "diff", "git-scraping"] 29 18 198 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     29 7 # csv-diff [![PyPI](https://img.shields.io/pypi/v/csv-diff.svg)](https://pypi.org/project/csv-diff/) [![Changelog](https://img.shields.io/github/v/release/simonw/csv-diff?include_prereleases&label=changelog)](https://github.com/simonw/csv-diff/releases) [![Tests](https://github.com/simonw/csv-diff/workflows/Test/badge.svg)](https://github.com/simonw/csv-diff/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/csv-diff/blob/main/LICENSE) Tool for viewing the difference between two CSV, TSV or JSON files. See [Generating a commit log for San Francisco’s official list of trees](https://simonwillison.net/2019/Mar/13/tree-history/) (and the [sf-tree-history repo commit log](https://github.com/simonw/sf-tree-history/commits)) for background information on this project. ## Installation pip install csv-diff ## Usage Consider two CSV files: `one.csv` id,name,age 1,Cleo,4 2,Pancakes,2 `two.csv` id,name,age 1,Cleo,5 3,Bailey,1 `csv-diff` can show a human-readable summary of differences between the files: $ csv-diff one.csv two.csv --key=id 1 row changed, 1 row added, 1 row removed 1 row changed Row 1 age: "4" => "5" 1 row added id: 3 name: Bailey age: 1 1 row removed id: 2 name: Pancakes age: 2 The `--key=id` option means that the `id` column should be treated as the unique key, to identify which records have changed. The tool will automatically detect if your files are comma- or tab-separated. You can over-ride this automatic detection and force the tool to use a specific format using `--format=tsv` or `--format=csv`. You can also feed it JSON files, provided they are a JSON array of objects where each object has the same keys. Use `--format=json` if your input files are JSON. Use `--show-unchanged` to include full details of the unchanged values for rows with at least one change in the diff output: % csv-diff one.csv two.c… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-csv-diff" class="anchor" aria-hidden="true" href="#user-content-csv-diff"><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>csv-diff</h1> <p dir="auto"><a href="https://pypi.org/project/csv-diff/" rel="nofollow"><img src="https://camo.githubusercontent.com/75784b8c5ee65df6e894c25c0efe54d360e3b6a33714da9aa0c6bb86ede1f153/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6373762d646966662e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/csv-diff.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/csv-diff/releases"><img src="https://camo.githubusercontent.com/a8ece0f4436cb61b1524e3722c02363faf7aa45fe7e62f6634604f2c30421517/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6373762d646966663f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/csv-diff?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/csv-diff/actions?query=workflow%3ATest"><img src="https://github.com/simonw/csv-diff/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/csv-diff/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2… 1 public 0   0  
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…            
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…            
195145678 MDEwOlJlcG9zaXRvcnkxOTUxNDU2Nzg= sqlite-diffable simonw/sqlite-diffable 0 simonw 9599 https://github.com/simonw/sqlite-diffable Tools for dumping/loading a SQLite database to diffable directory structure 0 2019-07-04T00:58:46Z 2022-07-12T17:00:19Z 2022-08-18T22:49:29Z   30 42 42 Python 1 1 1 1 0 3 0 0 3 Apache License 2.0 apache-2.0 ["datasette-io", "datasette-tool", "sqlite"] 3 3 42 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     3 1 # sqlite-diffable [![PyPI](https://img.shields.io/pypi/v/sqlite-diffable.svg)](https://pypi.org/project/sqlite-diffable/) [![Changelog](https://img.shields.io/github/v/release/simonw/sqlite-diffable?include_prereleases&label=changelog)](https://github.com/simonw/sqlite-diffable/releases) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/sqlite-diffable/blob/main/LICENSE) Tools for dumping/loading a SQLite database to diffable directory structure ## Installation pip install sqlite-diffable ## Demo The repository at [simonw/simonwillisonblog-backup](https://github.com/simonw/simonwillisonblog-backup) contains a backup of the database on my blog, https://simonwillison.net/ - created using this tool. ## Dumping a database Given a SQLite database called `fixtures.db` containing a table `facetable`, the following will dump out that table to the `dump/` directory: sqlite-diffable dump fixtures.db dump/ facetable To dump out every table in that database, use `--all`: sqlite-diffable dump fixtures.db dump/ --all ## Loading a database To load a previously dumped database, run the following: sqlite-diffable load restored.db dump/ This will show an error if any of the tables that are being restored already exist in the database file. You can replace those tables (dropping them before restoring them) using the `--replace` option: sqlite-diffable load restored.db dump/ --replace ## Converting to JSON objects Table rows are stored in the `.ndjson` files as newline-delimited JSON arrays, like this: ``` ["a", "a", "a-a", 63, null, 0.7364712141640124, "$null"] ["a", "b", "a-b", 51, null, 0.6020187290499803, "$null"] ``` Sometimes it can be more convenient to work with a list of JSON objects. The `sqlite-diffable objects` command can read a `.ndjson` file and its accompanying `.metadata.json` file and output JSON objects to standard output: sqlite-diffable objects fixtures.db dump/sortable.ndjson The output of that command looks somethi… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-sqlite-diffable" class="anchor" aria-hidden="true" href="#user-content-sqlite-diffable"><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-diffable</h1> <p dir="auto"><a href="https://pypi.org/project/sqlite-diffable/" rel="nofollow"><img src="https://camo.githubusercontent.com/f397aed437dd402178061cc28cd230ddaa228d7a19d4e6e33dd7d9d6b9aa7016/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73716c6974652d6469666661626c652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/sqlite-diffable.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/sqlite-diffable/releases"><img src="https://camo.githubusercontent.com/ad89df075a7b5a43a53000aaf22188af53405e2b5177102cb1b550954996dac4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f73716c6974652d6469666661626c653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/sqlite-diffable?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/sqlite-diffable/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-sr… 1 public 0   0  
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…            
197882382 MDEwOlJlcG9zaXRvcnkxOTc4ODIzODI= healthkit-to-sqlite dogsheep/healthkit-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/healthkit-to-sqlite Convert an Apple Healthkit export zip to a SQLite database 0 2019-07-20T05:03:12Z 2021-08-20T00:55:34Z 2021-08-20T00:56:17Z https://datasette.io/tools/healthkit-to-sqlite 29 91 91 Python 1 1 1 1 0 4 0 0 8 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-tool", "dogsheep", "healthkit", "sqlite"] 4 8 91 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}   dogsheep 53015001 4 3 # healthkit-to-sqlite [![PyPI](https://img.shields.io/pypi/v/healthkit-to-sqlite.svg)](https://pypi.org/project/healthkit-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/dogsheep/healthkit-to-sqlite?include_prereleases&label=changelog)](https://github.com/dogsheep/healthkit-to-sqlite/releases) [![Tests](https://github.com/dogsheep/healthkit-to-sqlite/workflows/Test/badge.svg)](https://github.com/dogsheep/healthkit-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/healthkit-to-sqlite/blob/main/LICENSE) Convert an Apple Healthkit export zip to a SQLite database ## How to install $ pip install healthkit-to-sqlite ## How to use First you need to export your Apple HealthKit data. 1. On your iPhone, open the "Health" app 2. Click the profile icon in the top right 3. Click "Export Health Data" at the bottom of that page 4. Save the resulting file somewhere you can access it, or AirDrop it directly to your laptop. Now you can convert the resulting `export.zip` file to SQLite like so: $ healthkit-to-sqlite export.zip healthkit.db A progress bar will be displayed. You can disable this using `--silent`. ``` Importing from HealthKit [#-------------] 5% 00:01:33 ``` You can explore the resulting data using [Datasette](https://datasette.readthedocs.io/) like this: $ datasette healthkit.db <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-healthkit-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-healthkit-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>healthkit-to-sqlite</h1> <p><a href="https://pypi.org/project/healthkit-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/d8fd72edb8183afd279306fabff220e4c1670906c58c256e9e3bd7fbdea8c76f/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6865616c74686b69742d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/healthkit-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/healthkit-to-sqlite/releases"><img src="https://camo.githubusercontent.com/9092a0b3a68a53e13d8470fdf4909dda3cabe09e9e74b53960ad2063c79ae8e4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f6773686565702f6865616c74686b69742d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/dogsheep/healthkit-to-sqlite?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/healthkit-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/dogsheep/healthkit-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/healthkit-to-sqlite/blob/main/LICENSE"><img src="ht…            
205429375 MDEwOlJlcG9zaXRvcnkyMDU0MjkzNzU= swarm-to-sqlite dogsheep/swarm-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/swarm-to-sqlite Create a SQLite database containing your checkin history from Foursquare Swarm 0 2019-08-30T17:37:29Z 2021-02-22T07:58:39Z 2021-01-18T04:36:03Z   49 37 37 Python 1 1 1 1 0 1 0 0 1 Apache License 2.0 apache-2.0 ["sqlite", "foursquare", "swarm", "foursquare-api", "datasette", "dogsheep", "datasette-io", "datasette-tool"] 1 1 37 main {"admin": false, "push": false, "pull": false}   dogsheep 53015001 1 3 # swarm-to-sqlite [![PyPI](https://img.shields.io/pypi/v/swarm-to-sqlite.svg)](https://pypi.org/project/swarm-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/dogsheep/swarm-to-sqlite?include_prereleases&label=changelog)](https://github.com/dogsheep/swarm-to-sqlite/releases) [![Tests](https://github.com/dogsheep/swarm-to-sqlite/workflows/Test/badge.svg)](https://github.com/dogsheep/swarm-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/swarm-to-sqlite/blob/main/LICENSE) Create a SQLite database containing your checkin history from Foursquare Swarm. ## How to install $ pip install swarm-to-sqlite ## Usage You will need to first obtain a valid OAuth token for your Foursquare account. You can do so using this tool: https://your-foursquare-oauth-token.glitch.me/ Simplest usage is to simply provide the name of the database file you wish to write to. The tool will prompt you to paste in your token, and will then download your checkins and store them in the specified database file. $ swarm-to-sqlite checkins.db Please provide your Foursquare OAuth token: Importing 3699 checkins [#########-----------------------] 27% 00:02:31 You can also pass the token as a command-line option: $ swarm-to-sqlite checkins.db --token=XXX Or as an environment variable: $ export FOURSQUARE_TOKEN=XXX $ swarm-to-sqlite checkins.db To retrieve just checkins within the past X hours, days or weeks, use the `--since=` option. For example, to pull only checkins that happened within the last 10 days use: $ swarm-to-sqlite checkins.db --token=XXX --since=10d Use `2w` for two weeks, `10h` for ten hours, `3d` for three days. In addition to saving the checkins to a database, you can also write them to a JSON file using the `--save` option: $ swarm-to-sqlite checkins.db --save=checkins.json Having done this, you can re-import checkins directly from that file (rather than making API calls to … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-swarm-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-swarm-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>swarm-to-sqlite</h1> <p><a href="https://pypi.org/project/swarm-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/336537cfcc544f29699c00a2aa4b5a199c9a21f53e43aff833e268e664735ed9/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f737761726d2d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/swarm-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/swarm-to-sqlite/releases"><img src="https://camo.githubusercontent.com/3a244282c89501bdea48af0387ebed5c0a03d41ef8f87331ed3fe63421f42c4f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f6773686565702f737761726d2d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/dogsheep/swarm-to-sqlite?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/swarm-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/dogsheep/swarm-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/swarm-to-sqlite/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb084…            
206156866 MDEwOlJlcG9zaXRvcnkyMDYxNTY4NjY= twitter-to-sqlite dogsheep/twitter-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/twitter-to-sqlite Save data from Twitter to a SQLite database 0 2019-09-03T19:30:08Z 2021-12-26T18:08:43Z 2021-12-26T18:08:40Z   298 269 269 Python 1 1 1 1 0 13 0 0 10 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-tool", "dogsheep", "sqlite", "twitter", "twitter-api"] 13 10 269 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}   dogsheep 53015001 13 5 # twitter-to-sqlite [![PyPI](https://img.shields.io/pypi/v/twitter-to-sqlite.svg)](https://pypi.org/project/twitter-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/dogsheep/twitter-to-sqlite?include_prereleases&label=changelog)](https://github.com/dogsheep/twitter-to-sqlite/releases) [![Tests](https://github.com/dogsheep/twitter-to-sqlite/workflows/Test/badge.svg)](https://github.com/dogsheep/twitter-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/twitter-to-sqlite/blob/main/LICENSE) Save data from Twitter to a SQLite database. **This tool currently uses Twitter API v1**. You may be unable to use it if you do not have an API key for that version of the API. <!-- toc --> - [How to install](#how-to-install) - [Authentication](#authentication) - [Retrieving tweets by specific accounts](#retrieving-tweets-by-specific-accounts) - [Retrieve user profiles in bulk](#retrieve-user-profiles-in-bulk) - [Retrieve tweets in bulk](#retrieve-tweets-in-bulk) - [Retrieving Twitter followers](#retrieving-twitter-followers) - [Retrieving friends](#retrieving-friends) - [Retrieving favorited tweets](#retrieving-favorited-tweets) - [Retrieving Twitter lists](#retrieving-twitter-lists) - [Retrieving Twitter list memberships](#retrieving-twitter-list-memberships) - [Retrieving just follower and friend IDs](#retrieving-just-follower-and-friend-ids) - [Retrieving tweets from your home timeline](#retrieving-tweets-from-your-home-timeline) - [Retrieving your mentions](#retrieving-your-mentions) - [Providing input from a SQL query with --sql and --attach](#providing-input-from-a-sql-query-with---sql-and---attach) - [Running searches](#running-searches) - [Capturing tweets in real-time with track and follow](#capturing-tweets-in-real-time-with-track-and-follow) * [track](#track) * [follow](#follow) - [Importing data from your Twitter archive](#importing-data-from-your-twitter-archive) - [Design notes](#design-notes) <!-- … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-twitter-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-twitter-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>twitter-to-sqlite</h1> <p dir="auto"><a href="https://pypi.org/project/twitter-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/fce3d286daf4a0ac037476f32a7f1885dd7f90329ec1df80f7fe6b9322c72f5c/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f747769747465722d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/twitter-to-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/twitter-to-sqlite/releases"><img src="https://camo.githubusercontent.com/e1228185d86e3eb446efcb27ff81748cdad3b90ac14ae58c61dab61a90bb992d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f6773686565702f747769747465722d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/dogsheep/twitter-to-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/twitter-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/dogsheep/twitter-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/twitter-to-sqlite/blob/main/LICENSE"><img src="https… 1 public 0      
206202864 MDEwOlJlcG9zaXRvcnkyMDYyMDI4NjQ= inaturalist-to-sqlite dogsheep/inaturalist-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/inaturalist-to-sqlite Create a SQLite database containing your observation history from iNaturalist 0 2019-09-04T01:21:21Z 2020-12-19T05:18:38Z 2020-10-22T00:08:58Z   17 2 2 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["sqlite", "inaturalist", "datasette", "dogsheep", "datasette-io", "datasette-tool"] 0 0 2 master {"admin": false, "push": false, "pull": false}   dogsheep 53015001 0 1 # inaturalist-to-sqlite [![PyPI](https://img.shields.io/pypi/v/inaturalist-to-sqlite.svg)](https://pypi.org/project/inaturalist-to-sqlite/) [![CircleCI](https://circleci.com/gh/dogsheep/inaturalist-to-sqlite.svg?style=svg)](https://circleci.com/gh/dogsheep/inaturalist-to-sqlite) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/inaturalist-to-sqlite/blob/master/LICENSE) Create a SQLite database containing your observation history from [iNaturalist](https://www.inaturalist.org/). ## How to install $ pip install inaturalist-to-sqlite ## Usage $ inaturalist-to-sqlite inaturalist.db yourusername (Or try `simonw` if you don't yet have an iNaturalist account) This will import all of your iNaturalist observations into a SQLite database called `inaturalist.db`. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-inaturalist-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-inaturalist-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>inaturalist-to-sqlite</h1> <p><a href="https://pypi.org/project/inaturalist-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/0b4aee6bb6f3aeb706c5195fce3537b66445f052f38021aefeb48672cf06cf74/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f696e61747572616c6973742d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/inaturalist-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/dogsheep/inaturalist-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/96dcb5c0cfa03bf010686f57c71dfef278ab6aaa53eb39cb48d28bde427c55b7/68747470733a2f2f636972636c6563692e636f6d2f67682f646f6773686565702f696e61747572616c6973742d746f2d73716c6974652e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/dogsheep/inaturalist-to-sqlite.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/inaturalist-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%2…            
206649770 MDEwOlJlcG9zaXRvcnkyMDY2NDk3NzA= google-takeout-to-sqlite dogsheep/google-takeout-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/google-takeout-to-sqlite Save data from Google Takeout to a SQLite database 0 2019-09-05T20:15:15Z 2021-06-08T15:31:47Z 2021-02-24T00:34:55Z   14 51 51 Python 1 1 1 1 0 4 0 0 6 Apache License 2.0 apache-2.0 ["google", "sqlite", "datasette", "dogsheep", "datasette-io", "datasette-tool"] 4 6 51 master {"admin": false, "push": false, "pull": false}   dogsheep 53015001 4 3 # google-takeout-to-sqlite [![PyPI](https://img.shields.io/pypi/v/google-takeout-to-sqlite.svg)](https://pypi.org/project/google-takeout-to-sqlite/) [![CircleCI](https://circleci.com/gh/dogsheep/google-takeout-to-sqlite.svg?style=svg)](https://circleci.com/gh/dogsheep/google-takeout-to-sqlite) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/google-takeout-to-sqlite/blob/master/LICENSE) Save data from google-takeout to a SQLite database. ## How to install $ pip install google-takeout-to-sqlite Request your Google data from https://takeout.google.com/ - wait for the email and download the zip file. This tool only supports a subset of the available options. More will be added over time. ## My Activity You can request the "My Activity" export and then import it with the following command: $ google-takeout-to-sqlite my-activity takeout.db ~/Downloads/takeout-20190530.zip This will create a database file called `takeout.db` if one does not already exist. ## Location History Your location history records latitude, longitude and timestame for where Google has tracked your location. You can import it using this command: $ google-takeout-to-sqlite location-history takeout.db ~/Downloads/takeout-20190530.zip ## Browsing your data with Datasette Once you have imported Google data into a SQLite database file you can browse your data using [Datasette](https://github.com/simonw/datasette). Install Datasette like so: $ pip install datasette Now browse your data by running this and then visiting `http://localhost:8001/` $ datasette takeout.db Install the [datasette-cluster-map](https://github.com/simonw/datasette-cluster-map) plugin to see your location history on a map: $ pip install datasette-cluster-map <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-google-takeout-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-google-takeout-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>google-takeout-to-sqlite</h1> <p><a href="https://pypi.org/project/google-takeout-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/fb9e0c4c7734b2904f2b1aaaa4ce05fa195167989240be80a7c8e56e2b2a000e/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f676f6f676c652d74616b656f75742d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/google-takeout-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/dogsheep/google-takeout-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/41bc34953e618d9a884ec9a8bad7d759bf580fc6b7c27982d3c4af4531121246/68747470733a2f2f636972636c6563692e636f6d2f67682f646f6773686565702f676f6f676c652d74616b656f75742d746f2d73716c6974652e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/dogsheep/google-takeout-to-sqlite.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/google-takeout-to-sqlite/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https://i…            
207052882 MDEwOlJlcG9zaXRvcnkyMDcwNTI4ODI= github-to-sqlite dogsheep/github-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/github-to-sqlite Save data from GitHub to a SQLite database 0 2019-09-08T02:50:28Z 2022-09-20T04:36:37Z 2022-09-28T21:07:54Z https://github-to-sqlite.dogsheep.net/ 143 235 235 Python 1 1 1 1 0 32 0 0 20 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-tool", "dogsheep", "github-api", "sqlite"] 32 20 235 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}   dogsheep 53015001 32 6 # github-to-sqlite [![PyPI](https://img.shields.io/pypi/v/github-to-sqlite.svg)](https://pypi.org/project/github-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/dogsheep/github-to-sqlite?include_prereleases&label=changelog)](https://github.com/dogsheep/github-to-sqlite/releases) [![Tests](https://github.com/dogsheep/github-to-sqlite/workflows/Test/badge.svg)](https://github.com/dogsheep/github-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/github-to-sqlite/blob/main/LICENSE) Save data from GitHub to a SQLite database. <!-- toc --> - [Demo](#demo) - [How to install](#how-to-install) - [Authentication](#authentication) - [Fetching issues for a repository](#fetching-issues-for-a-repository) - [Fetching pull requests for a repository](#fetching-pull-requests-for-a-repository) - [Fetching issue comments for a repository](#fetching-issue-comments-for-a-repository) - [Fetching commits for a repository](#fetching-commits-for-a-repository) - [Fetching releases for a repository](#fetching-releases-for-a-repository) - [Fetching tags for a repository](#fetching-tags-for-a-repository) - [Fetching contributors to a repository](#fetching-contributors-to-a-repository) - [Fetching repos belonging to a user or organization](#fetching-repos-belonging-to-a-user-or-organization) - [Fetching specific repositories](#fetching-specific-repositories) - [Fetching repos that have been starred by a user](#fetching-repos-that-have-been-starred-by-a-user) - [Fetching users that have starred specific repos](#fetching-users-that-have-starred-specific-repos) - [Fetching GitHub Actions workflows](#fetching-github-actions-workflows) - [Scraping dependents for a repository](#scraping-dependents-for-a-repository) - [Fetching emojis](#fetching-emojis) - [Making authenticated API calls](#making-authenticated-api-calls) <!-- tocstop --> ## Demo https://github-to-sqlite.dogsheep.net/ hosts a [Datasette](https://datasette.io/) demo of a … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-github-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-github-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>github-to-sqlite</h1> <p dir="auto"><a href="https://pypi.org/project/github-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/515e6efa4aef15e83b08072e5490c9040420223b2355d1d715cb628f66d60dff/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6769746875622d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/github-to-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/github-to-sqlite/releases"><img src="https://camo.githubusercontent.com/ae3fbf680cae0fca1e9126549e1fd0e14e756f6f77046e878db7b1c9cbd78911/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f6773686565702f6769746875622d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/dogsheep/github-to-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/github-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/dogsheep/github-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/github-to-sqlite/blob/main/LICENSE"><img src="https://camo.github… 1 public 0   0  
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…            
209590345 MDEwOlJlcG9zaXRvcnkyMDk1OTAzNDU= genome-to-sqlite dogsheep/genome-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/genome-to-sqlite Import your genome into a SQLite database 0 2019-09-19T15:38:39Z 2021-01-18T19:39:48Z 2019-09-19T15:41:17Z   9 13 13 Python 1 1 1 1 0 0 0 0 2 Apache License 2.0 apache-2.0 ["genetics", "sqlite", "23andme", "personal-analytics", "datasette", "dogsheep", "datasette-io", "datasette-tool"] 0 2 13 master {"admin": false, "push": false, "pull": false}   dogsheep 53015001 0 2 # genome-to-sqlite [![PyPI](https://img.shields.io/pypi/v/genome-to-sqlite.svg)](https://pypi.org/project/genome-to-sqlite/) [![CircleCI](https://circleci.com/gh/dogsheep/genome-to-sqlite.svg?style=svg)](https://circleci.com/gh/dogsheep/genome-to-sqlite) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/genome-to-sqlite/blob/master/LICENSE) Import your genome into a SQLite database. ## How to install $ pip install genome-to-sqlite ## How to use First, export your genome. This tool has only been tested against 23andMe so far. You can request an export of your genome from https://you.23andme.com/tools/data/download/ Now you can convert the resulting `export.zip` file to SQLite like so: $ genome-to-sqlite export.zip genome.db A progress bar will be displayed. You can disable this using `--silent`. ``` Importing genome [#----------------] 5% 00:01:33 ``` You can explore the resulting data using [Datasette](https://datasette.readthedocs.io/) like this: $ datasette genome.db --config facet_time_limit_ms:1000 Bumping up the facet time limit is useful in order to enable faceting by chromosome: http://127.0.0.1:8001/genome/genome?_facet=chromosome&_sort=position <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-genome-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-genome-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>genome-to-sqlite</h1> <p><a href="https://pypi.org/project/genome-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/a91d14ecfe9aa2d73da4818a7a898033e301380d4c8477d06a17dc20bd871c84/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f67656e6f6d652d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/genome-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://circleci.com/gh/dogsheep/genome-to-sqlite" rel="nofollow"><img src="https://camo.githubusercontent.com/5f7f5be2791ff007c49d3d153ef38baa81770a11c0326e5f6b8ffd7ee939d00f/68747470733a2f2f636972636c6563692e636f6d2f67682f646f6773686565702f67656e6f6d652d746f2d73716c6974652e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src="https://circleci.com/gh/dogsheep/genome-to-sqlite.svg?style=svg" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/genome-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>Import yo…            
213286752 MDEwOlJlcG9zaXRvcnkyMTMyODY3NTI= pocket-to-sqlite dogsheep/pocket-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/pocket-to-sqlite Create a SQLite database containing data from your Pocket account 0 2019-10-07T03:24:14Z 2022-08-21T21:11:59Z 2022-08-22T16:21:34Z   20 63 63 Python 1 1 1 1 0 3 0 0 5 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-tool", "dogsheep", "pocket", "pocket-api", "sqlite"] 3 5 63 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}   dogsheep 53015001 3 4 # pocket-to-sqlite [![PyPI](https://img.shields.io/pypi/v/pocket-to-sqlite.svg)](https://pypi.org/project/pocket-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/dogsheep/pocket-to-sqlite?include_prereleases&label=changelog)](https://github.com/dogsheep/pocket-to-sqlite/releases) [![Tests](https://github.com/dogsheep/pocket-to-sqlite/workflows/Test/badge.svg)](https://github.com/dogsheep/pocket-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/pocket-to-sqlite/blob/main/LICENSE) Create a SQLite database containing data from your [Pocket](https://getpocket.com/) account. ## How to install $ pip install pocket-to-sqlite ## Usage You will need to first obtain a valid OAuth token for your Pocket account. You can do this by running the `auth` command and following the prompts: $ pocket-to-sqlite auth Visit this page and sign in with your Pocket account: https://getpocket.com/auth/author... Once you have signed in there, hit <enter> to continue Authentication tokens written to auth.json Now you can fetch all of your items from Pocket like this: $ pocket-to-sqlite fetch pocket.db The first time you run this command it will fetch all of your items, and display a progress bar while it does it. On subsequent runs it will only fetch new items. You can force it to fetch everything from the beginning again using `--all`. Use `--silent` to disable the progress bar. ## Using with Datasette The SQLite database produced by this tool is designed to be browsed using [Datasette](https://datasette.readthedocs.io/). Use the [datasette-render-timestamps](https://github.com/simonw/datasette-render-timestamps) plugin to improve the display of the timestamp values. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-pocket-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-pocket-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>pocket-to-sqlite</h1> <p dir="auto"><a href="https://pypi.org/project/pocket-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/98050bc158f5e93f2c3576b03fa6a25b4a8091bb6d44774e07d95ae2842e4a3e/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f706f636b65742d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/pocket-to-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/pocket-to-sqlite/releases"><img src="https://camo.githubusercontent.com/b37c773b526e69ffcc72b9c02cbcd977d1b6e6a9bcf317c3accfc04b975e960c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f6773686565702f706f636b65742d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/dogsheep/pocket-to-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/pocket-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/dogsheep/pocket-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/pocket-to-sqlite/blob/main/LICENSE"><img src="https://camo.github… 1 public 0   0  
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…            
220716822 MDEwOlJlcG9zaXRvcnkyMjA3MTY4MjI= datasette-render-markdown simonw/datasette-render-markdown 0 simonw 9599 https://github.com/simonw/datasette-render-markdown Datasette plugin for rendering Markdown 0 2019-11-09T23:28:31Z 2022-05-26T04:58:56Z 2022-07-18T19:35:10Z   57 11 11 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "markdown"] 0 1 11 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 2 # datasette-render-markdown [![PyPI](https://img.shields.io/pypi/v/datasette-render-markdown.svg)](https://pypi.org/project/datasette-render-markdown/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-render-markdown?include_prereleases&label=changelog)](https://github.com/simonw/datasette-render-markdown/releases) [![Tests](https://github.com/simonw/datasette-render-markdown/workflows/Test/badge.svg)](https://github.com/simonw/datasette-render-markdown/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-render-markdown/blob/main/LICENSE) Datasette plugin for rendering Markdown. ## Installation Install this plugin in the same environment as Datasette to enable this new functionality: $ pip install datasette-render-markdown ## Usage You can explicitly list the columns you would like to treat as Markdown using [plugin configuration](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-configuration) in a `metadata.json` file. Add a `"datasette-render-markdown"` configuration block and use a `"columns"` key to list the columns you would like to treat as Markdown values: ```json { "plugins": { "datasette-render-markdown": { "columns": ["body"] } } } ``` This will cause any `body` column in any table to be treated as markdown and safely rendered using [Python-Markdown](https://python-markdown.github.io/). The resulting HTML is then run through [Bleach](https://bleach.readthedocs.io/) to avoid the risk of XSS security problems. Save this to `metadata.json` and run Datasette with the `--metadata` flag to load this configuration: $ datasette serve mydata.db --metadata metadata.json The 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 dir="auto"><a id="user-content-datasette-render-markdown" class="anchor" aria-hidden="true" href="#user-content-datasette-render-markdown"><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-markdown</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-render-markdown/" rel="nofollow"><img src="https://camo.githubusercontent.com/624f87a070fbf68882456039073cd2f330c4b412199efd1bd7308c97c3b30c40/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d72656e6465722d6d61726b646f776e2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-render-markdown.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-render-markdown/releases"><img src="https://camo.githubusercontent.com/5b3b13cdd601c70ee249e42c3fb43fce5b707eff875d49f19b1460a319cc42d6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d72656e6465722d6d61726b646f776e3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-render-markdown?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-render-markdown/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-render-markdown/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></… 1 public 0   0  
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…            
234825790 MDEwOlJlcG9zaXRvcnkyMzQ4MjU3OTA= datasette-upload-csvs simonw/datasette-upload-csvs 0 simonw 9599 https://github.com/simonw/datasette-upload-csvs Datasette plugin for uploading CSV files and converting them to database tables 0 2020-01-19T02:07:05Z 2022-07-03T20:58:20Z 2022-09-09T16:23:59Z https://datasette.io/plugins/datasette-upload-csvs 58 9 9 Python 1 1 1 1 0 1 0 0 4 Apache License 2.0 apache-2.0 ["csvs", "datasette", "datasette-io", "datasette-plugin"] 1 4 9 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 2 # datasette-upload-csvs [![PyPI](https://img.shields.io/pypi/v/datasette-upload-csvs.svg)](https://pypi.org/project/datasette-upload-csvs/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-upload-csvs?include_prereleases&label=changelog)](https://github.com/simonw/datasette-upload-csvs/releases) [![Tests](https://github.com/simonw/datasette-upload-csvs/workflows/Test/badge.svg)](https://github.com/simonw/datasette-upload-csvs/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-upload-csvs/blob/main/LICENSE) Datasette plugin for uploading CSV files and converting them to database tables ## Installation datasette install datasette-upload-csvs ## Usage The plugin adds an interface at `/-/upload-csvs` for uploading a CSV file and using it to create a new database table. 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 `upload-csvs` 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 dir="auto"><a id="user-content-datasette-upload-csvs" class="anchor" aria-hidden="true" href="#user-content-datasette-upload-csvs"><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-upload-csvs</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-upload-csvs/" rel="nofollow"><img src="https://camo.githubusercontent.com/0579577329c092ea76dd2672cfa6077ecd82c918c9d3caa9c8ff26be02104f78/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d75706c6f61642d637376732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-upload-csvs.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-upload-csvs/releases"><img src="https://camo.githubusercontent.com/34f7f9b455f75c80e8b706ff050dc59f70a926b93af51457f14f0a1d290f47bc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d75706c6f61642d637376733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-upload-csvs?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-upload-csvs/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-upload-csvs/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-uplo… 1 public 0   0  
236110759 MDEwOlJlcG9zaXRvcnkyMzYxMTA3NTk= datasette-auth-existing-cookies simonw/datasette-auth-existing-cookies 0 simonw 9599 https://github.com/simonw/datasette-auth-existing-cookies Datasette plugin that authenticates users based on existing domain cookies 0 2020-01-25T01:20:31Z 2022-05-28T01:50:15Z 2022-05-30T17:10:11Z   54 3 3 Python 1 1 1 1 0 1 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin"] 1 0 3 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 3 # datasette-auth-existing-cookies [![PyPI](https://img.shields.io/pypi/v/datasette-auth-existing-cookies.svg)](https://pypi.org/project/datasette-auth-existing-cookies/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-auth-existing-cookies?include_prereleases&label=changelog)](https://github.com/simonw/datasette-auth-existing-cookies/releases) [![Tests](https://github.com/simonw/datasette-auth-existing-cookies/workflows/Test/badge.svg)](https://github.com/simonw/datasette-auth-existing-cookies/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-auth-existing-cookies/blob/master/LICENSE) Datasette plugin that authenticates users based on existing domain cookies. ## When to use this This plugin allows you to build custom authentication for Datasette when you are hosting a Datasette instance on the same domain as another, authenticated website. Consider a website on `www.example.com` which supports user authentication. You could run Datasette on `data.example.com` in a way that lets it see cookies that were set for the `.example.com` domain. Using this plugin, you could build an API endpoint at `www.example.com/user-for-cookies` which returns a JSON object representing the currently signed-in user, based on their cookies. The plugin running on `data.example.com` will then make the `actor` available to the rest of Datasette based on the response from that API. Read about [Datasette's authentication and permissions system](https://docs.datasette.io/en/stable/authentication.html) for more on how actors and permissions work. ## Configuration This plugin requires some configuration in the Datasette [metadata.json file](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-configuration). The following configuration options are supported: - `api_url`: this is the API endpoint that Datasette should call with the user's cookies in order to identify the logged in user. - `cookies`: optional. A … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-auth-existing-cookies" class="anchor" aria-hidden="true" href="#user-content-datasette-auth-existing-cookies"><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-existing-cookies</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-auth-existing-cookies/" rel="nofollow"><img src="https://camo.githubusercontent.com/590f1fc881f5547ddc2df20c3e78f26fde45e0e616863c3c2111d37bf22f6a61/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d617574682d6578697374696e672d636f6f6b6965732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-auth-existing-cookies.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth-existing-cookies/releases"><img src="https://camo.githubusercontent.com/ca9233dbd3b295b882d4e93a38bf3d9d64a6904111ad04a787a4d7201b3cd58f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d617574682d6578697374696e672d636f6f6b6965733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-auth-existing-cookies?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth-existing-cookies/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-auth-exis… 1 public 0      
236867027 MDEwOlJlcG9zaXRvcnkyMzY4NjcwMjc= datasette-sentry simonw/datasette-sentry 0 simonw 9599 https://github.com/simonw/datasette-sentry Datasette plugin for configuring Sentry 0 2020-01-28T23:41:27Z 2022-07-18T20:28:25Z 2022-10-06T22:31:29Z   26 6 6 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "sentry"] 0 0 6 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 2 # datasette-sentry [![PyPI](https://img.shields.io/pypi/v/datasette-sentry.svg)](https://pypi.org/project/datasette-sentry/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-sentry?include_prereleases&label=changelog)](https://github.com/simonw/datasette-sentry/releases) [![Tests](https://github.com/simonw/datasette-sentry/workflows/Test/badge.svg)](https://github.com/simonw/datasette-sentry/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-sentry/blob/main/LICENSE) Datasette plugin for configuring Sentry for error reporting ## Installation pip install datasette-sentry ## Usage This plugin only takes effect if your `metadata.json` file contains relevant top-level plugin configuration in a `"datasette-sentry"` configuration key. You will need a Sentry DSN - see their [Getting Started instructions](https://docs.sentry.io/error-reporting/quickstart/?platform=python). Add it to `metadata.json` like this: ```json { "plugins": { "datasette-sentry": { "dsn": "https://KEY@sentry.io/PROJECTID" } } } ``` Settings in `metadata.json` are visible to anyone who visits the `/-/metadata` URL so this is a good place to take advantage of Datasette's [secret configuration values](https://datasette.readthedocs.io/en/stable/plugins.html#secret-configuration-values), in which case your configuration will look more like this: ```json { "plugins": { "datasette-sentry": { "dsn": { "$env": "SENTRY_DSN" } } } } ``` Then make a `SENTRY_DSN` environment variable available to Datasette. ## Configuration In addition to the `dsn` setting, you can also configure the Sentry [sample rate](https://docs.sentry.io/platforms/python/configuration/sampling/) by setting `sample_rate` to a floating point number between 0 and 1. For example, to capture 25% of errors you would do this: ```json { "plugins": { "datasette… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-sentry" class="anchor" aria-hidden="true" href="#user-content-datasette-sentry"><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-sentry</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-sentry/" rel="nofollow"><img src="https://camo.githubusercontent.com/235a5563b51d4001ae7207d970a8ea72137fd5cdb3443c66b5eb42ef35703683/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d73656e7472792e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-sentry.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sentry/releases"><img src="https://camo.githubusercontent.com/0a9f8c726d4c19b1bde12b99d824cf9269559d1290186a88815f72ee50a2a618/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d73656e7472793f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-sentry?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sentry/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-sentry/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sentry/blob/main/LICENSE"><img src="https://camo.githubusercontent.co… 1 public 0   0  
237321267 MDEwOlJlcG9zaXRvcnkyMzczMjEyNjc= geojson-to-sqlite simonw/geojson-to-sqlite 0 simonw 9599 https://github.com/simonw/geojson-to-sqlite CLI tool for converting GeoJSON files to SQLite (with SpatiaLite) 0 2020-01-30T22:51:05Z 2022-03-05T00:40:56Z 2022-04-13T23:39:25Z   117 34 34 Python 1 1 1 1 0 3 0 0 4 Apache License 2.0 apache-2.0 ["datasette-io", "datasette-tool", "geojson", "gis", "sqlite"] 3 4 34 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     3 3 # geojson-to-sqlite [![PyPI](https://img.shields.io/pypi/v/geojson-to-sqlite.svg)](https://pypi.org/project/geojson-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/simonw/geojson-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/geojson-to-sqlite/releases) [![Tests](https://github.com/simonw/geojson-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/geojson-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/geojson-to-sqlite/blob/main/LICENSE) CLI tool for converting GeoJSON to SQLite (optionally with SpatiaLite) [RFC 7946: The GeoJSON Format](https://tools.ietf.org/html/rfc7946) ## How to install $ pip install geojson-to-sqlite ## How to use You can run this tool against a GeoJSON file like so: $ geojson-to-sqlite my.db features features.geojson This will load all of the features from the `features.geojson` file into a table called `features`. Each row will have a `geometry` column containing the feature geometry, and columns for each of the keys found in any `properties` attached to those features. (To bundle all properties into a single JSON object, use the `--properties` flag.) The table will be created the first time you run the command. On subsequent runs you can use the `--alter` option to add any new columns that are missing from the table. You can pass more than one GeoJSON file, in which case the contents of all of the files will be inserted into the same table. If your features have an `"id"` property it will be used as the primary key for the table. You can also use `--pk=PROPERTY` with the name of a different property to use that as the primary key instead. If you don't want to use the `"id"` as the primary key (maybe it contains duplicate values) you can use `--pk ''` to specify no primary key. Specifying a primary key also will allow you to upsert data into the rows instead of insert data into new rows. If no primary key is specified,… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-geojson-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-geojson-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>geojson-to-sqlite</h1> <p dir="auto"><a href="https://pypi.org/project/geojson-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/b0c77834f0d6adf37e62573e121ccadd92711433ad2c5b4dd506610919762dab/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f67656f6a736f6e2d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/geojson-to-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/geojson-to-sqlite/releases"><img src="https://camo.githubusercontent.com/e88a12c13acc77ac4d0338f065dfeb664076b3414a7ee2560e8d465e828c1320/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f67656f6a736f6e2d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/geojson-to-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/geojson-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/geojson-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/geojson-to-sqlite/blob/main/LICENSE"><img src="https://camo.github… 1 public 0      
238339412 MDEwOlJlcG9zaXRvcnkyMzgzMzk0MTI= datasette-debug-asgi simonw/datasette-debug-asgi 0 simonw 9599 https://github.com/simonw/datasette-debug-asgi Datasette plugin for dumping out the ASGI scope 0 2020-02-05T00:57:09Z 2021-08-17T23:40:02Z 2021-08-17T23:41:03Z https://datasette.io/plugins/datasette-debug-asgi 16 1 1 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["asgi", "datasette-io", "datasette-plugin"] 0 0 1 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-debug-asgi [![PyPI](https://img.shields.io/pypi/v/datasette-debug-asgi.svg)](https://pypi.org/project/datasette-debug-asgi/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-debug-asgi?include_prereleases&label=changelog)](https://github.com/simonw/datasette-debug-asgi/releases) [![Tests](https://github.com/simonw/datasette-debug-asgi/workflows/Test/badge.svg)](https://github.com/simonw/datasette-debug-asgi/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-debug-asgi/blob/main/LICENSE) Datasette plugin for dumping out the ASGI scope. Adds a new URL at `/-/asgi-scope` which shows the current ASGI scope. Demo here: https://datasette.io/-/asgi-scope ## Installation pip install datasette-debug-asgi ## Usage Visit `/-/asgi-scope` to see debug output showing the ASGI scope. You can add query string parameters such as `/-/asgi-scope?q=hello`. You can also add extra path components such as `/-/asgi-scope/more/path/here`. <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-debug-asgi" class="anchor" aria-hidden="true" href="#user-content-datasette-debug-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-debug-asgi</h1> <p><a href="https://pypi.org/project/datasette-debug-asgi/" rel="nofollow"><img src="https://camo.githubusercontent.com/59ce0e036bd317f141a4ce0589ec0969f8fd2cfdef49c6b3c7c4dafc4bd9e332/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d64656275672d617367692e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-debug-asgi.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-debug-asgi/releases"><img src="https://camo.githubusercontent.com/d3b776c6e5f4674675855b8268bbc26631391e18e23a50a4cc92204b89a1b701/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d64656275672d617367693f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-debug-asgi?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-debug-asgi/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-debug-asgi/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-debug-asgi/blob/main/LICENSE"><img src="ht…            
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…            
243710733 MDEwOlJlcG9zaXRvcnkyNDM3MTA3MzM= datasette-ics simonw/datasette-ics 0 simonw 9599 https://github.com/simonw/datasette-ics Datasette plugin for outputting iCalendar files 0 2020-02-28T08:11:01Z 2022-07-07T14:11:49Z 2022-07-12T02:08:10Z https://datasette.io/plugins/datasette-ics 34 13 13 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "icalendar", "ics"] 0 0 13 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 2 # datasette-ics [![PyPI](https://img.shields.io/pypi/v/datasette-ics.svg)](https://pypi.org/project/datasette-ics/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-ics?include_prereleases&label=changelog)](https://github.com/simonw/datasette-ics/releases) [![Tests](https://github.com/simonw/datasette-ics/workflows/Test/badge.svg)](https://github.com/simonw/datasette-ics/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-ics/blob/main/LICENSE) Datasette plugin that adds support for generating [iCalendar .ics files](https://tools.ietf.org/html/rfc5545) with the results of a SQL query. ## Installation Install this plugin in the same environment as Datasette to enable the `.ics` output extension. $ pip install datasette-ics ## Usage To create an iCalendar file you need to define a custom SQL query that returns a required set of columns: * `event_name` - the short name for the event * `event_dtstart` - when the event starts The following columns are optional: * `event_dtend` - when the event ends * `event_duration` - the duration of the event (use instead of `dtend`) * `event_description` - a longer description of the event * `event_uid` - a globally unique identifier for this event * `event_tzid` - the timezone for the event, e.g. `America/Chicago` A query that returns these columns can then be returned as an ics feed by adding the `.ics` extension. ## Demo [This SQL query]([https://www.rockybeaches.com/data?sql=with+inner+as+(%0D%0A++select%0D%0A++++datetime%2C%0D%0A++++substr(datetime%2C+0%2C+11)+as+date%2C%0D%0A++++mllw_feet%2C%0D%0A++++lag(mllw_feet)+over+win+as+previous_mllw_feet%2C%0D%0A++++lead(mllw_feet)+over+win+as+next_mllw_feet%0D%0A++from%0D%0A++++tide_predictions%0D%0A++where%0D%0A++++station_id+%3D+%3Astation_id%0D%0A++++and+datetime+%3E%3D+date()%0D%0A++++window+win+as+(%0D%0A++++++order+by%0D%0A++++++++datetime%0D%0A++++)%0D%0A++order+by%0D%0A++++datetime%0D%0A)%2C%0D%0Alowe… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-ics" class="anchor" aria-hidden="true" href="#user-content-datasette-ics"><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-ics</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-ics/" rel="nofollow"><img src="https://camo.githubusercontent.com/ded2e32b426b79e4545931cf7a056c8c1db91042979ee4e1fa286bd89222af70/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6963732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-ics.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-ics/releases"><img src="https://camo.githubusercontent.com/ac8ba594bbdf3837c5b4a7c54786be6517128f0b6fe17fb569b189024fd0fcfb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6963733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-ics?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-ics/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-ics/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-ics/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa… 1 public 0   0  
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…            
245856731 MDEwOlJlcG9zaXRvcnkyNDU4NTY3MzE= datasette-search-all simonw/datasette-search-all 0 simonw 9599 https://github.com/simonw/datasette-search-all Datasette plugin for searching all searchable tables at once 0 2020-03-08T17:21:54Z 2021-12-19T04:06:49Z 2022-10-05T01:53:33Z   186 6 6 Python 1 1 1 1 0 2 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "search"] 2 0 6 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     2 2 # datasette-search-all [![PyPI](https://img.shields.io/pypi/v/datasette-search-all.svg)](https://pypi.org/project/datasette-search-all/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-search-all?include_prereleases&label=changelog)](https://github.com/simonw/datasette-search-all/releases) [![Tests](https://github.com/simonw/datasette-search-all/workflows/Test/badge.svg)](https://github.com/simonw/datasette-search-all/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-search-all/blob/main/LICENSE) Datasette plugin for searching all searchable tables at once. ## Installation Install the plugin in the same Python environment as Datasette: pip install datasette-search-all ## Background See [datasette-search-all: a new plugin for searching multiple Datasette tables at once](https://simonwillison.net/2020/Mar/9/datasette-search-all/) for background on this project. You can try the plugin out at https://fara.datasettes.com/ ## Usage This plugin only works if at least one of the tables connected to your Datasette instance has been configured for SQLite's full-text search. The [Datasette search documentation](https://docs.datasette.io/en/stable/full_text_search.html) includes details on how to enable full-text search for a table. You can also use the following tools: * [sqlite-utils](https://sqlite-utils.datasette.io/en/stable/cli.html#configuring-full-text-search) includes a command-line tool for enabling full-text search. * [datasette-enable-fts](https://github.com/simonw/datasette-enable-fts) is a Datasette plugin that adds a web interface for enabling search for specific columns. If the plugin detects at least one searchable table it will add a search form to the homepage. You can also navigate to `/-/search` on your Datasette instance to use the search interface directly. ## Screenshot ![Animated screenshot showing the plugin in action](https://raw.githubusercontent.com/simonw/datasette… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-search-all" class="anchor" aria-hidden="true" href="#user-content-datasette-search-all"><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-search-all</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-search-all/" rel="nofollow"><img src="https://camo.githubusercontent.com/2fe2b05de97f33998d29929414fb3878c21e05f5d6820e69a8c1b9aa1a6d7593/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7365617263682d616c6c2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-search-all.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-search-all/releases"><img src="https://camo.githubusercontent.com/e686df469f1732c1e8112cf75ac7f2388e793d4eaf381b965cf54876e5a6a75e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7365617263682d616c6c3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-search-all?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-search-all/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-search-all/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-search-all/blob/m… 1 public 0   0  
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/…            
247527438 MDEwOlJlcG9zaXRvcnkyNDc1Mjc0Mzg= datasette-edit-schema simonw/datasette-edit-schema 0 simonw 9599 https://github.com/simonw/datasette-edit-schema Datasette plugin for modifying table schemas 0 2020-03-15T18:34:06Z 2022-07-01T22:20:25Z 2022-08-22T22:45:58Z   133 6 6 JavaScript 1 1 1 1 0 0 0 0 10 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin"] 0 10 6 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-edit-schema [![PyPI](https://img.shields.io/pypi/v/datasette-edit-schema.svg)](https://pypi.org/project/datasette-edit-schema/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-edit-schema?include_prereleases&label=changelog)](https://github.com/simonw/datasette-edit-schema/releases) [![Tests](https://github.com/simonw/datasette-edit-schema/workflows/Test/badge.svg)](https://github.com/simonw/datasette-edit-schema/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-edit-schema/blob/master/LICENSE) Datasette plugin for modifying table schemas ## Features * Add new columns to a table * Rename columns in a table * Modify the type of columns in a table * Re-order the columns in a table * Rename a table * Delete a table ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-edit-schema ## Usage Navigate to `/-/edit-schema/dbname/tablename` on your Datasette instance to edit a specific table. Use `/-/edit-schema/dbname` to create a new table in a specific database. 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. ## Permissions The `edit-schema` 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. These permission checks will call the `permission_allowed()` plugin hook with three arguments: - `action` will be the string `"edit-schema"` - `actor` will be the currently authenticated actor - usually a dictionary - `resource` will be the string name of the database ## Screenshot ![datasette-edit-schema interface](https://raw.githubusercontent.com/simonw/datasette-edit-schema/mai… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-edit-schema" class="anchor" aria-hidden="true" href="#user-content-datasette-edit-schema"><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-edit-schema</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-edit-schema/" rel="nofollow"><img src="https://camo.githubusercontent.com/c7772b0d1f8c2377409f509e097f39ac2540e5215589dc08e73e1d497cb7e41d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d656469742d736368656d612e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-edit-schema.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-edit-schema/releases"><img src="https://camo.githubusercontent.com/e6d232795a6c369f9bf6a52f5656bbbc227f6a5d0e6ed99d8a02d703e74b07dc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d656469742d736368656d613f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-edit-schema?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-edit-schema/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-edit-schema/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-edit… 1 public 0   0  
248385299 MDEwOlJlcG9zaXRvcnkyNDgzODUyOTk= datasette-publish-fly simonw/datasette-publish-fly 0 simonw 9599 https://github.com/simonw/datasette-publish-fly Datasette plugin for publishing data using Fly 0 2020-03-19T01:47:01Z 2022-09-29T22:28:45Z 2022-09-29T17:25:15Z   50 10 10 Python 1 1 1 1 0 3 0 0 4 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "fly"] 3 4 10 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     3 3 # datasette-publish-fly [![PyPI](https://img.shields.io/pypi/v/datasette-publish-fly.svg)](https://pypi.org/project/datasette-publish-fly/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-publish-fly?include_prereleases&label=changelog)](https://github.com/simonw/datasette-publish-fly/releases) [![Tests](https://github.com/simonw/datasette-publish-fly/workflows/Test/badge.svg)](https://github.com/simonw/datasette-publish-fly/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-publish-fly/blob/main/LICENSE) [Datasette](https://datasette.io/) plugin for deploying Datasette instances to [Fly.io](https://fly.io/). Project background: [Using SQLite and Datasette with Fly Volumes](https://simonwillison.net/2022/Feb/15/fly-volumes/) ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-publish-fly ## Deploying read-only data First, install the `flyctl` command-line tool by [following their instructions](https://fly.io/docs/getting-started/installing-flyctl/). Run `flyctl auth signup` to create an account there, or `flyctl auth login` if you already have one. You can now use `datasette publish fly` to publish one or more SQLite database files: datasette publish fly my-database.db --app="my-data-app" The argument you pass to `--app` will be used for the URL of your application: `my-data-app.fly.dev`. To update an application, run the publish command passing the same application name to the `--app` option. Fly have [a free tier](https://fly.io/docs/about/pricing/#free-allowances), beyond which they will charge you monthly for each application you have live. Details of their pricing can be [found on their site](https://fly.io/docs/pricing/). Your application will be deployed at `https://your-app-name.fly.io/` - be aware that it may take several minutes to start working the first time you deploy it. ## Using Fly volumes for writable databases… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-publish-fly" class="anchor" aria-hidden="true" href="#user-content-datasette-publish-fly"><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-publish-fly</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-publish-fly/" rel="nofollow"><img src="https://camo.githubusercontent.com/e734388aed6f472c37bdfa14e6ddace47ad6e959c87da3b6399a5313f3558110/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7075626c6973682d666c792e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-publish-fly.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-publish-fly/releases"><img src="https://camo.githubusercontent.com/35efe08178a809f72d27ab8954426873c2c94d698c5ebd81d7eb284b421aa967/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7075626c6973682d666c793f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-publish-fly?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-publish-fly/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-publish-fly/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-publ… 1 public 0   0  
248903544 MDEwOlJlcG9zaXRvcnkyNDg5MDM1NDQ= hacker-news-to-sqlite dogsheep/hacker-news-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/hacker-news-to-sqlite Create a SQLite database containing data pulled from Hacker News 0 2020-03-21T04:02:05Z 2021-06-06T22:42:00Z 2021-03-13T19:15:06Z   19 25 25 Python 1 1 1 1 0 2 0 0 0 Apache License 2.0 apache-2.0 ["hacker-news", "datasette", "dogsheep", "datasette-io", "datasette-tool"] 2 0 25 main {"admin": false, "push": false, "pull": false}   dogsheep 53015001 2 1 # hacker-news-to-sqlite [![PyPI](https://img.shields.io/pypi/v/hacker-news-to-sqlite.svg)](https://pypi.org/project/hacker-news-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/dogsheep/hacker-news-to-sqlite?include_prereleases&label=changelog)](https://github.com/dogsheep/hacker-news-to-sqlite/releases) [![Tests](https://github.com/dogsheep/hacker-news-to-sqlite/workflows/Test/badge.svg)](https://github.com/dogsheep/hacker-news-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/hacker-news-to-sqlite/blob/main/LICENSE) Create a SQLite database containing data fetched from [Hacker News](https://news.ycombinator.com/). ## How to install $ pip install hacker-news-to-sqlite ## Usage $ hacker-news-to-sqlite user hacker-news.db your-username Importing items: 37%|███████████ | 845/2297 [05:09<11:02, 2.19it/s] Imports all of your Hacker News submissions and comments into a SQLite database called `hacker-news.db`. $ hacker-news-to-sqlite trees hacker-news.db 22640038 22643218 Fetches the entire comments tree in which any of those content IDs appears. ## Browsing your data with Datasette You can use [Datasette](https://datasette.readthedocs.org/) to browse your data. Install Datasette like this: $ pip install datasette Now run it against your `hacker-news.db` file like so: $ datasette hacker-news.db Visit `https://localhost:8001/` to search and explore your data. You can improve the display of your data usinng the [datasette-render-timestamps](https://github.com/simonw/datasette-render-timestamps) and [datasette-render-html](https://github.com/simonw/datasette-render-html) plugins. Install them like this: $ pip install datasette-render-timestamps datasette-render-html Now save the following configuration in a file called `metadata.json`: ```json { "databases": { "hacker-news": { "tables": { "items": { … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-hacker-news-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-hacker-news-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>hacker-news-to-sqlite</h1> <p><a href="https://pypi.org/project/hacker-news-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/bf6d88d26ea4d8f1f396c1b1fc88ae74380de6a30f5a792c9f29664f21a219dd/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6861636b65722d6e6577732d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/hacker-news-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/hacker-news-to-sqlite/releases"><img src="https://camo.githubusercontent.com/090ef507ee9402a786e40313d173f516f1dbdedf3df703402296594a4ebcad73/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f6773686565702f6861636b65722d6e6577732d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/dogsheep/hacker-news-to-sqlite?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/hacker-news-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/dogsheep/hacker-news-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/hacker-news-to-sqlite/blob/…            
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.…            
253632948 MDEwOlJlcG9zaXRvcnkyNTM2MzI5NDg= datasette-publish-vercel simonw/datasette-publish-vercel 0 simonw 9599 https://github.com/simonw/datasette-publish-vercel Datasette plugin for publishing data using Vercel 0 2020-04-06T22:47:13Z 2022-07-29T17:09:47Z 2022-08-24T17:43:41Z   55 27 27 Python 1 1 1 1 0 5 0 0 17 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "vercel", "zeit-now"] 5 17 27 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     5 4 # datasette-publish-vercel [![PyPI](https://img.shields.io/pypi/v/datasette-publish-vercel.svg)](https://pypi.org/project/datasette-publish-vercel/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-publish-vercel?include_prereleases&label=changelog)](https://github.com/simonw/datasette-publish-vercel/releases) [![Tests](https://github.com/simonw/datasette-publish-vercel/workflows/Test/badge.svg)](https://github.com/simonw/datasette-publish-vercel/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-publish-vercel/blob/main/LICENSE) Datasette plugin for publishing data using [Vercel](https://vercel.com/). ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-publish-vercel ## Usage First, install the Vercel CLI tool by [following their instructions](https://vercel.com/download). Run `vercel login` to login to (or create) an account. Now you can use `datasette publish vercel` to publish your data: datasette publish vercel my-database.db --project=my-database The `--project` argument is required - it specifies the project name that should be used for your deployment. This will be used as part of the deployment's URL. ### Other options * `--no-prod` deploys to the project without updating the "production" URL alias to point to that new deployment. Without that option all deploys go directly to production. * `--debug` enables the Vercel CLI debug output. * `--token` allows you to pass a Now authentication token, rather than needing to first run `now login` to configure the tool. Tokens can be created in the Vercel web dashboard under Account Settings -> Tokens. * `--public` runs `vercel --public` to publish the application source code at `/_src` e.g. https://datasette-public.now.sh/_src and make recent logs visible at `/_logs` e.g. https://datasette-public.now.sh/_logs * `--generate-dir` - by default this tool generates a new Vercel app in a… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-publish-vercel" class="anchor" aria-hidden="true" href="#user-content-datasette-publish-vercel"><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-publish-vercel</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-publish-vercel/" rel="nofollow"><img src="https://camo.githubusercontent.com/54812f865fef02d66cf1d1155ea07750ad19a0a88dad2d4f1a86f4fbd3fba8a0/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7075626c6973682d76657263656c2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-publish-vercel.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-publish-vercel/releases"><img src="https://camo.githubusercontent.com/5ba538bc3912064a11f09b105ecd92083d1223f2f8a38034d17734d09a26f321/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7075626c6973682d76657263656c3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-publish-vercel?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-publish-vercel/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-publish-vercel/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="h… 1 public 0   0  
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…            
256834907 MDEwOlJlcG9zaXRvcnkyNTY4MzQ5MDc= dogsheep-photos dogsheep/dogsheep-photos 0 dogsheep 53015001 https://github.com/dogsheep/dogsheep-photos Upload your photos to S3 and import metadata about them into a SQLite database 0 2020-04-18T19:22:13Z 2021-11-04T20:45:03Z 2021-11-04T20:45:00Z   68 124 124 Python 1 1 1 1 0 7 0 0 19 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-tool", "dogsheep", "sqlite"] 7 19 124 master {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}   dogsheep 53015001 7 10 # dogsheep-photos [![PyPI](https://img.shields.io/pypi/v/dogsheep-photos.svg)](https://pypi.org/project/dogsheep-photos/) [![Changelog](https://img.shields.io/github/v/release/dogsheep/dogsheep-photos?include_prereleases&label=changelog)](https://github.com/dogsheep/dogsheep-photos/releases) [![CircleCI](https://circleci.com/gh/dogsheep/dogsheep-photos.svg?style=svg)](https://circleci.com/gh/dogsheep/dogsheep-photos) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/dogsheep-photos/blob/master/LICENSE) Save details of your photos to a SQLite database and upload them to S3. See [Using SQL to find my best photo of a pelican according to Apple Photos](https://simonwillison.net/2020/May/21/apple-photos-sqlite/) for background information on this project. ## What these tools do These tools are a work-in-progress mechanism for taking full ownership of your photos. The core idea is to help implement the following: * Every photo you have taken lives in a single, private Amazon S3 bucket * You have a single SQLite database file which stores metadata about those photos - potentially pulled from multiple different places. This may include EXIF data, Apple Photos, the results of running machine learning APIs against photos and much more besides. * You can then use [Datasette](https://github.com/simonw/datasette) to explore your own photos. I'm a heavy user of Apple Photos so the initial releases of this tool will have a bias towards that, but ideally I would like a subset of these tools to be useful to people no matter which core photo solution they are using. ## Installation $ pip install dogsheep-photos ## Authentication (if using S3) If you want to use S3 to store your photos, you will need to first create S3 credentials for a new, dedicated bucket. You may find the [s3-credentials tool](https://github.com/simonw/s3-credentials) useful for this. Run this command and paste in your credentials. You will need three values: the name of your S3 bucket, your Ac… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-dogsheep-photos" class="anchor" aria-hidden="true" href="#user-content-dogsheep-photos"><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>dogsheep-photos</h1> <p><a href="https://pypi.org/project/dogsheep-photos/" rel="nofollow"><img src="https://camo.githubusercontent.com/c21d10e4250454707420755a0d4b90c97709771d795ffa55b495c98956a3938d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f646f6773686565702d70686f746f732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/dogsheep-photos.svg" style="max-width: 100%;"></a> <a href="https://github.com/dogsheep/dogsheep-photos/releases"><img src="https://camo.githubusercontent.com/c7bead2f1c989034f62914278a736eecdfbab79ce4d9b3ab804d1692e230d79d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f6773686565702f646f6773686565702d70686f746f733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/dogsheep/dogsheep-photos?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://circleci.com/gh/dogsheep/dogsheep-photos" rel="nofollow"><img src="https://camo.githubusercontent.com/3aefe86d4a3560c1ca080cf5b7e4dcc5788b239df8b7a3fed40e622b834c22e8/68747470733a2f2f636972636c6563692e636f6d2f67682f646f6773686565702f646f6773686565702d70686f746f732e7376673f7374796c653d737667" alt="CircleCI" data-canonical-src… 1 public 0      
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:/…            
271665336 MDEwOlJlcG9zaXRvcnkyNzE2NjUzMzY= datasette-auth-tokens simonw/datasette-auth-tokens 0 simonw 9599 https://github.com/simonw/datasette-auth-tokens Datasette plugin for authenticating access using API tokens 0 2020-06-11T23:23:30Z 2021-10-15T00:52:53Z 2021-10-15T00:54:20Z   34 4 4 Python 1 1 1 1 0 1 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin"] 1 0 4 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 3 # datasette-auth-tokens [![PyPI](https://img.shields.io/pypi/v/datasette-auth-tokens.svg)](https://pypi.org/project/datasette-auth-tokens/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-auth-tokens?include_prereleases&label=changelog)](https://github.com/simonw/datasette-auth-tokens/releases) [![Tests](https://github.com/simonw/datasette-auth-tokens/workflows/Test/badge.svg)](https://github.com/simonw/datasette-auth-tokens/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-auth-tokens/blob/main/LICENSE) Datasette plugin for authenticating access using API tokens ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-auth-tokens ## Hard-coded tokens Read about Datasette's [authentication and permissions system](https://datasette.readthedocs.io/en/latest/authentication.html). This plugin lets you configure secret API tokens which can be used to make authenticated requests to Datasette. First, create a random API token. A useful recipe for doing that is the following: $ python -c 'import secrets; print(secrets.token_hex(32))' 5f9a486dd807de632200b17508c75002bb66ca6fde1993db1de6cbd446362589 Decide on the actor that this token should represent, for example: ```json { "bot_id": "my-bot" } ``` You can then use `"allow"` blocks to provide that token with permission to access specific actions. To enable access to a configured writable SQL query you could use this in your `metadata.json`: ```json { "plugins": { "datasette-auth-tokens": { "tokens": [ { "token": { "$env": "BOT_TOKEN" }, "actor": { "bot_id": "my-bot" } } ] } }, "databases": { ":memory:": { "queries": { "show_version": { … <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-tokens" class="anchor" aria-hidden="true" href="#user-content-datasette-auth-tokens"><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-tokens</h1> <p><a href="https://pypi.org/project/datasette-auth-tokens/" rel="nofollow"><img src="https://camo.githubusercontent.com/8372a0259329c822611c82d155c9e1e29a243723aa17d0061b64bc06216c8e50/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d617574682d746f6b656e732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-auth-tokens.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth-tokens/releases"><img src="https://camo.githubusercontent.com/5c2dba28aad8f4910893ff5a064ae0c826b40c16aae67c5573c17f60c3b5ff97/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d617574682d746f6b656e733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-auth-tokens?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth-tokens/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-auth-tokens/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth-tokens/blob/main/LICE… 1 public 0      
272098486 MDEwOlJlcG9zaXRvcnkyNzIwOTg0ODY= datasette-psutil simonw/datasette-psutil 0 simonw 9599 https://github.com/simonw/datasette-psutil Datasette plugin adding a /-/psutil debugging endpoint 0 2020-06-13T22:57:07Z 2022-03-07T15:36:30Z 2022-03-07T15:35:57Z https://datasette.io/plugins/datasette-psutil 12 2 2 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin", "psutil"] 0 1 2 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 2 # datasette-psutil [![PyPI](https://img.shields.io/pypi/v/datasette-psutil.svg)](https://pypi.org/project/datasette-psutil/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-psutil?include_prereleases&label=changelog)](https://github.com/simonw/datasette-psutil/releases) [![Tests](https://github.com/simonw/datasette-psutil/workflows/Test/badge.svg)](https://github.com/simonw/datasette-psutil/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-psutil/blob/main/LICENSE) Datasette plugin adding a `/-/psutil` debugging endpoint ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-psutil ## Usage Visit `/-/psutil` on your Datasette instance to see various information provided by [psutil](https://psutil.readthedocs.io/). ## Demo https://latest-with-plugins.datasette.io/-/psutil is a live demo of this plugin, hosted on Google Cloud Run. <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-psutil" class="anchor" aria-hidden="true" href="#user-content-datasette-psutil"><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-psutil</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-psutil/" rel="nofollow"><img src="https://camo.githubusercontent.com/be1734fd4b22f0108384342af796a3468669cbb4d82f0e79b28aeb60f5634904/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d70737574696c2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-psutil.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-psutil/releases"><img src="https://camo.githubusercontent.com/8c025e6a2847072141ce3a8022ce39878eb8adc71fdeed5dbf93a6fa755f3785/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d70737574696c3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-psutil?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-psutil/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-psutil/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-psutil/blob/main/LICENSE"><img src="https://camo.githubusercontent.co… 1 public 0      
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%;"…            
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…            
293361514 MDEwOlJlcG9zaXRvcnkyOTMzNjE1MTQ= geocode-sqlite eyeseast/geocode-sqlite 0 eyeseast 25778 https://github.com/eyeseast/geocode-sqlite Geocode rows in a SQLite database table 0 2020-09-06T21:05:39Z 2022-11-02T19:19:56Z 2022-11-07T17:31:05Z   125 223 223 Python 1 1 1 1 0 6 0 0 8 Apache License 2.0 apache-2.0 [] 6 8 223 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     6 5 # geocode-sqlite [![PyPI](https://img.shields.io/pypi/v/geocode-sqlite.svg)](https://pypi.org/project/geocode-sqlite/) [![Changelog](https://img.shields.io/github/v/release/eyeseast/geocode-sqlite?include_prereleases&label=changelog)](https://github.com/eyeseast/geocode-sqlite/releases) [![Tests](https://github.com/eyeseast/geocode-sqlite/workflows/Test/badge.svg)](https://github.com/eyeseast/geocode-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/eyeseast/geocode-sqlite/blob/master/LICENSE) Geocode rows from a SQLite table ## Installation Install this tool using `pip` or `pipx`: ```sh # install inside a virtualenv pip install geocode-sqlite # install globally pipx install geocode-sqlite ``` ## Usage Let's say you have a spreadsheet with addresses in it, and you'd like to map those locations. First, create a SQLite database and insert rows from that spreadsheet using `sqlite-utils`. ```sh sqlite-utils insert data.db data data.csv --csv ``` Now, geocode it using OpenStreetMap's Nominatim geocoder. ```sh geocode-sqlite nominatim data.db data \ --location="{address}, {city}, {state} {zip}" \ --delay=1 \ --user-agent="this-is-me" ``` In the command above, you're using Nominatim, which is free and only asks for a unique user agent (`--user-agent`). This will connect to a database (`data.db`) and read all rows from the table `data` (skipping any that already have both a `latitude` and `longitude` column filled). You're also telling the geocoder how to extract a location query (`--location`) from a row of data, using Python's built-in string formatting, and setting a rate limit (`--delay`) of one request per second. For each row where geocoding succeeds, `latitude` and `longitude` will be populated. If you hit an error, or a rate limit, run the same query and pick up where you left off. The resulting table layout can be visualized with [datasette-cluster-map](https://datasette.io/plugins/datasette-cluster-map). Under th… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-geocode-sqlite" class="anchor" aria-hidden="true" href="#user-content-geocode-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>geocode-sqlite</h1> <p dir="auto"><a href="https://pypi.org/project/geocode-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/48afed6b156b122a781142db699a225016ec438b4f64f9534d5f852433332a50/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f67656f636f64652d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/geocode-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/geocode-sqlite/releases"><img src="https://camo.githubusercontent.com/cca0e9a2e0f5dbbfb761aeb9803bac6602b9831541a309b6c5a73ebec690b35e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f65796573656173742f67656f636f64652d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/eyeseast/geocode-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/geocode-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/eyeseast/geocode-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/geocode-sqlite/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e97… 1 public 0   0 0
303218369 MDEwOlJlcG9zaXRvcnkzMDMyMTgzNjk= evernote-to-sqlite dogsheep/evernote-to-sqlite 0 dogsheep 53015001 https://github.com/dogsheep/evernote-to-sqlite Tools for converting Evernote content to SQLite 0 2020-10-11T21:45:49Z 2021-08-26T19:01:54Z 2021-08-26T19:02:47Z   51 24 24 Python 1 1 1 1 0 4 0 0 3 Apache License 2.0 apache-2.0 ["datasette-io", "datasette-tool", "dogsheep", "evernote", "sqlite"] 4 3 24 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}   dogsheep 53015001 4 4 # evernote-to-sqlite [![PyPI](https://img.shields.io/pypi/v/evernote-to-sqlite.svg)](https://pypi.org/project/evernote-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/dogsheep/evernote-to-sqlite?include_prereleases&label=changelog)](https://github.com/dogsheep/evernote-to-sqlite/releases) [![Tests](https://github.com/dogsheep/evernote-to-sqlite/workflows/Test/badge.svg)](https://github.com/dogsheep/evernote-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/dogsheep/evernote-to-sqlite/blob/master/LICENSE) Tools for converting Evernote content to SQLite. See [Building an Evernote to SQLite exporter](https://simonwillison.net/2020/Oct/16/building-evernote-sqlite-exporter/) for background on this project. ## Installation Install this tool using `pip`: $ pip install evernote-to-sqlite ## Usage Currently the only available command is `evernote-to-sqlite enex`, which converts Evernote's ENEX export files into a SQLite database. You can create [an ENEX export](https://help.evernote.com/hc/en-us/articles/209005557-Export-notes-and-notebooks-as-ENEX-or-HTML) in the Evernote desktop application by selecting some notes (or all of your notes) and using the `File -> Export Notes...` menu option. This used to be able to export everything in one go, but it looks like more recent Evernote versions only allow exporting up to fifty notes at a time, or let you export an entire notebook by right-clicking on the notebook and selecting "Export notebook...". You can convert that file to SQLite like so: $ evernote-to-sqlite enex evernote.db MyNotes.enex This will display a progress bar and create a SQLite database file called `evernote.db`. ### Limitations Unfortunately the ENEX export format does not include a unique identifier for each note. This means you cannot use this tool to re-import notes after they have been updated - you should consider this tool to be a one-time transformation of an ENEX file into an equi… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-evernote-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-evernote-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>evernote-to-sqlite</h1> <p><a href="https://pypi.org/project/evernote-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/0035842afd045b61cc5c6ee9c8394c181ac4daf3530bf212349f37a05bebcdbb/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f657665726e6f74652d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/evernote-to-sqlite.svg" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/evernote-to-sqlite/releases"><img src="https://camo.githubusercontent.com/b51eee78bbc51296102af124839ed665bf3f17755f4dbff95c4bc8ed0713d763/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f6773686565702f657665726e6f74652d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/dogsheep/evernote-to-sqlite?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/evernote-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/dogsheep/evernote-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/dogsheep/evernote-to-sqlite/blob/master/LICENSE"><img src="https://camo.g…            
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…            
315796015 MDEwOlJlcG9zaXRvcnkzMTU3OTYwMTU= datasette-ripgrep simonw/datasette-ripgrep 0 simonw 9599 https://github.com/simonw/datasette-ripgrep Web interface for searching your code using ripgrep, built as a Datasette plugin 0 2020-11-25T01:26:36Z 2022-04-24T03:48:42Z 2022-06-30T22:45:03Z https://ripgrep.datasette.io 55 58 58 Python 1 1 1 1 0 1 0 0 6 Apache License 2.0 apache-2.0 ["codesearch", "datasette", "datasette-io", "datasette-plugin", "ripgrep"] 1 6 58 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 3 # datasette-ripgrep [![PyPI](https://img.shields.io/pypi/v/datasette-ripgrep.svg)](https://pypi.org/project/datasette-ripgrep/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-ripgrep?include_prereleases&label=changelog)](https://github.com/simonw/datasette-ripgrep/releases) [![Tests](https://github.com/simonw/datasette-ripgrep/workflows/Test/badge.svg)](https://github.com/simonw/datasette-ripgrep/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-ripgrep/blob/main/LICENSE) Web interface for searching your code using [ripgrep](https://github.com/BurntSushi/ripgrep), built as a [Datasette](https://datasette.io/) plugin For background on this project see [datasette-ripgrep: deploy a regular expression search engine for your source code](https://simonwillison.net/2020/Nov/28/datasette-ripgrep/). ## Demo Try this plugin out at https://ripgrep.datasette.io/-/ripgrep - where you can run regular expression searches across the source code of Datasette and all of the `datasette-*` plugins belonging to the [simonw GitHub user](https://github.com/simonw). Some example searches: - [with.\*AsyncClient](https://ripgrep.datasette.io/-/ripgrep?pattern=with.*AsyncClient) - regular expression search for `with.*AsyncClient` - [.plugin_config, literal=on](https://ripgrep.datasette.io/-/ripgrep?pattern=.plugin_config\(&literal=on) - a non-regular expression search for `.plugin_config(` - [with.\*AsyncClient glob=datasette/\*\*](https://ripgrep.datasette.io/-/ripgrep?pattern=with.*AsyncClient&glob=datasette%2F%2A%2A) - search for that pattern only within the `datasette/` top folder - ["sqlite-utils\[">\] glob=setup.py](https://ripgrep.datasette.io/-/ripgrep?pattern=%22sqlite-utils%5B%22%3E%5D&glob=setup.py) - a regular expression search for packages that depend on either `sqlite-utils` or `sqlite-utils>=some-version` - [test glob=!\*.html](https://ripgrep.datasette.io/-/ripgrep?pattern=test&glob=%21*.html) - search fo… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-ripgrep" class="anchor" aria-hidden="true" href="#user-content-datasette-ripgrep"><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-ripgrep</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-ripgrep/" rel="nofollow"><img src="https://camo.githubusercontent.com/ebcbf381887ee3c4ed1c9da54876d414e77b4a1c7eb1056f8ea8c7b4a24e8156/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d726970677265702e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-ripgrep.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-ripgrep/releases"><img src="https://camo.githubusercontent.com/355fe4e16e5f39a0efea997bbb0d4b0eead22e1975695ca00351fa8f14deb370/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d726970677265703f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-ripgrep?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-ripgrep/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-ripgrep/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-ripgrep/blob/main/LICENSE"><img src="https://camo.github… 1 public 0   0  
330304628 MDEwOlJlcG9zaXRvcnkzMzAzMDQ2Mjg= datasette-query-history bretwalker/datasette-query-history 0 bretwalker 181698 https://github.com/bretwalker/datasette-query-history   0 2021-01-17T03:13:34Z 2021-04-18T03:06:36Z 2021-01-17T23:11:37Z   75 3 3 JavaScript 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 3 main {"admin": false, "push": false, "pull": false}     0 1 # datasette-query-history [![PyPI](https://img.shields.io/pypi/v/datasette-query-history.svg)](https://pypi.org/project/datasette-query-history/) [![Changelog](https://img.shields.io/github/v/release/bretwalker/datasette-query-history?include_prereleases&label=changelog)](https://github.com/bretwalker/datasette-query-history/releases) [![Tests](https://github.com/bretwalker/datasette-query-history/workflows/Test/badge.svg)](https://github.com/bretwalker/datasette-query-history/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/bretwalker/datasette-query-history/blob/main/LICENSE) Datasette plugin that keeps a list of the queries you've run and lets you rerun them. ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-query-history ## Usage Click the `Query History` button on the SQL editor page to see previous queries. Click the ⬆︎ button to replace the current query with a previous query. Click the `Clear Query History` button to clear the list previous queries. <img src="https://raw.githubusercontent.com/bretwalker/datasette-query-history/main/docs/datasette-query-history-example1.png" width="350px" alt="Screenshot of plugin"> ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-query-history 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-query-history" class="anchor" aria-hidden="true" href="#user-content-datasette-query-history"><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-history</h1> <p><a href="https://pypi.org/project/datasette-query-history/" rel="nofollow"><img src="https://camo.githubusercontent.com/d74ad3a4fc71b2fea733dcc8f934843e15f176363d7016e72f0f2e2a159148df/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d71756572792d686973746f72792e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-query-history.svg" style="max-width:100%;"></a> <a href="https://github.com/bretwalker/datasette-query-history/releases"><img src="https://camo.githubusercontent.com/9b546caa8588b66ba6dea138d26a307e46e9e28bc6de43117a4bc7afec6dc7fb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6272657477616c6b65722f6461746173657474652d71756572792d686973746f72793f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/bretwalker/datasette-query-history?include_prereleases&amp;label=changelog" style="max-width:100%;"></a> <a href="https://github.com/bretwalker/datasette-query-history/actions?query=workflow%3ATest"><img src="https://github.com/bretwalker/datasette-query-history/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.…            
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…            
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…            
347263722 MDEwOlJlcG9zaXRvcnkzNDcyNjM3MjI= django-sql-dashboard simonw/django-sql-dashboard 0 simonw 9599 https://github.com/simonw/django-sql-dashboard Django app for building dashboards using raw SQL queries 0 2021-03-13T03:38:23Z 2022-04-19T01:13:12Z 2022-04-20T00:27:39Z https://django-sql-dashboard.datasette.io/ 513 335 335 Python 1 1 1 1 0 28 0 0 25 Apache License 2.0 apache-2.0 ["dashboards", "datasette-io", "datasette-tool", "django", "sql"] 28 25 335 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     28 9 # django-sql-dashboard [![PyPI](https://img.shields.io/pypi/v/django-sql-dashboard.svg)](https://pypi.org/project/django-sql-dashboard/) [![Changelog](https://img.shields.io/github/v/release/simonw/django-sql-dashboard?include_prereleases&label=changelog)](https://github.com/simonw/django-sql-dashboard/releases) [![Tests](https://github.com/simonw/django-sql-dashboard/workflows/Test/badge.svg)](https://github.com/simonw/django-sql-dashboard/actions?query=workflow%3ATest) [![Documentation Status](https://readthedocs.org/projects/django-sql-dashboard/badge/?version=latest)](http://django-sql-dashboard.datasette.io/en/latest/?badge=latest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/django-sql-dashboard/blob/main/LICENSE) Django SQL Dashboard provides an authenticated interface for executing read-only SQL queries directly against your PostgreSQL database, bringing a useful subset of [Datasette](https://datasette.io/) to Django. Applications include ad-hoc analysis and debugging, plus the creation of reporting dashboards that can be shared with team members or published online. See my blog for [more about this project](https://simonwillison.net/2021/May/10/django-sql-dashboard/), including [a video demo](https://www.youtube.com/watch?v=ausrmMZkPEY). Features include: - Safely run read-only one or more SQL queries against your database and view the results in your browser - Bookmark queries and share those links with other members of your team - Create [saved dashboards](https://django-sql-dashboard.datasette.io/en/latest/saved-dashboards.html) from your queries, with full control over who can view and edit them - [Named parameters](https://django-sql-dashboard.datasette.io/en/latest/sql.html#sql-parameters) such as `select * from entries where id = %(id)s` will be turned into form fields, allowing quick creation of interactive dashboards - Produce [bar charts](https://django-sql-dashboard.datasette.io/en/latest/widgets.html#bar-label-bar-quantity), [progres… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-django-sql-dashboard" class="anchor" aria-hidden="true" href="#user-content-django-sql-dashboard"><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>django-sql-dashboard</h1> <p dir="auto"><a href="https://pypi.org/project/django-sql-dashboard/" rel="nofollow"><img src="https://camo.githubusercontent.com/87a7771e261b30e7b0da09a83f2d6120ce484b068a0d844a41d2f945141194d1/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f646a616e676f2d73716c2d64617368626f6172642e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/django-sql-dashboard.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/django-sql-dashboard/releases"><img src="https://camo.githubusercontent.com/f3c931ccf5487f5df160f339f767aba9ac45e15a5f4e8beb37fd6e33cbc239c0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f646a616e676f2d73716c2d64617368626f6172643f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/django-sql-dashboard?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/django-sql-dashboard/actions?query=workflow%3ATest"><img src="https://github.com/simonw/django-sql-dashboard/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="http://django-sql-dashboard.datasette.io/en/latest/?b… 1 public 0      
361014273 MDEwOlJlcG9zaXRvcnkzNjEwMTQyNzM= datasette-dashboards rclement/datasette-dashboards 0 rclement 1238873 https://github.com/rclement/datasette-dashboards Datasette plugin providing data dashboards from metadata 0 2021-04-23T21:56:48Z 2022-09-21T13:03:39Z 2022-10-07T07:18:03Z https://datasette-dashboards-demo.vercel.app 1746 74 74 Python 1 1 1 1 0 3 0 0 3 Apache License 2.0 apache-2.0 ["dashboards", "data-visualization", "datasette", "datasette-io", "datasette-plugin", "sql", "vega-lite"] 3 3 74 master {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     3 1 # datasette-dashboards > Datasette plugin providing data dashboards from metadata [![PyPI](https://img.shields.io/pypi/v/datasette-dashboards.svg)](https://pypi.org/project/datasette-dashboards/) [![CI/CD](https://github.com/rclement/datasette-dashboards/actions/workflows/ci-cd.yml/badge.svg)](https://github.com/rclement/datasette-dashboards/actions/workflows/ci-cd.yml) [![Coverage Status](https://img.shields.io/codecov/c/github/rclement/datasette-dashboards)](https://codecov.io/gh/rclement/datasette-dashboards) [![License](https://img.shields.io/github/license/rclement/datasette-dashboards)](https://github.com/rclement/datasette-dashboards/blob/master/LICENSE) Try out a live demo at [https://datasette-dashboards-demo.vercel.app](https://datasette-dashboards-demo.vercel.app/-/dashboards) **WARNING**: this plugin is still experimental and not ready for production. Some breaking changes might happen between releases before reaching a stable version. Use it at your own risks! ![Datasette Dashboards Demo](https://raw.githubusercontent.com/rclement/datasette-dashboards/master/demo/datasette-dashboards-demo.png) ## Installation Install this plugin in the same environment as Datasette: ```bash $ datasette install datasette-dashboards ``` ## Usage Define dashboards within `metadata.yml` / `metadata.json`: ```yaml plugins: datasette-dashboards: my-dashboard: title: My Dashboard description: Showing some nice metrics layout: - [analysis-note, events-count] - [analysis-note, events-source] filters: date_start: name: Date Start type: date default: "2021-01-01" date_end: name: Date End type: date charts: analysis-note: library: markdown display: |- # Analysis notes > A quick rundown of events statistics and KPIs events-count: title: Total number of events db: jobs query: SELECT count(*) as count FROM events … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-dashboards" class="anchor" aria-hidden="true" href="#user-content-datasette-dashboards"><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-dashboards</h1> <blockquote> <p dir="auto">Datasette plugin providing data dashboards from metadata</p> </blockquote> <p dir="auto"><a href="https://pypi.org/project/datasette-dashboards/" rel="nofollow"><img src="https://camo.githubusercontent.com/f362a9e19c9666117e279326df7065185827fbec6acab7c6ae6c5e7e379191db/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d64617368626f617264732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-dashboards.svg" style="max-width: 100%;"></a> <a href="https://github.com/rclement/datasette-dashboards/actions/workflows/ci-cd.yml"><img src="https://github.com/rclement/datasette-dashboards/actions/workflows/ci-cd.yml/badge.svg" alt="CI/CD" style="max-width: 100%;"></a> <a href="https://codecov.io/gh/rclement/datasette-dashboards" rel="nofollow"><img src="https://camo.githubusercontent.com/12d74ac8b571a59d446ce62428195bfc76d2027e8394fb3cb1e8584bdf025c9f/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f72636c656d656e742f6461746173657474652d64617368626f61726473" alt="Coverage Status" data-canonical-src="https://img.shields.io/codecov/c/github/rclement/datasette-dashboards" style="max-width: 100%;"></a> <a href="https://github.com/rcleme… 1 public 0   0  
390535500 MDEwOlJlcG9zaXRvcnkzOTA1MzU1MDA= datasette-remote-metadata simonw/datasette-remote-metadata 0 simonw 9599 https://github.com/simonw/datasette-remote-metadata Periodically refresh Datasette metadata from a remote URL 0 2021-07-28T23:17:19Z 2021-12-13T19:40:51Z 2021-12-13T19:40:48Z   8 3 3 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 3 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 2 # datasette-remote-metadata [![PyPI](https://img.shields.io/pypi/v/datasette-remote-metadata.svg)](https://pypi.org/project/datasette-remote-metadata/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-remote-metadata?include_prereleases&label=changelog)](https://github.com/simonw/datasette-remote-metadata/releases) [![Tests](https://github.com/simonw/datasette-remote-metadata/workflows/Test/badge.svg)](https://github.com/simonw/datasette-remote-metadata/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-remote-metadata/blob/main/LICENSE) Periodically refresh Datasette metadata from a remote URL ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-remote-metadata ## Usage Add the following to your `metadata.json`: ```json { "plugins": { "datasette-remote-metadata": { "url": "https://example.com/remote-metadata.yml" } } } ``` The plugin will fetch the specified metadata from that URL at startup and combine it with any existing metadata. You can use a URL to either a JSON file or a YAML file. It will periodically refresh that metadata - by default every 30 seconds, unless you specify an alternative `"ttl"` value in the plugin configuration. ## Configuration Available configuration options are as follows: - `"url"` - the URL to retrieve remote metadata from. Can link to a JSON or a YAML file. - `"ttl"` - integer value in secords: how frequently should the script check for fresh metadata. Defaults to 30 seconds. - `"headers"` - a dictionary of additional request headers to send. - `"cachebust"` - if true, a random `?0.29508` value will be added to the query string of the remote metadata to bust any intermediary caches. This example `metadata.json` configuration refreshes every 10 seconds, uses cache busting and sends an `Authorization: Bearer xyz` header with the request: ```json { "plugins": { … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-remote-metadata" class="anchor" aria-hidden="true" href="#user-content-datasette-remote-metadata"><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-remote-metadata</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-remote-metadata/" rel="nofollow"><img src="https://camo.githubusercontent.com/88715eda95713112087b759d9348f413cf7421760dbf9dc75a891f603077bb02/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d72656d6f74652d6d657461646174612e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-remote-metadata.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-remote-metadata/releases"><img src="https://camo.githubusercontent.com/81743aaae3ae2fa6d977f38bae18d79b191a53725378e4a945833f29a7d75bb1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d72656d6f74652d6d657461646174613f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-remote-metadata?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-remote-metadata/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-remote-metadata/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></… 1 public 0      
423984522 R_kgDOGUV9ig s3-credentials simonw/s3-credentials 0 simonw 9599 https://github.com/simonw/s3-credentials A tool for creating credentials for accessing S3 buckets 0 2021-11-02T20:09:50Z 2022-09-05T15:12:46Z 2022-09-15T23:43:10Z https://s3-credentials.readthedocs.io 204 129 129 Python 1 1 1 1 0 10 0 0 18 Apache License 2.0 apache-2.0 ["aws", "boto3", "s3"] 10 18 129 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     10 2 # s3-credentials [![PyPI](https://img.shields.io/pypi/v/s3-credentials.svg)](https://pypi.org/project/s3-credentials/) [![Changelog](https://img.shields.io/github/v/release/simonw/s3-credentials?include_prereleases&label=changelog)](https://github.com/simonw/s3-credentials/releases) [![Tests](https://github.com/simonw/s3-credentials/workflows/Test/badge.svg)](https://github.com/simonw/s3-credentials/actions?query=workflow%3ATest) [![Documentation Status](https://readthedocs.org/projects/s3-credentials/badge/?version=latest)](https://s3-credentials.readthedocs.org/) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/s3-credentials/blob/master/LICENSE) A tool for creating credentials for accessing S3 buckets For project background, see [s3-credentials: a tool for creating credentials for S3 buckets](https://simonwillison.net/2021/Nov/3/s3-credentials/) on my blog. ## Installation pip install s3-credentials ## Basic usage To create a new S3 bucket and output credentials that can be used with only that bucket: ``` % s3-credentials create my-new-s3-bucket --create-bucket Created bucket: my-new-s3-bucket Created user: s3.read-write.my-new-s3-bucket with permissions boundary: arn:aws:iam::aws:policy/AmazonS3FullAccess Attached policy s3.read-write.my-new-s3-bucket to user s3.read-write.my-new-s3-bucket Created access key for user: s3.read-write.my-new-s3-bucket { "UserName": "s3.read-write.my-new-s3-bucket", "AccessKeyId": "AKIAWXFXAIOZOYLZAEW5", "Status": "Active", "SecretAccessKey": "...", "CreateDate": "2021-11-03 01:38:24+00:00" } ``` The tool can do a lot more than this. See the [documentation](https://s3-credentials.readthedocs.io/) for details. ## Documentation - [Full documentation](https://s3-credentials.readthedocs.io/) - [Command help reference](https://s3-credentials.readthedocs.io/en/stable/help.html) - [Release notes](https://github.com/simonw/s3-credentials/releases) <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-s3-credentials" class="anchor" aria-hidden="true" href="#user-content-s3-credentials"><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>s3-credentials</h1> <p dir="auto"><a href="https://pypi.org/project/s3-credentials/" rel="nofollow"><img src="https://camo.githubusercontent.com/843ad3dae900f3f8042c9847a2d4ec012f47c9e7569fb65cdf66d288c152aecf/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73332d63726564656e7469616c732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/s3-credentials.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/s3-credentials/releases"><img src="https://camo.githubusercontent.com/03854eef387e7e67ee77ab44fc4770f3edef39895610bedd2de9aff4ed873dcf/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f73332d63726564656e7469616c733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/s3-credentials?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/s3-credentials/actions?query=workflow%3ATest"><img src="https://github.com/simonw/s3-credentials/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://s3-credentials.readthedocs.org/" rel="nofollow"><img src="https://camo.githubusercontent.com/2d884a293a1442ff42dc0a43da9554… 1 public 0   0  
427128866 R_kgDOGXV4Ig git-history simonw/git-history 0 simonw 9599 https://github.com/simonw/git-history Tools for analyzing Git history using SQLite 0 2021-11-11T20:07:06Z 2022-10-20T20:33:28Z 2022-10-21T23:06:33Z   117 114 114 Python 1 1 1 1 0 11 0 0 20 Apache License 2.0 apache-2.0 ["git", "sqlite"] 11 20 114 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     11 3 # git-history [![PyPI](https://img.shields.io/pypi/v/git-history.svg)](https://pypi.org/project/git-history/) [![Changelog](https://img.shields.io/github/v/release/simonw/git-history?include_prereleases&label=changelog)](https://github.com/simonw/git-history/releases) [![Tests](https://github.com/simonw/git-history/workflows/Test/badge.svg)](https://github.com/simonw/git-history/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/git-history/blob/master/LICENSE) Tools for analyzing Git history using SQLite For background on this project see [git-history: a tool for analyzing scraped data collected using Git and SQLite](https://simonwillison.net/2021/Dec/7/git-history/). [Measuring traffic during the Half Moon Bay Pumpkin Festival](https://simonwillison.net/2022/Oct/19/measuring-traffic/) describes a project using this tool in detail. ## Installation Install this tool using `pip`: $ pip install git-history ## Demos [git-history-demos.datasette.io](http://git-history-demos.datasette.io/) hosts three example databases created using this tool: - [pge-outages](https://git-history-demos.datasette.io/pge-outages) shows a history of PG&E (the electricity supplier) [outages](https://pgealerts.alerts.pge.com/outagecenter/), using data collected in [simonw/pge-outages](https://github.com/simonw/pge-outages) converted using [pge-outages.sh](https://github.com/simonw/git-history/blob/main/demos/pge-outages.sh) - [ca-fires](https://git-history-demos.datasette.io/ca-fires) shows a history of fires in California reported on [fire.ca.gov/incidents](https://www.fire.ca.gov/incidents/), from data in [simonw/ca-fires-history](https://github.com/simonw/ca-fires-history) converted using [ca-fires.sh](https://github.com/simonw/git-history/blob/main/demos/ca-fires.sh) - [sf-bay-511](https://git-history-demos.datasette.io/sf-bay-511) has records of San Francisco Bay Area traffic and transit incident data from [511.org](https://511.org/), collected… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-git-history" class="anchor" aria-hidden="true" href="#user-content-git-history"><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>git-history</h1> <p dir="auto"><a href="https://pypi.org/project/git-history/" rel="nofollow"><img src="https://camo.githubusercontent.com/eb1f825a264577967f0ed804c6ce43e204d4cb64f8a3cea7c45a023a5ae42ff3/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6769742d686973746f72792e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/git-history.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/git-history/releases"><img src="https://camo.githubusercontent.com/19a0b180a4c69384c234f52e0defeb4086138c1edeccbe42e5623e340503c0ec/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6769742d686973746f72793f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/git-history?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/git-history/actions?query=workflow%3ATest"><img src="https://github.com/simonw/git-history/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/git-history/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/6… 1 public 0 {"id": 401177473, "node_id": "MDEwOlJlcG9zaXRvcnk0MDExNzc0NzM=", "name": "click-app-template-repository", "full_name": "simonw/click-app-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/click-app-template-repository", "description": "GitHub template repository for creating new Python Click CLI tools, using the simonw/click-app cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/click-app-template-repository", "forks_url": "https://api.github.com/repos/simonw/click-app-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/click-app-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/click-app-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/click-app-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/click-app-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/click-app-template-repository/issues/events{/number}", "events_url": "https://api.github.com/repos/simonw/click-app-templa… 0  
438003374 R_kgDOGhtmrg datasette-pretty-traces simonw/datasette-pretty-traces 0 simonw 9599 https://github.com/simonw/datasette-pretty-traces Prettier formatting for ?_trace=1 traces 0 2021-12-13T19:43:28Z 2021-12-19T20:40:10Z 2022-01-14T02:08:51Z   22 2 2 JavaScript 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-io", "datasette-plugin"] 0 0 2 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-pretty-traces [![PyPI](https://img.shields.io/pypi/v/datasette-pretty-traces.svg)](https://pypi.org/project/datasette-pretty-traces/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-pretty-traces?include_prereleases&label=changelog)](https://github.com/simonw/datasette-pretty-traces/releases) [![Tests](https://github.com/simonw/datasette-pretty-traces/workflows/Test/badge.svg)](https://github.com/simonw/datasette-pretty-traces/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-pretty-traces/blob/main/LICENSE) Prettier formatting for `?_trace=1` traces ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-pretty-traces ## Usage Once installed, run Datasette using `--setting trace_debug 1`: datasette fixtures.db --setting trace_debug 1 Then navigate to any page and add `?_trace=` to the URL: http://localhost:8001/?_trace=1 The plugin will scroll you down the page to the visualized trace information. ## Demo You can try out the demo here: - [/?_trace=1](https://latest-with-plugins.datasette.io/?_trace=1) tracing the homepage - [/github/commits?_trace=1](https://latest-with-plugins.datasette.io/github/commits?_trace=1) tracing a table page ## Screenshot ![Screenshot showing the visualization produced by the plugin](https://user-images.githubusercontent.com/9599/145883732-a53accdd-5feb-4629-94cd-f73407c7943d.png) ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-pretty-traces 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 dir="auto"><a id="user-content-datasette-pretty-traces" class="anchor" aria-hidden="true" href="#user-content-datasette-pretty-traces"><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-pretty-traces</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-pretty-traces/" rel="nofollow"><img src="https://camo.githubusercontent.com/ed86d276f9a69a313d94c59c0a68e29ebd828d11646c2cfd55d776d8738ec333/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7072657474792d7472616365732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-pretty-traces.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-pretty-traces/releases"><img src="https://camo.githubusercontent.com/26aa360a6a2df25aefecf0566189c1b970e68493853d18d55045684e328eb303/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7072657474792d7472616365733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-pretty-traces?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-pretty-traces/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-pretty-traces/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github… 1 public 0      
441024802 R_kgDOGkmBIg datasette-tiddlywiki simonw/datasette-tiddlywiki 0 simonw 9599 https://github.com/simonw/datasette-tiddlywiki Run TiddlyWiki in Datasette and save Tiddlers to a SQLite database 0 2021-12-23T01:05:56Z 2022-02-14T08:57:33Z 2022-03-08T01:36:10Z   426 22 22 HTML 1 1 1 1 0 0 0 0 3 Apache License 2.0 apache-2.0 [] 0 3 22 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 2 # datasette-tiddlywiki [![PyPI](https://img.shields.io/pypi/v/datasette-tiddlywiki.svg)](https://pypi.org/project/datasette-tiddlywiki/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-tiddlywiki?include_prereleases&label=changelog)](https://github.com/simonw/datasette-tiddlywiki/releases) [![Tests](https://github.com/simonw/datasette-tiddlywiki/workflows/Test/badge.svg)](https://github.com/simonw/datasette-tiddlywiki/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-tiddlywiki/blob/main/LICENSE) Run [TiddlyWiki](https://tiddlywiki.com/) in Datasette and save Tiddlers to a SQLite database Read more about this project [on my blog](https://simonwillison.net/2021/Dec/24/datasette-tiddlywiki/). ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-tiddlywiki ## Usage Start Datasette with a `tiddlywiki.db` database. You can create it if it does not yet exist using `--create`. You need to be signed in as the `root` user to write to the wiki, so use the `--root` option and click on the link it provides: % datasette tiddlywiki.db --create --root http://127.0.0.1:8001/-/auth-token?token=456670f1e8d01a8a33b71e17653130de17387336e29afcdfb4ab3d18261e6630 # ... Navigate to `/-/tiddlywiki` on your instance to interact with TiddlyWiki. ## Authentication and permissions By default, the wiki can be read by anyone who has permission to read the `tiddlywiki.db` database. Only the signed in `root` user can write to it. You can sign in using the `--root` option described above, or you can set a password for that user using the [datasette-auth-passwords](https://datasette.io/plugins/datasette-auth-passwords) plugin and sign in using the `/-/login` page. You can use the `edit-tiddlywiki` permission to grant edit permisions to other users, using another plugin such as [datasette-permissions-sql](https://datasette.io/plugins/datasette-permissions-s… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-tiddlywiki" class="anchor" aria-hidden="true" href="#user-content-datasette-tiddlywiki"><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-tiddlywiki</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-tiddlywiki/" rel="nofollow"><img src="https://camo.githubusercontent.com/94d62f40def55ce1280599082836059caa2a8015c30d984cde1872d75a15d0f4/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d746964646c7977696b692e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-tiddlywiki.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-tiddlywiki/releases"><img src="https://camo.githubusercontent.com/c054acb54b94f60a29e4f277807ce46811b9693a170e3e02c1e04798e3a595e8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d746964646c7977696b693f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-tiddlywiki?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-tiddlywiki/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-tiddlywiki/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-tiddlywiki/blob/m… 1 public 0      
459821110 R_kgDOG2hQNg google-drive-to-sqlite simonw/google-drive-to-sqlite 0 simonw 9599 https://github.com/simonw/google-drive-to-sqlite Create a SQLite database containing metadata from Google Drive 0 2022-02-16T02:16:29Z 2022-05-17T00:30:43Z 2022-05-21T16:56:11Z https://datasette.io/tools/google-drive-to-sqlite 74 133 133 Python 1 1 1 1 0 11 0 0 9 Apache License 2.0 apache-2.0 [] 11 9 133 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     11 3 # google-drive-to-sqlite [![PyPI](https://img.shields.io/pypi/v/google-drive-to-sqlite.svg)](https://pypi.org/project/google-drive-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/simonw/google-drive-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/google-drive-to-sqlite/releases) [![Tests](https://github.com/simonw/google-drive-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/google-drive-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/google-drive-to-sqlite/blob/master/LICENSE) Create a SQLite database containing metadata from [Google Drive](https://www.google.com/drive) For background on this project, see [Google Drive to SQLite](https://simonwillison.net/2022/Feb/20/google-drive-to-sqlite/) on my blog. If you use Google Drive, and especially if you have shared drives with other people there's a good chance you have hundreds or even thousands of files that you may not be fully aware of. This tool can download metadata about those files - their names, sizes, folders, content types, permissions, creation dates and more - and store them in a SQLite database. This lets you use SQL to analyze your Google Drive contents, using [Datasette](https://datasette.io/) or the SQLite command-line tool or any other SQLite database browsing software. ## Installation Install this tool using `pip`: pip install google-drive-to-sqlite ## Quickstart Authenticate with Google Drive by running: google-drive-to-sqlite auth Now create a SQLite database with metadata about all of the files you have starred using: google-drive-to-sqlite files starred.db --starred You can explore the resulting database using [Datasette](https://datasette.io/): $ pip install datasette $ datasette starred.db INFO: Started server process [24661] INFO: Uvicorn running on http://127.0.0.1:8001 ## Authentication > :warning: **This application has not yet been veri… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-google-drive-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-google-drive-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>google-drive-to-sqlite</h1> <p dir="auto"><a href="https://pypi.org/project/google-drive-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/18fcd4b2930251d5e234ec0832e9dd82dde2d7b5bfc9dc31387e22107a1da0a3/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f676f6f676c652d64726976652d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/google-drive-to-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/google-drive-to-sqlite/releases"><img src="https://camo.githubusercontent.com/7c733ea3efff14b60d66656573c9bdc05d5d6a2d84ec3fdec73cef08685decf1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f676f6f676c652d64726976652d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/google-drive-to-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/google-drive-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/google-drive-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/g… 1 public 0      
461322238 R_kgDOG383_g sqlite-colorbrewer eyeseast/sqlite-colorbrewer 0 eyeseast 25778 https://github.com/eyeseast/sqlite-colorbrewer A custom function to use ColorBrewer scales in SQLite queries 0 2022-02-19T21:53:46Z 2022-03-03T17:16:40Z 2022-03-02T03:04:56Z   19 4 4 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 4 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # sqlite-colorbrewer [![PyPI](https://img.shields.io/pypi/v/sqlite-colorbrewer.svg)](https://pypi.org/project/sqlite-colorbrewer/) [![Changelog](https://img.shields.io/github/v/release/eyeseast/sqlite-colorbrewer?include_prereleases&label=changelog)](https://github.com/eyeseast/sqlite-colorbrewer/releases) [![Tests](https://github.com/eyeseast/sqlite-colorbrewer/workflows/Test/badge.svg)](https://github.com/eyeseast/sqlite-colorbrewer/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/eyeseast/sqlite-colorbrewer/blob/main/LICENSE) A custom function to use [ColorBrewer](https://colorbrewer2.org/) scales in SQLite queries. Colors are exported from [here](https://colorbrewer2.org/export/colorbrewer.json). ## Installation To install as a Python library and use with the [standard SQLite3 module](https://docs.python.org/3/library/sqlite3.html): pip install sqlite-colorbrewer To install this plugin in the same environment as Datasette. datasette install sqlite-colorbrewer ## Usage If you're using this library with Datasette, it will be automatically registered as a plugin and available for use in SQL queries, like so: ```sql SELECT colorbrewer('Blues', 9, 0); ``` That will return a single value: `"rgb(247,251,255)"` To use with a SQLite connection outside of Datasette, use the `register` function: ```python >>> import sqlite3 >>> import sqlite_colorbrewer >>> conn = sqlite3.connect(':memory') >>> sqlite_colorbrewer.register(conn) >>> cursor = conn.execute("SELECT colorbrewer('Blues', 9, 0);") >>> result = next(cursor) >>> print(result) rgb(247,251,255) ``` ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd sqlite-colorbrewer 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 To build `sqlite_col… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-sqlite-colorbrewer" class="anchor" aria-hidden="true" href="#user-content-sqlite-colorbrewer"><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-colorbrewer</h1> <p dir="auto"><a href="https://pypi.org/project/sqlite-colorbrewer/" rel="nofollow"><img src="https://camo.githubusercontent.com/04ce9615649f436d9d448e3c317bf8f12473237aa608429218b746755cbd0ef6/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73716c6974652d636f6c6f726272657765722e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/sqlite-colorbrewer.svg" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/sqlite-colorbrewer/releases"><img src="https://camo.githubusercontent.com/638c41b57fe97aeaec1e6be4a0f1d0c69e4d9259585553a48a5f21ef40047542/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f65796573656173742f73716c6974652d636f6c6f726272657765723f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/eyeseast/sqlite-colorbrewer?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/sqlite-colorbrewer/actions?query=workflow%3ATest"><img src="https://github.com/eyeseast/sqlite-colorbrewer/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/sqlite-colorbrewer/blob/main/LICENSE"><… 1 public 0      
462903750 R_kgDOG5dZxg datasette-redirect-forbidden simonw/datasette-redirect-forbidden 0 simonw 9599 https://github.com/simonw/datasette-redirect-forbidden Redirect forbidden requests to a login page 0 2022-02-23T20:59:26Z 2022-02-23T22:00:12Z 2022-02-23T22:02:38Z   7 0 0 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 [] 0 1 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-redirect-forbidden [![PyPI](https://img.shields.io/pypi/v/datasette-redirect-forbidden.svg)](https://pypi.org/project/datasette-redirect-forbidden/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-redirect-forbidden?include_prereleases&label=changelog)](https://github.com/simonw/datasette-redirect-forbidden/releases) [![Tests](https://github.com/simonw/datasette-redirect-forbidden/workflows/Test/badge.svg)](https://github.com/simonw/datasette-redirect-forbidden/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-redirect-forbidden/blob/main/LICENSE) Redirect forbidden requests to a login page ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-redirect-forbidden ## Usage Add the following to your `metadata.yml` (or `metadata.json`) file to configure the plugin: ```yaml plugins: datasette-redirect-forbidden: redirect_to: /-/login ``` Any 403 forbidden pages will redirect to the specified page. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-redirect-forbidden 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 dir="auto"><a id="user-content-datasette-redirect-forbidden" class="anchor" aria-hidden="true" href="#user-content-datasette-redirect-forbidden"><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-redirect-forbidden</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-redirect-forbidden/" rel="nofollow"><img src="https://camo.githubusercontent.com/5fd755c03dc30d32c237a39392ed5ba94a54e5f20a4bbd2c0522c69736d9ac0c/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d72656469726563742d666f7262696464656e2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-redirect-forbidden.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-redirect-forbidden/releases"><img src="https://camo.githubusercontent.com/31dd293e33f6786f2b162731eb130a22c26c39fbbc48a29edcc03ad735e643bf/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d72656469726563742d666f7262696464656e3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-redirect-forbidden?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-redirect-forbidden/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-redirect-forbidden/workflows/Test/badge.svg" … 1 public 0 {"id": 400878073, "node_id": "MDEwOlJlcG9zaXRvcnk0MDA4NzgwNzM=", "name": "datasette-plugin-template-repository", "full_name": "simonw/datasette-plugin-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/datasette-plugin-template-repository", "description": "GitHub template repository for creating new Datasette plugins, using the simonw/datasette-plugin cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository", "forks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/issues/events{/numbe…    
467679579 R_kgDOG-A5Ww shot-scraper simonw/shot-scraper 0 simonw 9599 https://github.com/simonw/shot-scraper A command-line utility for taking automated screenshots of websites 0 2022-03-08T21:21:02Z 2022-11-15T14:38:08Z 2022-11-16T04:28:52Z https://shot-scraper.datasette.io 188 775 775 Python 1 1 1 1 0 40 0 0 16 Apache License 2.0 apache-2.0 ["playwright", "playwright-python", "scraping", "screenshot-utility", "screenshots"] 40 16 775 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     40 3 # shot-scraper [![PyPI](https://img.shields.io/pypi/v/shot-scraper.svg)](https://pypi.org/project/shot-scraper/) [![Changelog](https://img.shields.io/github/v/release/simonw/shot-scraper?include_prereleases&label=changelog)](https://github.com/simonw/shot-scraper/releases) [![Tests](https://github.com/simonw/shot-scraper/workflows/Test/badge.svg)](https://github.com/simonw/shot-scraper/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/shot-scraper/blob/master/LICENSE) A command-line utility for taking automated screenshots of websites For background on this project see [shot-scraper: automated screenshots for documentation, built on Playwright](https://simonwillison.net/2022/Mar/10/shot-scraper/). ## Documentation - [Full documentation for shot-scraper](https://shot-scraper.datasette.io/) - [Tutorial: Automating screenshots for the Datasette documentation using shot-scraper](https://simonwillison.net/2022/Oct/14/automating-screenshots/) - [Release notes](https://github.com/simonw/shot-scraper/releases) ## Get started with GitHub Actions To get started without installing any software, use the [shot-scraper-template](https://github.com/simonw/shot-scraper-template) template to create your own GitHub repository which takes screenshots of a page using `shot-scraper`. See [Instantly create a GitHub repository to take screenshots of a web page](https://simonwillison.net/2022/Mar/14/shot-scraper-template/) for details. ## Quick installation You can install the `shot-scraper` CLI tool using [pip](https://pip.pypa.io/): pip install shot-scraper # Now install the browser it needs: shot-scraper install ## Taking your first screenshot You can take a screenshot of a web page like this: shot-scraper https://datasette.io/ This will create a screenshot in a file called `datasette-io.png`. Many more options are available, see [Taking a screenshot](https://shot-scraper.datasette.io/en/stable/screenshots.html) for details.… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-shot-scraper" class="anchor" aria-hidden="true" href="#user-content-shot-scraper"><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>shot-scraper</h1> <p dir="auto"><a href="https://pypi.org/project/shot-scraper/" rel="nofollow"><img src="https://camo.githubusercontent.com/286ea85d2fe4edc6a9b1fdb4649d30bdf8021bb7251f1952f5ac780efe108494/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73686f742d736372617065722e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/shot-scraper.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/shot-scraper/releases"><img src="https://camo.githubusercontent.com/efbd5167cbe1861a03ee215da1ed60e73452db7584ea177e1334c63c7b35897d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f73686f742d736372617065723f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/shot-scraper?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/shot-scraper/actions?query=workflow%3ATest"><img src="https://github.com/simonw/shot-scraper/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/shot-scraper/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e… 1 public 0   0 0
470338069 R_kgDOHAjKFQ datasette-hashed-urls simonw/datasette-hashed-urls 0 simonw 9599 https://github.com/simonw/datasette-hashed-urls Optimize Datasette performance behind a caching proxy 0 2022-03-15T21:31:52Z 2022-03-17T03:00:34Z 2022-03-24T17:58:05Z   38 3 3 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 3 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-hashed-urls [![PyPI](https://img.shields.io/pypi/v/datasette-hashed-urls.svg)](https://pypi.org/project/datasette-hashed-urls/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-hashed-urls?include_prereleases&label=changelog)](https://github.com/simonw/datasette-hashed-urls/releases) [![Tests](https://github.com/simonw/datasette-hashed-urls/workflows/Test/badge.svg)](https://github.com/simonw/datasette-hashed-urls/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-hashed-urls/blob/main/LICENSE) Optimize Datasette performance behind a caching proxy When you open a database file in immutable mode using the `-i` option, Datasette calculates a SHA-256 hash of the contents of that file on startup. This content hash can then optionally be used to create URLs that are guaranteed to change if the contents of the file changes in the future. The result is pages that can be cached indefinitely by both browsers and caching proxies - providing a significant performance boost. ## Demo A demo of this plugin is running at https://datasette-hashed-urls.vercel.app/ ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-hashed-urls ## Usage Once installed, this plugin will act on any immutable database files that are loaded into Datasette: datasette -i fixtures.db The database will automatically be renamed to incorporate a hash of the contents of the SQLite file - so the above database would be served as: http://127.0.0.1:8001/fixtures-aa7318b Every page that accesss that database, including JSON endpoints, will be served with the following far-future cache expiry header: cache-control: max-age=31536000, public Here `max-age=31536000` is the number of seconds in a year. A caching proxy such as Cloudflare can then be used to cache and accelerate content served by Datasette. When the database file is updated and the server is re… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-hashed-urls" class="anchor" aria-hidden="true" href="#user-content-datasette-hashed-urls"><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-hashed-urls</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-hashed-urls/" rel="nofollow"><img src="https://camo.githubusercontent.com/55153811ecb81f551b5a9e808170c99673e8aa31647e65e9c7d93780f7082f42/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6861736865642d75726c732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-hashed-urls.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-hashed-urls/releases"><img src="https://camo.githubusercontent.com/a583f3c3cf3ad04b522018036f27666125f6dc718c2addd80ed64834d9068677/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6861736865642d75726c733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-hashed-urls?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-hashed-urls/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-hashed-urls/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-hash… 1 public 0      
474176116 R_kgDOHENadA datasette-packages simonw/datasette-packages 0 simonw 9599 https://github.com/simonw/datasette-packages Show a list of currently installed Python packages 0 2022-03-25T22:04:23Z 2022-03-25T22:04:45Z 2022-07-03T02:41:55Z   9 0 0 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 [] 0 1 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-packages [![PyPI](https://img.shields.io/pypi/v/datasette-packages.svg)](https://pypi.org/project/datasette-packages/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-packages?include_prereleases&label=changelog)](https://github.com/simonw/datasette-packages/releases) [![Tests](https://github.com/simonw/datasette-packages/workflows/Test/badge.svg)](https://github.com/simonw/datasette-packages/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-packages/blob/main/LICENSE) Show a list of currently installed Python packages ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-packages ## Usage Visit `/-/packages` to see a list of installed Python packages. Visit `/-/packages.json` to get that back as JSON. ## Demo The output of this plugin can be seen here: - https://latest-with-plugins.datasette.io/-/packages - https://latest-with-plugins.datasette.io/-/packages.json ## With datasette-graphql if you have version 2.1 or higher of the [datasette-graphql](https://datasette.io/plugins/datasette-graphql) plugin installed you can also query the list of packages using this GraphQL query: ```graphql { packages { name version } } ``` [Demo of this query](https://latest-with-plugins.datasette.io/graphql?query=%7B%0A%20%20packages%20%7B%0A%20%20%20%20name%0A%20%20%20%20version%0A%20%20%7D%0A%7D). ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-packages python3 -mvenv venv source venv/bin/activate 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 dir="auto"><a id="user-content-datasette-packages" class="anchor" aria-hidden="true" href="#user-content-datasette-packages"><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-packages</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-packages/" rel="nofollow"><img src="https://camo.githubusercontent.com/e627d38389969d85cfcb630a701966524caf79b08068f56eb1143679614ef233/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7061636b616765732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-packages.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-packages/releases"><img src="https://camo.githubusercontent.com/091e917c5f8e80e63def650f03bc9ab9990fbc7e68f8bf87e280aa8d6002ed98/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7061636b616765733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-packages?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-packages/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-packages/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-packages/blob/main/LICENSE"><img src="https… 1 public 0   0  
474468776 R_kgDOHEfRqA datasette-auth0 simonw/datasette-auth0 0 simonw 9599 https://github.com/simonw/datasette-auth0 Datasette plugin that authenticates users using Auth0 0 2022-03-26T21:19:31Z 2022-03-27T17:59:49Z 2022-03-28T03:04:52Z   11 3 3 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["auth0", "datasette", "datasette-plugin"] 0 0 3 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-auth0 [![PyPI](https://img.shields.io/pypi/v/datasette-auth0.svg)](https://pypi.org/project/datasette-auth0/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-auth0?include_prereleases&label=changelog)](https://github.com/simonw/datasette-auth0/releases) [![Tests](https://github.com/simonw/datasette-auth0/workflows/Test/badge.svg)](https://github.com/simonw/datasette-auth0/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-auth0/blob/main/LICENSE) Datasette plugin that authenticates users using [Auth0](https://auth0.com/) See [Simplest possible OAuth authentication with Auth0](https://til.simonwillison.net/auth0/oauth-with-auth0) for more about how this plugin works. ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-auth0 ## Demo You can try this out at [datasette-auth0-demo.datasette.io](https://datasette-auth0-demo.datasette.io/) - click on the top right menu icon and select "Sign in with Auth0". ## Initial configuration First, create a new application in Auth0. You will need the domain, client ID and client secret for that application. The domain should be something like `mysite.us.auth0.com`. Add `http://127.0.0.1:8001/-/auth0-callback` to the list of Allowed Callback URLs. Then configure these plugin secrets using `metadata.yml`: ```yaml plugins: datasette-auth0: domain: "$env": AUTH0_DOMAIN client_id: "$env": AUTH0_CLIENT_ID client_secret: "$env": AUTH0_CLIENT_SECRET ``` Only the `client_secret` needs to be kept secret, but for consistency I recommend using the `$env` mechanism for all three. In development, you can run Datasette and pass in environment variables like this: ``` AUTH0_DOMAIN="your-domain.us.auth0.com" \ AUTH0_CLIENT_ID="...client-id-goes-here..." \ AUTH0_CLIENT_SECRET="...secret-goes-here..." \ datasette -m metadata.yml ``` If you are deploying using `datasette publi… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-auth0" class="anchor" aria-hidden="true" href="#user-content-datasette-auth0"><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-auth0</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-auth0/" rel="nofollow"><img src="https://camo.githubusercontent.com/f43e5887f316cf40043f9c8a820290d3d12ae6b474804d66627cadf27de5145b/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d61757468302e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-auth0.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth0/releases"><img src="https://camo.githubusercontent.com/62decb2ba747ff51dd7bd5bdb614a6973179ff5642425c8e8525764285bc372c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d61757468303f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-auth0?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth0/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-auth0/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-auth0/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c… 1 public 0      
474473836 R_kgDOHEflbA datasette-nteract-data-explorer hydrosquall/datasette-nteract-data-explorer 0 hydrosquall 9020979 https://github.com/hydrosquall/datasette-nteract-data-explorer automatic visual data explorer for datasette 0 2022-03-26T21:47:17Z 2022-10-04T03:28:02Z 2022-10-19T00:35:29Z https://datasette-nteract-data-explorer.vercel.app/ 137 8 8 TypeScript 1 1 1 1 0 1 0 0 8 Apache License 2.0 apache-2.0 ["automatic-viz", "datasette", "datasette-plugin", "dataviz"] 1 8 8 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 1     1 public 0   0  
479175467 R_kgDOHI-jKw pypi-to-sqlite simonw/pypi-to-sqlite 0 simonw 9599 https://github.com/simonw/pypi-to-sqlite Load data about Python packages from PyPI into SQLite 0 2022-04-07T23:09:02Z 2022-04-08T15:16:03Z 2022-04-08T16:29:53Z   24 2 2 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 [] 0 1 2 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # pypi-to-sqlite [![PyPI](https://img.shields.io/pypi/v/pypi-to-sqlite.svg)](https://pypi.org/project/pypi-to-sqlite/) [![Changelog](https://img.shields.io/github/v/release/simonw/pypi-to-sqlite?include_prereleases&label=changelog)](https://github.com/simonw/pypi-to-sqlite/releases) [![Tests](https://github.com/simonw/pypi-to-sqlite/workflows/Test/badge.svg)](https://github.com/simonw/pypi-to-sqlite/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/pypi-to-sqlite/blob/master/LICENSE) Load data about Python packages from PyPI into SQLite ## Installation Install this tool using `pip`: pip install pypi-to-sqlite ## Usage To create a SQLite database with details of one or more packages, run: pypi-to-sqlite pypi.db datasette sqlite-utils You can also process JSON that you have previously saved to disk like so: curl -o datasette.json https://pypi.org/pypi/datasette/json pypi-to-sqlite pypi.db -f datasette.json The tool will create three tables: `packages`, `versions` and `releases`. The full table schema is shown below. To create the tables with a prefix, use `--prefix prefix`. For example: pypi-to-sqlite pypi.db datasette --prefix pypi_ This will create tables called `pypi_packages`, `pypi_versions` and `pypi_releases`. ## Demo You can see examples of tables created using this tool running in [Datasette](https://datasette.io/) here: - [packages](https://datasette.io/content/pypi_packages) - [versions](https://datasette.io/content/pypi_versions) - [releases](https://datasette.io/content/pypi_releases) ## Database schema <!-- [[[cog import cog, json from pypi_to_sqlite import cli from click.testing import CliRunner import sqlite_utils import tempfile, pathlib tmpdir = pathlib.Path(tempfile.mkdtemp()) db_path = str(tmpdir / "pypi.db") runner = CliRunner() result = runner.invoke(cli.cli, [db_path, "-f", "tests/datasette-block.json"]) cog.out("```sql\n") cog.out(sqlite_utils.Database(db_path).schema) cog.o… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-pypi-to-sqlite" class="anchor" aria-hidden="true" href="#user-content-pypi-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>pypi-to-sqlite</h1> <p dir="auto"><a href="https://pypi.org/project/pypi-to-sqlite/" rel="nofollow"><img src="https://camo.githubusercontent.com/200eab1d4c07550744081184a86be6c72391ed7061054162919ec2ad2b48fa09/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f707970692d746f2d73716c6974652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/pypi-to-sqlite.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/pypi-to-sqlite/releases"><img src="https://camo.githubusercontent.com/5efc8be881faf986aca6a6396ff257b787a9be964ef6f1328e46568544be0847/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f707970692d746f2d73716c6974653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/pypi-to-sqlite?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/pypi-to-sqlite/actions?query=workflow%3ATest"><img src="https://github.com/simonw/pypi-to-sqlite/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/pypi-to-sqlite/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841… 1 public 0      
485962807 R_kgDOHPc0Nw datasette-total-page-time simonw/datasette-total-page-time 0 simonw 9599 https://github.com/simonw/datasette-total-page-time Add a note to the Datasette footer measuring the total page load time 0 2022-04-26T22:09:58Z 2022-04-26T22:10:27Z 2022-04-26T22:11:48Z   0 0 0 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-total-page-time [![PyPI](https://img.shields.io/pypi/v/datasette-total-page-time.svg)](https://pypi.org/project/datasette-total-page-time/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-total-page-time?include_prereleases&label=changelog)](https://github.com/simonw/datasette-total-page-time/releases) [![Tests](https://github.com/simonw/datasette-total-page-time/workflows/Test/badge.svg)](https://github.com/simonw/datasette-total-page-time/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-total-page-time/blob/main/LICENSE) Add a note to the Datasette footer measuring the total page load time ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-total-page-time ## Usage Once this plugin is installed, a note will appear in the footer of every page showing how long the page took to generate. > Queries took 326.74ms · Page took 386.310ms ## How it works Measuring how long a page takes to load and then injecting that note into the page is tricky, because you need to finish generating the page before you know how long it took to load it! This plugin uses the [asgi_wrapper](https://docs.datasette.io/en/stable/plugin_hooks.html#asgi-wrapper-datasette) plugin hook to measure the time taken by Datasette and then inject the following JavaScript at the bottom of the response, after the closing `</html>` tag but with the correct measured value: ```html <script> let footer = document.querySelector("footer"); if (footer) { let ms = 37.224; let s = ` &middot; Page took ${ms.toFixed(3)}ms`; footer.innerHTML += s; } </script> ``` This script is injected only on pages with the `text/html` content type - so it should not affect JSON or CSV returned by Datasette. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-total-page-time python3 -mvenv venv s… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-total-page-time" class="anchor" aria-hidden="true" href="#user-content-datasette-total-page-time"><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-total-page-time</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-total-page-time/" rel="nofollow"><img src="https://camo.githubusercontent.com/46f2a11c9943f96c31f5d07f9be81db92f572d8d4a0a89fd74eb607647893920/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d746f74616c2d706167652d74696d652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-total-page-time.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-total-page-time/releases"><img src="https://camo.githubusercontent.com/7fb0313d1610a325951cfd81a63bb460a452ac3be321a8a3e275296a9d65dcd2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d746f74616c2d706167652d74696d653f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-total-page-time?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-total-page-time/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-total-page-time/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></… 1 public 0      
486080358 R_kgDOHPj_Zg datasette-gzip simonw/datasette-gzip 0 simonw 9599 https://github.com/simonw/datasette-gzip Add gzip compression to Datasette 0 2022-04-27T06:54:52Z 2022-04-28T03:19:50Z 2022-04-28T16:06:51Z   15 4 4 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 4 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-gzip [![PyPI](https://img.shields.io/pypi/v/datasette-gzip.svg)](https://pypi.org/project/datasette-gzip/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-gzip?include_prereleases&label=changelog)](https://github.com/simonw/datasette-gzip/releases) [![Tests](https://github.com/simonw/datasette-gzip/workflows/Test/badge.svg)](https://github.com/simonw/datasette-gzip/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-gzip/blob/main/LICENSE) Add gzip compression to Datasette ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-gzip ## Usage Once installed, Datasette will obey the `Accept-Encoding:` header sent by browsers or other user agents and return content compressed in the most appropriate way. This plugin is a thin wrapper for the [asgi-gzip library](https://github.com/simonw/asgi-gzip), which extracts the [GzipMiddleware](https://www.starlette.io/middleware/#gzipmiddleware) from Starlette. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-gzip python3 -mvenv venv source venv/bin/activate 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 dir="auto"><a id="user-content-datasette-gzip" class="anchor" aria-hidden="true" href="#user-content-datasette-gzip"><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-gzip</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-gzip/" rel="nofollow"><img src="https://camo.githubusercontent.com/2710ff5daf8e208e73a7b4cc0c852401cdb1214c7266da2fe9bd9d451a0b6710/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d677a69702e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-gzip.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-gzip/releases"><img src="https://camo.githubusercontent.com/0ac879f01bbec94064e9c423f0d6285e073140ec9583e348c450be58246a8ef5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d677a69703f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-gzip?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-gzip/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-gzip/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-gzip/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9… 1 public 0      
486732669 R_kgDOHQLzfQ datasette-copy-to-memory simonw/datasette-copy-to-memory 0 simonw 9599 https://github.com/simonw/datasette-copy-to-memory Copy database files into an in-memory database on startup 0 2022-04-28T20:02:21Z 2022-04-30T21:32:54Z 2022-04-30T19:49:29Z   19 2 2 Python 1 1 1 1 0 0 0 0 2 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin"] 0 2 2 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-copy-to-memory [![PyPI](https://img.shields.io/pypi/v/datasette-copy-to-memory.svg)](https://pypi.org/project/datasette-copy-to-memory/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-copy-to-memory?include_prereleases&label=changelog)](https://github.com/simonw/datasette-copy-to-memory/releases) [![Tests](https://github.com/simonw/datasette-copy-to-memory/workflows/Test/badge.svg)](https://github.com/simonw/datasette-copy-to-memory/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-copy-to-memory/blob/main/LICENSE) Copy database files into an in-memory database on startup This plugin is **highly experimental**. It currently exists to support Datasette performance research, and is not designed for actual production usage. ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-copy-to-memory ## Usage On startup, Datasette will create an in-memory named database for each attached database. This database will have the same name but with `_memory` at the end. So running this: datasette fixtures.db Will serve two databases: the original at `/fixtures` and the in-memory copy at `/fixtures_memory`. ## Demo A demo is running on [latest-with-plugins.datasette.io](https://latest-with-plugins.datasette.io/) - the [/fixtures_memory](https://latest-with-plugins.datasette.io/fixtures_memory) table there is provided by this plugin. ## Configuration By default every attached database file will be loaded into a `_memory` copy. You can use plugin configuration to specify just a subset of the database. For example, to create `github_memory` but not `fixtures_memory` you would use the following `metadata.yml` file: ```yaml plugins: datasette-copy-to-memory: databases: - github ``` Then start Datasette like this: datasette github.db fixtures.db -m metadata.yml If you don't want to have a `fixtures` and `fixtures_memory` data… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-copy-to-memory" class="anchor" aria-hidden="true" href="#user-content-datasette-copy-to-memory"><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-copy-to-memory</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-copy-to-memory/" rel="nofollow"><img src="https://camo.githubusercontent.com/d3a367abdd18cd053406fa7ada0fe34b03d87d6a8ba6572c6c4722e46ab398b3/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d636f70792d746f2d6d656d6f72792e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-copy-to-memory.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-copy-to-memory/releases"><img src="https://camo.githubusercontent.com/688ecff26c66603539b1877da4753ec7bfdfab4555a6c4846e1ee0b1c428f60b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d636f70792d746f2d6d656d6f72793f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-copy-to-memory?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-copy-to-memory/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-copy-to-memory/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="h… 1 public 0      
489156146 R_kgDOHSfuMg datasette-upload-dbs simonw/datasette-upload-dbs 0 simonw 9599 https://github.com/simonw/datasette-upload-dbs Upload SQLite database files to Datasette 0 2022-05-05T23:36:51Z 2022-05-17T16:38:00Z 2022-09-09T16:23:13Z   93 5 5 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 [] 0 1 5 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 2 # datasette-upload-dbs [![PyPI](https://img.shields.io/pypi/v/datasette-upload-dbs.svg)](https://pypi.org/project/datasette-upload-dbs/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-upload-dbs?include_prereleases&label=changelog)](https://github.com/simonw/datasette-upload-dbs/releases) [![Tests](https://github.com/simonw/datasette-upload-dbs/workflows/Test/badge.svg)](https://github.com/simonw/datasette-upload-dbs/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-upload-dbs/blob/main/LICENSE) Upload SQLite database files to Datasette ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-upload-dbs ## Configuration This plugin requires you to configure a directory in which uploaded files will be stored. On startup, Datasette will automatically load any SQLite files that it finds in that directory. This means it is safe to restart your server in between file uploads. To configure the directory as `/home/datasette/uploads`, add this to a `metadata.yml` configuration file: ```yaml plugins: datasette-upload-dbs: directory: /home/datasette/uploads ``` Or if you are using `metadata.json`: ```json { "plugins": { "datasette-upload-dbs": { "directory": "/home/datasette/uploads" } } } ``` You can use `"."` for the current folder when the server starts, or `"uploads"` for a folder relative to that folder. The folder will be created on startup if it does not already exist. Then start Datasette like this: datasette -m metadata.yml ## Usage Only users with the `upload-dbs` permission will be able to upload files. The `root` user has this permission by default - other users can be granted access using permission plugins, see the [Permissions](https://docs.datasette.io/en/stable/authentication.html#permissions) documentation for details. To start Datasette as the root user, run this: datasette -m metadata.yml --roo… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-upload-dbs" class="anchor" aria-hidden="true" href="#user-content-datasette-upload-dbs"><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-upload-dbs</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-upload-dbs/" rel="nofollow"><img src="https://camo.githubusercontent.com/dc98cd1fbc11a52c3610a10dd294832a4489aa3366a5e88b61ab3b7144bf7425/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d75706c6f61642d6462732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-upload-dbs.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-upload-dbs/releases"><img src="https://camo.githubusercontent.com/c00a952891cccd5b0a084a4a8aebf0f38a89669c5e7769a926b45fcaa5fa33bf/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d75706c6f61642d6462733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-upload-dbs?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-upload-dbs/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-upload-dbs/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-upload-dbs/blob/m… 1 public 0   0  
499911426 R_kgDOHcwLAg datasette-query-files eyeseast/datasette-query-files 0 eyeseast 25778 https://github.com/eyeseast/datasette-query-files Write Datasette canned queries as plain SQL files 0 2022-06-04T18:52:07Z 2022-07-02T19:46:52Z 2022-07-02T20:40:51Z   24 8 8 Python 1 1 1 1 0 0 0 0 2 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin", "python", "sql", "sqlite"] 0 2 8 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-query-files [![PyPI](https://img.shields.io/pypi/v/datasette-query-files.svg)](https://pypi.org/project/datasette-query-files/) [![Changelog](https://img.shields.io/github/v/release/eyeseast/datasette-query-files?include_prereleases&label=changelog)](https://github.com/eyeseast/datasette-query-files/releases) [![Tests](https://github.com/eyeseast/datasette-query-files/workflows/Test/badge.svg)](https://github.com/eyeseast/datasette-query-files/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/eyeseast/datasette-query-files/blob/main/LICENSE) Write Datasette canned queries as plain SQL files. ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-query-files Or using `pip` or `pipenv`: pip install datasette-query-files pipenv install datasette-query-files ## Usage This plugin will look for [canned queries](https://docs.datasette.io/en/stable/sql_queries.html#canned-queries) in the filesystem, in addition any defined in metadata. Let's say you're working in a directory called `project-directory`, with a database file called `my-project.db`. Start by creating a `queries` directory with a `my-project` directory inside it. Any SQL file inside that `my-project` folder will become a canned query that can be run on the `my-project` database. If you have a `query-name.sql` file and a `query-name.json` (or `query-name.yml`) file in the same directory, the JSON file will be used as query metadata. ``` project-directory/ my-project.db queries/ my-project/ query-name.sql # a query query-name.yml # query metadata ``` ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-query-files python3 -m venv venv source venv/bin/activate 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 dir="auto"><a id="user-content-datasette-query-files" class="anchor" aria-hidden="true" href="#user-content-datasette-query-files"><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-files</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-query-files/" rel="nofollow"><img src="https://camo.githubusercontent.com/c204f01390d188a0f01eeafcd5f9f369b653b2cfaaef56534a36497a575cc317/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d71756572792d66696c65732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-query-files.svg" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/datasette-query-files/releases"><img src="https://camo.githubusercontent.com/d614cd96ac7137aced94769f27f45a90dfc8ddd9bbff39b15d6c276704b7e703/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f65796573656173742f6461746173657474652d71756572792d66696c65733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/eyeseast/datasette-query-files?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/datasette-query-files/actions?query=workflow%3ATest"><img src="https://github.com/eyeseast/datasette-query-files/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/eyeseast/… 1 public 0 {"id": 400878073, "node_id": "MDEwOlJlcG9zaXRvcnk0MDA4NzgwNzM=", "name": "datasette-plugin-template-repository", "full_name": "simonw/datasette-plugin-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/datasette-plugin-template-repository", "description": "GitHub template repository for creating new Datasette plugins, using the simonw/datasette-plugin cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository", "forks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/issues/events{/numbe… 0  
501303242 R_kgDOHeFHyg datasette-socrata simonw/datasette-socrata 0 simonw 9599 https://github.com/simonw/datasette-socrata Import data from Socrata into Datasette 0 2022-06-08T15:13:44Z 2022-06-09T21:13:34Z 2022-06-17T20:29:53Z   38 0 0 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 [] 0 1 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-socrata [![PyPI](https://img.shields.io/pypi/v/datasette-socrata.svg)](https://pypi.org/project/datasette-socrata/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-socrata?include_prereleases&label=changelog)](https://github.com/simonw/datasette-socrata/releases) [![Tests](https://github.com/simonw/datasette-socrata/workflows/Test/badge.svg)](https://github.com/simonw/datasette-socrata/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-socrata/blob/main/LICENSE) Import data from Socrata into Datasette ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-socrata ## Usage Make sure you have [enabled WAL mode](https://til.simonwillison.net/sqlite/enabling-wal-mode) on your database files before using this plugin. Once installed, an interface for importing data from Socrata will become available at this URL: /-/import-socrata Users will be able to paste in a URL to a dataset on Socrata in order to initialize an import. You can also pre-fill the form by passing a `?url=` parameter, for example: /-/import-socrata?url=https://data.sfgov.org/City-Infrastructure/Street-Tree-List/tkzw-k3nq Any database that is attached to Datasette, is NOT loaded as immutable (with the `-i` option) and that has WAL mode enabled will be available for users to import data into. The `import-socrata` permission governs access. By default the `root` actor (accessible using `datasette --root` to start Datasette) is granted that permission. You can use permission plugins such as [datasette-permissions-sql](https://github.com/simonw/datasette-permissions-sql) to grant additional access to other users. ## Configuration If you only want Socrata imports to be allowed to a specific database, you can configure that using plugin configration in `metadata.yml`: ```yaml plugins: datasette-socrata: database: socrata ``` ## Development To set up this… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-socrata" class="anchor" aria-hidden="true" href="#user-content-datasette-socrata"><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-socrata</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-socrata/" rel="nofollow"><img src="https://camo.githubusercontent.com/db40380ae3f84b80e55f3156dd6039851796a73ae5eb79e839c54dc78bc28c28/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d736f63726174612e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-socrata.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-socrata/releases"><img src="https://camo.githubusercontent.com/d093beb5cfaa4caa322dc585e63996f01f1fd16cbe6cbc6f05cb9db54c7b88ec/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d736f63726174613f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-socrata?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-socrata/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-socrata/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-socrata/blob/main/LICENSE"><img src="https://camo.github… 1 public 0      
506026919 R_kgDOHilbpw datasette-scale-to-zero simonw/datasette-scale-to-zero 0 simonw 9599 https://github.com/simonw/datasette-scale-to-zero Quit Datasette if it has not received traffic for a specified time period 0 2022-06-21T22:49:04Z 2022-07-13T14:02:31Z 2022-08-05T22:29:17Z https://datasette.io/plugins/datasette-scale-to-zero 22 8 8 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin"] 0 0 8 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-scale-to-zero [![PyPI](https://img.shields.io/pypi/v/datasette-scale-to-zero.svg)](https://pypi.org/project/datasette-scale-to-zero/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-scale-to-zero?include_prereleases&label=changelog)](https://github.com/simonw/datasette-scale-to-zero/releases) [![Tests](https://github.com/simonw/datasette-scale-to-zero/workflows/Test/badge.svg)](https://github.com/simonw/datasette-scale-to-zero/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-scale-to-zero/blob/main/LICENSE) Quit Datasette if it has not received traffic for a specified time period Some hosting providers such as [Fly](https://fly.io/) offer a scale to zero mechanism, where servers can shut down and will be automatically started when new traffic arrives. This plugin can be used to configure Datasette to quit X minutes (or seconds, or hours) after the last request it received. It can also cause the Datasette server to exit after a configured maximum time whether or not it is receiving traffic. ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-scale-to-zero ## Configuration This plugin will only take effect if it has been configured. Add the following to your ``metadata.json`` or ``metadata.yml`` configuration file: ```json { "plugins": { "datasette-scale-to-zero": { "duration": "10m" } } } ``` This will cause Datasette to quit if it has not received any HTTP traffic for 10 minutes. You can set this value using a suffix of `m` for minutes, `h` for hours or `s` for seconds. To cause Datasette to exit if the server has been running for longer than a specific time, use `"max-age"`: ```json { "plugins": { "datasette-scale-to-zero": { "max-age": "10h" } } } ``` This example will exit the Datasette server if it has been running for more than ten hours. You can… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-scale-to-zero" class="anchor" href="#user-content-datasette-scale-to-zero" aria-hidden="true"><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-scale-to-zero</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-scale-to-zero/" rel="nofollow"><img src="https://camo.githubusercontent.com/ca2386dea8d6d4b851a3603de67aefac24923128b004780fa51d9c4b8d0ff1c6/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7363616c652d746f2d7a65726f2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-scale-to-zero.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-scale-to-zero/releases"><img src="https://camo.githubusercontent.com/096b12a9ae4fda1fae3c316e4b4625210e2a51100ed34dd764c7baf7f15fd266/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7363616c652d746f2d7a65726f3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-scale-to-zero?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-scale-to-zero/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-scale-to-zero/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github… 1 public 0   0  
508461227 R_kgDOHk6Aqw s3-ocr simonw/s3-ocr 0 simonw 9599 https://github.com/simonw/s3-ocr Tools for running OCR against files stored in S3 0 2022-06-28T21:33:09Z 2022-08-10T21:24:45Z 2022-08-10T04:43:17Z   41 63 63 Python 1 1 1 1 0 3 0 0 7 Apache License 2.0 apache-2.0 ["ocr", "s3", "textract"] 3 7 63 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     3 2 # s3-ocr [![PyPI](https://img.shields.io/pypi/v/s3-ocr.svg)](https://pypi.org/project/s3-ocr/) [![Changelog](https://img.shields.io/github/v/release/simonw/s3-ocr?include_prereleases&label=changelog)](https://github.com/simonw/s3-ocr/releases) [![Tests](https://github.com/simonw/s3-ocr/workflows/Test/badge.svg)](https://github.com/simonw/s3-ocr/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/s3-ocr/blob/master/LICENSE) Tools for running OCR against files stored in S3 Background on this project: [s3-ocr: Extract text from PDF files stored in an S3 bucket](https://simonwillison.net/2022/Jun/30/s3-ocr/) ## Installation Install this tool using `pip`: pip install s3-ocr ## Demo You can see the results of running this tool against three PDFs from the Internet Archive ([one](https://archive.org/details/unmaskingrobert00houdgoog), [two](https://archive.org/details/practicalmagicia00harr), [three](https://archive.org/details/latestmagicbeing00hoff)) in [this example table](https://s3-ocr-demo.datasette.io/pages/pages?_facet=path#facet-path) hosted using [Datasette](https://datasette.io/). ## Starting OCR against PDFs in a bucket The `start` command takes a list of keys and submits them to [Textract](https://aws.amazon.com/textract/) for OCR processing. You need to have AWS configured using environment variables, credentials file in your home directory or a JSON or INI file generated using [s3-credentials](https://datasette.io/tools/s3-credentials). You can start the process running like this: s3-ocr start name-of-your-bucket my-pdf-file.pdf The paths you specify should be paths within the bucket. If you stored your PDF files in folders inside the bucket it should look like this: s3-ocr start name-of-your-bucket path/to/one.pdf path/to/two.pdf OCR can take some time. The results of the OCR will be stored in `textract-output` in your bucket. To process every file in the bucket with a `.pdf` extension use `--all`: … <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-s3-ocr" class="anchor" href="#user-content-s3-ocr" aria-hidden="true"><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>s3-ocr</h1> <p dir="auto"><a href="https://pypi.org/project/s3-ocr/" rel="nofollow"><img src="https://camo.githubusercontent.com/697cb78ed5f8b2955201be9925084bf6c5603a1cebc448d174f5684ae1453d68/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73332d6f63722e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/s3-ocr.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/s3-ocr/releases"><img src="https://camo.githubusercontent.com/a5fa08d6edb96e5b9f55b10efcb2820fdb2168be4a766b9a38a87da938251c66/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f73332d6f63723f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/s3-ocr?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/s3-ocr/actions?query=workflow%3ATest"><img src="https://github.com/simonw/s3-ocr/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/s3-ocr/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e736… 1 public 0   0  
510136835 R_kgDOHmgSAw datasette-expose-env simonw/datasette-expose-env 0 simonw 9599 https://github.com/simonw/datasette-expose-env Datasette plugin to expose selected environment variables at /-/env for debugging 0 2022-07-03T21:14:29Z 2022-07-03T21:27:12Z 2022-07-03T21:28:55Z https://datasette.io/plugins/datasette-expose-env 0 0 0 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 ["datasette", "datasette-plugin"] 0 0 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-expose-env [![PyPI](https://img.shields.io/pypi/v/datasette-expose-env.svg)](https://pypi.org/project/datasette-expose-env/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-expose-env?include_prereleases&label=changelog)](https://github.com/simonw/datasette-expose-env/releases) [![Tests](https://github.com/simonw/datasette-expose-env/workflows/Test/badge.svg)](https://github.com/simonw/datasette-expose-env/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-expose-env/blob/main/LICENSE) Datasette plugin to expose selected environment variables at `/-/env` for debugging ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-expose-env ## Configuration Decide on a list of environment variables you would like to expose, then add the following to your `metadata.yml` configuration: ```yaml plugins: datasette-expose-env: - ENV_VAR_1 - ENV_VAR_2 - ENV_VAR_3 ``` If you are using JSON in a `metadata.json` file use the following: ```json { "plugins": { "datasette-expose-env": [ "ENV_VAR_1", "ENV_VAR_2", "ENV_VAR_3" ] } } ``` Visit `/-/env` on your Datasette instance to see the values of the environment variables. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-expose-env python3 -m venv venv source venv/bin/activate 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 dir="auto"><a id="user-content-datasette-expose-env" class="anchor" aria-hidden="true" href="#user-content-datasette-expose-env"><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-expose-env</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-expose-env/" rel="nofollow"><img src="https://camo.githubusercontent.com/517c6344ee172d57f8ff5e4fcd9342e7ecfec45aababd88e8e85f53c9ba43ece/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6578706f73652d656e762e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-expose-env.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-expose-env/releases"><img src="https://camo.githubusercontent.com/070f8badacd8aece25028f405f9622f5a9e066d0252971b3cda58801c04c3105/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6578706f73652d656e763f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-expose-env?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-expose-env/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-expose-env/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-expose-env/blob/m… 1 public 0 {"id": 400878073, "node_id": "MDEwOlJlcG9zaXRvcnk0MDA4NzgwNzM=", "name": "datasette-plugin-template-repository", "full_name": "simonw/datasette-plugin-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/datasette-plugin-template-repository", "description": "GitHub template repository for creating new Datasette plugins, using the simonw/datasette-plugin cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository", "forks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/issues/events{/numbe… 0  
511787166 R_kgDOHoFAng sqlite-comprehend simonw/sqlite-comprehend 0 simonw 9599 https://github.com/simonw/sqlite-comprehend Tools for running data in a SQLite database through AWS Comprehend 0 2022-07-08T06:26:15Z 2022-07-11T21:44:34Z 2022-07-12T14:21:42Z   77 6 6 Python 1 1 1 1 0 0 0 0 1 Apache License 2.0 apache-2.0 [] 0 1 6 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # sqlite-comprehend [![PyPI](https://img.shields.io/pypi/v/sqlite-comprehend.svg)](https://pypi.org/project/sqlite-comprehend/) [![Changelog](https://img.shields.io/github/v/release/simonw/sqlite-comprehend?include_prereleases&label=changelog)](https://github.com/simonw/sqlite-comprehend/releases) [![Tests](https://github.com/simonw/sqlite-comprehend/workflows/Test/badge.svg)](https://github.com/simonw/sqlite-comprehend/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/sqlite-comprehend/blob/master/LICENSE) Tools for running data in a SQLite database through [AWS Comprehend](https://aws.amazon.com/comprehend/) See [sqlite-comprehend: run AWS entity extraction against content in a SQLite database](https://simonwillison.net/2022/Jul/11/sqlite-comprehend/) for background on this project. ## Installation Install this tool using `pip`: pip install sqlite-comprehend ## Demo You can see examples of tables generated using this command here: - [comprehend_entities](https://datasette.simonwillison.net/simonwillisonblog/comprehend_entities) - the extracted entities, classified by type - [blog_entry_comprehend_entities](https://datasette.simonwillison.net/simonwillisonblog/blog_entry_comprehend_entities) - a table relating entities to the entries that they appear in - [comprehend_entity_types](https://datasette.simonwillison.net/simonwillisonblog/comprehend_entity_types) - a small lookup table of entity types ## Configuration You will need AWS credentials with the `comprehend:BatchDetectEntities` [IAM permission](https://docs.aws.amazon.com/comprehend/latest/dg/access-control-managing-permissions.html). You can configure credentials [using these instructions](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html). You can also save them to a JSON or INI configuration file and pass them to the command using `-a credentials.ini`, or pass them using the `--access-key` and `--secret-key` options. ## Entity ex… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-sqlite-comprehend" class="anchor" aria-hidden="true" href="#user-content-sqlite-comprehend"><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-comprehend</h1> <p dir="auto"><a href="https://pypi.org/project/sqlite-comprehend/" rel="nofollow"><img src="https://camo.githubusercontent.com/469666373ceff91e6d61dd34291b32805e10d84b0499d1d671f5379190a6358f/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73716c6974652d636f6d70726568656e642e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/sqlite-comprehend.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/sqlite-comprehend/releases"><img src="https://camo.githubusercontent.com/3af3baa88364e1d1baa0619b4bb45a483a453734d0b69c5aaf50f3e18e86193d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f73716c6974652d636f6d70726568656e643f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/sqlite-comprehend?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/sqlite-comprehend/actions?query=workflow%3ATest"><img src="https://github.com/simonw/sqlite-comprehend/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/sqlite-comprehend/blob/master/LICENSE"><img src="https://camo.gith… 1 public 0   0  
526978148 R_kgDOH2kMZA datasette-mp3-audio simonw/datasette-mp3-audio 0 simonw 9599 https://github.com/simonw/datasette-mp3-audio Turn .mp3 URLs into an audio player in the Datasette interface 0 2022-08-20T16:20:06Z 2022-08-21T04:49:01Z 2022-08-21T06:43:00Z   18 1 1 Python 1 1 1 1 0 1 0 0 1 Apache License 2.0 apache-2.0 [] 1 1 1 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 1 # datasette-mp3-audio [![PyPI](https://img.shields.io/pypi/v/datasette-mp3-audio.svg)](https://pypi.org/project/datasette-mp3-audio/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-mp3-audio?include_prereleases&label=changelog)](https://github.com/simonw/datasette-mp3-audio/releases) [![Tests](https://github.com/simonw/datasette-mp3-audio/workflows/Test/badge.svg)](https://github.com/simonw/datasette-mp3-audio/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-mp3-audio/blob/main/LICENSE) Turn .mp3 URLs into an audio player in the Datasette interface ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-mp3-audio ## Demo Try this plugin at [https://scotrail.datasette.io/scotrail/announcements](https://scotrail.datasette.io/scotrail/announcements) The demo uses ScotRail train announcements from [matteason/scotrail-announcements-june-2022](https://github.com/matteason/scotrail-announcements-june-2022). ## Usage Once installed, any cells with a value that ends in `.mp3` and starts with either `http://` or `/` or `https://` will be turned into an embedded HTML audio element like this: ```html <audio controls src="... value ..."><a href="...">Download MP3</a></audio> ``` A "Play X MP3s on this page" button will be added to athe top of any table page listing more than one MP3. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-mp3-audio python3 -m venv venv source venv/bin/activate 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 dir="auto"><a id="user-content-datasette-mp3-audio" class="anchor" aria-hidden="true" href="#user-content-datasette-mp3-audio"><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-mp3-audio</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-mp3-audio/" rel="nofollow"><img src="https://camo.githubusercontent.com/be406dad915277ef158f3ac64acd7eaa1935dadb232dba65be9ac0d88488aaf6/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6d70332d617564696f2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-mp3-audio.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-mp3-audio/releases"><img src="https://camo.githubusercontent.com/7efb947563daf991f6c300a68a7a14f92ec115507ae8e4771a32c2199dd0260d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6d70332d617564696f3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-mp3-audio?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-mp3-audio/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-mp3-audio/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-mp3-audio/blob/main/LICENSE"><… 1 public 0 {"id": 400878073, "node_id": "MDEwOlJlcG9zaXRvcnk0MDA4NzgwNzM=", "name": "datasette-plugin-template-repository", "full_name": "simonw/datasette-plugin-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/datasette-plugin-template-repository", "description": "GitHub template repository for creating new Datasette plugins, using the simonw/datasette-plugin cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository", "forks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/issues/events{/numbe… 0  
528611541 R_kgDOH4H41Q datasette-multiline-links simonw/datasette-multiline-links 0 simonw 9599 https://github.com/simonw/datasette-multiline-links Make multiple newline separated URLs clickable in Datasette 0 2022-08-24T22:16:30Z 2022-08-24T22:16:52Z 2022-08-24T22:56:16Z   12 0 0 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-multiline-links [![PyPI](https://img.shields.io/pypi/v/datasette-multiline-links.svg)](https://pypi.org/project/datasette-multiline-links/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-multiline-links?include_prereleases&label=changelog)](https://github.com/simonw/datasette-multiline-links/releases) [![Tests](https://github.com/simonw/datasette-multiline-links/workflows/Test/badge.svg)](https://github.com/simonw/datasette-multiline-links/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-multiline-links/blob/main/LICENSE) Make multiple newline separated URLs clickable in Datasette ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-multiline-links ## Demo Try this plugin out against a [Google Sheets spreadsheet](https://docs.google.com/spreadsheets/d/1wZhPLMCHKJvwOkP4juclhjFgqIY8fQFMemwKL2c64vk) of previously featured datasets from [Data is Plural](https://www.data-is-plural.com/) using [Datasette Lite](https://lite.datasette.io/) here: * <a href="https://lite.datasette.io/?install=datasette-multiline-links&csv=https://docs.google.com/spreadsheets/d/1wZhPLMCHKJvwOkP4juclhjFgqIY8fQFMemwKL2c64vk/export?format=csv#/data?sql=select+edition%2C+headline%2C+text%2C+links%2C+hattips+from+export+where%0Atext+like+'%25'+||+%3Aq+||+'%25'+or+headline+like+'%25'+||+%3Aq+||+'%25'+order+by+edition+desc&q=loans">Demo this plugin in Datasette Lite</a> ## Usage Once installed, if a cell has contents like this: ``` https://example.com Not a link https://google.com ``` It will be rendered as: ```html <a href="https://example.com">https://example.com</a> Not a link <a href="https://google.com">https://google.com</a> ``` ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-multiline-links python3 -m venv venv source venv/bin/activate Now install the dependencies a… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-multiline-links" class="anchor" aria-hidden="true" href="#user-content-datasette-multiline-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-multiline-links</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-multiline-links/" rel="nofollow"><img src="https://camo.githubusercontent.com/059c99528ca3f757a565a1430c1310891efcace69d475fbdb914d16f879f8592/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d6d756c74696c696e652d6c696e6b732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-multiline-links.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-multiline-links/releases"><img src="https://camo.githubusercontent.com/5c3c310bb49e90c51aa56403feccb12f948067586b18dc3f1e32833756259b7e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d6d756c74696c696e652d6c696e6b733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-multiline-links?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-multiline-links/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-multiline-links/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></… 1 public 0 {"id": 400878073, "node_id": "MDEwOlJlcG9zaXRvcnk0MDA4NzgwNzM=", "name": "datasette-plugin-template-repository", "full_name": "simonw/datasette-plugin-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/datasette-plugin-template-repository", "description": "GitHub template repository for creating new Datasette plugins, using the simonw/datasette-plugin cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository", "forks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/issues/events{/numbe… 0  
530399214 R_kgDOH50_7g datasette-sitemap simonw/datasette-sitemap 0 simonw 9599 https://github.com/simonw/datasette-sitemap Generate sitemap.xml for Datasette sites 0 2022-08-29T21:22:46Z 2022-08-29T23:04:23Z 2022-08-30T17:59:53Z   25 0 0 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-sitemap [![PyPI](https://img.shields.io/pypi/v/datasette-sitemap.svg)](https://pypi.org/project/datasette-sitemap/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-sitemap?include_prereleases&label=changelog)](https://github.com/simonw/datasette-sitemap/releases) [![Tests](https://github.com/simonw/datasette-sitemap/workflows/Test/badge.svg)](https://github.com/simonw/datasette-sitemap/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-sitemap/blob/main/LICENSE) Generate sitemap.xml for Datasette sites ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-sitemap ## Demo This plugin is used for the sitemap on [til.simonwillison.net](https://til.simonwillison.net/): - https://til.simonwillison.net/sitemap.xml Here's [the configuration](https://github.com/simonw/til/blob/d4f67743a90a67100b46145986b2dec6f8d96583/metadata.yaml#L14-L16) used for that sitemap. ## Usage Once configured, this plugin adds a sitemap at `/sitemap.xml` with a list of URLs. This list is defined using a SQL query in `metadata.json` (or `.yml`) that looks like this: ```json { "plugins": { "datasette-sitemap": { "query": "select '/' || id as path from my_table" } } } ``` Using `metadata.yml` allows for multi-line SQL queries which can be easier to maintain: ```yaml plugins: datasette-sitemap: query: | select '/' || id as path from my_table ``` The SQL query must return a column called `path`. The values in this column must begin with a `/`. They will be used to generate a sitemap that looks like this: ```xml <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://example.com/1</loc></url> <url><loc>https://example.com/2</loc></url> </urlset> ``` You can use ``UNION`` in your SQL query to combine results from multiple tables, or include liter… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-sitemap" class="anchor" aria-hidden="true" href="#user-content-datasette-sitemap"><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-sitemap</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-sitemap/" rel="nofollow"><img src="https://camo.githubusercontent.com/6771365acdee2a47414d423ce45cba60d99dbc6a20fa98637c0617476f8053da/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d736974656d61702e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-sitemap.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sitemap/releases"><img src="https://camo.githubusercontent.com/4ceed1473baea92d47265f3ec83d36d6218a335777f158e5785a7033a2affba6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d736974656d61703f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-sitemap?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sitemap/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-sitemap/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sitemap/blob/main/LICENSE"><img src="https://camo.github… 1 public 0 {"id": 400878073, "node_id": "MDEwOlJlcG9zaXRvcnk0MDA4NzgwNzM=", "name": "datasette-plugin-template-repository", "full_name": "simonw/datasette-plugin-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/datasette-plugin-template-repository", "description": "GitHub template repository for creating new Datasette plugins, using the simonw/datasette-plugin cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository", "forks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/issues/events{/numbe… 0  
532404547 R_kgDOH7vZQw datasette-render-image-tags simonw/datasette-render-image-tags 0 simonw 9599 https://github.com/simonw/datasette-render-image-tags Turn any URLs ending in .jpg/.png/.gif into img tags with width 200 0 2022-09-04T00:36:44Z 2022-09-04T00:37:13Z 2022-09-04T00:48:32Z   10 0 0 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-render-image-tags [![PyPI](https://img.shields.io/pypi/v/datasette-render-image-tags.svg)](https://pypi.org/project/datasette-render-image-tags/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-render-image-tags?include_prereleases&label=changelog)](https://github.com/simonw/datasette-render-image-tags/releases) [![Tests](https://github.com/simonw/datasette-render-image-tags/workflows/Test/badge.svg)](https://github.com/simonw/datasette-render-image-tags/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-render-image-tags/blob/main/LICENSE) Turn any URLs ending in .jpg/.png/.gif into img tags with width 200 ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-render-image-tags ## Usage Once installed, any cells contaning a URL that ends with `.png` or `.jpg` or `.jpeg` or `.gif` will be rendered using an image tag, with a width of 200px. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-render-image-tags python3 -m venv venv source venv/bin/activate 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 dir="auto"><a id="user-content-datasette-render-image-tags" class="anchor" aria-hidden="true" href="#user-content-datasette-render-image-tags"><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-image-tags</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-render-image-tags/" rel="nofollow"><img src="https://camo.githubusercontent.com/57f7abc8fd4b0dd9d66333a0711ecae79dd3fec5e13057e175624b6ceded2cf3/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d72656e6465722d696d6167652d746167732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-render-image-tags.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-render-image-tags/releases"><img src="https://camo.githubusercontent.com/41d793901ad12364d0a8e2f28a0e5f972129ebd4816b0db29500eb2eaf2d6f9d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d72656e6465722d696d6167652d746167733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-render-image-tags?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-render-image-tags/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-render-image-tags/workflows/Test/badge.svg" alt="Tests" s… 1 public 0 {"id": 400878073, "node_id": "MDEwOlJlcG9zaXRvcnk0MDA4NzgwNzM=", "name": "datasette-plugin-template-repository", "full_name": "simonw/datasette-plugin-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/datasette-plugin-template-repository", "description": "GitHub template repository for creating new Datasette plugins, using the simonw/datasette-plugin cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository", "forks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/issues/events{/numbe… 0  
534735639 R_kgDOH99rFw datasette-sandstorm-support simonw/datasette-sandstorm-support 0 simonw 9599 https://github.com/simonw/datasette-sandstorm-support Authentication and permissions for Datasette on Sandstorm 0 2022-09-09T17:11:04Z 2022-09-09T17:36:46Z 2022-09-16T17:14:12Z   15 1 1 Python 1 1 1 1 0 1 0 0 1 Apache License 2.0 apache-2.0 [] 1 1 1 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     1 2 # datasette-sandstorm-support [![PyPI](https://img.shields.io/pypi/v/datasette-sandstorm-support.svg)](https://pypi.org/project/datasette-sandstorm-support/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-sandstorm-support?include_prereleases&label=changelog)](https://github.com/simonw/datasette-sandstorm-support/releases) [![Tests](https://github.com/simonw/datasette-sandstorm-support/workflows/Test/badge.svg)](https://github.com/simonw/datasette-sandstorm-support/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-sandstorm-support/blob/main/LICENSE) Authentication and permissions for Datasette on Sandstorm ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-sandstorm-support ## Usage This plugin is part of [datasette-sandstorm](https://github.com/ocdtrekkie/datasette-sandstorm). ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-sandstorm-support python3 -m venv venv source venv/bin/activate 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 dir="auto"><a id="user-content-datasette-sandstorm-support" class="anchor" aria-hidden="true" href="#user-content-datasette-sandstorm-support"><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-sandstorm-support</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-sandstorm-support/" rel="nofollow"><img src="https://camo.githubusercontent.com/6e32b5bcf5e4e48dcb4a2ea4c18cd41da494afb1c48d2458ff9b01f0ec485495/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d73616e6473746f726d2d737570706f72742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-sandstorm-support.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sandstorm-support/releases"><img src="https://camo.githubusercontent.com/ed98d1cc299400313c2b6f5f65227b2c41429724e4b09b44581cd0653ce654c1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d73616e6473746f726d2d737570706f72743f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-sandstorm-support?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-sandstorm-support/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-sandstorm-support/workflows/Test/badge.svg" alt="Tests" s… 1 public 0 {"id": 400878073, "node_id": "MDEwOlJlcG9zaXRvcnk0MDA4NzgwNzM=", "name": "datasette-plugin-template-repository", "full_name": "simonw/datasette-plugin-template-repository", "private": false, "owner": {"login": "simonw", "id": 9599, "node_id": "MDQ6VXNlcjk1OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9599?v=4", "gravatar_id": "", "url": "https://api.github.com/users/simonw", "html_url": "https://github.com/simonw", "followers_url": "https://api.github.com/users/simonw/followers", "following_url": "https://api.github.com/users/simonw/following{/other_user}", "gists_url": "https://api.github.com/users/simonw/gists{/gist_id}", "starred_url": "https://api.github.com/users/simonw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/simonw/subscriptions", "organizations_url": "https://api.github.com/users/simonw/orgs", "repos_url": "https://api.github.com/users/simonw/repos", "events_url": "https://api.github.com/users/simonw/events{/privacy}", "received_events_url": "https://api.github.com/users/simonw/received_events", "type": "User", "site_admin": false}, "html_url": "https://github.com/simonw/datasette-plugin-template-repository", "description": "GitHub template repository for creating new Datasette plugins, using the simonw/datasette-plugin cookiecutter template", "fork": false, "url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository", "forks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/forks", "keys_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/teams", "hooks_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/hooks", "issue_events_url": "https://api.github.com/repos/simonw/datasette-plugin-template-repository/issues/events{/numbe… 0  
545764894 R_kgDOIIe2Hg datasette-public simonw/datasette-public 0 simonw 9599 https://github.com/simonw/datasette-public Make specific Datasette tables visible to the public 0 2022-10-05T00:03:28Z 2022-10-05T00:03:40Z 2022-10-07T22:34:48Z   15 0 0 Python 1 1 1 1 0 0 0 0 0 Apache License 2.0 apache-2.0 [] 0 0 0 main {"admin": false, "maintain": false, "push": false, "triage": false, "pull": false}     0 1 # datasette-public [![PyPI](https://img.shields.io/pypi/v/datasette-public.svg)](https://pypi.org/project/datasette-public/) [![Changelog](https://img.shields.io/github/v/release/simonw/datasette-public?include_prereleases&label=changelog)](https://github.com/simonw/datasette-public/releases) [![Tests](https://github.com/simonw/datasette-public/workflows/Test/badge.svg)](https://github.com/simonw/datasette-public/actions?query=workflow%3ATest) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/simonw/datasette-public/blob/main/LICENSE) Make specific Datasette tables visible to the public ## Installation Install this plugin in the same environment as Datasette. datasette install datasette-public ## Usage Any tables listed in the `_public_tables` table will be visible to the public, even if the rest of the Datasette instance does not allow anonymous access. The root user (and any user with the new `public-tables` permission) will get a new option in the table action menu allowing them to toggle a table between public and private. Installing this plugin also causes `allow-sql` permission checks to fall back to checking if the user has access to the entire database. This is to avoid users with access to a single public table being able to access data from other tables using the `?_where=` query string parameter. ## Configuration This plugin creates a new table in one of your databases called `_public_tables`. This table defaults to being created in the first database passed to Datasette. To create it in a different named database, use this plugin configuration: ```json { "plugins": { "datasette-public": { "database": "database_to_create_table_in" } } } ``` ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-public python3 -m venv venv source venv/bin/activate Now install the dependencies and test dependencies: pip install -e '.[test]' To run the test… <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-datasette-public" class="anchor" aria-hidden="true" href="#user-content-datasette-public"><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-public</h1> <p dir="auto"><a href="https://pypi.org/project/datasette-public/" rel="nofollow"><img src="https://camo.githubusercontent.com/1798aea770a4aa04657940b1f93ba819d45dca65244ab80f88ef88b148d3eb38/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7075626c69632e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-public.svg" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-public/releases"><img src="https://camo.githubusercontent.com/57a70736767e5fae2b3260d8f712e4727075426f1a0dcf7bf2acb8041a1c37a6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7075626c69633f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-public?include_prereleases&amp;label=changelog" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-public/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-public/workflows/Test/badge.svg" alt="Tests" style="max-width: 100%;"></a> <a href="https://github.com/simonw/datasette-public/blob/main/LICENSE"><img src="https://camo.githubusercontent.co… 1 public 0   0  

Next page

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 127.465ms