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