forked from LBRYCommunity/lbry-sdk
initial kv store
This commit is contained in:
parent
072f1f112e
commit
d2ad3e7ff1
3 changed files with 82 additions and 1 deletions
|
@ -1004,6 +1004,52 @@ class Daemon(metaclass=JSONRPCServerType):
|
||||||
setattr(c, key, cleaned)
|
setattr(c, key, cleaned)
|
||||||
return {key: cleaned}
|
return {key: cleaned}
|
||||||
|
|
||||||
|
PREFERENCE_DOC = """
|
||||||
|
Preferences management.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def jsonrpc_preference_get(self, key=None, account_id=None):
|
||||||
|
"""
|
||||||
|
Get preference value for key or all values if not key is passed in.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
preference_get [<key>]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--key=<key> : (str) key associated with value
|
||||||
|
--account_id=<account_id> : (str) id of the account containing value
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
(dict) Dictionary of preference(s)
|
||||||
|
"""
|
||||||
|
account = self.get_account_or_default(account_id)
|
||||||
|
if key:
|
||||||
|
if key in account.preferences:
|
||||||
|
return {key: account.preferences[key]}
|
||||||
|
return
|
||||||
|
return account.preferences
|
||||||
|
|
||||||
|
def jsonrpc_preference_set(self, key, value, account_id=None):
|
||||||
|
"""
|
||||||
|
Set preferences
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
preference_set (<key>) (<value>)
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--key=<key> : (str) key associated with value
|
||||||
|
--value=<key> : (str) key associated with value
|
||||||
|
--account_id=<account_id> : (str) id of the account containing value
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
(dict) Dictionary with key/value of new preference
|
||||||
|
"""
|
||||||
|
account = self.get_account_or_default(account_id)
|
||||||
|
account.preferences[key] = value
|
||||||
|
account.modified_on = time.time()
|
||||||
|
self.default_wallet.save()
|
||||||
|
return {key: value}
|
||||||
|
|
||||||
ACCOUNT_DOC = """
|
ACCOUNT_DOC = """
|
||||||
Create, modify and inspect wallet accounts.
|
Create, modify and inspect wallet accounts.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -27,6 +27,7 @@ class Account(BaseAccount):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.channel_keys = {}
|
self.channel_keys = {}
|
||||||
|
self.preferences = {}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hash(self) -> bytes:
|
def hash(self) -> bytes:
|
||||||
|
@ -38,6 +39,7 @@ class Account(BaseAccount):
|
||||||
def apply(self, d: dict):
|
def apply(self, d: dict):
|
||||||
super().apply(d)
|
super().apply(d)
|
||||||
self.channel_keys.update(d.get('certificates', {}))
|
self.channel_keys.update(d.get('certificates', {}))
|
||||||
|
self.preferences.update(d.get('preferences', {}))
|
||||||
|
|
||||||
def add_channel_private_key(self, private_key):
|
def add_channel_private_key(self, private_key):
|
||||||
public_key_bytes = private_key.get_verifying_key().to_der()
|
public_key_bytes = private_key.get_verifying_key().to_der()
|
||||||
|
@ -118,17 +120,22 @@ class Account(BaseAccount):
|
||||||
def from_dict(cls, ledger, wallet, d: dict) -> 'Account':
|
def from_dict(cls, ledger, wallet, d: dict) -> 'Account':
|
||||||
account = super().from_dict(ledger, wallet, d)
|
account = super().from_dict(ledger, wallet, d)
|
||||||
account.channel_keys = d.get('certificates', {})
|
account.channel_keys = d.get('certificates', {})
|
||||||
|
account.preferences = d.get('preferences', {})
|
||||||
return account
|
return account
|
||||||
|
|
||||||
def to_dict(self, include_channel_keys=True):
|
def to_dict(self, include_channel_keys=True, include_preferences=True):
|
||||||
d = super().to_dict()
|
d = super().to_dict()
|
||||||
if include_channel_keys:
|
if include_channel_keys:
|
||||||
d['certificates'] = self.channel_keys
|
d['certificates'] = self.channel_keys
|
||||||
|
if include_preferences and self.preferences:
|
||||||
|
d['preferences'] = self.preferences
|
||||||
return d
|
return d
|
||||||
|
|
||||||
async def get_details(self, **kwargs):
|
async def get_details(self, **kwargs):
|
||||||
details = await super().get_details(**kwargs)
|
details = await super().get_details(**kwargs)
|
||||||
details['certificates'] = len(self.channel_keys)
|
details['certificates'] = len(self.channel_keys)
|
||||||
|
if self.preferences:
|
||||||
|
details['preferences'] = self.preferences
|
||||||
return details
|
return details
|
||||||
|
|
||||||
def get_transaction_history(self, **constraints):
|
def get_transaction_history(self, **constraints):
|
||||||
|
|
|
@ -84,3 +84,31 @@ class AccountSynchronization(AsyncioTestCase):
|
||||||
self.daemon.jsonrpc_sync_apply('password', data=add_cert)
|
self.daemon.jsonrpc_sync_apply('password', data=add_cert)
|
||||||
self.assertEqual(self.daemon.jsonrpc_sync_hash(), hash_w_cert)
|
self.assertEqual(self.daemon.jsonrpc_sync_hash(), hash_w_cert)
|
||||||
self.assertEqual(self.account.channel_keys, {'abcdefg1234:0': '---PRIVATE KEY---'})
|
self.assertEqual(self.account.channel_keys, {'abcdefg1234:0': '---PRIVATE KEY---'})
|
||||||
|
|
||||||
|
@mock.patch('time.time', mock.Mock(return_value=12345))
|
||||||
|
def test_account_preferences_syncing(self):
|
||||||
|
starting_hash = '69afcd60a300f47933917d77ef011beeeb4decfafebbda91c144c84282c6814f'
|
||||||
|
self.account.modified_on = 123.456
|
||||||
|
self.assertEqual(self.daemon.jsonrpc_sync_hash(), starting_hash)
|
||||||
|
self.assertEqual(self.daemon.jsonrpc_sync_apply('password')['hash'], starting_hash)
|
||||||
|
self.assertFalse(self.daemon.jsonrpc_preference_get())
|
||||||
|
|
||||||
|
hash_w_pref = '2fe43f0b2f8bbf1fbb55537f862d8bcb0823791019a7151c848bd5f5bd32d336'
|
||||||
|
add_pref = (
|
||||||
|
'czo4MTkyOjE2OjE6Jgn3nAGrfYP2usMA4KQ/73+YHAwMyiGdSWuxCmgZKlpwSpnfQv8R7R0tum/n2oTSBQxjdL'
|
||||||
|
'OlTW+tv/G5L2GfQ5op3xaT89gN+F/JJnvf3cdWvYH7Nc+uTUMb7cKhJP7hQvFW5bb1Y3jX3EBBY00Jkqyj9RCR'
|
||||||
|
'XPtbLVu71KbVRvCAR/oAnMEsgD+ITsC3WkXMwE3BS2LjJDQmeqbH4YXNdcjJN/JzQ6fxOmr3Uk1GqnpuhFsta8'
|
||||||
|
'H14ViRilq1pLKOSZIN80rrm5cKq45nFO5kFeoqBCEaal4u2/OkX9nOnpQlO3E95wD8hkCmZ3i20aSte6nqwqXx'
|
||||||
|
'ZKVRZqR2a0TjwVWB8kPXPA2ewKvPILaj190bXPl8EVu+TAnTCQwMgytinYjtcKNZmMz3ENJyI2mCANwpWlX7xl'
|
||||||
|
'y/J+qLi5b9N+agghTxggs5rVJ/hkaue7GS542dXDrwMrw9nwGqNw3dS/lcU+1wRUQ0fnHwb/85XbbwyO2aDj2i'
|
||||||
|
'DFNkdyLyUIiIUvB1JfWAnWqX3vQcL1REK1ePgUei7dCHJ3WyWdsRx3cVXzlK8yOPkf0N6d3AKrZQWVebwDC7Nd'
|
||||||
|
'eL4sDW8AkaXuBIrbuZw6XUHd6WI0NvU/q10j2qMm0YoXSu+dExou1/1THwx5g86MxcX5nwodKUEVCOTzKMyrLz'
|
||||||
|
'CRsitH/+dAXhZNRp/FbnDCGBMyD3MOYCjZvAFbCZUasoRwqponxILw=='
|
||||||
|
)
|
||||||
|
self.daemon.jsonrpc_sync_apply('password', data=add_pref)
|
||||||
|
self.assertEqual(self.daemon.jsonrpc_sync_hash(), hash_w_pref)
|
||||||
|
self.assertEqual(self.daemon.jsonrpc_preference_get(), {"fruit": ["apple", "orange"]})
|
||||||
|
|
||||||
|
self.daemon.jsonrpc_preference_set("fruit", ["peach", "apricot"])
|
||||||
|
self.assertEqual(self.daemon.jsonrpc_preference_get(), {"fruit": ["peach", "apricot"]})
|
||||||
|
self.assertNotEqual(self.daemon.jsonrpc_sync_hash(), hash_w_pref)
|
||||||
|
|
Loading…
Reference in a new issue