{"database": "docs", "table": "sections", "rows": [["changelog:id147", "changelog", "id147", "0.19 (2018-04-16)", "This is the first preview of the new Datasette plugins mechanism. Only two\n                plugin hooks are available so far - for custom SQL functions and custom template\n                filters. There's plenty more to come - read  the documentation  and get involved in\n                 the tracking ticket  if you\n                have feedback on the direction so far. \n             \n                 \n                     Fix for  _sort_desc=sortable_with_nulls  test, refs  #216 \n                 \n                 \n                     Fixed  #216  - paginate correctly when sorting by nullable column \n                 \n                 \n                     Initial documentation for plugins, closes  #213 \n                     https://docs.datasette.io/en/stable/plugins.html \n                 \n                 \n                     New  --plugins-dir=plugins/  option ( #212 ) \n                     New option causing Datasette to load and evaluate all of the Python files in\n                        the specified directory and register any plugins that are defined in those\n                        files. \n                     This new option is available for the following commands: \n                     datasette serve mydb.db --plugins-dir=plugins/\ndatasette publish now/heroku mydb.db --plugins-dir=plugins/\ndatasette package mydb.db --plugins-dir=plugins/ \n                 \n                 \n                     Start of the plugin system, based on pluggy ( #210 ) \n                     Uses  https://pluggy.readthedocs.io/  originally created for the py.test project \n                     We're starting with two plugin hooks: \n                     prepare_connection(conn) \n                     This is called when a new SQLite connection is created. It can be used to register custom SQL functions. \n                     prepare_jinja2_environment(env) \n                     This is called with the Jinja2 environment. It can be used to register custom template tags and filters. \n                     An example plugin which uses these two hooks can be found at  https://github.com/simonw/datasette-plugin-demos  or installed using  pip install datasette-plugin-demos \n                     Refs  #14 \n                 \n                 \n                     Return HTTP 405 on InvalidUsage rather than 500. [Russ Garrett] \n                     This also stops it filling up the logs. This happens for HEAD requests\n                        at the moment - which perhaps should be handled better, but that's a\n                        different issue.", "[\"Changelog\"]", "[{\"href\": \"https://docs.datasette.io/en/stable/plugins.html\", \"label\": \"the documentation\"}, {\"href\": \"https://github.com/simonw/datasette/issues/14\", \"label\": \"the tracking ticket\"}, {\"href\": \"https://github.com/simonw/datasette/issues/216\", \"label\": \"#216\"}, {\"href\": \"https://github.com/simonw/datasette/issues/216\", \"label\": \"#216\"}, {\"href\": \"https://github.com/simonw/datasette/issues/213\", \"label\": \"#213\"}, {\"href\": \"https://docs.datasette.io/en/stable/plugins.html\", \"label\": \"https://docs.datasette.io/en/stable/plugins.html\"}, {\"href\": \"https://github.com/simonw/datasette/issues/212\", \"label\": \"#212\"}, {\"href\": \"https://github.com/simonw/datasette/issues/14\", \"label\": \"#210\"}, {\"href\": \"https://pluggy.readthedocs.io/\", \"label\": \"https://pluggy.readthedocs.io/\"}, {\"href\": \"https://github.com/simonw/datasette-plugin-demos\", \"label\": \"https://github.com/simonw/datasette-plugin-demos\"}, {\"href\": \"https://github.com/simonw/datasette/issues/14\", \"label\": \"#14\"}]"]], "columns": ["id", "page", "ref", "title", "content", "breadcrumbs", "references"], "primary_keys": ["id"], "primary_key_values": ["changelog:id147"], "units": {}, "query_ms": 1.064162002876401}