Files
ARR-2.0-0918/integrations/ohip/capture_named_day_job.py

64 lines
2.7 KiB
Python

"""Explicit-date v3 capture jobs with an explicit primary-profile query budget."""
import argparse
import json
from pathlib import Path
from . import audit_arr_named_day as audit, capture_job as jobs, collect_arr_named_day as named
from . import collect_arr_source as source
from .profile_reader import ProfileSummaryReader
from .rate_info import RateInfoReader
class NamedDayProtocol:
@staticmethod
def identity(batch_id, options):
source.require(type(options) is named.Options, "invalid_named_day_options")
request = jobs.identity(batch_id, options)
request.update(version="arr-api-capture-job/v3", source_contract="arr-api-date-candidates/v3",
operations=named.OPERATIONS)
return request
@staticmethod
def collect(options, archive, reader_factory):
reader, rates, profiles = reader_factory(archive, options.hotel_id)
return named.collect(options, archive, reader, rates, profiles)
@staticmethod
def verify_completed(directory, attempt, options):
verified = audit.VerifiedArchive(directory / f"attempt-{attempt['attempt_no']:04d}", attempt["manifest_sha256"])
source.require(verified.options == options, "completed_capture_context_mismatch")
audit.replay(verified)
return verified.result
def run_batch(root, batch_id, options, reader_factory):
return jobs.run_batch(root, batch_id, options, reader_factory, protocol=NamedDayProtocol)
def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--job-store", type=Path, required=True)
parser.add_argument("--batch-id", required=True)
parser.add_argument("--from-date", required=True)
parser.add_argument("--to-date", required=True)
parser.add_argument("--rate-date", required=True)
parser.add_argument("--hotel-id", required=True)
parser.add_argument("--max-profiles", type=int, required=True)
parser.add_argument("--credential-file", type=Path, required=True)
args = parser.parse_args(argv)
options = named.Options(args.from_date, args.to_date, args.rate_date, args.hotel_id, max_profiles=args.max_profiles)
def factory(archive, hotel):
key = source.load_key(args.credential_file)
transport = source.HTTPTransport(key, timeout=40)
return (source.Reader(archive, hotel, transport, key=key), RateInfoReader(archive, hotel, transport, key=key),
ProfileSummaryReader(archive, hotel, transport, max_profiles=options.max_profiles, key=key))
result = run_batch(args.job_store, args.batch_id, options, factory)
print(json.dumps(result, ensure_ascii=False, allow_nan=False))
return 0 if result.get("candidate_capture_complete") else 1
if __name__ == "__main__":
raise SystemExit(main())