class_docstr: Describes how the time dimension for metrics should be constrained.
class_docstr_tok: ["Describes","how","the","time","dimension","for","metrics","should","be","constrained","."]
code: def __post_init__(self) -> None:  # noqa: D
      if self.start_time > self.end_time:
          logger.warning(
              f"start_time must not be > end_time. start_time={self.start_time} end_time={self.end_time}"
          )
  
      if self.start_time < TimeRangeConstraint.ALL_TIME_BEGIN():
          logger.warning(
              f"start_time={self.start_time} exceeds the limits of {TimeRangeConstraint.ALL_TIME_BEGIN()}"
          )
  
      if self.end_time > TimeRangeConstraint.ALL_TIME_END():
          raise RuntimeError(
              f"end_time={self.end_time} exceeds the limits of {TimeRangeConstraint.ALL_TIME_END()}"
          )
  
imports: from __future__ import annotations
  import datetime
  import logging
  from dataclasses import dataclass
  from typing import Optional
  import pandas
  from dbt_semantic_interfaces.dataclass_serialization import SerializableDataclass
  from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity
  from metricflow.time.time_granularity import offset_period
label_desc: Use image node_id 1 for calling the TimeRangeConstraint obj's underlying member method code with example usage: obj.__post_init__() without return types