From 32cf9988982915dffee2ed8804e2a29a31a7723a Mon Sep 17 00:00:00 2001
From: Moul <moul@moul.re>
Date: Fri, 29 Apr 2022 23:10:19 +0200
Subject: [PATCH] [mod] #397: Replace BlockchainParams() singleton with
 @functools.lru_cache()

---
 silkaj/blockchain_tools.py | 20 ++++++--------------
 silkaj/cert.py             |  7 +++----
 silkaj/membership.py       |  4 ++--
 silkaj/tools.py            |  4 ++--
 silkaj/wot.py              |  6 +++---
 tests/test_membership.py   |  4 ++--
 6 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/silkaj/blockchain_tools.py b/silkaj/blockchain_tools.py
index c8522ba0..3c8e1ef8 100644
--- a/silkaj/blockchain_tools.py
+++ b/silkaj/blockchain_tools.py
@@ -13,25 +13,17 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with Silkaj. If not, see <https://www.gnu.org/licenses/>.
 
+import functools
+
 from duniterpy.api.bma import blockchain
 
 from silkaj.network_tools import ClientInstance
 
 
-class BlockchainParams:
-    __instance = None
-
-    def __new__(cls):
-        if BlockchainParams.__instance is None:
-            BlockchainParams.__instance = object.__new__(cls)
-        return BlockchainParams.__instance
-
-    def __init__(self):
-        self.params = self.get_params()
-
-    def get_params(self):
-        client = ClientInstance().client
-        return client(blockchain.parameters)
+@functools.lru_cache(maxsize=1)
+def get_blockchain_parameters():
+    client = ClientInstance().client
+    return client(blockchain.parameters)
 
 
 class HeadBlock:
diff --git a/silkaj/cert.py b/silkaj/cert.py
index 01ba69c8..dd05c93c 100644
--- a/silkaj/cert.py
+++ b/silkaj/cert.py
@@ -24,7 +24,7 @@ from tabulate import tabulate
 from silkaj import tui, wot
 from silkaj import wot_tools as wt
 from silkaj.auth import auth_method
-from silkaj.blockchain_tools import BlockchainParams, HeadBlock
+from silkaj.blockchain_tools import HeadBlock, get_blockchain_parameters
 from silkaj.constants import ALL, DATE, SUCCESS_EXIT_STATUS
 from silkaj.crypto_tools import is_pubkey_and_check
 from silkaj.license import license_approval
@@ -89,11 +89,10 @@ def pre_checks(client, issuer_pubkey, pubkey_to_certify):
         sys.exit("You can’t certify yourself!")
 
     # Check if the certification can be renewed
-    req = client(bma.wot.requirements, pubkey_to_certify)
+    params = get_blockchain_parameters()
     req = req["identities"][0]
     for cert in req["certifications"]:
         if cert["from"] == issuer_pubkey:
-            params = BlockchainParams().params
             # Ğ1: 0<–>2y - 2y + 2m
             # ĞT: 0<–>4.8m - 4.8m + 12.5d
             renewable = cert["expiresIn"] - params["sigValidity"] + params["sigReplay"]
@@ -128,7 +127,7 @@ def certification_confirmation(
             tui.display_pubkey_and_checksum(pubkey_to_certify),
         ]
     )
-    params = BlockchainParams().params
+    params = get_blockchain_parameters()
     cert_begins = now().format(DATE)
     cert_ends = now().add(seconds=params["sigValidity"]).format(DATE)
     cert.append(["Valid", cert_begins, "—>", cert_ends])
diff --git a/silkaj/membership.py b/silkaj/membership.py
index f579e4ba..b52222bc 100644
--- a/silkaj/membership.py
+++ b/silkaj/membership.py
@@ -23,7 +23,7 @@ from duniterpy.documents import BlockID, Membership, get_block_id
 from tabulate import tabulate
 
 from silkaj import auth, tui, wot
-from silkaj.blockchain_tools import BlockchainParams, HeadBlock
+from silkaj.blockchain_tools import HeadBlock, get_blockchain_parameters
 from silkaj.constants import DATE, SUCCESS_EXIT_STATUS
 from silkaj.license import license_approval
 from silkaj.network_tools import ClientInstance, send_document
@@ -126,7 +126,7 @@ def display_confirmation_table(identity_uid, pubkey, identity_block_id):
     date_idty_pub = pendulum.from_timestamp(block["time"], tz="local").format(DATE)
     table.append(["Identity published", date_idty_pub])
 
-    params = BlockchainParams().params
+    params = get_blockchain_parameters()
     membership_validity = (
         pendulum.now().add(seconds=params["msValidity"]).diff_for_humans()
     )
diff --git a/silkaj/tools.py b/silkaj/tools.py
index 94e001eb..7c59b6a9 100644
--- a/silkaj/tools.py
+++ b/silkaj/tools.py
@@ -15,7 +15,7 @@
 
 from sys import exit
 
-from silkaj.blockchain_tools import BlockchainParams
+from silkaj.blockchain_tools import get_blockchain_parameters
 from silkaj.constants import FAILURE_EXIT_STATUS, G1_SYMBOL, GTEST_SYMBOL
 
 
@@ -31,7 +31,7 @@ class CurrencySymbol:
         self.symbol = self.get_symbol()
 
     def get_symbol(self):
-        params = BlockchainParams().params
+        params = get_blockchain_parameters()
         if params["currency"] == "g1":
             return G1_SYMBOL
         elif params["currency"] == "g1-test":
diff --git a/silkaj/wot.py b/silkaj/wot.py
index 2268e145..92377b42 100644
--- a/silkaj/wot.py
+++ b/silkaj/wot.py
@@ -23,7 +23,7 @@ from pendulum import from_timestamp, now
 from tabulate import tabulate
 
 from silkaj import wot_tools as wt
-from silkaj.blockchain_tools import BlockchainParams
+from silkaj.blockchain_tools import get_blockchain_parameters
 from silkaj.constants import DATE
 from silkaj.crypto_tools import is_pubkey_and_check
 from silkaj.network_tools import ClientInstance, exit_on_http_error
@@ -66,7 +66,7 @@ def received_sent_certifications(uid_pubkey):
 
     identity, pubkey, signed = choose_identity(uid_pubkey)
     certifications = OrderedDict()
-    params = BlockchainParams().params
+    params = get_blockchain_parameters()
     requirements = client(wot.requirements, pubkey)
     for req in requirements["identities"]:
         if req["pubkey"] == pubkey:
@@ -107,7 +107,7 @@ def cert_written_in_the_blockchain(written_certs, certifieur):
 
 
 def membership_status(certifications, pubkey, req):
-    params = BlockchainParams().params
+    params = get_blockchain_parameters()
     if len(certifications["received"]) >= params["sigQty"]:
         date = certifications["received_expire"][
             len(certifications["received"]) - params["sigQty"]
diff --git a/tests/test_membership.py b/tests/test_membership.py
index 1d632ad1..763bf0ad 100644
--- a/tests/test_membership.py
+++ b/tests/test_membership.py
@@ -36,7 +36,7 @@ from patched.wot import (
     patched_wot_requirements_one_pending,
 )
 from silkaj import auth, membership, wot
-from silkaj.blockchain_tools import BlockchainParams, HeadBlock
+from silkaj.blockchain_tools import HeadBlock, get_blockchain_parameters
 from silkaj.cli import cli
 from silkaj.constants import DATE, FAILURE_EXIT_STATUS, SUCCESS_EXIT_STATUS
 from silkaj.network_tools import ClientInstance
@@ -171,7 +171,7 @@ def test_display_confirmation_table(patched_wot_requirements, monkeypatch, capsy
         ["Identity published", date_idty_pub],
     )
 
-    params = BlockchainParams().params
+    params = get_blockchain_parameters()
     membership_validity = (
         pendulum.now().add(seconds=params["msValidity"]).diff_for_humans()
     )
-- 
GitLab