def test_auditdt_cm_diff(active_run, dolt_audit1, doltdb): doltdb = Dolt(doltdb) logs = list(doltdb.log(2).keys()) with DoltDT(run=active_run, audit=dolt_audit1) as dolt: df = dolt.sql("SELECT * FROM `bar`", as_key="akey") diff = dolt.diff(from_commit=logs[1], to_commit=logs[0], table="bar")
def test_reset(doltdb): db = Dolt(doltdb) db.reset() db.reset(hard=True) db.reset(soft=True) db.reset(tables="t1") db.reset(tables=["t1"])
def dolt_audit1(doltdb): db = Dolt(doltdb) lg = db.log() commit = lg.popitem(last=False)[0] yield { "actions": { "bar": { "key": "bar", "config_id": "dd9f1f38-6802-4657-b869-602dde993180", "pathspec": "VersioningDemo/1611853111934656/start/1", "table_name": "bar", "kind": "read", "query": "SELECT * FROM `bar`", "commit": commit, "artifact_name": None, "timestamp": 1611853112.794624, } }, "configs": { "dd9f1f38-6802-4657-b869-602dde993180": { "id": "dd9f1f38-6802-4657-b869-602dde993180", "database": doltdb, "branch": "master", "commit": commit, "dolthub_remote": False, "push_on_commit": False, } }, }
def test_reset_errors(doltdb): db = Dolt(doltdb) with pytest.raises(ValueError): db.reset(hard=True, soft=True) with pytest.raises(ValueError): db.reset(tables="t1", hard=True) with pytest.raises(ValueError): db.reset(tables="t1", soft=True) with pytest.raises(ValueError): db.reset(tables={"t1": True})
def test_dolt_sql_errors(doltdb): db = Dolt(doltdb) with pytest.raises(ValueError): db.sql(result_parser=lambda x: x, query=None) with pytest.raises(ValueError): db.sql(result_parser=2, query="select active_branch()") with pytest.raises(ValueError): db.sql(result_file="file.csv", query=None) with pytest.raises(ValueError): db.sql(result_format="csv", query=None)
def test_detached_head_cm(doltdb): db = Dolt(doltdb) commits = list(db.log().keys()) with detach_head(db, commits[1]): sum1 = db.sql("select sum(a) as sum from t1", result_format="csv")[0] with detach_head(db, commits[0]): sum2 = db.sql("select sum(a) as sum from t1", result_format="csv")[0] assert sum1["sum"] == "3" assert sum2["sum"] == "6"
def test_branchdt_diff(inactive_run, dolt_config, doltdb): doltdb = Dolt(doltdb) logs = list(doltdb.log(2).keys()) dolt = DoltDT(config=dolt_config) diff = dolt.diff(from_commit=logs[1], to_commit=logs[0], table="bar") row = diff["bar"].iloc[0] assert row.from_A == 1 assert row.from_B == 1 assert row.to_A == 2 assert row.to_B == 2
def test_custom_query_branch(active_run, dolt_config, doltdb): doltdb = Dolt(doltdb) logs = list(doltdb.log(2).keys()) dolt_config.commit = logs[1] with DoltDT(run=active_run, config=dolt_config) as dolt: df = dolt.sql("SELECT * FROM `bar` LIMIT 2", as_key="akey") np.testing.assert_array_equal(df.A.values, [1, 1]) audit = active_run.dolt assert "akey" in audit["actions"] assert audit["actions"]["akey"]["kind"] == "read" assert audit["actions"]["akey"]["query"] == "SELECT * FROM `bar` LIMIT 2"
def test_set_dolt_path_error(doltdb): db = Dolt(doltdb) set_dolt_path("dolt") test_cmd = "show tables" db.sql(test_cmd, result_format="csv") try: with pytest.raises(FileNotFoundError): set_dolt_path("notdolt") from doltcli.utils import DOLT_PATH assert DOLT_PATH == "notdolt" db.sql(test_cmd, result_format="csv") finally: set_dolt_path("dolt")
def test_branchdt_cm_write(active_run, dolt_config, doltdb): input_df = pd.DataFrame({"A": [2, 2, 2], "B": [2, 2, 2]}) with DoltDT(run=active_run, config=dolt_config) as dolt: dolt.write(df=input_df, table_name="baz") db = Dolt(doltdb) output_df = read_pandas_sql(db, "SELECT * from `baz`") np.testing.assert_array_equal(output_df.A.values, [2, 2, 2]) audit = active_run.dolt print(audit["actions"]["baz"]) assert "baz" in audit["actions"] assert audit["actions"]["baz"]["kind"] == "write" assert audit["actions"]["baz"]["query"] == "SELECT * FROM `baz`"
def _get_db(self, config: DoltConfig): if config.id in self._dbcache: return self._dbcache[config.id] # TODO: clone remote try: Dolt.init(repo_dir=config.database) except DoltException as e: pass if ".dolt" not in os.listdir(config.database): raise ValueError( f"Passed a path {config.database} that is not a Dolt database directory" ) doltdb = Dolt(repo_dir=config.database) current_branch, branches = doltdb.branch() logger.info( f"Dolt database in {config.database} at branch {current_branch.name}, using branch {config.branch}" ) if config.branch == current_branch.name: pass elif config.branch not in [branch.name for branch in branches]: raise ValueError(f"Passed branch '{config.branch}' that does not exist") else: doltdb.checkout(config.branch, checkout_branch=False) if not doltdb.status().is_clean: raise Exception( "DoltDT as context manager requires clean working set for transaction semantics" ) if not config.commit: config.commit = self._get_latest_commit_hash(doltdb) self._dbcache[config.id] = doltdb return doltdb
def test_working(doltdb): db = Dolt(doltdb) assert db.head != db.working
def test_bad_repo_path(tmp_path): bad_repo_path = tmp_path with pytest.raises(ValueError): Dolt(bad_repo_path)
def test_clone_new_dir(tmp_path): target = os.path.join(tmp_path, "state_age") Dolt.clone("max-hoffman/state-age", new_dir=target) db = Dolt(target) assert db.head is not None
def test_checkout_non_existent_branch(doltdb): repo = Dolt(doltdb) repo.checkout("main")