From fa98397a4d73a876c31f88a577cc5bfc51e1d628 Mon Sep 17 00:00:00 2001
From: Holger Nahrstaedt <holger@nahrstaedt.de>
Date: Sat, 28 Apr 2018 09:33:21 +0200
Subject: [PATCH] Allow condenser_api calls for appbase nodes

steem
* add option use_condenser
steemnoderpc
* refactoring
Graphenerpc
* condenser_api calls shen use_condenser=True is set.
unit tests
* test_comment and test_discussion uses 19.4 nodes now
---
 README.rst                     |  1 +
 beem/steem.py                  |  4 +---
 beemapi/steemnoderpc.py        |  5 -----
 beemgrapheneapi/graphenerpc.py | 14 ++++++++++++--
 tests/beem/test_comment.py     |  3 ++-
 tests/beem/test_discussions.py |  3 ++-
 6 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/README.rst b/README.rst
index 043bebdb..70ef94ce 100644
--- a/README.rst
+++ b/README.rst
@@ -136,6 +136,7 @@ Changelog
 * Memory consumption fer requests and websocket reduced when creating more instances of steem
 * trade_history added to market
 * Issue #4 fixed
+* Steem(use_condenser=True) activates condenser_api calls for 19.4 nodes
 
 0.19.23
 -------
diff --git a/beem/steem.py b/beem/steem.py
index 7c1bdb7a..53302590 100644
--- a/beem/steem.py
+++ b/beem/steem.py
@@ -129,7 +129,7 @@ class Steem(object):
                 "irrversible")
             :param bool bundle: Do not broadcast transactions right away, but allow
                 to bundle operations *(optional)*
-            :param bool appbase: Use the new appbase rpc protocol on nodes with version
+            :param bool use_condenser: Use the old condenser_api rpc protocol on nodes with version
                 0.19.4 or higher. The settings has no effect on nodes with version of 0.19.3 or lower.
             :param int num_retries: Set the maximum number of reconnects to the nodes before
                 NumRetriesReached is raised. Disabled for -1. (default is -1)
@@ -146,7 +146,6 @@ class Steem(object):
         self.expiration = int(kwargs.get("expiration", 30))
         self.bundle = bool(kwargs.get("bundle", False))
         self.blocking = kwargs.get("blocking", False)
-        appbase = kwargs.get("appbase", True)
 
         # Store config for access through other Classes
         self.config = config
@@ -156,7 +155,6 @@ class Steem(object):
                          rpcuser=rpcuser,
                          rpcpassword=rpcpassword,
                          **kwargs)
-            self.rpc.appbase = appbase
 
         self.data = {'last_refresh': None, 'dynamic_global_properties': None, 'feed_history': None,
                      'get_feed_history': None, 'hardfork_properties': None,
diff --git a/beemapi/steemnoderpc.py b/beemapi/steemnoderpc.py
index 8cf691c5..0f993c76 100644
--- a/beemapi/steemnoderpc.py
+++ b/beemapi/steemnoderpc.py
@@ -27,13 +27,8 @@ class SteemNodeRPC(GrapheneRPC):
 
     def __init__(self, *args, **kwargs):
         super(SteemNodeRPC, self).__init__(*args, **kwargs)
-        self.appbase = kwargs.get("appbase", False)
         self.next_node_on_empty_reply = False
 
-    def get_use_appbase(self):
-        """Returns True if appbase ready and appbase calls are set"""
-        return self.appbase and self.is_appbase_ready()
-
     def set_next_node_on_empty_reply(self, next_node_on_empty_reply=True):
         """Switch to next node on empty reply for the next rpc call"""
         self.next_node_on_empty_reply = next_node_on_empty_reply
diff --git a/beemgrapheneapi/graphenerpc.py b/beemgrapheneapi/graphenerpc.py
index 3b9869f5..fd4ffe8a 100644
--- a/beemgrapheneapi/graphenerpc.py
+++ b/beemgrapheneapi/graphenerpc.py
@@ -161,6 +161,7 @@ class GrapheneRPC(object):
         self.rpc_queue = []
         self.timeout = kwargs.get('timeout', 60)
         self.num_retries = kwargs.get("num_retries", -1)
+        self.use_condenser = kwargs.get("use_condenser", False)
         self.error_cnt = {}
         self.num_retries_call = kwargs.get("num_retries_call", 5)
         self.error_cnt_call = 0
@@ -185,6 +186,10 @@ class GrapheneRPC(object):
         """Check if node is appbase ready"""
         return self.current_rpc >= 2
 
+    def get_use_appbase(self):
+        """Returns True if appbase ready and appbase calls are set"""
+        return not self.use_condenser and self.is_appbase_ready()
+
     def rpcconnect(self, next_url=True):
         """Connect to next url in a loop."""
         if self.urls is None:
@@ -216,7 +221,10 @@ class GrapheneRPC(object):
                     self.rpclogin(self.user, self.password)
                 try:
                     props = None
-                    props = self.get_config(api="database")
+                    if not self.use_condenser:
+                        props = self.get_config(api="database")
+                    else:
+                        props = self.get_config()
                 except Exception as e:
                     if re.search("Bad Cast:Invalid cast from type", str(e)):
                         self.current_rpc += 2
@@ -400,11 +408,13 @@ class GrapheneRPC(object):
         def method(*args, **kwargs):
 
             api_name = get_api_name(self.is_appbase_ready(), *args, **kwargs)
+            if self.is_appbase_ready() and self.use_condenser:
+                api_name = "condenser_api"
 
             # let's be able to define the num_retries per query
             self.num_retries_call = kwargs.get("num_retries_call", self.num_retries_call)
             add_to_queue = kwargs.get("add_to_queue", False)
-            query = get_query(self.is_appbase_ready(), self.get_request_id(), api_name, name, args)
+            query = get_query(self.is_appbase_ready() and not self.use_condenser, self.get_request_id(), api_name, name, args)
             if add_to_queue:
                 self.rpc_queue.append(query)
                 return None
diff --git a/tests/beem/test_comment.py b/tests/beem/test_comment.py
index a843389d..2fa81acc 100644
--- a/tests/beem/test_comment.py
+++ b/tests/beem/test_comment.py
@@ -19,7 +19,8 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         cls.bts = Steem(
-            node=get_node_list(appbase=False),
+            node=get_node_list(appbase=True),
+            use_condenser=True,
             nobroadcast=True,
             keys={"active": wif},
             num_retries=10
diff --git a/tests/beem/test_discussions.py b/tests/beem/test_discussions.py
index 1ed80f94..c11b68e5 100644
--- a/tests/beem/test_discussions.py
+++ b/tests/beem/test_discussions.py
@@ -25,7 +25,8 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         cls.bts = Steem(
-            node=get_node_list(appbase=False),
+            node=get_node_list(appbase=True),
+            use_condenser=True,
             nobroadcast=True,
             keys={"active": wif},
             num_retries=10
-- 
GitLab