mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-05 03:35:51 +00:00
90 lines
2.1 KiB
Python
90 lines
2.1 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.util import Dict
|
|
from ripple.util import Log
|
|
from ripple.util import Range
|
|
from ripple.util.Decimal import Decimal
|
|
from ripple.util.PrettyPrint import pretty_print, Streamer
|
|
|
|
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(print, server, numbers):
|
|
print(Range.to_string(numbers))
|
|
|
|
def display(f):
|
|
@wraps(f)
|
|
def wrapper(printer, server, numbers, *args):
|
|
streamer = Streamer(printer=printer)
|
|
for number in numbers:
|
|
ledger = server.get_ledger(number, ARGS.full)
|
|
if ledger:
|
|
streamer.add(number, f(ledger, *args))
|
|
streamer.finish()
|
|
return wrapper
|
|
|
|
def extractor(f):
|
|
@wraps(f)
|
|
def wrapper(printer, server, numbers, *paths):
|
|
try:
|
|
find = jsonpath_rw.parse('|'.join(paths)).find
|
|
except:
|
|
raise ValueError("Can't understand jsonpath '%s'." % path)
|
|
def fn(ledger, *args):
|
|
return f(find(ledger), *args)
|
|
display(fn)(printer, server, numbers)
|
|
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)
|
|
|
|
@extractor
|
|
def extract(finds):
|
|
return dict((str(f.full_path), str(f.value)) for f in finds)
|
|
|
|
@extractor
|
|
def sum(finds):
|
|
d = Decimal()
|
|
for f in finds:
|
|
d.accumulate(f.value)
|
|
return [str(d), len(finds)]
|