class_docstr: Timetable that triggers DAG runs according to a cron expression.
  
  This is different from ``CronDataIntervalTimetable``, where the cron
  expression specifies the *data interval* of a DAG run. With this timetable,
  the data intervals are specified independently from the cron expression.
  Also for the same reason, this timetable kicks off a DAG run immediately at
  the start of the period (similar to POSIX cron), instead of needing to wait
  for one data interval to pass.
  
  Don't pass ``@once`` in here; use ``OnceTimetable`` instead.
code: def infer_manual_data_interval(
      self, *, run_after: DateTime
  ) -> DataInterval:
      return DataInterval(
          # pendulum.Datetime ± timedelta should return pendulum.Datetime
          # however mypy decide that output would be datetime.datetime
          run_after - self._interval,  # type: ignore[arg-type]
          run_after,
      )
  
file_path: airflow/airflow/timetables/trigger.py
imports: from __future__ import annotations
  import datetime
  from typing import TYPE_CHECKING, Any
  from pendulum import DateTime
  from airflow.timetables._cron import CronMixin
  from airflow.timetables.base import DagRunInfo, DataInterval, Timetable
label_desc: Use image node_id 4 for calling the CronTriggerTimetable obj's underlying member method code with example usage: obj.infer_manual_data_interval() and returns: DataInterval