Programs are now recorded in the store.
The record() program and cli is not yet working. For that we need a working `FSDiff` next. Then we'll finally be ready to start recording file information.
This commit is contained in:
parent
f18368f1e0
commit
f55d110e49
@ -5,6 +5,20 @@ from .. import store
|
||||
import os
|
||||
|
||||
|
||||
def do_record(directory):
|
||||
"""Unwrapped record command"""
|
||||
if not os.path.isdir(directory):
|
||||
raise ValueError(f"Cannot record non-existent directory {directory}")
|
||||
|
||||
existing_store = store.find_store(directory)
|
||||
if existing_store is None: # this is a new store
|
||||
s = store.Store.init(directory)
|
||||
else: # this is an existing store
|
||||
s = store.Store(directory)
|
||||
|
||||
s.record()
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.argument("directory", default='.')
|
||||
def record(directory):
|
||||
@ -16,14 +30,5 @@ def record(directory):
|
||||
directory is part of an existing store, it will be updated and versions
|
||||
of any files changes since the last recording will be incremented.
|
||||
"""
|
||||
if not os.path.isdir(directory):
|
||||
raise ValueError(f"Cannot record non-existent directory {directory}")
|
||||
|
||||
existing_store = store.find_store(directory)
|
||||
if existing_store is None: # this is a new store
|
||||
s = store.Store.init(directory)
|
||||
else: # this is an existing store
|
||||
s = store.Store(directory)
|
||||
|
||||
s.record()
|
||||
do_record(directory)
|
||||
|
||||
|
||||
@ -192,9 +192,12 @@ class FSEntry:
|
||||
sha256=bytes.fromhex(sha256),
|
||||
)
|
||||
|
||||
def diff(self, other):
|
||||
return FSDiff(self, other)
|
||||
|
||||
|
||||
class FSDiff:
|
||||
def __init__(A, B):
|
||||
def __init__(self, A, B):
|
||||
"""Given two hashed directories, efficiently compute difference.
|
||||
|
||||
This assumes the hashes are consistent, so that directories with
|
||||
|
||||
@ -42,17 +42,33 @@ class Program:
|
||||
env.id, #environment INTEGER NOT NULL,
|
||||
self.message, #message TEXT, -- user-defined message to help distinguish similar runs
|
||||
))
|
||||
self.id = cur.lastrowid
|
||||
cur.connection.commit()
|
||||
|
||||
self.set_start_time(datetime.datetime.now())
|
||||
# track this program in the store
|
||||
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_value, exc_traceback):
|
||||
elapsed = datetime.datetime.now() - self.start_time
|
||||
end_time = datetime.datetime.now()
|
||||
# record start and end times in store
|
||||
|
||||
cur = self.store.conn.cursor()
|
||||
cur.execute('''
|
||||
UPDATE
|
||||
program
|
||||
SET
|
||||
start_time = ?,
|
||||
end_time = ?
|
||||
WHERE
|
||||
id = ?
|
||||
''',
|
||||
(self.start_time, end_time, self.id),
|
||||
)
|
||||
cur.connection.commit()
|
||||
self._evaluated = True # prevent re-running
|
||||
elapsed = end_time - self.start_time
|
||||
print(f"Program [{self.id}] {self.name} (message:{self.message}) ran in {elapsed} seconds.")
|
||||
|
||||
|
||||
class Store:
|
||||
|
||||
@ -1,4 +1,29 @@
|
||||
import os
|
||||
from pathlib import Path
|
||||
import pytest
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
@pytest.fixture
|
||||
def bare_dir():
|
||||
"""Create an emptry temp directory"""
|
||||
with tempfile.TemporaryDirectory(prefix="nancy_testdir") as d:
|
||||
yield Path(d)
|
||||
|
||||
@pytest.fixture
|
||||
def filled_dir(bare_dir):
|
||||
open(bare_dir / 'a.txt', 'w').write("foo")
|
||||
os.makedirs(bare_dir / 'stats')
|
||||
open(bare_dir / 'stats' / 'metrics.csv', 'w').write("bar,baz")
|
||||
# identical to ./a.txt
|
||||
open(bare_dir / 'stats' / 'a.txt', 'w').write("foo")
|
||||
return bare_dir
|
||||
|
||||
|
||||
def test_record_untracked_dir(filled_dir):
|
||||
from nancy.cli.record import do_record
|
||||
do_record(filled_dir)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def store():
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user