Changeset - 4b88aca70fbc
[Not reviewed]
default
0 3 0
Laman - 8 years ago 2017-06-12 21:29:32

Progress object
3 files changed with 38 insertions and 20 deletions:
0 comments (0 inline, 0 general)
src/client.py
Show inline comments
 
@@ -4,7 +4,7 @@ import logging as log
 
from datetime import datetime
 

	
 
import config as conf
 
from util import progress
 
from util import Progress
 
from hashtree import HashTree
 
from networkers import NetworkReader,NetworkWriter
 

	
 
@@ -45,6 +45,7 @@ class Client:
 

	
 
			# determine which blocks to send
 
			print(datetime.now(), "negotiating:")
 
			progress=Progress(localTree.leafCount)
 
			while len(nodeStack)>0:
 
				i=nodeStack.pop()
 
				outcoming.writeMsg({"command":"req", "index":i})
 
@@ -59,8 +60,8 @@ class Client:
 
						nodeStack.append(2*i+1)
 
					else:
 
						blocksToTransfer.append(i-localTree.leafStart) # leaf
 
						progress(i-localTree.leafStart, localTree.leafCount)
 
		print("100%")
 
						progress.p(i-localTree.leafStart)
 
		progress.done()
 

	
 
		return blocksToTransfer
 

	
 
@@ -71,6 +72,7 @@ class Client:
 

	
 
		print(datetime.now(), "sending data:")
 
		with Connection() as (incoming,outcoming):
 
			progress=Progress(len(blocksToTransfer))
 
			for (k,i2) in enumerate(blocksToTransfer):
 
				jsonData={"command":"send", "index":i2, "dataType":"data"}
 
				if i1+1!=i2:
 
@@ -83,8 +85,8 @@ class Client:
 
				jsonData,binData=incoming.readMsg()
 
				assert jsonData["command"]=="ack" and jsonData["index"]==i2, jsonData
 
				i1=i2
 
				progress(k,len(blocksToTransfer))
 
		print("100%")
 
				progress.p(k)
 
		progress.done()
 

	
 
		with Connection() as (incoming,outcoming):
 
			outcoming.writeMsg({"command":"end"})
src/hashtree.py
Show inline comments
 
@@ -2,7 +2,7 @@
 
import os
 
from datetime import datetime
 

	
 
from util import progress
 
from util import Progress
 

	
 

	
 
class HashTree:
 
@@ -25,12 +25,13 @@ class HashTree:
 
			res=cls(leafCount)
 
			print(datetime.now(), "hashing file:")
 

	
 
			progress=Progress(leafCount)
 
			for i in range(leafCount):
 
				data=f.read(HashTree.BLOCK_SIZE)
 
				res.insertLeaf(hashlib.sha256(data).digest()[HashTree.HASH_LEN:])
 

	
 
				progress(i, leafCount)
 
			print("100%")
 
				progress.p(i)
 
			progress.done()
 
		res.buildTree()
 
		
 
		return res
 
@@ -76,10 +77,11 @@ class HashTree:
 
	## Fast construction of the tree over the leaves. O(n).
 
	def buildTree(self):
 
		print(datetime.now(), "building tree:")
 
		progress=Progress(-1, self.leafStart-1)
 
		for i in range(self.leafStart-1,-1,-1):
 
			self.store[i]=hashlib.sha256(self.store[i*2+1]+self.store[i*2+2]).digest()[HashTree.HASH_LEN:]
 
			progress(i, -1, self.leafStart - 1)
 
		print()
 
			progress.p(i)
 
		progress.done()
 

	
 

	
 
if __name__=="__main__":
src/util.py
Show inline comments
 
def progress(i, n, i0=0):
 
	def _progress(i,n,i0):
 
		return 100*(i+1-i0)//(n-i0)
 
class Progress:
 
	def __init__(self,n,i0=0):
 
		self._n=n
 
		self._i0=i0
 
		self._i=i0
 
		self._last=""
 

	
 
	def p(self,i):
 
		i0=self._i0
 
		n=self._n
 

	
 
	if n<i0:
 
		i*=-1
 
		n*=-1
 
		i0*=-1
 
	assert i0<=i<n, (i0,i,n)
 
	percentage=_progress(i,n,i0)
 
	print("{0}%".format(percentage),end="\r")
 
		assert i0<=i<n or n<i<=i0, (i0,i,n)
 
		percentage=Progress._p(i,n,i0)
 
		res="{0}%".format(percentage)
 
		if res!=self._last:
 
			print(res,end="\r")
 
			self._last=res
 

	
 
	def done(self):
 
		print("100%")
 

	
 
	@staticmethod
 
	def _p(i,n,i0):
 
		_1=1 if n>=i0 else -1
 
		return 100*(i+_1-i0)//(n-i0)
0 comments (0 inline, 0 general)