From 8790acfbf156ced2979c78352b559c0fbd776065 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Fri, 18 Oct 2019 12:22:23 -0700 Subject: [PATCH 1/5] Failing test for #597 --- tests/fixtures.py | 7 +++++++ tests/test_api.py | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/tests/fixtures.py b/tests/fixtures.py index dac28dc0..a4c32f36 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -178,6 +178,13 @@ def app_client_two_attached_databases(): ) +@pytest.fixture(scope="session") +def app_client_conflicting_database_names(): + yield from make_app_client( + extra_databases={"foo.db": EXTRA_DATABASE_SQL, "foo-bar.db": EXTRA_DATABASE_SQL} + ) + + @pytest.fixture(scope="session") def app_client_two_attached_databases_one_immutable(): yield from make_app_client( diff --git a/tests/test_api.py b/tests/test_api.py index cc00b780..71bb5a5e 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -7,6 +7,7 @@ from .fixtures import ( # noqa app_client_larger_cache_size, app_client_returned_rows_matches_page_size, app_client_two_attached_databases_one_immutable, + app_client_conflicting_database_names, app_client_with_cors, app_client_with_dot, generate_compound_rows, @@ -1652,3 +1653,20 @@ def test_cors(app_client_with_cors, path, status_code): response = app_client_with_cors.get(path) assert response.status == status_code assert "*" == response.headers["Access-Control-Allow-Origin"] + + +def test_common_prefix_database_names(app_client_conflicting_database_names): + # https://github.com/simonw/datasette/issues/597 + assert ["fixtures", "foo", "foo-bar"] == [ + d["name"] + for d in json.loads( + app_client_conflicting_database_names.get("/-/databases.json").body + ) + ] + for db_name, path in (("foo", "/foo.json"), ("foo-bar", "/foo-bar.json")): + assert ( + db_name + == json.loads(app_client_conflicting_database_names.get(path).body)[ + "database" + ] + ) From 1186ca1eac056e698cc56af3fe797bb21858f8bf Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Fri, 18 Oct 2019 15:18:24 -0700 Subject: [PATCH 2/5] Fix for #597 --- datasette/views/base.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/datasette/views/base.py b/datasette/views/base.py index db1d69d9..219630af 100644 --- a/datasette/views/base.py +++ b/datasette/views/base.py @@ -193,14 +193,14 @@ class DataView(BaseView): async def resolve_db_name(self, request, db_name, **kwargs): hash = None name = None - if "-" in db_name: - # Might be name-and-hash, or might just be - # a name with a hyphen in it - name, hash = db_name.rsplit("-", 1) - if name not in self.ds.databases: - # Try the whole name - name = db_name - hash = None + if db_name not in self.ds.databases and "-" in db_name: + # No matching DB found, maybe it's a name-hash? + name_bit, hash_bit = db_name.rsplit("-", 1) + if name_bit not in self.ds.databases: + raise NotFound("Database not found: {}".format(name)) + else: + name = name_bit + hash = hash_bit else: name = db_name # Verify the hash From 767e29c404d29000f8a5f6c7f1b232144050ec56 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Fri, 18 Oct 2019 15:30:20 -0700 Subject: [PATCH 3/5] Fix for Python 3.5 3.5 doesn't let you json.loads() on a bytes object --- tests/test_api.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 71bb5a5e..c2e9beb1 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1664,9 +1664,7 @@ def test_common_prefix_database_names(app_client_conflicting_database_names): ) ] for db_name, path in (("foo", "/foo.json"), ("foo-bar", "/foo-bar.json")): - assert ( - db_name - == json.loads(app_client_conflicting_database_names.get(path).body)[ - "database" - ] + data = json.loads( + app_client_conflicting_database_names.get(path).body.decode("utf8") ) + assert db_name == data["database"] From 8cc5a8dc35371f7d4353a4206b2d079f520c61cd Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Fri, 18 Oct 2019 15:40:31 -0700 Subject: [PATCH 4/5] Another 3.5 error I missed --- tests/test_api.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index c2e9beb1..826c00f3 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1660,7 +1660,9 @@ def test_common_prefix_database_names(app_client_conflicting_database_names): assert ["fixtures", "foo", "foo-bar"] == [ d["name"] for d in json.loads( - app_client_conflicting_database_names.get("/-/databases.json").body + app_client_conflicting_database_names.get("/-/databases.json").body.decode( + "utf8" + ) ) ] for db_name, path in (("foo", "/foo.json"), ("foo-bar", "/foo-bar.json")): From fe9d4a5ffeb898ef73e00377ef28ab7f30a3e4d0 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Fri, 18 Oct 2019 18:05:47 -0700 Subject: [PATCH 5/5] Release 0.30 --- docs/changelog.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 26d0f75c..e8dafa35 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,20 @@ Changelog ========= +.. _v0_30: + +0.30 (2019-10-18) +----------------- + +- Added ``/-/threads`` debugging page +- Allow ``EXPLAIN WITH...`` (`#583 `__) +- Button to format SQL - thanks, Tobias Kunze (`#136 `__) +- Sort databases on homepage by argument order - thanks, Tobias Kunze (`#585 `__) +- Display metadata footer on custom SQL queries - thanks, Tobias Kunze (`#589 `__) +- Use ``--platform=managed`` for ``publish cloudrun`` (`#587 `__) +- Fixed bug returning non-ASCII characters in CSV (`#584 `__) +- Fix for ``/foo`` v.s. ``/foo-bar`` bug (`#601 `__) + .. _v0_29_3: 0.29.3 (2019-09-02)