130 lines
3.4 KiB
Python
130 lines
3.4 KiB
Python
|
import os
|
||
|
from warnings import catch_warnings
|
||
|
|
||
|
import pytest
|
||
|
|
||
|
import fsspec
|
||
|
from fsspec.config import conf, set_conf_env, set_conf_files
|
||
|
|
||
|
|
||
|
@pytest.fixture
|
||
|
def clean_conf():
|
||
|
"""Tests should start and end with clean config dict"""
|
||
|
conf.clear()
|
||
|
yield
|
||
|
conf.clear()
|
||
|
|
||
|
|
||
|
def test_from_env_ignored(clean_conf):
|
||
|
env = {
|
||
|
"FSSPEC": "missing_protocol",
|
||
|
"FSSPEC_": "missing_protocol",
|
||
|
"FSSPEC__INVALID_KEY": "invalid_protocol",
|
||
|
"FSSPEC_INVALID1": "not_json_dict",
|
||
|
"FSSPEC_INVALID2": '["not_json_dict"]',
|
||
|
}
|
||
|
cd = {}
|
||
|
with catch_warnings(record=True) as w:
|
||
|
set_conf_env(conf_dict=cd, envdict=env)
|
||
|
assert len(w) == 5
|
||
|
assert "unexpected name" in str(w[0].message)
|
||
|
assert "unexpected name" in str(w[1].message)
|
||
|
assert "unexpected name" in str(w[2].message)
|
||
|
assert "parse failure" in str(w[3].message)
|
||
|
assert "not being a dict" in str(w[4].message)
|
||
|
assert cd == {}
|
||
|
|
||
|
|
||
|
def test_from_env_kwargs(clean_conf):
|
||
|
env = {
|
||
|
"FSSPEC_PROTO_KEY": "value",
|
||
|
"FSSPEC_PROTO_LONG_KEY": "othervalue",
|
||
|
"FSSPEC_MALFORMED": "novalue",
|
||
|
}
|
||
|
cd = {}
|
||
|
with catch_warnings(record=True) as w:
|
||
|
set_conf_env(conf_dict=cd, envdict=env)
|
||
|
assert len(w) == 1
|
||
|
assert "parse failure" in str(w[0].message)
|
||
|
assert cd == {"proto": {"key": "value", "long_key": "othervalue"}}
|
||
|
|
||
|
|
||
|
def test_from_env_protocol_dict(clean_conf):
|
||
|
env = {
|
||
|
"FSSPEC_PROTO": '{"int": 1, "float": 2.3, "bool": true, "dict": {"key": "val"}}'
|
||
|
}
|
||
|
cd = {}
|
||
|
set_conf_env(conf_dict=cd, envdict=env)
|
||
|
assert cd == {
|
||
|
"proto": {"int": 1, "float": 2.3, "bool": True, "dict": {"key": "val"}}
|
||
|
}
|
||
|
|
||
|
|
||
|
def test_from_env_kwargs_override_protocol_dict(clean_conf):
|
||
|
env = {
|
||
|
"FSSPEC_PROTO_LONG_KEY": "override1",
|
||
|
"FSSPEC_PROTO": '{"key": "value1", "long_key": "value2", "otherkey": "value3"}',
|
||
|
"FSSPEC_PROTO_KEY": "override2",
|
||
|
}
|
||
|
cd = {}
|
||
|
set_conf_env(conf_dict=cd, envdict=env)
|
||
|
assert cd == {
|
||
|
"proto": {"key": "override2", "long_key": "override1", "otherkey": "value3"}
|
||
|
}
|
||
|
|
||
|
|
||
|
def test_from_file_ini(clean_conf, tmpdir):
|
||
|
file1 = os.path.join(tmpdir, "1.ini")
|
||
|
file2 = os.path.join(tmpdir, "2.ini")
|
||
|
with open(file1, "w") as f:
|
||
|
f.write(
|
||
|
"""[proto]
|
||
|
key=value
|
||
|
other_key:othervalue
|
||
|
overwritten=dont_see
|
||
|
"""
|
||
|
)
|
||
|
with open(file2, "w") as f:
|
||
|
f.write(
|
||
|
"""[proto]
|
||
|
overwritten=see
|
||
|
"""
|
||
|
)
|
||
|
cd = {}
|
||
|
set_conf_files(tmpdir, cd)
|
||
|
assert cd == {
|
||
|
"proto": {"key": "value", "other_key": "othervalue", "overwritten": "see"}
|
||
|
}
|
||
|
|
||
|
|
||
|
def test_from_file_json(clean_conf, tmpdir):
|
||
|
file1 = os.path.join(tmpdir, "1.json")
|
||
|
file2 = os.path.join(tmpdir, "2.json")
|
||
|
with open(file1, "w") as f:
|
||
|
f.write(
|
||
|
"""{"proto":
|
||
|
{"key": "value",
|
||
|
"other_key": "othervalue",
|
||
|
"overwritten": false}}
|
||
|
"""
|
||
|
)
|
||
|
with open(file2, "w") as f:
|
||
|
f.write(
|
||
|
"""{"proto":
|
||
|
{"overwritten": true}}
|
||
|
"""
|
||
|
)
|
||
|
cd = {}
|
||
|
set_conf_files(tmpdir, cd)
|
||
|
assert cd == {
|
||
|
"proto": {"key": "value", "other_key": "othervalue", "overwritten": True}
|
||
|
}
|
||
|
|
||
|
|
||
|
def test_apply(clean_conf):
|
||
|
conf["file"] = {"auto_mkdir": "test"}
|
||
|
fs = fsspec.filesystem("file")
|
||
|
assert fs.auto_mkdir == "test"
|
||
|
fs = fsspec.filesystem("file", auto_mkdir=True)
|
||
|
assert fs.auto_mkdir is True
|