class_docstr: Determines whether a task's execution date is valid.
class_docstr_tok: ["Determines","whether","a","task","'s","execution","date","is","valid","."]
code: def _get_dep_statuses(self, ti, session, dep_context):
      cur_date = timezone.utcnow()
  
      # don't consider runs that are executed in the future unless
      # specified by config and schedule_interval is None
      logical_date = ti.get_dagrun(session).execution_date
      if (
          logical_date > cur_date
          and not ti.task.dag.allow_future_exec_dates
      ):
          yield self._failing_status(
              reason=(
                  f"Execution date {logical_date.isoformat()} is in the future "
                  f"(the current date is {cur_date.isoformat()})."
              )
          )
  
      if ti.task.end_date and logical_date > ti.task.end_date:
          yield self._failing_status(
              reason=(
                  f"The execution date is {logical_date.isoformat()} but this is "
                  f"after the task's end date {ti.task.end_date.isoformat()}."
              )
          )
  
      if (
          ti.task.dag
          and ti.task.dag.end_date
          and logical_date > ti.task.dag.end_date
      ):
          yield self._failing_status(
              reason=(
                  f"The execution date is {logical_date.isoformat()} but this is after "
                  f"the task's DAG's end date {ti.task.dag.end_date.isoformat()}."
              )
          )
  
imports: from __future__ import annotations
  from airflow.ti_deps.deps.base_ti_dep import BaseTIDep
  from airflow.utils import timezone
  from airflow.utils.session import provide_session
label_desc: Use image node_id 1 for calling the RunnableExecDateDep obj's underlying member method code with example usage: obj._get_dep_statuses(ti, session, dep_context) without return types