From 8d1fe3bfb2650b8f78f8ee0e53853254d822c56f Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux <hugo@trentesaux.fr> Date: Fri, 21 Aug 2020 20:03:22 +0200 Subject: [PATCH] [fix] diverse localblockchain fixes use pathlib instead of os.path / glob fix too long lines use default variables --- .../blockchain.py} | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) rename duniterpy/{localblockchain.py => helpers/blockchain.py} (62%) diff --git a/duniterpy/localblockchain.py b/duniterpy/helpers/blockchain.py similarity index 62% rename from duniterpy/localblockchain.py rename to duniterpy/helpers/blockchain.py index 8c88322b..cc6d433a 100644 --- a/duniterpy/localblockchain.py +++ b/duniterpy/helpers/blockchain.py @@ -1,29 +1,29 @@ # imports locally stored blockchain in the chunk format # example usage : # ``` -# from duniterpy.localblockchain import load +# from duniterpy.helpers.blockchain import load # bc = load() # gets blockchain iterator # b = next(bc) # gets block +# b.number # should return 0 +# next(bc).number # should return 1 (and so on) # ``` import json -import os -import glob -from .documents import Block +import pathlib +from ..documents import Block CHUNK_SIZE = 250 +DEFAULT_PATH = ".config/duniter/duniter_default/g1/" class JsonBlockchain: def __init__(self, folder): self.folder = folder # folder where chunks are stored - self.chunks = len( - glob.glob(os.path.join(folder, "chunk_*")) - ) # number of files starting with "chunk_" - self.current_block_in_chunk = ( - 0 # number from 0 to 249 equal to current_block // current_chunk - ) + # number of files starting with "chunk_" + self.chunks = len(list(folder.glob("chunk_*"))) + # number from 0 to 249 equal to current_block // current_chunk + self.current_block_in_chunk = 0 self.current_chunk = 0 # current chunk number self.chunk = [] # parsed json for current chunk (length = 250) self.parsechunk() # parse first chunk @@ -31,7 +31,9 @@ class JsonBlockchain: def parsechunk(self): """parse a json chunk file""" with open( - os.path.join(self.folder, "chunk_" + str(self.current_chunk) + "-250.json") + self.folder.joinpath( + "chunk_" + str(self.current_chunk) + "-" + str(CHUNK_SIZE) + ".json" + ) ) as f: s = f.read() p = json.loads(s) @@ -41,16 +43,18 @@ class JsonBlockchain: return self def __next__(self): - """if current block is outside current chunk, parse next one, otherwise, return current block parsed json""" - if self.current_block_in_chunk == 250: # block outside chunk + """ + if current block is outside current chunk, parse next one, + otherwise, return current block parsed json + """ + if self.current_block_in_chunk == CHUNK_SIZE: # block outside chunk self.current_block_in_chunk = 0 # reset to next chunk start self.current_chunk += 1 # increment current chunk number if self.current_chunk >= self.chunks: # outside range raise StopIteration() self.parsechunk() # parse this chunk - self.current_block_in_chunk += ( - 1 # increment current block number for next iteration - ) + # increment current block number for next iteration + self.current_block_in_chunk += 1 return self.chunk[ self.current_block_in_chunk - 1 ] # return block (before incrementation) @@ -63,10 +67,10 @@ def Blockchain(json_blockchain): yield Block.from_parsed_json(jb) -def load(path=".config/duniter/duniter_default/g1/"): +def load(path=DEFAULT_PATH): """returns an iterator allowing to browse all the blockchain in practice, it will load chunk by chunk and only keep one in memory at a time""" - path = os.path.join(os.path.expanduser("~"), path) # expand path + path = pathlib.Path("~").joinpath(path).expanduser() # expand path jbc = JsonBlockchain(path) # gets an iterator over json blockchain bc = Blockchain(jbc) # convert it to an iterator over blocks return bc # returns -- GitLab