text: import json
  from datetime import datetime, timedelta
  
  from airflow.decorators import dag, task # DAG and task decorators for interfacing with the TaskFlow API
  
  
  @dag(
      # This defines how often your DAG will run, or the schedule by which your DAG runs. In this case, this DAG
      # will run every 30 mins
      schedule_interval=timedelta(minutes=30),
      # This DAG is set to run for the first time on January 1, 2021. Best practice is to use a static
      # start_date. Subsequent DAG runs are instantiated based on scheduler_interval
      start_date=datetime(2021, 1, 1),
      # When catchup=False, your DAG will only run for the latest schedule_interval. In this case, this means
      # that tasks will not be run between January 1, 2021 and 30 mins ago. When turned on, this DAG's first
      # run will be for the next 30 mins, per the schedule_interval
      catchup=False,
      tags=['example']) # If set, this tag is shown in the DAG view of the Airflow UI
  def example_dag_basic():
      """
      ### Basic ETL Dag
      This is a simple ETL data pipeline example that demonstrates the use of
      the TaskFlow API using three simple tasks for extract, transform, and load.
      For more information on Airflow's TaskFlow API, reference documentation here:
      https://airflow.apache.org/docs/apache-airflow/stable/tutorial_taskflow_api.html
      """
  
      @task()
      def extract():
          """
          #### Extract task
          A simple "extract" task to get data ready for the rest of the
          pipeline. In this case, getting data is simulated by reading from a
          hardcoded JSON string.
          """
          data_string = '{"1001": 301.27, "1002": 433.21, "1003": 502.22}'
  
          order_data_dict = json.loads(data_string) 
          return order_data_dict
  
      @task(multiple_outputs=True) # multiple_outputs=True unrolls dictionaries into separate XCom values
      def transform(order_data_dict: dict):
          """
          #### Transform task
          A simple "transform" task which takes in the collection of order data and
          computes the total order value.
          """
          total_order_value = 0
  
          for value in order_data_dict.values():
              total_order_value += value
  
          return {"total_order_value": total_order_value}
  
      @task()
      def load(total_order_value: float):
          """
          #### Load task
          A simple "load" task that takes in the result of the "transform" task and prints it out,
          instead of saving it to end user review
          """
  
          print(f"Total order value is: {total_order_value:.2f}")
  
      order_data = extract()
      order_summary = transform(order_data)
      load(order_summary["total_order_value"])
  
  example_dag_basic = example_dag_basic()