repos
20 rows where open_issues_count = 0, owner = 9599 and permissions = "{"admin": false, "push": false, "pull": false}"
This data as json, CSV (advanced)
Suggested facets: homepage, size, stargazers_count, watchers_count, forks_count, topics, forks, watchers, default_branch, network_count, subscribers_count, created_at (date), updated_at (date), pushed_at (date), topics (array)
id ▼ | node_id | name | full_name | private | owner | html_url | description | fork | created_at | updated_at | pushed_at | homepage | size | stargazers_count | watchers_count | language | has_issues | has_projects | has_downloads | has_wiki | has_pages | forks_count | archived | disabled | open_issues_count | license | topics | forks | open_issues | watchers | default_branch | permissions | temp_clone_token | organization | network_count | subscribers_count | readme | readme_html | allow_forking | visibility | is_template | template_repository | web_commit_signoff_required | has_discussions |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 [](https://pypi.org/project/datasette-jellyfish/) [](https://github.com/simonw/datasette-jellyfish/releases) [](https://github.com/simonw/datasette-jellyfish/actions?query=workflow%3ATest) [](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&label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-jellyfish/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-jellyfish/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-jellyfish/blob/main/LICENSE"><img src="https://camo.git… | ||||||||
175550127 | MDEwOlJlcG9zaXRvcnkxNzU1NTAxMjc= | yaml-to-sqlite | simonw/yaml-to-sqlite | 0 | simonw 9599 | https://github.com/simonw/yaml-to-sqlite | Utility for converting YAML files to SQLite | 0 | 2019-03-14T04:49:08Z | 2021-06-13T09:04:40Z | 2021-06-13T04:45:52Z | 19 | 36 | 36 | Python | 1 | 1 | 1 | 1 | 0 | 2 | 0 | 0 | 0 | Apache License 2.0 apache-2.0 | ["yaml", "sqlite", "datasette-io", "datasette-tool"] | 2 | 0 | 36 | main | {"admin": false, "push": false, "pull": false} | 2 | 1 | # yaml-to-sqlite [](https://pypi.org/project/yaml-to-sqlite/) [](https://github.com/simonw/yaml-to-sqlite/releases) [](https://github.com/simonw/yaml-to-sqlite/actions?query=workflow%3ATest) [](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&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 [](https://pypi.org/project/datasette-jq/) [](https://circleci.com/gh/simonw/datasette-jq) [](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… | |||||||||
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 [](https://pypi.org/project/datasette-rure/) [](https://circleci.com/gh/simonw/datasette-rure) [](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 [](https://pypi.org/project/datasette-atom/) [](https://github.com/simonw/datasette-atom/releases) [](https://github.com/simonw/datasette-atom/actions?query=workflow%3ATest) [](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&label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-atom/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-atom/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-atom/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4… | |||||||||
214299267 | MDEwOlJlcG9zaXRvcnkyMTQyOTkyNjc= | datasette-render-timestamps | simonw/datasette-render-timestamps | 0 | simonw 9599 | https://github.com/simonw/datasette-render-timestamps | Datasette plugin for rendering timestamps | 0 | 2019-10-10T22:50:50Z | 2020-10-17T11:09:42Z | 2020-03-22T17:57:17Z | 17 | 4 | 4 | Python | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | Apache License 2.0 apache-2.0 | ["datasette", "datasette-plugin", "datasette-io"] | 1 | 0 | 4 | master | {"admin": false, "push": false, "pull": false} | 1 | 2 | # datasette-render-timestamps [](https://pypi.org/project/datasette-render-timestamps/) [](https://circleci.com/gh/simonw/datasette-render-timestamps) [](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 [](https://pypi.org/project/datasette-haversine/) [](https://github.com/simonw/datasette-haversine/releases) [](https://github.com/simonw/datasette-haversine/actions?query=workflow%3ATest) [](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&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  [](https://pypi.org/project/sqlite-transform/) [](https://github.com/simonw/sqlite-transform/releases) [](https://github.com/simonw/sqlite-transform/actions?query=workflow%3ATest) [](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… | |||||||||
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 [](https://pypi.org/project/datasette-configure-asgi/) [](https://circleci.com/gh/simonw/datasette-configure-asgi) [](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… | |||||||||
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 [](https://pypi.org/project/datasette-mask-columns/) [](https://github.com/simonw/datasette-mask-columns/releases) [](https://github.com/simonw/datasette-mask-columns/actions?query=workflow%3ATest) [](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&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… | ||||||||
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 [](https://pypi.org/project/datasette-clone/) [](https://github.com/simonw/datasette-clone/releases) [](https://github.com/simonw/datasette-clone/actions?query=workflow%3ATest) [](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&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… | |||||||||
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 [](https://pypi.org/project/datasette-permissions-sql/) [](https://circleci.com/gh/simonw/datasette-permissions-sql) [](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:/… | |||||||||
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 [](https://pypi.org/project/sqlite-generate/) [](https://github.com/simonw/sqlite-generate/releases) [](https://github.com/simonw/sqlite-generate/blob/master/LICENSE) Tool for generating demo SQLite databases ## Installation Install this plugin using `pip`: $ pip install sqlite-generate ## Demo You can see a demo of the database generated using this command running in [Datasette](https://github.com/simonw/datasette) at https://sqlite-generate-demo.datasette.io/ The demo is generated using the following command: sqlite-generate demo.db --seed seed --fts --columns=10 --fks=0,3 --pks=0,2 ## Usage To generate a SQLite database file called `data.db` with 10 randomly named tables in it, run the following: sqlite-generate data.db You can use the `--tables` option to generate a different number of tables: sqlite-generate data.db --tables 20 You can run the command against the same database file multiple times to keep adding new tables, using different settings for each batch of generated tables. By default each table will contain a random number of rows between 0 and 200. You can customize this with the `--rows` option: sqlite-generate data.db --rows 20 This will insert 20 rows into each table. sqlite-generate data.db --rows 500,2000 This inserts a random number of rows between 500 and 2000 into each table. Each table will have 5 columns. You can change this using `--columns`: sqlite-generate data.db --columns 10 `--columns` can also accept a range: sqlite-generate data.db --columns 5,15 You can control the random number seed used with the `--seed` option. This will result in the exact same database file being created by multiple runs of the tool: sqlite-generate data.db --seed=myseed By default each table will contain betwee… | <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-sqlite-generate" class="anchor" aria-hidden="true" href="#user-content-sqlite-generate"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>sqlite-generate</h1> <p><a href="https://pypi.org/project/sqlite-generate/" rel="nofollow"><img src="https://camo.githubusercontent.com/f0bc12d9a036f8faadbe40bbc37caa416eadf33d6694322ca385c16f2302b575/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f73716c6974652d67656e65726174652e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/sqlite-generate.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/sqlite-generate/releases"><img src="https://camo.githubusercontent.com/8acbae82ad62477a2630aee86e3c2c6c498a06acc6fd6d6c08e51779ea3905de/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f73716c6974652d67656e65726174653f6c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/sqlite-generate?label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/sqlite-generate/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" style="max-width:100%;"… | ||||||||
275615947 | MDEwOlJlcG9zaXRvcnkyNzU2MTU5NDc= | datasette-glitch | simonw/datasette-glitch | 0 | simonw 9599 | https://github.com/simonw/datasette-glitch | Utilities to help run Datasette on Glitch | 0 | 2020-06-28T15:41:25Z | 2020-07-01T22:48:35Z | 2020-07-01T22:49:22Z | 3 | 1 | 1 | Python | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | ["glitch", "datasette", "datasette-plugin", "datasette-io"] | 0 | 0 | 1 | main | {"admin": false, "push": false, "pull": false} | 0 | 1 | # datasette-glitch [](https://pypi.org/project/datasette-glitch/) [](https://github.com/simonw/datasette-glitch/releases) [](https://github.com/simonw/datasette-glitch/blob/master/LICENSE) Utilities to help run Datasette on Glitch ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-glitch ## Usage This plugin outputs a special link which will sign you into Datasette as the root user. Click Tools -> Logs in the Glitch editor interface after your app starts to see the link. | <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-glitch" class="anchor" aria-hidden="true" href="#user-content-datasette-glitch"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>datasette-glitch</h1> <p><a href="https://pypi.org/project/datasette-glitch/" rel="nofollow"><img src="https://camo.githubusercontent.com/da8d1e55f6fa2edbfe632b0cb5b8b97a65d75b3e74cfe2c32992720b136f7fe3/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d676c697463682e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-glitch.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-glitch/releases"><img src="https://camo.githubusercontent.com/8609928bfae188a41e14d2e647a1805211a59fce8f113e4f3bc7a5e8dbcd44b6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d676c697463683f6c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-glitch?label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-glitch/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" style="max-… | ||||||||||
275624346 | MDEwOlJlcG9zaXRvcnkyNzU2MjQzNDY= | datasette-init | simonw/datasette-init | 0 | simonw 9599 | https://github.com/simonw/datasette-init | Ensure specific tables and views exist on startup | 0 | 2020-06-28T16:26:29Z | 2021-06-14T19:43:55Z | 2020-07-01T22:47:09Z | 9 | 1 | 1 | Python | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | [] | 0 | 0 | 1 | main | {"admin": false, "push": false, "pull": false} | 0 | 1 | # datasette-init [](https://pypi.org/project/datasette-init/) [](https://github.com/simonw/datasette-init/releases) [](https://github.com/simonw/datasette-init/blob/master/LICENSE) Ensure specific tables and views exist on startup ## Installation Install this plugin in the same environment as Datasette. $ pip install datasette-init ## Usage This plugin is configured using `metadata.json` (or `metadata.yaml`). ### Creating tables Add a block like this that specifies the tables you would like to ensure exist: ```json { "plugins": { "datasette-init": { "my_database": { "tables": { "dogs": { "columns": { "id": "integer", "name": "text", "age": "integer", "weight": "float" }, "pk": "id" } } } } } } ``` Any tables that do not yet exist will be created when Datasette first starts. Valid column types are `"integer"`, `"text"`, `"float"` and `"blob"`. The `"pk"` is optional, and is used to define the primary key. To define a compound primary key (across more than one column) use a list of column names here: ```json "pk": ["id1", "id2"] ``` ### Creating views The plugin can also be used to create views: ```json { "plugins": { "datasette-init": { "my_database": { "views": { "my_view": "select 1 + 1" } } } } } ``` Each view in the ``"views"`` block will be created when the Database first starts. If a view with the same name already exists it will be replaced with the new definition. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-init python3 -mvenv venv source venv/bin/activate Or if you are usin… | <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-init" class="anchor" aria-hidden="true" href="#user-content-datasette-init"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>datasette-init</h1> <p><a href="https://pypi.org/project/datasette-init/" rel="nofollow"><img src="https://camo.githubusercontent.com/83fefe5c408de5ede9ce3a712c8133a53de0da3cea828b513827c7d14c4c3cb2/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d696e69742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-init.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-init/releases"><img src="https://camo.githubusercontent.com/c60721d7193f69d423216b711462556b27b48be0c5b33e74b1831a2daea05bdc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d696e69743f6c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-init?label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-init/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7a4e719b1f3cf955/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License" data-canonical-src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" style="max-width:100%;"></a></p> <p… | ||||||||||
335137108 | MDEwOlJlcG9zaXRvcnkzMzUxMzcxMDg= | datasette-basemap | simonw/datasette-basemap | 0 | simonw 9599 | https://github.com/simonw/datasette-basemap | A basemap for Datasette and datasette-leaflet | 0 | 2021-02-02T01:49:09Z | 2021-02-03T21:56:20Z | 2021-02-03T21:56:18Z | https://datasette.io/plugins/datasette-basemap | 43 | 1 | 1 | Python | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | ["openstreetmap", "mbtiles", "datasette", "datasette-plugin", "datasette-io"] | 0 | 0 | 1 | main | {"admin": false, "push": false, "pull": false} | 0 | 1 | # datasette-basemap [](https://pypi.org/project/datasette-basemap/) [](https://github.com/simonw/datasette-basemap/releases) [](https://github.com/simonw/datasette-basemap/actions?query=workflow%3ATest) [](https://github.com/simonw/datasette-basemap/blob/main/LICENSE) A basemap for Datasette and datasette-leaflet ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-basemap ## Usage This plugin will make a `basemap` database available containing OpenStreetMap tiles for zoom levels 0-6 in the [mbtiles](https://github.com/mapbox/mbtiles-spec) format. It is designed for use with the [datasette-tiles](https://datasette.io/plugins/datasette-tiles) tile server plugin. ## Demo You can preview this map at https://datasette-tiles-demo.datasette.io/-/tiles/basemap and browse the database directly at https://datasette-tiles-demo.datasette.io/basemap ## License The data bundled with this package is © OpenStreetMap contributors, licensed under the [Open Data Commons Open Database License](https://opendatacommons.org/licenses/odbl/). See [this page](https://www.openstreetmap.org/copyright) for more details. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-basemap python3 -mvenv venv source venv/bin/activate Or if you are using `pipenv`: pipenv shell Now install the dependencies and tests: pip install -e '.[test]' To run the tests: pytest | <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-basemap" class="anchor" aria-hidden="true" href="#user-content-datasette-basemap"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>datasette-basemap</h1> <p><a href="https://pypi.org/project/datasette-basemap/" rel="nofollow"><img src="https://camo.githubusercontent.com/9e2030246117aed0c545320f2597b7cfefec254930d354c648b4a5ef1f695e4d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d626173656d61702e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-basemap.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-basemap/releases"><img src="https://camo.githubusercontent.com/7280ebff6265b28b5c3d37fe294e2bef782ad2cc64e0ca8281b119555e6ac485/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d626173656d61703f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-basemap?include_prereleases&label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-basemap/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-basemap/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-basemap/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e9… | |||||||||
335372050 | MDEwOlJlcG9zaXRvcnkzMzUzNzIwNTA= | download-tiles | simonw/download-tiles | 0 | simonw 9599 | https://github.com/simonw/download-tiles | Download map tiles and store them in an MBTiles database | 0 | 2021-02-02T17:37:49Z | 2021-05-29T07:22:58Z | 2021-02-16T04:19:59Z | https://datasette.io/tools/download-tiles | 26 | 9 | 9 | Python | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | Apache License 2.0 apache-2.0 | ["openstreetmap", "mbtiles", "datasette-io", "datasette-tool"] | 0 | 0 | 9 | main | {"admin": false, "push": false, "pull": false} | 0 | 1 | # download-tiles [](https://pypi.org/project/download-tiles/) [](https://github.com/simonw/download-tiles/releases) [](https://github.com/simonw/download-tiles/actions?query=workflow%3ATest) [](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&label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/download-tiles/actions?query=workflow%3ATest"><img src="https://github.com/simonw/download-tiles/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/download-tiles/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb7aa832afc0c7… | ||||||||
342126610 | MDEwOlJlcG9zaXRvcnkzNDIxMjY2MTA= | datasette-block | simonw/datasette-block | 0 | simonw 9599 | https://github.com/simonw/datasette-block | Block all access to specific path prefixes | 0 | 2021-02-25T04:51:08Z | 2021-02-25T08:18:28Z | 2021-02-25T05:03:45Z | https://datasette.io/plugins/datasette-block | 4 | 1 | 1 | Python | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | ["datasette", "datasette-plugin", "datasette-io"] | 0 | 0 | 1 | main | {"admin": false, "push": false, "pull": false} | 0 | 1 | # datasette-block [](https://pypi.org/project/datasette-block/) [](https://github.com/simonw/datasette-block/releases) [](https://github.com/simonw/datasette-block/actions?query=workflow%3ATest) [](https://github.com/simonw/datasette-block/blob/main/LICENSE) Block all access to specific path prefixes ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-block ## Configuration Add the following to `metadata.json` to block specific path prefixes: ```json { "plugins": { "datasette-block": { "prefixes": ["/all/"] } } } ``` This will cause a 403 error to be returned for any path beginning with `/all/`. This blocking happens as an ASGI wrapper around Datasette. ## Why would you need this? You almost always would not. I use it with `datasette-ripgrep` to block access to static assets for unauthenticated users. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-block python3 -mvenv venv source venv/bin/activate Or if you are using `pipenv`: pipenv shell Now install the dependencies and tests: pip install -e '.[test]' To run the tests: pytest | <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-block" class="anchor" aria-hidden="true" href="#user-content-datasette-block"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>datasette-block</h1> <p><a href="https://pypi.org/project/datasette-block/" rel="nofollow"><img src="https://camo.githubusercontent.com/eedcb03a8e4f528e044cee8db9b02e79782b8a9bccf66bd239701d9d7a991984/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d626c6f636b2e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-block.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-block/releases"><img src="https://camo.githubusercontent.com/05cef47f53da7aaccdd3a18a809f166b816ac100f83757b2488082897269f5b4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d626c6f636b3f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-block?include_prereleases&label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-block/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-block/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-block/blob/main/LICENSE"><img src="https://camo.githubusercontent.com/1698104e976c681143eb0841f9675c6f802bb… | |||||||||
393999598 | MDEwOlJlcG9zaXRvcnkzOTM5OTk1OTg= | datasette-pyinstrument | simonw/datasette-pyinstrument | 0 | simonw 9599 | https://github.com/simonw/datasette-pyinstrument | Use pyinstrument to analyze Datasette page performance | 0 | 2021-08-08T15:33:29Z | 2021-08-08T15:50:54Z | 2021-08-08T15:50:52Z | 0 | 0 | 0 | Python | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | [] | 0 | 0 | 0 | main | {"admin": false, "push": false, "pull": false} | 0 | 1 | # datasette-pyinstrument [](https://pypi.org/project/datasette-pyinstrument/) [](https://github.com/simonw/datasette-pyinstrument/releases) [](https://github.com/simonw/datasette-pyinstrument/actions?query=workflow%3ATest) [](https://github.com/simonw/datasette-pyinstrument/blob/main/LICENSE) Use pyinstrument to analyze Datasette page performance ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-pyinstrument ## Usage Once installed, adding `?_pyinstrument=1` to any URL within Datasette will replace the output of that page with the pyinstrument profiler results for it. ## Demo You can see the output of this plugin at https://latest-with-plugins.datasette.io/fixtures/sortable?_pyinstrument=1 ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-pyinstrument python3 -mvenv venv source venv/bin/activate Or if you are using `pipenv`: pipenv shell Now install the dependencies and test dependencies: pip install -e '.[test]' To run the tests: pytest | <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-pyinstrument" class="anchor" aria-hidden="true" href="#user-content-datasette-pyinstrument"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>datasette-pyinstrument</h1> <p><a href="https://pypi.org/project/datasette-pyinstrument/" rel="nofollow"><img src="https://camo.githubusercontent.com/04eb20d5c908480064bd38f51a23efb993e1ab6cd8731310a7fd8762fbf0e589/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d7079696e737472756d656e742e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-pyinstrument.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-pyinstrument/releases"><img src="https://camo.githubusercontent.com/82a450100507a691eb342ecf1a1e328c5078b2d42918187061fe0f1255431fd7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d7079696e737472756d656e743f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-pyinstrument?include_prereleases&label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-pyinstrument/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-pyinstrument/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-pyinstrument/blo… | ||||||||||
394107614 | MDEwOlJlcG9zaXRvcnkzOTQxMDc2MTQ= | datasette-query-links | simonw/datasette-query-links | 0 | simonw 9599 | https://github.com/simonw/datasette-query-links | Turn SELECT queries returned by a query into links to execute them | 0 | 2021-08-09T01:16:59Z | 2021-08-09T04:31:40Z | 2021-08-09T02:56:40Z | 7 | 3 | 3 | Python | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | [] | 0 | 0 | 3 | main | {"admin": false, "push": false, "pull": false} | 0 | 1 | # datasette-query-links [](https://pypi.org/project/datasette-query-links/) [](https://github.com/simonw/datasette-query-links/releases) [](https://github.com/simonw/datasette-query-links/actions?query=workflow%3ATest) [](https://github.com/simonw/datasette-query-links/blob/main/LICENSE) Turn SELECT queries returned by a query into links to execute them ## Installation Install this plugin in the same environment as Datasette. $ datasette install datasette-query-links ## Usage This is an experimental plugin, requiring Datasette 0.59a1 or higher. Any SQL query that returns a value that itself looks like a valid SQL query will be converted into a link to execute that SQL query when it is displayed in the Datasette interface. These links will only show for valid SQL query - if a SQL query would return an error it will not be turned into a link. ## Demo * [Here's an example query](https://latest-with-plugins.datasette.io/fixtures?sql=select%0D%0A++%27select+*+from+%5Bfacetable%5D%27+as+query%0D%0Aunion%0D%0Aselect%0D%0A++%27select+sqlite_version()%27%0D%0Aunion%0D%0Aselect%0D%0A++%27select+this+is+invalid+SQL+so+will+not+be+linked%27) showing the plugin in action. ## Development To set up this plugin locally, first checkout the code. Then create a new virtual environment: cd datasette-query-links python3 -mvenv venv source venv/bin/activate Or if you are using `pipenv`: pipenv shell Now install the dependencies and test dependencies: pip install -e '.[test]' To run the tests: pytest | <div id="readme" class="md" data-path="README.md"><article class="markdown-body entry-content container-lg" itemprop="text"><h1><a id="user-content-datasette-query-links" class="anchor" aria-hidden="true" href="#user-content-datasette-query-links"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>datasette-query-links</h1> <p><a href="https://pypi.org/project/datasette-query-links/" rel="nofollow"><img src="https://camo.githubusercontent.com/3ab4d04fcda27408dfd62a12ac76681be62dfafccd5c0fffb3837512e08a60fb/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f6461746173657474652d71756572792d6c696e6b732e737667" alt="PyPI" data-canonical-src="https://img.shields.io/pypi/v/datasette-query-links.svg" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-query-links/releases"><img src="https://camo.githubusercontent.com/2889989730367edad93f0dd54b21beb27e4f8f5b68ae195dec3a4751353b5949/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f73696d6f6e772f6461746173657474652d71756572792d6c696e6b733f696e636c7564655f70726572656c6561736573266c6162656c3d6368616e67656c6f67" alt="Changelog" data-canonical-src="https://img.shields.io/github/v/release/simonw/datasette-query-links?include_prereleases&label=changelog" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-query-links/actions?query=workflow%3ATest"><img src="https://github.com/simonw/datasette-query-links/workflows/Test/badge.svg" alt="Tests" style="max-width:100%;"></a> <a href="https://github.com/simonw/datasette-query-links/blob/main/LICENSE… |
Advanced export
JSON shape: default, array, newline-delimited, object
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]);