def get_block_range_for_date(provider_uri, date, output): """Outputs start and end blocks for given date.""" bitcoin_rpc = BitcoinRpc(provider_uri) btc_service = BtcBlockRangeService(bitcoin_rpc) start_block, end_block = btc_service.get_block_range_for_date(date) with smart_open(output, 'w') as output_file: output_file.write('{},{}\n'.format(start_block, end_block))
def get_block_range_for_date(provider_uri, date, start_hour, end_hour, output): """Outputs start and end blocks for given date.""" if start_hour > end_hour: raise ValueError('end_hour should be greater than or equal to start_hour') bitcoin_rpc = BitcoinRpc(provider_uri) btc_service = BtcBlockRangeService(bitcoin_rpc) start_block, end_block = btc_service.get_block_range_for_date(date, start_hour, end_hour) with smart_open(output, 'w') as output_file: output_file.write('{},{}\n'.format(start_block, end_block))
def get_partitions(start, end, partition_batch_size, provider_uri): """Yield partitions based on input data type.""" if is_date_range(start, end): start_date = datetime.strptime(start, '%Y-%m-%d').date() end_date = datetime.strptime(end, '%Y-%m-%d').date() day = timedelta(days=1) btc_service = BtcBlockRangeService( bitcoin_rpc=ThreadLocalProxy(lambda: BitcoinRpc(provider_uri))) while start_date <= end_date: batch_start_block, batch_end_block = btc_service.get_block_range_for_date( start_date) partition_dir = '/date={start_date!s}/'.format( start_date=start_date) yield batch_start_block, batch_end_block, partition_dir, start_date start_date += day elif is_block_range(start, end): start_block = int(start) end_block = int(end) for batch_start_block in range(start_block, end_block + 1, partition_batch_size): batch_end_block = batch_start_block + partition_batch_size - 1 if batch_end_block > end_block: batch_end_block = end_block padded_batch_start_block = str(batch_start_block).zfill(8) padded_batch_end_block = str(batch_end_block).zfill(8) partition_dir = '/start_block={padded_batch_start_block}/end_block={padded_batch_end_block}'.format( padded_batch_start_block=padded_batch_start_block, padded_batch_end_block=padded_batch_end_block, ) yield batch_start_block, batch_end_block, partition_dir else: raise ValueError( 'start and end must be either block numbers or ISO dates')
def get_new_btc_block_range_service(chain): rpc = get_bitcoin_rpc("online", chain=chain) return BtcBlockRangeService(rpc)