Files
rippled/bin/ripple/ledger/displays/__init__.py
Tom Ritchford 9160b46c1e Bug fixes and new features for LedgerTool:
* 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.
2014-08-27 18:05:44 -04:00

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)]