From 0f36b8d767bc81d107d96d50a32d3bf1324babec Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Thu, 1 Oct 2020 15:38:38 -0700 Subject: [PATCH] Updated README ready for 0.3 release, closes #23 --- README.md | 34 +++++++++++++++++++++++++++++----- datasette-edit-schema.png | Bin 0 -> 25649 bytes 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 datasette-edit-schema.png diff --git a/README.md b/README.md index 4b0d104..2453356 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,14 @@ Datasette plugin for modifying table schemas -## Features (planned) +## 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 -* Modify the type of columns in a table -* Add new columns to a table -* Create a new empty table from scratch ## Installation @@ -27,7 +28,30 @@ Navigate to `/-/edit-schema/dbname/tablename` on your Datasette instance to edit 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. 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. + +## Screenshot + +![datasette-edit-schema interface](https://raw.githubusercontent.com/simonw/datasette-edit-schema/main/datasette-edit-schema.png) + +## Development + +To set up this plugin locally, first checkout the code. Then create a new virtual environment: + + cd datasette-edit-schema + 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 diff --git a/datasette-edit-schema.png b/datasette-edit-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..1d5699bd46278071c9c3b9a42d06d728f9154e9f GIT binary patch literal 25649 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 literal 0 HcmV?d00001