pretty_table

This commit is contained in:
Amber 2024-11-11 14:59:19 +01:00
parent 733458f375
commit 0b189b8e5f
4 changed files with 134 additions and 1 deletions

View File

@ -116,6 +116,8 @@ def diff_snap(last_tree, current_tree, path='./'):
# compute moved could save bandwidth
res['moved'] = []
for n, r in enumerate(res['removed']):
if r.get('hash') is None:
continue
found, path = find_subtree(current_tree, {
r['name'] : r['hash'],
})

View File

@ -541,7 +541,6 @@ class Manager():
changes = local_snap_diff.get('changed') or []
unmerged = []
dones = []
for node in changes:
@ -569,6 +568,38 @@ class Manager():
return dones
def sync_removed(self, removed=None):
if removed is None:
local_snap_diff = self.get_local_snap_diff()
removed = local_snap_diff.get('removed') or []
unmerged = []
dones = []
for node in removed:
node_name = node['name']
last_hash = node['last_hash']
print(f'Checking local {node_name}')
rstatus = self.get_rnode_status(node)
rfile_buf, rhash, rexists = map(rstatus.get, ['iobuffer', 'hash', 'exists'])
node['remote_hash'] = rhash
node['remote_file_buf'] = rfile_buf
if rexists and last_hash != rhash:
print(f'Put node {node_name} in unmerged, node exists in remote but hash diff from know last_hash snapshot')
unmerged.append(node)
continue
dones.append(node)
print(f'You can proceed to remove {node_name} file it is not changed from the last version')
self.remove_node_remotely(node)
if unmerged:
self.store_unmerged_diff(unmerged)
return dones
def sync(self):
'''
sync:
@ -602,6 +633,12 @@ class Manager():
for node in added_done:
local_tree = self.update_local_hash('add', node, tree=local_tree)
removed = local_snap_diff.get('removed') or []
removed_done = self.sync_removed(removed=removed)
for node in removed_done:
local_tree = self.update_local_hash('removed', node, tree=local_tree)
## dump new tree
self.dump_local_hash(hsh=local_tree)
@ -620,6 +657,10 @@ class Manager():
if kpath == '.': continue
subtree = subtree[kpath]
if action == 'remove':
subtree.pop(node_name, None)
return tree
if action == 'add':
subtree[node_name] = {}

View File

@ -2,8 +2,29 @@ import os
from lib.snapshot.generate import local as _genlocal
from tools import pretty_print
from testing import sync
def test_tree_hash():
m = sync.get_test_manager()
agent = m.get_agent()
## verify
local_node_hash = _genlocal.generate_tree_hash('/home/luca/sharednotes_dev/')
remote_node_hash = agent.generate_tree_hash_oversftp('/home/notanamber/notes_dev/')
try:
assert local_node_hash == remote_node_hash
print('Test executed succesfully')
return
except:
pretty_print.pp(local_node_hash)
print('*************************')
print('*************************')
print('*************************')
print('*************************')
pretty_print.pp(remote_node_hash)
def test_add_folder():
new_path = '/home/luca/sharednotes_dev/test_add/test_add_nested'
try:
@ -14,6 +35,25 @@ def test_add_folder():
m = sync.get_test_manager()
m.sync()
return test_tree_hash()
def test_remove_folder():
'''
remove /home/luca/sharednotes_dev/test_add/
'''
m = sync.get_test_manager()
m.sync()
## verify
test_tree_hash()
def test_add_file():
'''
add manually a file then
launch test_add_file
'''
m = sync.get_test_manager()
m.sync()
## verify
local_node_hash = _genlocal.generate_tree_hash('/home/luca/sharednotes_dev/test_add/')

50
src/tools/pretty_table.py Normal file
View File

@ -0,0 +1,50 @@
class PrettyTable():
def __init__(self):
self.col_sep = '\uFF5C'
self.hor_fill = '\u2015'
self.pad_right = 5
self.head_str = ''
self.body_str = ''
self.sep_str = ''
self.hspecs = []
def get_separator_str(self):
if self.sep_str:
return self.sep_str
self.sep_str = ''
for _, thead_len in self.hspecs:
self.sep_str += '{0:{fill}<{flen}}'.format('',fill=self.hor_fill, flen=thead_len)
self.sep_str += self.col_sep
self.sep_str += '\n'
return self.sep_str
def head(self, hspecs):
'''
@param hspecs [('header_text', int)] text and length of column
'''
self.hspecs = hspecs
self.head_str = ''
# for thead_text, thead_len, align in zip(htexts, hlens, ['^']*len(hlens)):
for (thead_text, thead_len), align in zip(hspecs, ['^']*len(hspecs)):
self.head_str += "{0:{align}{flen}}".format(thead_text, align=align, flen=thead_len)
self.head_str += self.col_sep
self.head_str += '\n'
self.head_str += self.get_separator_str()
# print(self.head_str)
def body(self, rows):
hlens = [thead_len for (thead_text, thead_len) in self.hspecs]
self.body_str = ''
for row in rows:
row_str = ''
for trow_text, flen in zip(row, hlens):
row_str += "{0:{flen}}".format(' %s' % trow_text, flen=flen)
row_str += self.col_sep
self.body_str += row_str + '\n' + self.get_separator_str()
# print(self.body_str)
def print(self):
return print(self.head_str + self.body_str)