202 lines
8.5 KiB
Python
202 lines
8.5 KiB
Python
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
# ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
# ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
# ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
# ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
# ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
# ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
# ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
# ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
# ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
|
|
from datetime import date, datetime
|
|
from pytest import mark
|
|
import perspective as psp
|
|
|
|
client = psp.Server().new_local_client()
|
|
Table = client.table
|
|
|
|
|
|
class TestTableInfer(object):
|
|
def test_table_infer_int(self):
|
|
data = {"a": [None, None, None, None, 1, 0, 1, 1, 1]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "integer"}
|
|
|
|
def test_table_infer_float(self):
|
|
data = {"a": [None, None, None, None, 1.0, 2.0]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "float"}
|
|
|
|
def test_table_infer_bool(self):
|
|
bool_data = [{"a": True, "b": False}, {"a": True, "b": True}]
|
|
tbl = Table(bool_data)
|
|
assert tbl.size() == 2
|
|
assert tbl.schema() == {"a": "boolean", "b": "boolean"}
|
|
|
|
def test_table_infer_bool_str(self):
|
|
bool_data = [{"a": "True", "b": "False"}, {"a": "True", "b": "True"}]
|
|
tbl = Table(bool_data)
|
|
assert tbl.size() == 2
|
|
assert tbl.schema() == {"a": "boolean", "b": "boolean"}
|
|
|
|
@mark.skip(reason="Unsupported python specific behavior")
|
|
def test_table_bool_infer_str_all_formats_from_schema(self):
|
|
bool_data = [
|
|
{"a": "True", "b": "False"},
|
|
{"a": "t", "b": "f"},
|
|
{"a": "true", "b": "false"},
|
|
{"a": 1, "b": 0},
|
|
{"a": "on", "b": "off"},
|
|
]
|
|
tbl = Table(bool_data)
|
|
assert tbl.schema() == {"a": "boolean", "b": "boolean"}
|
|
assert tbl.size() == 5
|
|
assert tbl.view().to_columns() == {
|
|
"a": [True, True, True, True, True],
|
|
"b": [False, False, False, False, False],
|
|
}
|
|
|
|
def test_table_infer_bool_variant(self):
|
|
data = {"a": [None, None, None, None, True, True, True]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "boolean"}
|
|
|
|
def test_table_infer_str(self):
|
|
data = {"a": [None, None, None, None, None, None, "abc"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "string"}
|
|
|
|
@mark.skip(reason="Time is not a valid JSON type")
|
|
def test_table_infer_time_as_string(self):
|
|
# time objects are inferred as string
|
|
data = {
|
|
"a": [
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
datetime(2019, 7, 11, 12, 30, 5).time(),
|
|
]
|
|
}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "string"}
|
|
|
|
@mark.skip(reason="Unsupported python specific behavior")
|
|
def test_table_infer_date_from_datetime(self):
|
|
# inferrence on non-pandas datasets defaults to datetime
|
|
data = {"a": [None, None, None, None, None, None, datetime(2019, 7, 11)]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "datetime"}
|
|
|
|
def test_table_infer_date_from_date(self):
|
|
# pass in a `date` to make sure it infers as date
|
|
data = {"a": [None, None, None, None, None, None, date(2019, 7, 11)]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "date"}
|
|
|
|
def test_table_infer_valid_date(self):
|
|
data = {"a": [None, None, None, None, None, None, "08/31/2019"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "date"}
|
|
|
|
def test_table_infer_ambiguous_date(self):
|
|
data = {"a": [None, None, None, None, None, None, "01/03/2019"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "date"}
|
|
|
|
def test_table_infer_ymd_date(self):
|
|
data = {"a": [None, None, None, None, None, None, "2019/01/03"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "date"}
|
|
|
|
def test_table_infer_invalid_date(self):
|
|
data = {"a": [None, None, None, None, None, None, "08/55/2019"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "string"}
|
|
|
|
def test_table_infer_date_edge(self):
|
|
data = {"a": [None, None, None, None, None, None, "08/31/2019 00:00:00"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "date"}
|
|
|
|
def test_table_infer_datetime_edge(self):
|
|
data = {"a": [None, None, None, None, None, None, "08/31/2019 00:00:01"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "datetime"}
|
|
|
|
def test_table_infer_valid_datetime(self):
|
|
data = {"a": [None, None, None, None, None, None, "08/31/2019 07:30:00"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "datetime"}
|
|
|
|
def test_table_infer_iso_datetime(self):
|
|
data = {"a": [None, None, None, None, None, None, "2019/07/25T09:00:00"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "datetime"}
|
|
|
|
def test_table_infer_datetime_separators(self):
|
|
data = {
|
|
"a": [
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
"2019-07-25T09:00:00",
|
|
"2019/07/25T09:00:00",
|
|
]
|
|
}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "datetime"}
|
|
|
|
def test_table_infer_datetime_tz(self):
|
|
data = {"a": [None, None, None, None, None, "2019-07-25T09:00:00-05:00"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "datetime"}
|
|
|
|
def test_table_infer_invalid_datetime(self):
|
|
data = {"a": [None, None, None, None, None, None, "08/31/2019 25:30:00"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "string"}
|
|
|
|
def test_table_infer_mixed_date(self):
|
|
data = {"a": [None, None, None, None, None, "08/11/2019"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "date"}
|
|
|
|
def test_table_infer_mixed_datetime(self):
|
|
data = {"a": [None, None, None, None, None, "08/11/2019 13:14:15"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "datetime"}
|
|
|
|
@mark.skip(reason="Numeric strings are not inferred as numbers")
|
|
def test_table_strict_datetime_infer(self):
|
|
data = {"a": ["10", "9", "8", "7", "6", "5", "4", "3", "2", "1"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "string"}
|
|
|
|
def test_table_strict_date_infer(self):
|
|
data = {"a": ["2019 09 10"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "date"}
|
|
|
|
def test_table_strict_datetime_separator_infer(self):
|
|
data = {"a": ["2019-10-01 7:30"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "datetime"}
|
|
|
|
def test_table_datetime_infer_no_false_positive(self):
|
|
data = {"a": [" . - / but clearly not a date"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "string"}
|
|
|
|
@mark.skip
|
|
def test_table_datetime_infer_from_string_with_time(self):
|
|
data = {"a": ["11:00 ABCD"]}
|
|
tbl = Table(data)
|
|
assert tbl.schema() == {"a": "string"}
|