Source code for rpscripts.trimmer
'''This module cuts off a given calc's JSON output file by given start and end measure numbers and return a new JSON file.'''
from .lib.base import CustomException, GeneralSubparser, RPData, file_rename
[docs]def main(rpdata: RPData, start_measure, end_measure) -> None:
'''Trim the given RPData between the given start and end measures.'''
global_offsets = sorted(list(rpdata.offset_map.values()))
measures = sorted(list(map(int, list(rpdata.offset_map.keys()))))
try:
start_offset = global_offsets[0]
start_label = 'init'
if start_measure:
if start_measure in measures:
start_offset = rpdata.offset_map[str(start_measure)]
start_label = int(start_measure)
end_offset = global_offsets[-1] + 1
end_label = 'end'
if end_measure:
if end_measure in measures:
next_measure = str(end_measure + 1)
if next_measure in rpdata.offset_map.keys():
end_offset = rpdata.offset_map[next_measure]
end_label = str(end_measure)
except:
raise CustomException('Given start or end measure out of piece')
if start_label == 'init' and end_label == 'end':
print('Given start and end measure out of the piece. Nothing done.')
return
new_rpdata = RPData()
# Get limits
start_pointer = None
i = 0
while i < rpdata.size and rpdata.data['Global offset'][i] < end_offset:
if rpdata.data['Global offset'][i] >= start_offset:
if start_pointer == None:
start_pointer = i
i += 1
end_pointer = i
new_rpdata = rpdata.trim(start_pointer, end_pointer)
new_rpdata.path = file_rename(rpdata.path, 'json', 'excerpt-{}-{}'.format(start_label, end_label))
new_rpdata.save_to_file()
[docs]class Subparser(GeneralSubparser):
'''Implements argparser.'''
[docs] def setup(self) -> None:
self.program_name = 'trim'
self.program_help = 'JSON file trimmer. Trim given measures'
[docs] def add_arguments(self) -> None:
self.parser.add_argument('-s', '--start', help='Start measure. Blank means "from the beginning"', type=int)
self.parser.add_argument('-e', '--end', help='End measure. Blank means "to the end"', type=int)
[docs] def handle(self, args):
if not args.start and not args.end:
print('No given start or end measure')
else:
start_measure = None
end_measure = None
if args.start:
start_measure = int(args.start)
if args.end:
end_measure = int(args.end)
rpdata = RPData(args.filename)
main(rpdata, start_measure, end_measure)