Skip to content

Commit

Permalink
Allow dupe permisisons if exact matches
Browse files Browse the repository at this point in the history
  • Loading branch information
simonw committed Dec 13, 2022
1 parent e1545b2 commit 5d17e22
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 6 deletions.
12 changes: 6 additions & 6 deletions datasette/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -434,21 +434,21 @@ async def invoke_startup(self):
if self._startup_invoked:
return
# Register permissions, but watch out for duplicate name/abbr
names = set()
abbrs = set()
names = {}
abbrs = {}
for hook in pm.hook.register_permissions(datasette=self):
if hook:
for p in hook:
if p.name in names:
if p.name in names and p != names[p.name]:
raise StartupError(
"Duplicate permission name: {}".format(p.name)
)
if p.abbr in abbrs:
if p.abbr in abbrs and p != abbrs[p.abbr]:
raise StartupError(
"Duplicate permission abbr: {}".format(p.abbr)
)
names.add(p.name)
abbrs.add(p.abbr)
names[p.name] = p
abbrs[p.abbr] = p
self.permissions[p.name] = p
for hook in pm.hook.prepare_jinja2_environment(
env=self.jinja_env, datasette=self
Expand Down
34 changes: 34 additions & 0 deletions tests/test_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -1130,3 +1130,37 @@ async def test_hook_register_permissions_no_duplicates(duplicate):
with pytest.raises(StartupError) as ex:
await ds.invoke_startup()
assert "Duplicate permission {}".format(duplicate) in str(ex.value)


@pytest.mark.asyncio
async def test_hook_register_permissions_allows_identical_duplicates():
ds = Datasette(
metadata={
"plugins": {
"datasette-register-permissions": {
"permissions": [
{
"name": "name1",
"abbr": "abbr1",
"description": None,
"takes_database": False,
"takes_resource": False,
"default": True,
},
{
"name": "name1",
"abbr": "abbr1",
"description": None,
"takes_database": False,
"takes_resource": False,
"default": True,
},
]
}
}
},
plugins_dir=PLUGINS_DIR,
)
await ds.invoke_startup()
# Check that ds.permissions has only one of each
assert len([p for p in ds.permissions.values() if p.abbr == "abbr1"]) == 1

0 comments on commit 5d17e22

Please sign in to comment.