Skip to content

Commit deb6ae3

Browse files
committed
datasette-extract for datasette>=1.0a20
Refs simonw/datasette#2577
1 parent 52b24cc commit deb6ae3

File tree

4 files changed

+33
-31
lines changed

4 files changed

+33
-31
lines changed

.github/workflows/publish.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ jobs:
3030
deploy:
3131
runs-on: ubuntu-latest
3232
needs: [test]
33+
environment: release
34+
permissions:
35+
id-token: write
3336
steps:
3437
- uses: actions/checkout@v5
3538
- name: Set up Python
@@ -40,12 +43,10 @@ jobs:
4043
cache-dependency-path: pyproject.toml
4144
- name: Install dependencies
4245
run: |
43-
pip install setuptools wheel twine build
44-
- name: Publish
45-
env:
46-
TWINE_USERNAME: __token__
47-
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
46+
pip install setuptools wheel build
47+
- name: Build
4848
run: |
4949
python -m build
50-
twine upload dist/*
50+
- name: Publish
51+
uses: pypa/gh-action-pypi-publish@release/v1
5152

datasette_extract/__init__.py

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import asyncio
22
import llm
3-
from datasette import hookimpl, Response, NotFound, Permission, Forbidden
3+
from datasette import hookimpl, Response, NotFound, Forbidden
4+
from datasette.permissions import Action
5+
from datasette.resources import DatabaseResource, TableResource
46
from datasette_secrets import Secret, get_secret
57
from datetime import datetime, timezone
68
from sqlite_utils import Database
@@ -12,15 +14,11 @@
1214

1315

1416
@hookimpl
15-
def register_permissions(datasette):
17+
def register_actions(datasette):
1618
return [
17-
Permission(
19+
Action(
1820
name="datasette-extract",
19-
abbr=None,
2021
description="Use the extract tool to populate tables",
21-
takes_database=False,
22-
takes_resource=False,
23-
default=False,
2422
)
2523
]
2624

@@ -36,34 +34,32 @@ def register_secrets():
3634
]
3735

3836

39-
@hookimpl
40-
def permission_allowed(action, actor):
41-
if action == "datasette-extract" and actor and actor.get("id") == "root":
42-
return True
43-
44-
4537
def get_config(datasette):
4638
return datasette.plugin_config("datasette-extract") or {}
4739

4840

4941
async def can_extract(datasette, actor, database_name, to_table=None):
5042
if actor is None:
5143
return False
52-
reply_from_that = await datasette.permission_allowed(actor, "datasette-extract")
44+
reply_from_that = await datasette.allowed(actor=actor, action="datasette-extract")
5345
if not reply_from_that:
5446
return False
5547
if not to_table:
5648
# Need create-table for database
57-
can_create_table = await datasette.permission_allowed(
58-
actor, "create-table", resource=database_name
49+
can_create_table = await datasette.allowed(
50+
actor=actor,
51+
action="create-table",
52+
resource=DatabaseResource(database_name),
5953
)
6054
if not can_create_table:
6155
return False
6256
return True
6357
else:
6458
# Need insert-row for that table
65-
return await datasette.permission_allowed(
66-
actor, "insert-row", resource=(database_name, to_table)
59+
return await datasette.allowed(
60+
actor=actor,
61+
action="insert-row",
62+
resource=TableResource(database_name, to_table),
6763
)
6864

6965

pyproject.toml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ version = "0.1a11"
44
description = "Import unstructured data (text and images) into structured tables"
55
readme = "README.md"
66
authors = [{name = "Simon Willison"}]
7-
license = {text = "Apache-2.0"}
7+
license = "Apache-2.0"
88
classifiers=[
9-
"Framework :: Datasette",
10-
"License :: OSI Approved :: Apache Software License"
9+
"Framework :: Datasette"
1110
]
12-
requires-python = ">=3.9"
11+
requires-python = ">=3.10"
1312
dependencies = [
14-
"datasette==1.0a19",
13+
"datasette>=1.0a21",
1514
"datasette-secrets>=0.1a2",
1615
"llm>=0.24",
1716
"llm-openai-plugin",

tests/test_web.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
@pytest.mark.asyncio
1111
async def test_extract_flow():
1212
ds = Datasette()
13+
ds.root_enabled = True
1314
ds.add_memory_database("data")
1415
cookies = {"ds_actor": ds.client.actor_cookie({"id": "root"})}
1516
response = await ds.client.get("/data/-/extract", cookies=cookies)
@@ -86,14 +87,17 @@ async def test_permissions(actor, path, should_allow):
8687
ds = Datasette(
8788
config={
8889
"permissions": {
89-
"insert-row": {"id": ["allowed_all", "no_create"]},
90-
"create-table": {"id": ["allowed_all", "no_extract", "no_insert"]},
90+
"insert-row": {"id": ["allowed_all", "no_create", "root"]},
91+
"create-table": {
92+
"id": ["allowed_all", "no_extract", "no_insert", "root"]
93+
},
9194
"datasette-extract": {
9295
"id": ["allowed_all", "no_insert", "no_create", "root"]
9396
},
9497
}
9598
}
9699
)
100+
ds.root_enabled = True
97101
db = ds.add_memory_database("test")
98102
await db.execute_write("create table if not exists foo (id integer primary key)")
99103
cookies = {"ds_actor": ds.client.actor_cookie({"id": actor})}
@@ -129,6 +133,7 @@ async def test_action_menus_require_api_key(monkeypatch, path, has_env_variable)
129133
}
130134
}
131135
)
136+
ds.root_enabled = True
132137
db = ds.add_memory_database("test2")
133138
await db.execute_write("create table if not exists foo (id integer primary key)")
134139
cookies = {"ds_actor": ds.client.actor_cookie({"id": "root"})}
@@ -144,6 +149,7 @@ async def test_action_menus_require_api_key(monkeypatch, path, has_env_variable)
144149
@pytest.mark.asyncio
145150
async def test_create_table_copying_columns():
146151
ds = Datasette()
152+
ds.root_enabled = True
147153
data = ds.add_memory_database("data")
148154
await data.execute_write(
149155
"create table foo (name text, age integer, weight float, bio text)"

0 commit comments

Comments
 (0)