-s/--setting x y gets merged into datasette.yml, refs #2143, #2156

This change updates the `-s/--setting` option to `datasette serve` to allow it to be used to set arbitrarily complex nested settings in a way that is compatible with the new `-c datasette.yml` work happening in:
- #2143

It will enable things like this:
```
datasette data.db --setting plugins.datasette-ripgrep.path "/home/simon/code"
```
For the moment though it just affects [settings](https://docs.datasette.io/en/1.0a4/settings.html) - so you can do this:
```
datasette data.db --setting settings.sql_time_limit_ms 3500
```
I've also implemented a backwards compatibility mechanism, so if you use it this way (the old way):
```
datasette data.db --setting sql_time_limit_ms 3500
```
It will notice that the setting you passed is one of Datasette's core settings, and will treat that as if you said `settings.sql_time_limit_ms` instead.
This commit is contained in:
Simon Willison 2023-08-28 13:06:14 -07:00 committed by GitHub
commit d9aad1fd04
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 47 deletions

View file

@ -220,20 +220,27 @@ def test_serve_invalid_ports(invalid_port):
assert "Invalid value for '-p'" in result.stderr
def test_setting():
@pytest.mark.parametrize(
"args",
(
["--setting", "default_page_size", "5"],
["--setting", "settings.default_page_size", "5"],
["-s", "settings.default_page_size", "5"],
),
)
def test_setting(args):
runner = CliRunner()
result = runner.invoke(
cli, ["--setting", "default_page_size", "5", "--get", "/-/settings.json"]
)
result = runner.invoke(cli, ["--get", "/-/settings.json"] + args)
assert result.exit_code == 0, result.output
assert json.loads(result.output)["default_page_size"] == 5
settings = json.loads(result.output)
assert settings["default_page_size"] == 5
def test_setting_type_validation():
runner = CliRunner(mix_stderr=False)
result = runner.invoke(cli, ["--setting", "default_page_size", "dog"])
assert result.exit_code == 2
assert '"default_page_size" should be an integer' in result.stderr
assert '"settings.default_page_size" should be an integer' in result.stderr
@pytest.mark.parametrize("default_allow_sql", (True, False))
@ -360,11 +367,3 @@ def test_help_settings():
result = runner.invoke(cli, ["--help-settings"])
for setting in SETTINGS:
assert setting.name in result.output
@pytest.mark.parametrize("setting", ("hash_urls", "default_cache_ttl_hashed"))
def test_help_error_on_hash_urls_setting(setting):
runner = CliRunner()
result = runner.invoke(cli, ["--setting", setting, 1])
assert result.exit_code == 2
assert "The hash_urls setting has been removed" in result.output