
    ZThiD                     \   d dl mZ d dlmZmZmZ d dlZd dlZd dlm	Z	m
Z
 d dlZd dlZd dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZ d d	lmZmZmZ d d
lmZ d dlm Z m!Z!m"Z"m#Z#  eejH                  jJ                  jL                        Zde
fdZ'de	fdZ(d Z)d Z*d Z+d Z,d Z-d Z.dZ/dZ0y)    )Path)AnyDictcastN)MockerFixtureMockFixture)
_mock_path)SiftAPIDeprecationWarning)ChannelBitFieldElementChannelConfigChannelDataTypeChannelEnumType)TelemetryConfigTelemetryConfigValidationError)_validate_yamlload_named_expression_modulesread_and_validate)
FlowConfig)$RuleActionCreateDataReviewAnnotationRuleActionCreatePhaseAnnotationRuleActionKind
RuleConfigmockerc                    t        t        t        t        f   t        j                  t
                    }t        |      }| j                  t        t                    }||_
        | j                  t        t                    }ddd|_
        t               }t               }t        j                  t        d      5  t!        j"                  ||g      }d d d        j$                  dk(  sJ |j&                  dk(  sJ t)        |j*                        dk(  sJ |j*                  }|d	   j,                  d
k(  sJ |d   j,                  dk(  sJ |d   j,                  dk(  sJ |\  }	}
}t)        |	j.                        dk(  sJ t)        |
j.                        dk(  sJ t)        |j.                        dk(  sJ |j.                  d	   }|j,                  dk(  sJ |j0                  dk(  sJ |j2                  t4        j6                  k(  sJ |	j.                  \  }}}}|j,                  dk(  sJ |j2                  t4        j8                  k(  sJ |j:                  dk(  sJ |j<                  J |j0                  dk(  sJ |j,                  dk(  sJ |j2                  t4        j>                  k(  sJ |j:                  dk(  sJ |j0                  dk(  sJ |j,                  dk(  sJ |j2                  t4        j@                  k(  sJ |j:                  dk(  sJ |j0                  dk(  sJ t)        |jB                        dk(  sJ |jB                  d	   j,                  dk(  sJ |jB                  d	   jD                  d	k(  sJ |jB                  d   j,                  dk(  sJ |jB                  d   jD                  dk(  sJ |jB                  d   j,                  dk(  sJ |jB                  d   jD                  dk(  sJ |j,                  dk(  sJ |j2                  t4        jF                  k(  sJ |j:                  J |j0                  dk(  sJ t)        |jH                        dk(  sJ |jH                  d	   j,                  dk(  sJ |jH                  d	   jJ                  d	k(  sJ |jH                  d	   jL                  dk(  sJ |jH                  d   j,                  d k(  sJ |jH                  d   jJ                  dk(  sJ |jH                  d   jL                  dk(  sJ |jH                  d   j,                  d!k(  sJ |jH                  d   jJ                  dk(  sJ |jH                  d   jL                  dk(  sJ |jH                  d   j,                  d"k(  sJ |jH                  d   jJ                  d#k(  sJ |jH                  d   jL                  dk(  sJ t)        |jN                        dk(  sJ |jN                  \  }}}}|j,                  d$k(  sJ |j0                  d%k(  sJ |jP                  d&k(  sJ |jR                  jU                         tV        jX                  k(  sJ t[        |jR                  t\              sJ |j,                  d'k(  sJ |j0                  d(k(  sJ |jP                  d)k(  sJ |jR                  jU                         tV        jX                  k(  sJ t[        |jR                  t^              sJ |j,                  d*k(  sJ |j0                  d+k(  sJ |jP                  d,k(  sJ |jR                  jU                         tV        jX                  k(  sJ t[        |jR                  t\              sJ |j,                  d-k(  sJ |j0                  d.k(  sJ |jP                  d/k(  sJ |jR                  jU                         tV        jX                  k(  sJ t[        |jR                  t\              sJ y # 1 sw Y   xY w)0Ncontains($1, $substr)"0.5 * $mass * $1 * $1 > $thresholdlog_substring_containskinetic_energy_gt	componentmatchLunarVehicle426lunar_vehicle_426   r   readings   partial_readings   logs   logz
asset logszmainmotor.velocityzMiles Per HourspeedvoltageVoltszvoltage at the sourcevehicle_statezvehicle stateAcceleratingDeceleratingStoppedgpiozon/off values for pins on gpio12vchargeledheater   overheatingzChecks for vehicle overheatingz$1 == "Accelerating" && $2 > 80speedingzChecks high vehicle speedz$1 > 20failureszChecks for failure logscontains($1, "ERROR")kinetic_energyz)Tracks high energy output while in motionz0.5 * 10 * $1 * $1 > 470)0r   r   r   yaml	safe_loadTEST_YAML_CONFIG_STRr   patchr	   r   return_valuer   r   pytestwarnsr
   r   try_from_yaml
asset_nameingestion_client_keylenflowsnamechannelsdescription	data_typer   STRINGDOUBLEunitr    INT_32ENUM
enum_typeskey	BIT_FIELDbit_field_elementsindex	bit_countrules
expressionactionkindr   
ANNOTATION
isinstancer   r   )r   raw_yaml_configyaml_configmock_read_and_validate"mock_load_named_expression_modulesdummy_yaml_pathdummy_named_expr_mod_pathtelemetry_configflow_configsreadings_flowpartial_readings_flow	logs_flowlog_channelvelocity_channelvoltage_channelvehicle_state_channelgpio_channeloverheating_rulespeeding_rulefailures_rulekinetic_energy_rules                        m/home/www/backend.miabetepe.com/venv/lib/python3.12/site-packages/sift_py/ingestion/config/_telemetry_test.py$test_telemetry_config_load_from_yamlru   #   s    4S>4>>:N+OPO 1K#\\*5F*GH*5')/jA^6_)`&"9A7&3
 fO $	/{	C 
*8878


 &&*;;;;004GGGG%%&!+++#))L?:---?#5555?6)))6B3M()}%%&!+++$--.!333y!!"a'''$$Q'Ku$$$""l222  O$:$::::MZMcMcJo'<l  $8888%%)?)????  $4444%%---''72229,,,$$(>(>>>>7***&&*AAAA %%888 **o.B.BBBB %%888 ,,???$//0A555 ++A.33~EEE ++A.22a777 ++A.33~EEE ++A.22a777 ++A.33y@@@ ++A.22a777&&&!!_%>%>>>>$$$##'GGGG|../1444**1-22e;;;**1-33q888**1-771<<<**1-22h>>>**1-33q888**1-771<<<**1-22e;;;**1-33q888**1-771<<<**1-22h>>>**1-33q888**1-771<<<%%&!+++ 	   M111''+KKKK&&*KKKK""'')^-F-FFFF&--/STTT+++$$(CCCC##y000""'')^-F-FFFFm**,KLLL+++$$(AAAA##'>>>>""'')^-F-FFFFm**,PQQQ##'7777**.YYYY))-GGGG""'')^-F-FFFF)002VWWWC
 
s   <__c                    t        t        t        t        f   t        j                  t
                    }t        |      }| j                  t        t                    }||_
        | j                  t        t                    }ddd|_
        t               }t               }t        j                  t        d      5  t!        j"                  ||g      }ddd       y# 1 sw Y   yxY w)zC
    Raise an error if there are duplicate channels in a flow.
    r   r   r   !Can't have two identical channelsr!   N)r   r   r   r?   r@   *DUPLICATE_CHANNEL_IN_FLOW_TELEMETRY_CONFIGr   rB   r	   r   rC   r   r   rD   raisesr   r   rF   )r   r`   ra   rb   rc   rd   re   _s           rt   7test_telemetry_config_err_if_duplicate_channels_in_flowr{      s     S#X'QRO !1K#\\*5F*GH*5')/jA^6_)`&"9A7&3
 fO $	5=`	a X))/<U;VWX X Xs   <CC&c                       y )N r}       rt   4test_telemetry_config_named_expression_interpolationr      s    r~   c            
         t        dt        j                        } t        dddd| j	                         dgt        dd	g
            }t        dddd| j	                         dgt        dd	g
            }t        j                  t        d      5  t        dddt        d| g      g||g       d d d        y # 1 sw Y   y xY w)N
my_channelrK   rN   rule_a $1 > 10$1channel_referencechannel_identifierzbob@example.com	barometerassigneetagsrK   rM   r[   channel_referencesr\   z$1 > 11zCan't have two rulesr!   my_assetmy_asset_keymy_organization_idmy_flowrK   rL   )rG   rH   organization_idrJ   rZ   )r   r   rP   r   fqnr   rD   ry   r   r   r   )channelrule_on_my_channel_aanother_rule_on_my_channel_as      rt   1test_telemetry_config_validations_duplicate_rulesr      s    !((G
 &"&gkkmL
 4&
 $."&gkkmL
 4&
$  
5=S	T 
!!/0"%Y ()EF	

 
 
s    B<<Cc                      t        dt        j                        } t        j                  t
        d      5  t        dddt        d| | g	      g
       d d d        y # 1 sw Y   y xY w)Nr   r   rw   r!   r   r   r   r   r   rG   rH   r   rJ   r   r   rP   rD   ry   r   r   r   )r   s    rt   4test_telemetry_config_validations_duplicate_channelsr      sk    !((G
 
5=`	a 
!!/0"		

 
 
s   AA'c                  "   t        dt        j                        } t        dt        j                        }t        j                  t
        d      5  t        dddt        d	| g
      t        d	|g
      g       d d d        y # 1 sw Y   y xY w)Nr   r   my_other_channelzCan't have two flowsr!   r   r   r   r   r   r   r   )r   	channel_bs     rt   6test_telemetry_config_validations_flows_with_same_namer      s    !((G
 !((I
 
5=S	T 
!!/0"%Y "'[			

 
 
s   *BBc                  p   t        dt        j                        } t        dt        j                        }t        dt        j                  ddt        dd	      t        d
d	      t        dd	      g      }t        dt        j                  dt        ddd      t        ddd      t        ddd      g      }t        dddd| j                         dgt        ddg             }t        d!d"d#d|j                         dgt        d$g%             }t        d&t        d'| |||g(      g||g)      S )*N	channel_ar   r   channel_enumzAn example enum channelzExample Enum UnitOptionAr   )rK   rU   OptionBr'   OptionCr)   )rK   rN   rM   rQ   rT   channel_bitfieldzAn example bitfield channelElement1)rK   rX   rY   Element2Element3r%   r+   )rK   rN   rM   rW   r   zRule A descriptionr   r   r   zalice@example.comtag_ar   r   rule_bzRule B descriptionr=   tag_b)r   asset_1flow_1r   )rG   rJ   rZ   )r   r   rP   rO   rS   r   rV   r   r   r   r   r   r   r   )r   r   r   r   r   r   s         rt   get_telemetry_configr     s`   !((I
 !((I
 !!&&- 222

L %!++1"
!qI"
!qI"
!qI
		 ("&immoN
 4(
F (*"&immoN
 /

F #Y>NO
 v	 	r~   c                     t               j                         } t               }| |j                         k(  sJ t               }d|_        | |j                         k7  sJ t               }d|j                  d   _        | |j                         k7  sJ t               }d|j                  d   j
                  d   _        | |j                         k7  sJ t               }d|j                  d   j
                  d   _        | |j                         k7  sJ t               }d|j                  d   j
                  d   _        | |j                         k7  sJ t               }d|j                  d   j
                  d   j                  d   _        | |j                         k7  sJ t               }d	|j                  d   j
                  d   j                  d   _	        | |j                         k7  sJ t               }d
|j                  d   j
                  d   j                  d   _        | |j                         k7  sJ t               }d	|j                  d   j
                  d   j                  d   _        | |j                         k7  sJ t               }d|j                  d   j
                  d   j                  d   _        | |j                         k7  sJ t               }t               }|j                  d   j
                  d   |j                  d   j
                  d   c|j                  d   j
                  d<   |j                  d   j
                  d<   |j                         |j                         k7  sJ y )Nnew_asset_namenew_flow_namer   new_channel_namezUpdated descriptionzUpdated UnitzUpdated Enum Namer)   
   zUpdated Bit Field Namer%   	   r'   )r   hashrG   rJ   rK   rL   rM   rQ   rT   rU   rW   rY   rX   )original_hash
new_configoriginal_configs      rt   test_telemetry_config_hashr   ^  s.   (*//1M%'JJOO----%'J,JJOO----%'J.JQJOO----%'J+=JQ  #(JOO----%'J2GJQ  #/JOO----%'J+9JQ  #(JOO----%'J9LJQ  #..q16JOO----%'J8:JQ  #..q15JOO----%'JAYJQ  #66q9>JOO----%'JFHJQ  #66q9CJOO----%'JBCJQ  #66q9?JOO---- +,O%'J$$Q'$$Q' EJQ  #Z%5%5a%8%A%A!%D
 !Z__%6666r~   a	  
asset_name: LunarVehicle426
ingestion_client_key: lunar_vehicle_426

channels:
  log_channel: &log_channel
    name: log
    data_type: string
    description: asset logs

  velocity_channel: &velocity_channel
    name: velocity
    data_type: double
    description: speed
    unit: Miles Per Hour
    component: mainmotor

  voltage_channel: &voltage_channel
    name: voltage
    data_type: int32
    description: voltage at the source
    unit: Volts

  vehicle_state_channel: &vehicle_state_channel
    name: vehicle_state
    data_type: enum
    description: vehicle state
    unit: vehicle state
    enum_types:
      - name: Accelerating
        key: 0
      - name: Decelerating
        key: 1
      - name: Stopped
        key: 2

  gpio_channel: &gpio_channel
    name: gpio
    data_type: bit_field
    description: on/off values for pins on gpio
    bit_field_elements:
      - name: 12v
        index: 0
        bit_count: 1
      - name: charge
        index: 1
        bit_count: 2
      - name: led
        index: 3
        bit_count: 4
      - name: heater
        index: 7
        bit_count: 1

rules:
  - name: overheating
    description: Checks for vehicle overheating
    expression: $1 == "Accelerating" && $2 > 80
    channel_references:
      - $1: *vehicle_state_channel
      - $2: *voltage_channel
    type: review

  - name: speeding
    description: Checks high vehicle speed
    type: phase
    expression: $1 > 20
    channel_references:
      - $1: *velocity_channel

  - name: failures
    description: Checks for failure logs
    type: review
    assignee: homer@example.com
    expression:
      name: log_substring_contains
    channel_references:
      - $1: *log_channel
    sub_expressions:
      - $substr: ERROR
    tags:
        - foo
        - bar
        - baz

  - name: kinetic_energy
    description: Tracks high energy output while in motion
    type: review
    assignee: homer@example.com
    expression:
      name: kinetic_energy_gt
    channel_references:
      - $1: *velocity_channel
    sub_expressions:
      - $mass: 10
      - $threshold: 470
    tags:
        - nostromo

flows:
  - name: readings
    channels:
      - <<: *velocity_channel
      - <<: *voltage_channel
      - <<: *vehicle_state_channel
      - <<: *gpio_channel

  - name: partial_readings
    channels:
      - <<: *velocity_channel
      - <<: *voltage_channel

  - name: logs
    channels:
      - <<: *log_channel

aM  
asset_name: LunarVehicle426
ingestion_client_key: lunar_vehicle_426

channels:
  velocity_channel: &velocity_channel
    name: velocity
    data_type: double
    description: speed
    unit: Miles Per Hour
    component: mainmotor

flows:
  - name: readings
    channels:
      - <<: *velocity_channel
      - <<: *velocity_channel
)1pathlibr   typingr   r   r   rD   r?   pytest_mockr   r   "sift_py.ingestion.config.telemetrysift_py"sift_py.ingestion.config.yaml.loadsift_py._internal.test_util.fnr	   _mock_path_impsift_py.errorr
   sift_py.ingestion.channelr   r   r   r   r   r   r   r   r   sift_py.ingestion.flowr   sift_py.ingestion.rule.configr   r   r   r   	ingestionconfig	telemetryru   r{   r   r   r   r   r   r   rA   rx   r}   r~   rt   <module>r      s     " "   2 ) ) G 3  _ 
 .  G--44>>?
qX qXhXM X2	,
^
.
:DN77vt l. *r~   