mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-19 18:45:52 +00:00
* Fix RIPD-509, RIPD-514, RIPD-519, RIPD-525, RIPD-527, RIPD-529, RIPD-530 and RIPD-531. * Protect people from ledger-spew and remove cruft. * Better error messages and handling. * Cache command lists or clears ledger cache. * Better ledger summaries. * Offline mode.
92 lines
2.2 KiB
Python
92 lines
2.2 KiB
Python
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
|
|
from functools import wraps
|
|
|
|
import jsonpath_rw
|
|
|
|
from ripple.ledger.Args import ARGS
|
|
from ripple.ledger.PrettyPrint import pretty_print
|
|
from ripple.util import Dict
|
|
from ripple.util import Log
|
|
from ripple.util import Range
|
|
from ripple.util.Decimal import Decimal
|
|
|
|
TRANSACT_FIELDS = (
|
|
'accepted',
|
|
'close_time_human',
|
|
'closed',
|
|
'ledger_index',
|
|
'total_coins',
|
|
'transactions',
|
|
)
|
|
|
|
LEDGER_FIELDS = (
|
|
'accepted',
|
|
'accountState',
|
|
'close_time_human',
|
|
'closed',
|
|
'ledger_index',
|
|
'total_coins',
|
|
'transactions',
|
|
)
|
|
|
|
def _dict_filter(d, keys):
|
|
return dict((k, v) for (k, v) in d.items() if k in keys)
|
|
|
|
def ledger_number(server, numbers):
|
|
yield Range.to_string(numbers)
|
|
|
|
def display(f):
|
|
"""A decorator for displays that just print JSON"""
|
|
@wraps(f)
|
|
def wrapper(server, numbers, *args, **kwds):
|
|
for number in numbers:
|
|
ledger = server.get_ledger(number, ARGS.full)
|
|
if ledger:
|
|
yield pretty_print(f(ledger, *args, **kwds))
|
|
return wrapper
|
|
|
|
def json(f):
|
|
"""A decorator for displays that print JSON, extracted by a path"""
|
|
@wraps(f)
|
|
def wrapper(server, numbers, path, *args, **kwds):
|
|
try:
|
|
path_expr = jsonpath_rw.parse(path)
|
|
except:
|
|
raise ValueError("Can't understand jsonpath '%s'." % path)
|
|
|
|
for number in numbers:
|
|
ledger = server.get_ledger(number, ARGS.full)
|
|
if ledger:
|
|
finds = path_expr.find(ledger)
|
|
yield pretty_print(f(finds, *args, **kwds))
|
|
return wrapper
|
|
|
|
@display
|
|
def ledger(ledger, full=False):
|
|
if ARGS.full:
|
|
if full:
|
|
return ledger
|
|
ledger = Dict.prune(ledger, 1, False)
|
|
|
|
return _dict_filter(ledger, LEDGER_FIELDS)
|
|
|
|
@display
|
|
def prune(ledger, level=1):
|
|
return Dict.prune(ledger, level, False)
|
|
|
|
@display
|
|
def transact(ledger):
|
|
return _dict_filter(ledger, TRANSACT_FIELDS)
|
|
|
|
@json
|
|
def extract(finds):
|
|
return dict((str(f.full_path), str(f.value)) for f in finds)
|
|
|
|
@json
|
|
def sum(finds):
|
|
d = Decimal()
|
|
for f in finds:
|
|
d.accumulate(f.value)
|
|
return [str(d), len(finds)]
|