tuya-interpreter 0.1.0a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. tuya_interpreter-0.1.0a1/.gitignore +17 -0
  2. tuya_interpreter-0.1.0a1/LICENSE +21 -0
  3. tuya_interpreter-0.1.0a1/PKG-INFO +356 -0
  4. tuya_interpreter-0.1.0a1/README.md +337 -0
  5. tuya_interpreter-0.1.0a1/THIRD_PARTY_NOTICES.md +20 -0
  6. tuya_interpreter-0.1.0a1/bindings/js/engine.mjs +84 -0
  7. tuya_interpreter-0.1.0a1/bindings/js/smoke.mjs +34 -0
  8. tuya_interpreter-0.1.0a1/docs/device-customization.md +166 -0
  9. tuya_interpreter-0.1.0a1/docs/engine-spec.md +435 -0
  10. tuya_interpreter-0.1.0a1/docs/performance.md +35 -0
  11. tuya_interpreter-0.1.0a1/docs/releases.md +86 -0
  12. tuya_interpreter-0.1.0a1/docs/rust-engine.md +318 -0
  13. tuya_interpreter-0.1.0a1/examples/README.md +241 -0
  14. tuya_interpreter-0.1.0a1/examples/devices/device-a.json +70 -0
  15. tuya_interpreter-0.1.0a1/examples/devices/device-b.json +70 -0
  16. tuya_interpreter-0.1.0a1/examples/devices/rules.json +18 -0
  17. tuya_interpreter-0.1.0a1/examples/devices/toggle-switch.json +28 -0
  18. tuya_interpreter-0.1.0a1/examples/python/device_cli.py +189 -0
  19. tuya_interpreter-0.1.0a1/examples/python/toggle_cli.py +215 -0
  20. tuya_interpreter-0.1.0a1/examples/rust/Cargo.toml +16 -0
  21. tuya_interpreter-0.1.0a1/examples/rust/src/main.rs +388 -0
  22. tuya_interpreter-0.1.0a1/hatch_build.py +41 -0
  23. tuya_interpreter-0.1.0a1/hatch_version.py +23 -0
  24. tuya_interpreter-0.1.0a1/pyproject.toml +62 -0
  25. tuya_interpreter-0.1.0a1/rules/README.md +75 -0
  26. tuya_interpreter-0.1.0a1/rules/builtin/00-default.json +22684 -0
  27. tuya_interpreter-0.1.0a1/rules/builtin/10-windowpusher.json +48 -0
  28. tuya_interpreter-0.1.0a1/rules/builtin/manifest.json +15 -0
  29. tuya_interpreter-0.1.0a1/rust/Cargo.toml +3 -0
  30. tuya_interpreter-0.1.0a1/rust/engine/Cargo.toml +19 -0
  31. tuya_interpreter-0.1.0a1/rust/engine/examples/benchmark.rs +100 -0
  32. tuya_interpreter-0.1.0a1/rust/engine/schema.json +277 -0
  33. tuya_interpreter-0.1.0a1/rust/engine/src/adapter.rs +639 -0
  34. tuya_interpreter-0.1.0a1/rust/engine/src/api.rs +339 -0
  35. tuya_interpreter-0.1.0a1/rust/engine/src/assembly.rs +369 -0
  36. tuya_interpreter-0.1.0a1/rust/engine/src/data.rs +372 -0
  37. tuya_interpreter-0.1.0a1/rust/engine/src/driver/check.rs +87 -0
  38. tuya_interpreter-0.1.0a1/rust/engine/src/driver/cover.rs +304 -0
  39. tuya_interpreter-0.1.0a1/rust/engine/src/driver/overrides.rs +622 -0
  40. tuya_interpreter-0.1.0a1/rust/engine/src/driver.rs +817 -0
  41. tuya_interpreter-0.1.0a1/rust/engine/src/entity.rs +451 -0
  42. tuya_interpreter-0.1.0a1/rust/engine/src/error.rs +49 -0
  43. tuya_interpreter-0.1.0a1/rust/engine/src/expr.rs +831 -0
  44. tuya_interpreter-0.1.0a1/rust/engine/src/lib.rs +84 -0
  45. tuya_interpreter-0.1.0a1/rust/engine/src/machine.rs +155 -0
  46. tuya_interpreter-0.1.0a1/rust/engine/src/plan.rs +68 -0
  47. tuya_interpreter-0.1.0a1/rust/engine/src/protocol.rs +179 -0
  48. tuya_interpreter-0.1.0a1/rust/engine/src/rules.rs +190 -0
  49. tuya_interpreter-0.1.0a1/rust/engine/src/runtime.rs +191 -0
  50. tuya_interpreter-0.1.0a1/rust/engine/tests/conformance.rs +269 -0
  51. tuya_interpreter-0.1.0a1/rust/engine/tests/driver_vectors.json +1 -0
  52. tuya_interpreter-0.1.0a1/rust/engine/tests/native_api.rs +177 -0
  53. tuya_interpreter-0.1.0a1/rust/engine/tuya_engine.h +19 -0
  54. tuya_interpreter-0.1.0a1/scripts/benchmark_abi.py +65 -0
  55. tuya_interpreter-0.1.0a1/scripts/build_pack.py +35 -0
  56. tuya_interpreter-0.1.0a1/scripts/build_rules.py +50 -0
  57. tuya_interpreter-0.1.0a1/scripts/data/tuya_categories.json +109 -0
  58. tuya_interpreter-0.1.0a1/scripts/data/tuya_standard_rules.json +8 -0
  59. tuya_interpreter-0.1.0a1/scripts/gen_core_tables.py +138 -0
  60. tuya_interpreter-0.1.0a1/scripts/gen_host_units.py +22 -0
  61. tuya_interpreter-0.1.0a1/scripts/gen_quirks.py +63 -0
  62. tuya_interpreter-0.1.0a1/scripts/gen_tuya_categories.py +42 -0
  63. tuya_interpreter-0.1.0a1/scripts/golden/README.md +37 -0
  64. tuya_interpreter-0.1.0a1/scripts/golden/ambr.py +83 -0
  65. tuya_interpreter-0.1.0a1/scripts/golden/build_golden.py +53 -0
  66. tuya_interpreter-0.1.0a1/scripts/golden/extract_actions.py +61 -0
  67. tuya_interpreter-0.1.0a1/scripts/golden/quirk_oracle.py +37 -0
  68. tuya_interpreter-0.1.0a1/scripts/golden/quirk_oracle_synthetic.py +21 -0
  69. tuya_interpreter-0.1.0a1/scripts/golden/snapshots.json +7907 -0
  70. tuya_interpreter-0.1.0a1/scripts/golden/synthetic_snapshots.json +272 -0
  71. tuya_interpreter-0.1.0a1/scripts/release_version.py +51 -0
  72. tuya_interpreter-0.1.0a1/scripts/standard.py +48 -0
  73. tuya_interpreter-0.1.0a1/src/tuya_interpreter/__init__.py +58 -0
  74. tuya_interpreter-0.1.0a1/src/tuya_interpreter/checks.py +22 -0
  75. tuya_interpreter-0.1.0a1/src/tuya_interpreter/driver.py +81 -0
  76. tuya_interpreter-0.1.0a1/src/tuya_interpreter/io.py +118 -0
  77. tuya_interpreter-0.1.0a1/src/tuya_interpreter/native.py +85 -0
  78. tuya_interpreter-0.1.0a1/src/tuya_interpreter/overrides.py +11 -0
  79. tuya_interpreter-0.1.0a1/src/tuya_interpreter/rules.py +23 -0
  80. tuya_interpreter-0.1.0a1/tests/chain/baseline.json +58 -0
  81. tuya_interpreter-0.1.0a1/tests/chain/conftest.py +11 -0
  82. tuya_interpreter-0.1.0a1/tests/chain/measure.py +45 -0
  83. tuya_interpreter-0.1.0a1/tests/chain/props.py +88 -0
  84. tuya_interpreter-0.1.0a1/tests/chain/test_counts.py +40 -0
  85. tuya_interpreter-0.1.0a1/tests/chain/test_props.py +52 -0
  86. tuya_interpreter-0.1.0a1/tests/conftest.py +6 -0
  87. tuya_interpreter-0.1.0a1/tests/engine.py +157 -0
  88. tuya_interpreter-0.1.0a1/tests/golden/actions_golden.json +887 -0
  89. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/bh_dft4ebatvon3ha5s.json +80 -0
  90. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/bzyd_45idzfufidgee7ir.json +137 -0
  91. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/bzyd_ssimhf6r8kgwepfb.json +76 -0
  92. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/bzyd_tkqgkrutewrmbn9c.json +147 -0
  93. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cjkg_hmabvy81.json +283 -0
  94. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cjkg_uenof8jd.json +171 -0
  95. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ckmkzq_1yyqfw4djv9eii3q.json +59 -0
  96. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_3r8gc33pnqsxfe1g.json +122 -0
  97. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_669wsr2w4cvinbh4.json +138 -0
  98. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_cpbo62rn.json +100 -0
  99. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_ebt12ypvexnixvtf.json +57 -0
  100. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_g1cp07dsqnbdbbki.json +102 -0
  101. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_lfkr93x0ukp5gaia.json +138 -0
  102. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_n3xgr5pdmpinictg.json +37 -0
  103. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_qqdxfdht.json +65 -0
  104. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_qtemqjy7axczkkls.json +109 -0
  105. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_rD7uqAAgQOpSA2Rx.json +37 -0
  106. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cl_zah67ekd.json +60 -0
  107. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/clkg_nhyj64w2.json +93 -0
  108. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/clkg_wltqkykhni0papzj.json +114 -0
  109. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/clkg_xqvhthwkbmp3aghs.json +114 -0
  110. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/clkg_y7j64p60glp8qpx7.json +108 -0
  111. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/co2bj_yakol79dibtswovc.json +56 -0
  112. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/co2bj_yrr3eiyiacm31ski.json +285 -0
  113. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cobj_hcdy5zrq3ikzthws.json +59 -0
  114. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_b9oyi2yofflroq1g.json +134 -0
  115. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_biflejkeshx1sqig.json +130 -0
  116. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_eguoms25tkxtf5u8.json +88 -0
  117. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_ipmyy4nigpqcnd8q.json +40 -0
  118. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_ka2wfrdoogpvgzfi.json +127 -0
  119. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_qhxmvae667uap4zh.json +30 -0
  120. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_u0wirz487erb0eka.json +169 -0
  121. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_vmxuxszzjwp5smli.json +30 -0
  122. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cs_zibqa9dutqyaxym2.json +54 -0
  123. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cwjwq_agwu93lr.json +64 -0
  124. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cwwsq_lxfvx41gqdotrkgi.json +111 -0
  125. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cwwsq_wfkzyy0evslzsmoi.json +99 -0
  126. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cwysj_akln8rb04cav403q.json +73 -0
  127. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cwysj_z3rpyvznfcch99aa.json +130 -0
  128. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_0fHWRe8ULjtmnBNd.json +149 -0
  129. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_0g1fmqh6d5io7lcn.json +54 -0
  130. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_2iepauebcvo74ujc.json +168 -0
  131. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_2jxesipczks0kdct.json +86 -0
  132. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_37mnhia3pojleqfh.json +87 -0
  133. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_39sy2g68gsjwo2xv.json +155 -0
  134. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_4mbgrfotyNzMxDAv.json +87 -0
  135. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_6fa7odsufen374x2.json +168 -0
  136. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_79a7z01v3n35kytb.json +21 -0
  137. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_9ivirni8wemum6cw.json +87 -0
  138. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_AiHXxAyyn7eAkLQY.json +54 -0
  139. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_CHLZe9HQ6QIXujVN.json +54 -0
  140. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_EYfNTuTPZln9e4cn.json +87 -0
  141. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_ExGgQmjt0SHMdlDZ.json +57 -0
  142. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_HBRBzv1UVBVfF6SL.json +56 -0
  143. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_IGzCi97RpN2Lf9cu.json +149 -0
  144. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_PGEkBctAbtzKOZng.json +54 -0
  145. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_anwgf2xugjxpkfxb.json +116 -0
  146. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_cuhokdii7ojyw8k2.json +54 -0
  147. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_dhto3y4uachr1wll.json +21 -0
  148. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_dntgh2ngvshfxpsz.json +33 -0
  149. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_fbvia0apnlnattcy.json +101 -0
  150. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_fencxse0bnut96ig.json +100 -0
  151. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_gbtxrqfy9xcsakyp.json +168 -0
  152. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_gjnozsaz.json +133 -0
  153. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_guitoc9iylae4axs.json +217 -0
  154. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_hA2GsgMfTQFTz9JL.json +54 -0
  155. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_hj0a5c7ckzzexu8l.json +98 -0
  156. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_ik9sbig3mthx9hjz.json +168 -0
  157. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_ipabufmlmodje1ws.json +165 -0
  158. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_iqhidxhhmgxk5eja.json +54 -0
  159. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_jnbbxsb84gvvyfg5.json +56 -0
  160. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_jti3ce2hzvsposgj.json +215 -0
  161. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_mQUhiTg9kwydBFBd.json +87 -0
  162. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_n8iVBAPLFKAAAszH.json +54 -0
  163. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_nkb0fmtlfyqosnvk.json +98 -0
  164. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_nx8rv6jpe1tsnffk.json +116 -0
  165. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_piuensvr.json +33 -0
  166. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_qm0iq4nqnrlzh4qc.json +168 -0
  167. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_qxJSyTLEtX5WrzA9.json +87 -0
  168. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_raceucn29wk2yawe.json +56 -0
  169. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_sb6bwb1n8ma2c5q4.json +168 -0
  170. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_t0a4hwsf8anfsadp.json +116 -0
  171. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_tf6qp8t3hl9h7m94.json +86 -0
  172. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_tkn2s79mzedk6pwr.json +160 -0
  173. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_vrbpx6h7fsi5mujb.json +223 -0
  174. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_vxqn72kwtosoy4d3.json +98 -0
  175. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_w0qqde0g.json +133 -0
  176. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_wifvoilfrqeo6hvu.json +98 -0
  177. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_wrz6vzch8htux2zp.json +168 -0
  178. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_y4jnobxh.json +33 -0
  179. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_yncyws7tu1q4cpsz.json +37 -0
  180. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/cz_z6pht25s3p0gs26q.json +207 -0
  181. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dc_l3bpgg8ibsagon4x.json +147 -0
  182. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dd_gaobbrxqiblcng2p.json +21 -0
  183. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dgnbj_layxxij0sdbrfmrf.json +508 -0
  184. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_0gyaslysqfp4gfis.json +557 -0
  185. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_8szt7whdvwpmxglk.json +493 -0
  186. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_8ugheslg.json +57 -0
  187. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_8y0aquaa8v6tho8w.json +336 -0
  188. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_AqHUMdcbYzIq1Of4.json +508 -0
  189. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_amx1bgdrfab6jngb.json +333 -0
  190. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_bSXSSFArVKtc4DyC.json +54 -0
  191. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_baf9tt9lb8t5uc7z.json +75 -0
  192. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_c3nsqogqovapdpfj.json +348 -0
  193. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_d4g0fbsoaal841o6.json +375 -0
  194. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_dbou1ap4.json +390 -0
  195. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_djnozmdyqyriow8z.json +482 -0
  196. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_ekwolitfjhxn55js.json +557 -0
  197. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_fuupmcr2mb1odkja.json +336 -0
  198. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_h4aX2JkHZNByQ4AV.json +54 -0
  199. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_hp6orhaqm6as3jnv.json +508 -0
  200. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_hpc8ddyfv85haxa7.json +154 -0
  201. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_iayz2jmtlipjnxj7.json +527 -0
  202. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_idnfq7xbx8qewyoa.json +521 -0
  203. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_ilddqqih3tucdk68.json +75 -0
  204. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_j1bgp31cffutizub.json +432 -0
  205. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_k3okx0w3bsgmindp.json +921 -0
  206. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_kgaob37tz2muf3mi.json +548 -0
  207. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_lmnt3uyltk1xffrt.json +75 -0
  208. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_mki13ie507rlry4r.json +456 -0
  209. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_nbumqpv8vz61enji.json +557 -0
  210. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_nlxvjzy1hoeiqsg6.json +75 -0
  211. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_oe0cpnjg.json +224 -0
  212. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_oj4fqh3fo3obgu6a.json +830 -0
  213. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_p06rbu0a9jp37ixo.json +899 -0
  214. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_qoqolwtqzfuhgghq.json +477 -0
  215. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_riwp3k79.json +400 -0
  216. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_tgewj70aowigv8fz.json +140 -0
  217. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_tmsloaroqavbucgn.json +375 -0
  218. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_ufq2xwuzd4nb0qdr.json +333 -0
  219. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_vqwcnabamzrc2kab.json +530 -0
  220. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_xdvitmhhmgefaeuq.json +510 -0
  221. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_xokdfs6kh5ednakk.json +375 -0
  222. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_yfqmcabsid3gkd1y.json +379 -0
  223. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_zakhnlpdiu0ycdxn.json +75 -0
  224. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_zav1pa32pyxray78.json +320 -0
  225. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dj_zputiamzanuk6yky.json +411 -0
  226. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dlq_0tnvg2xaisqdadcf.json +247 -0
  227. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dlq_cnpkf4xdmd9v49iq.json +158 -0
  228. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dlq_dikb3dp6.json +146 -0
  229. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dlq_fygozcnralhwbauo.json +268 -0
  230. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dlq_jdj6ccklup7btq3a.json +216 -0
  231. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dlq_kxdr6su0c55p7bbo.json +135 -0
  232. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dlq_r9kg2g1uhhyicycb.json +143 -0
  233. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dlq_z3jngbyubvwgfrcv.json +222 -0
  234. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/dr_pjvxl1wsyqxivsaf.json +185 -0
  235. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/fs_g0ewlb1vmwqljzji.json +132 -0
  236. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/fs_ibytpo6fpnugft1c.json +21 -0
  237. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/fsd_9ecs16c53uqskxw6.json +151 -0
  238. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ggq_7ytb3h8u.json +52 -0
  239. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/gyd_lgekqfxdabipm3tn.json +263 -0
  240. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/hcdd_expmpw4xxd0kkifb.json +91 -0
  241. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/hjjcy_9f8pjxsmaqnk2tzr.json +334 -0
  242. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/hps_2aaelwxk.json +184 -0
  243. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/hps_wqashyqo.json +41 -0
  244. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/hwsb_ircs2n82vgrozoew.json +34 -0
  245. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/infrared_ac_47peys.json +96 -0
  246. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/infrared_ac_qzktzhehinzsz2je.json +96 -0
  247. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/infrared_tv_47pew0.json +129 -0
  248. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/infrared_tv_lplun31mo1xaonwz.json +129 -0
  249. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/jsq_r492ifwk6f2ssptb.json +86 -0
  250. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/jtmspro_xqeob8h6.json +398 -0
  251. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kg_4nqs33emdwJxpQ8O.json +54 -0
  252. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kg_5ftkaulg.json +80 -0
  253. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kg_gbm9ata1zrzaez4a.json +54 -0
  254. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kj_CAjWAxBUZt7QZHfz.json +84 -0
  255. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kj_fsxtzzhujkrak2oy.json +104 -0
  256. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kj_s4uzibibgzdxzowo.json +115 -0
  257. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kj_yrzylxax1qspdgpp.json +77 -0
  258. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ks_j9fa8ahzac8uvlfl.json +105 -0
  259. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kt_5wnlzekkstwcdsvm.json +78 -0
  260. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kt_ibmmirhhq62mmf1g.json +110 -0
  261. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kt_vdadlnmsorlhw4td.json +78 -0
  262. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/kt_wxqdp6ecfkd78zzz.json +152 -0
  263. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ktkzq_urzivdhumrwfakie.json +74 -0
  264. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ldcg_9kbbfeho.json +45 -0
  265. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mal_gyitctrjj1kefxp2.json +224 -0
  266. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mc_oSQljE9YDqwCwTUA.json +35 -0
  267. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mcs_6ywsnauy.json +44 -0
  268. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mcs_7jIGJAymiH8OsFFb.json +41 -0
  269. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mcs_8yhypbo7.json +39 -0
  270. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mcs_hx5ztlztij4yxxvg.json +35 -0
  271. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mcs_oxslv1c9.json +39 -0
  272. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mcs_qxu3flpqjsc1kqu3.json +39 -0
  273. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/msp_3ddulzljdjjwkhoy.json +149 -0
  274. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/msp_5t7esmqqh92ssbe5.json +54 -0
  275. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/msp_mzuro9jgjs7uiryn.json +155 -0
  276. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mzj_jlapoy5liocmtdvd.json +21 -0
  277. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/mzj_qavcakohisj5adyh.json +117 -0
  278. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ntq_9mqdhwklpvnnvb7t.json +21 -0
  279. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pc_t2afic7i3v1bwhfp.json +42 -0
  280. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pc_trjopo1vdlt9q1tg.json +84 -0
  281. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pc_tsbguim4trl6fa7g.json +188 -0
  282. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pc_yku9wsimasckdt15.json +189 -0
  283. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pir_3amxzozho9xp4mkh.json +42 -0
  284. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pir_fcdjzz3s.json +46 -0
  285. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pir_j5jgnjvdaczeb6dc.json +21 -0
  286. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pir_o1l76njefmksbgkk.json +77 -0
  287. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/pir_wqz93nrdomectyoz.json +37 -0
  288. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/qccdz_7bvgooyjhiua1yyq.json +103 -0
  289. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/qccdz_dsmsam7xpb3ht7rl.json +157 -0
  290. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/qn_5ls2jw49hpczwqng.json +21 -0
  291. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/qt_TtXKwTMwiPpURWLJ.json +37 -0
  292. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/qxj_fsea1lat3vuktbt6.json +410 -0
  293. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/qxj_is2indt9nlth6esa.json +63 -0
  294. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/qxj_xbwbniyt6bgws9ia.json +265 -0
  295. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/rqbj_4iqe2hsfyd86kwwc.json +88 -0
  296. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/rs_d7woucobqi8ncacf.json +57 -0
  297. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sd_i6hyjg3af7doaswm.json +64 -0
  298. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sd_lr33znaodtyarrrz.json +474 -0
  299. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sfkzq_1fcnd8xk.json +130 -0
  300. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sfkzq_d4vpmigg.json +130 -0
  301. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sfkzq_ed7frwissyqrejic.json +282 -0
  302. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sfkzq_kcdiut0eqeni7b8n.json +132 -0
  303. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sfkzq_nxquc5lb.json +130 -0
  304. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sfkzq_o6dagifntoafakst.json +54 -0
  305. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sfkzq_rzklytdei8i8vo37.json +100 -0
  306. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sgbj_DYgId0sz6zWlmmYu.json +74 -0
  307. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sgbj_im2eqqhj72suwwko.json +92 -0
  308. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sgbj_ulv4nnue7gqp0rjk.json +67 -0
  309. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sj_rzeSU2h9uoklxEwq.json +41 -0
  310. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sj_tgvtvdoc.json +41 -0
  311. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sjz_ftbc8rp8ipksdfpv.json +143 -0
  312. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_6bmk1remyscwyx6i.json +229 -0
  313. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_csr2fqitalj5o0tq.json +127 -0
  314. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_drezasavompxpcgm.json +180 -0
  315. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_ehzbfjrau5lbph4o.json +160 -0
  316. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_knkaf1d0dytgyhix.json +289 -0
  317. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_nzauwyj3mcnjnf35.json +220 -0
  318. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_rjKXWRohlvOTyLBu.json +211 -0
  319. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_rudejjigkywujjvs.json +240 -0
  320. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/sp_sdd5f5f2dl5wydjf.json +381 -0
  321. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/swtz_3rzngbyy.json +116 -0
  322. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/szjcy_u5xgcpcngk3pfxb4.json +56 -0
  323. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_1aegphq4yfd50e6b.json +137 -0
  324. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_1ctrc5jx88mtdh9w.json +303 -0
  325. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_9htyiowaf5rtdhrv.json +137 -0
  326. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_cq1p0nt0a4rixnex.json +246 -0
  327. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_emb5khohohihmbxc.json +303 -0
  328. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_gdknjvdpiwoq6smx.json +253 -0
  329. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_nockvv2k39vbrxxk.json +225 -0
  330. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_p6sqiuesvhmhvv4f.json +21 -0
  331. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_pu8uhxhwcp3tgoz7.json +167 -0
  332. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_uoa3mayicscacseb.json +21 -0
  333. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tdq_x3o8epevyeo3z3oa.json +21 -0
  334. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tyndj_pyakuuoc.json +143 -0
  335. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/tzc1_5vlawhjm.json +210 -0
  336. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wfcon_b25mh8sxawsgndck.json +21 -0
  337. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wfcon_lieerjyy6l4ykjor.json +21 -0
  338. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wfcon_plp0gnfcacdeqk5o.json +21 -0
  339. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wg2_2gowdgni.json +77 -0
  340. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wg2_haclbl0qkqlf2qds.json +77 -0
  341. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wg2_nwxr8qcu4seltoro.json +88 -0
  342. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wg2_pkhw2vbphv4csrir.json +135 -0
  343. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wg2_setmxeqgs63xwopm.json +68 -0
  344. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wg2_tmwhss6ntjfc7prs.json +21 -0
  345. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wg2_v7owd9tzcaninc36.json +21 -0
  346. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_6kijc7nd.json +187 -0
  347. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_B0eP8qYAdpUo4yR9.json +53 -0
  348. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_IAYz2WK1th0cMLmL.json +93 -0
  349. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_aqoouq7x.json +100 -0
  350. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_ccpwojhalfxryigz.json +121 -0
  351. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_cpmgn2cf.json +85 -0
  352. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_fi6dne5tu4t1nm6j.json +186 -0
  353. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_gc1bxoq2hafxpa35.json +110 -0
  354. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_gogb05wrtredz3bs.json +195 -0
  355. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_t94pit6zjbask9qo.json +168 -0
  356. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_tfbhw0mg.json +109 -0
  357. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wk_y5obtqhuztqsf2mj.json +74 -0
  358. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wkcz_gc4b1mdw7kebtuyz.json +227 -0
  359. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wkf_9xfjixap.json +85 -0
  360. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wkf_p3dbf6qs.json +85 -0
  361. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wnykq_kzwdw5bpxlbs9h9g.json +40 -0
  362. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wnykq_npbbca46yiug8ysk.json +21 -0
  363. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wnykq_om518smspsaltzdi.json +21 -0
  364. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wnykq_rqhxdyusjrwxyff6.json +21 -0
  365. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wnykq_x0lyfgjuguuh1vof.json +22 -0
  366. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_g2y6z3p3ja2qhyav.json +155 -0
  367. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_iq4ygaai.json +45 -0
  368. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_iv7hudlj.json +168 -0
  369. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_krlcihrpzpc8olw9.json +66 -0
  370. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_lf36y5nwb8jkxwgg.json +66 -0
  371. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_qrztc3ev.json +210 -0
  372. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_s5l7qidyapl1rbrs.json +59 -0
  373. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_vlzqwckk.json +348 -0
  374. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_vtA4pDd6PLUZzXgZ.json +56 -0
  375. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_xflodz7oja0pndk3.json +428 -0
  376. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_xpxdr5q6vc8aztq0.json +59 -0
  377. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_xr3htd96.json +56 -0
  378. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdcg_yqiqbaldtr0i7mru.json +259 -0
  379. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wsdykq_ay30hrndaogxclh0.json +22 -0
  380. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wxkg_ja5osu5g.json +64 -0
  381. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wxkg_l8yaz4um5b3pwyvf.json +50 -0
  382. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/wxnbq_5l1ht8jygsyr1wn1.json +21 -0
  383. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/xdd_shx9mmadyyeaq88t.json +139 -0
  384. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/xfj_pjabraecffsfrmxz.json +75 -0
  385. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/xktyd_3djw12ln4xtvv8eq.json +175 -0
  386. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/xnyjcn_pb0tc75khaik8qbg.json +794 -0
  387. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ydkt_jevroj5aguwdbs2e.json +21 -0
  388. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ygsb_l6ax0u6jwbz82atk.json +63 -0
  389. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ykq_bngwdjsr.json +70 -0
  390. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ywbj_arywmw6h6vesoz5t.json +37 -0
  391. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ywbj_cjlutkuuvxnie17o.json +37 -0
  392. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ywbj_gf9dejhmzffgdyfj.json +63 -0
  393. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ywbj_kscbebaf3s1eogvt.json +51 -0
  394. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ywbj_rccxox8p.json +68 -0
  395. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ywcgq_h8lvyoahr6s6aybf.json +146 -0
  396. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/ywcgq_wtzwyhkev3b4ubns.json +139 -0
  397. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zjq_nkkl7uzv.json +21 -0
  398. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zndb_4ggkyflayu1h1ho9.json +227 -0
  399. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zndb_gqmmtjclqb7reg5p.json +22 -0
  400. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zndb_iow5ux77dxy3yrpj.json +129 -0
  401. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zndb_uqzhc4bx5zqwpg2m.json +74 -0
  402. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zndb_v5jlnn5hwyffkhp3.json +77 -0
  403. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zndb_z95s7p3z54xbsjnl.json +136 -0
  404. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zndb_ze8faryrxr0glqnn.json +77 -0
  405. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/znjdq_au6dqazvkxqnpaak.json +269 -0
  406. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/znnbq_0kllybtbzftaee7y.json +70 -0
  407. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/znnbq_6b3pbbuqbfabhfiq.json +56 -0
  408. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/znrb_8ln34bg8u4y6rdda.json +419 -0
  409. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/znrb_db81ge24jctwx8lo.json +172 -0
  410. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/znrb_gpzittzfnzhduquz.json +265 -0
  411. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zwjcy_gvygg3m8.json +77 -0
  412. tuya_interpreter-0.1.0a1/tests/golden/core_fixtures/zwjcy_myd45weu.json +77 -0
  413. tuya_interpreter-0.1.0a1/tests/golden/fixtures.py +22 -0
  414. tuya_interpreter-0.1.0a1/tests/golden/golden.json +32909 -0
  415. tuya_interpreter-0.1.0a1/tests/golden/quirk_golden.json +960 -0
  416. tuya_interpreter-0.1.0a1/tests/golden/quirk_synthetic_golden.json +1132 -0
  417. tuya_interpreter-0.1.0a1/tests/helpers.py +33 -0
  418. tuya_interpreter-0.1.0a1/tests/rule_data.py +21 -0
  419. tuya_interpreter-0.1.0a1/tests/sample_overrides.json +20 -0
  420. tuya_interpreter-0.1.0a1/tests/sample_products.json +714 -0
  421. tuya_interpreter-0.1.0a1/tests/test_adapter.py +185 -0
  422. tuya_interpreter-0.1.0a1/tests/test_boundary.py +53 -0
  423. tuya_interpreter-0.1.0a1/tests/test_build_version.py +25 -0
  424. tuya_interpreter-0.1.0a1/tests/test_builtin_rules.py +35 -0
  425. tuya_interpreter-0.1.0a1/tests/test_converter_effects.py +148 -0
  426. tuya_interpreter-0.1.0a1/tests/test_covers.py +337 -0
  427. tuya_interpreter-0.1.0a1/tests/test_delta.py +44 -0
  428. tuya_interpreter-0.1.0a1/tests/test_deltas.py +72 -0
  429. tuya_interpreter-0.1.0a1/tests/test_device_cli.py +55 -0
  430. tuya_interpreter-0.1.0a1/tests/test_driver.py +378 -0
  431. tuya_interpreter-0.1.0a1/tests/test_golden.py +247 -0
  432. tuya_interpreter-0.1.0a1/tests/test_il_values.py +89 -0
  433. tuya_interpreter-0.1.0a1/tests/test_native.py +73 -0
  434. tuya_interpreter-0.1.0a1/tests/test_overrides.py +219 -0
  435. tuya_interpreter-0.1.0a1/tests/test_pack.py +25 -0
  436. tuya_interpreter-0.1.0a1/tests/test_platforms.py +25 -0
  437. tuya_interpreter-0.1.0a1/tests/test_quirks.py +98 -0
  438. tuya_interpreter-0.1.0a1/tests/test_release_version.py +25 -0
  439. tuya_interpreter-0.1.0a1/tests/test_rules.py +137 -0
  440. tuya_interpreter-0.1.0a1/tests/test_rust_toggle_cli.py +85 -0
  441. tuya_interpreter-0.1.0a1/tests/test_specs.py +103 -0
  442. tuya_interpreter-0.1.0a1/tests/test_standard.py +44 -0
  443. tuya_interpreter-0.1.0a1/tests/test_toggle_cli.py +99 -0
@@ -0,0 +1,17 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .pytest_cache/
4
+ dist/
5
+ *.egg-info/
6
+ .venv/
7
+ venv/
8
+ .coverage
9
+ .DS_Store
10
+ /rust/target/
11
+
12
+ /prebuilt/
13
+
14
+ /examples/rust/target/
15
+
16
+ # Resolve Cargo dependencies from manifests in fresh checkouts.
17
+ Cargo.lock
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 3735943886
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,356 @@
1
+ Metadata-Version: 2.5
2
+ Name: tuya-interpreter
3
+ Version: 0.1.0a1
4
+ Summary: Portable Tuya device interpreter: device schemas and DPS <-> ildevice descriptors, values, events and commands
5
+ Project-URL: Repository, https://github.com/3735943886/tuya-interpreter
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Rust
10
+ Classifier: Topic :: Home Automation
11
+ Requires-Python: >=3.10
12
+ Provides-Extra: test
13
+ Requires-Dist: cryptography; extra == 'test'
14
+ Requires-Dist: jsonschema; extra == 'test'
15
+ Requires-Dist: pytest; extra == 'test'
16
+ Requires-Dist: setuptools-scm; extra == 'test'
17
+ Requires-Dist: tuya-device-sharing-sdk==0.2.15; extra == 'test'
18
+ Description-Content-Type: text/markdown
19
+
20
+ # tuya-interpreter
21
+
22
+ **A universal Tuya interpreter. Raw data points in, human-friendly device semantics out.**
23
+
24
+ Turn Tuya DP–value pairs into meaningful device properties, values, events and commands.
25
+ Give the interpreter a device schema and rule pack, then feed it DPS from your preferred
26
+ transport. It handles DP mappings, value decoding, scales, units and device-specific behavior,
27
+ and converts common device commands back into the DPS the device expects.
28
+
29
+ ```text
30
+ Device A: {"1": true, "2": 235} ─┐
31
+ ├─ schema + rules → switch_1: on
32
+ Device B: {"101": true, "102": 2350} ─┘ temp_current: 23.5 °C
33
+
34
+ Common command: switch_1 = true → interpreter → device-specific Tuya DPS
35
+ ```
36
+
37
+ The result is [ildevice](https://github.com/3735943886/ildevice): a **human-readable,
38
+ developer-friendly intermediate device model**. Its descriptor tells your application what
39
+ properties a device exposes, their types and units, and which commands are available.
40
+ Use that common model in dashboards, automation systems, gateways or your own tools, with
41
+ Tuya interpretation shared across applications.
42
+
43
+ **Interpret once. Integrate anywhere.** The same Rust engine powers the native Rust API,
44
+ Python wrapper and JavaScript/WebAssembly binding, with a JSON C ABI for other languages.
45
+ Use Tuya DP–value pairs from rustuya, TinyTuya or another transport implementation;
46
+ the interpretation stays independent of how the data arrives.
47
+
48
+ The engine is Sans-IO: your host owns connections, supplies time and executes returned effects.
49
+ Device schemas and rules provide the meaning of raw DPs; the interpreter handles the conversion
50
+ and state. See the [two-device example](examples/README.md#same-application-different-devices)
51
+ for the same UI operating different DP layouts and temperature scales.
52
+
53
+ ## Device JSON: what the converter uses
54
+
55
+ Use a JSON-safe export of a device populated by
56
+ [tuya-device-sharing-sdk](https://github.com/tuya/tuya-device-sharing-sdk), or a device entry from
57
+ [tuyawizard](https://github.com/3735943886/tuyawizard)'s `tuyadevices.json`.
58
+ The input is one decoded device object, rather than the entire device list or an SDK object.
59
+ Device metadata supplies the schema; live input uses Tuya's standard DP ID–value pairs,
60
+ such as `{"1": true, "2": 235}`. Hosts can obtain these pairs through
61
+ [rustuya](https://github.com/3735943886/rustuya),
62
+ [TinyTuya](https://github.com/jasonacox/tinytuya), or any other Tuya transport implementation.
63
+ The host unwraps the transport response and passes the flat DP map to the interpreter;
64
+ the transport library does not need to supply the device schema.
65
+
66
+ There is no separate `schema` field. Here, **device schema** means the definitions in
67
+ `function` and `status_range`, with `local_strategy` connecting local DP IDs to those definitions.
68
+
69
+ | JSON field | Contents | How it is used |
70
+ | --- | --- | --- |
71
+ | `id` | Device ID, as a string | Required for driver construction; device identity and device-specific overrides. |
72
+ | `name` | Device name | Descriptor label. |
73
+ | `category` | Tuya category such as `cz`, `dj` or `cl` | Selects the category's classification rules. |
74
+ | `product_id` | Product ID | Selects product-specific quirks and overrides; supplies model identity. |
75
+ | `product_name` | Product name | Default model name, unless a quirk or override supplies it. |
76
+ | `function` | Object keyed by DP code, containing writable feature definitions | Resolves command sources and writable properties, including types and allowed values. |
77
+ | `status_range` | Object keyed by DP code, containing reported feature definitions | Resolves state sources, types, ranges, scales, units and report behavior. |
78
+ | `local_strategy` | Object keyed by local DP ID | Maps raw DPS to codes and applies the named value conversion with its configuration. |
79
+ | `status` | Initial values keyed by DP code | Used by classification probes and initial device interpretation; live packets are supplied separately. |
80
+
81
+ Other connection fields, such as `local_key`, IP address, protocol version and parent-device routing,
82
+ belong to the host. Link availability is supplied through `Connected` and `Disconnected` inputs.
83
+
84
+ ### Inside the schema fields
85
+
86
+ A `function` or `status_range` entry provides `code`, `type` and `values`.
87
+ `status_range` may also provide `report_type`, including `sum` for increments that need accumulation.
88
+ `values` can be a decoded object or a JSON string; both forms are accepted.
89
+
90
+ Supported DP types are `Boolean`, `Integer`, `Enum`, `Bitmap`, `String`, `Raw` and `Json`.
91
+ Integer definitions describe `min`, `max`, `scale`, `step` and an optional `unit`;
92
+ Enum definitions contain `range`, and Bitmap definitions can contain `label`.
93
+ The actual interpretation of Raw and Json values depends on the relevant codec and rules.
94
+
95
+ A `local_strategy` entry provides:
96
+
97
+ | Nested field | Purpose |
98
+ | --- | --- |
99
+ | `status_code` or a code in `config_item.statusFormat` | Connects the DP ID to a semantic code. |
100
+ | `value_convert` | Names the raw-to-code value conversion, such as `default` or `enum`. |
101
+ | `config_item` | Conversion configuration, including `valueType`, `valueDesc` and `enumMappingMap` where applicable. |
102
+
103
+ The host can also supply `TuyaDriver(..., dpmap={"1": "switch_1"})` when it already knows
104
+ an ID-to-code mapping. A mapping identifies a DP; its feature definitions still come from
105
+ schema metadata or rules/overrides.
106
+
107
+ ### Example device entry
108
+
109
+ This illustrative plug record has one writable Boolean feature:
110
+
111
+ ```json
112
+ {
113
+ "id": "example-device",
114
+ "name": "Desk plug",
115
+ "category": "cz",
116
+ "product_id": "example-product",
117
+ "product_name": "Smart plug",
118
+ "function": {
119
+ "switch_1": {"code": "switch_1", "type": "Boolean", "values": {}}
120
+ },
121
+ "status_range": {
122
+ "switch_1": {"code": "switch_1", "type": "Boolean", "values": {}}
123
+ },
124
+ "local_strategy": {
125
+ "1": {
126
+ "status_code": "switch_1",
127
+ "value_convert": "default",
128
+ "config_item": {"valueType": "Boolean", "valueDesc": {}}
129
+ }
130
+ },
131
+ "status": {"switch_1": true}
132
+ }
133
+ ```
134
+
135
+ `status["switch_1"]` is a code-keyed initial value. A local packet such as `{"1": true}`
136
+ is DP-ID-keyed and goes through the adapter. Do not feed a code-keyed SDK `status` map directly
137
+ as a DPS message. The host must adapt cloud updates to the driver's DP-ID input contract.
138
+
139
+ ### SDK exports and tuyawizard exports
140
+
141
+ The Sharing SDK populates `device.function` and `device.status_range` with definition objects,
142
+ `device.local_strategy` with DP mappings, and `device.status` with code-keyed values.
143
+ To export an SDK device, recursively convert its objects into dictionaries and serialize DP ID
144
+ keys as strings. Passing the SDK's Python objects directly to `TuyaDriver` is not supported.
145
+
146
+ [tuyawizard's exporter](https://github.com/3735943886/tuyawizard/blob/master/tuyawizard/wizard.py)
147
+ already recursively converts SDK device objects and parses JSON object strings. Its saved device
148
+ list can therefore be decoded and individual entries passed to the driver.
149
+
150
+ A raw cloud API response is a different shape: specification responses contain `functions` and
151
+ `status` arrays, which the SDK turns into the code-keyed `function` and `status_range` objects.
152
+ Use the populated device export, or normalize the raw response to the structure above.
153
+
154
+ ### Missing schema and unclassified DPs
155
+
156
+ Normal automatic classification needs feature definitions in `function` / `status_range`.
157
+ The engine does not infer a device's function from a DP number and current value alone.
158
+ Product quirks and `dp` overrides can supply missing definitions before classification.
159
+
160
+ `expose_unused=True` exposes DPs that the normal rules did not claim as generic properties.
161
+ It can use type/range metadata from `local_strategy.config_item` when feature definitions are missing.
162
+ Integer, Enum and Boolean properties are writable only when defined in `function`;
163
+ String, Raw, Json and Bitmap properties are read-only. This fallback does not invent semantic roles.
164
+
165
+ ## Python quick start
166
+
167
+ ```sh
168
+ pip install tuya-interpreter
169
+ ```
170
+
171
+ Supported wheels include the native engine and official rule files. Runtime dependencies do not
172
+ include the Sharing SDK or tuyawizard: those are ways to obtain device metadata.
173
+ Building from source requires Cargo and Rust 1.88 or newer.
174
+
175
+ Official rules are bundled with the package. `load_builtin_rules()` reads the official layers
176
+ in filename order and returns a merged, validated pack. It also works in editable source checkouts.
177
+ The driver still takes `rules` explicitly and performs no rule-file I/O itself.
178
+
179
+ ```python
180
+ from tuya_interpreter import Command, Connected, Message, TuyaDriver, load_builtin_rules
181
+
182
+ # device is a decoded device entry from the Sharing SDK or tuyawizard.
183
+ driver = TuyaDriver(device, rules=load_builtin_rules())
184
+ print(driver.descriptor)
185
+
186
+ # For the example plug above; the host supplies actual time and packets.
187
+ driver.handle(0.0, Connected())
188
+ values = driver.handle(1.0, Message("active", {"1": True}))
189
+ commands = driver.handle(2.0, Command("switch_1", "off"))
190
+ # commands contains SendMessage("set", {"dps": {"1": False}}).
191
+ # The host sends that payload to the device.
192
+ ```
193
+
194
+ To load a saved tuyawizard device list:
195
+
196
+ ```python
197
+ import json
198
+ from pathlib import Path
199
+
200
+ from tuya_interpreter import TuyaDriver, load_builtin_rules
201
+
202
+ devices = json.loads(Path("tuyadevices.json").read_text(encoding="utf-8"))
203
+ driver = TuyaDriver(devices[0], rules=load_builtin_rules())
204
+ ```
205
+
206
+ Use `descriptor_of(device, rules=rules)` when only a descriptor is needed.
207
+ Keep one driver per device for live conversion, events, accumulated values and timers.
208
+
209
+ ## Interactive examples: one UI, different Tuya devices
210
+
211
+ Two virtual devices expose the same switch and temperature properties through different DP IDs
212
+ and scales. The CLI builds its controls from the ildevice descriptor; it has no hardcoded
213
+ DP mapping, feature names or temperature conversion.
214
+
215
+ ```sh
216
+ pip install tinytuya tuyamock
217
+ python examples/python/device_cli.py --device a
218
+ # After quitting, try the same UI with the other device:
219
+ python examples/python/device_cli.py --device b
220
+ ```
221
+
222
+ Both accept `set switch_1 true` and report `temp_current = 23.5 °C`. Device A sends DP 1
223
+ and reports temperature as `235`; device B sends DP 101 and reports temperature as `2350`.
224
+ The interpreter applies each schema's mapping and scale and rejects writes to the read-only sensor.
225
+
226
+ Run from a source checkout with the interpreter installed. Use `--memory` for a demo without
227
+ network dependencies. See [the example guide](examples/README.md#same-application-different-devices)
228
+ for the profiles and [Rust/rustuya version](examples/README.md#rust-use-the-same-two-device-profiles).
229
+ The original [minimal toggle CLI](examples/python/toggle_cli.py) remains available for connection checks
230
+ and real-device use with private metadata.
231
+
232
+ ## Rules and supported device functions
233
+
234
+ The [official rule pack](rules/README.md) contains category tables, entity specifications,
235
+ units, mappings, feature definitions, codecs' configuration and product-specific quirks.
236
+ The Rust engine supplies the interpreter and Tuya primitives. Changes expressible in the rule
237
+ language, including new platforms, do not require rebuilding the engine.
238
+
239
+ The converter assembles switch, button, select, number, sensor, binary sensor, event, light,
240
+ cover, fan, siren, valve, humidifier, climate, alarm and vacuum functions into ildevice.
241
+ Camera classification exists, but camera streams are outside the current IL assembly;
242
+ `driver.state["assembly"]["unsupported"]` records unsupported plans. Doorbell events carry a kind without
243
+ message text because the intermediate event contract has no text payload.
244
+
245
+ Support is determined by category, available feature definitions and rules; there is no requirement
246
+ to register every product separately. A matching category alone does not guarantee that every
247
+ feature of a product can be interpreted.
248
+
249
+ User rule layers merge recursively: arrays and scalars replace earlier values, `{"$delete": true}`
250
+ removes a member, `{"$append": [...]}` extends an array, and `null` is literal.
251
+ Load official layers in filename order, then user layers. Invalid final packs are rejected.
252
+ See [rule composition and the official manifest](rules/README.md).
253
+
254
+ ```python
255
+ from tuya_interpreter import load_builtin_rules, merge_rules
256
+
257
+ custom_rules = merge_rules(user_layers, base=load_builtin_rules())["rules"]
258
+ driver = TuyaDriver(device, rules=custom_rules)
259
+ ```
260
+
261
+ Overrides can correct DP definitions and codes, aliases, categories, descriptor metadata and
262
+ cover direction. Declarative converters add computed properties, commands, state and timers.
263
+ See [device customization](docs/device-customization.md) for examples and all cover/delta settings,
264
+ and [the engine documentation](docs/rust-engine.md#json-converters) for JSON programs.
265
+
266
+ ## Runtime and host responsibilities
267
+
268
+ | Direction | Data |
269
+ | --- | --- |
270
+ | Host → driver | `Connected`, `Disconnected`, `Message(channel, flat_dps)`, `Timer(name)` |
271
+ | Driver → ildevice consumer | `Descriptor`, `Value`, `Absent`, `Event`, `Reject` |
272
+ | ildevice consumer → driver | `Command(prop, value)` |
273
+ | Driver → Tuya transport | `SendMessage("set", {"dps": ...})` |
274
+ | Driver → host | `SetTimer`, `CancelTimer`, `SettingsChanged` |
275
+
276
+ The host unwraps transport envelopes into flat DP-ID maps, manages authentication, connections,
277
+ subscriptions, retained-message policy and device routing, and sends returned commands.
278
+ It supplies `now`, executes timer requests and persists settings, and initiates device reads when needed.
279
+
280
+ Message channels have distinct semantics:
281
+
282
+ - `active`: device push; updates values, fires events and accumulates increments.
283
+ - `passive`: readback or live report; changed values are treated as live by converters,
284
+ but events do not fire. Delta accumulation requires `delta.accept_passive`.
285
+ - `state`: snapshot; seeds values without treating retained commands as new movement or events.
286
+
287
+ Numeric values use their published native units. For example, `500 mA` stays `500` with unit `mA`;
288
+ a suggested display unit does not rescale the wire value. Commands are checked against the ildevice
289
+ contract before conversion and rejected with `Reject` when invalid. Brightness conversions can
290
+ introduce quantization. Covers use the device's position direction, configurable through cover settings;
291
+ garage/gate controls are read-only unless `allow_hazardous=True`.
292
+
293
+ Changing rules or overrides requires a replacement driver. `new.carry(old)` preserves compatible
294
+ delta totals; the host then seeds its current snapshot and replaces the descriptor.
295
+ With `device_settings=True`, setting writes return `SettingsChanged` for the host to save and reload.
296
+
297
+ ## Rust, C ABI and WebAssembly
298
+
299
+ Rust hosts use `RulePack`, `Driver`, `DriverOptions`, `Input` and `Output` directly with driver
300
+ state retained in memory. Python uses the JSON C ABI; `TUYA_ENGINE_LIBRARY` selects an alternative
301
+ native library. JavaScript uses the same request protocol through WebAssembly.
302
+ All bindings share the rule interpreter and Tuya semantics.
303
+
304
+ See [native Rust API](docs/rust-engine.md#native-rust-api),
305
+ [C ABI](docs/rust-engine.md#c-abi), [other languages](docs/rust-engine.md#another-language)
306
+ and [local performance measurements](docs/performance.md).
307
+
308
+ ## Development and validation
309
+
310
+ ```sh
311
+ cargo test --manifest-path rust/Cargo.toml
312
+ pip install -e ".[test]"
313
+ python -m pytest
314
+ ```
315
+
316
+ Classification, values, commands and quirks are checked against fixtures and golden data derived
317
+ from Home Assistant's Tuya integration and the Sharing SDK. The pinned reference behavior and
318
+ intentional differences are described in [the engine specification](docs/engine-spec.md).
319
+ Tuya's standard category assignments take precedence over differing HA category assignments;
320
+ cover positions keep the device's direction rather than HA's mirrored representation.
321
+
322
+ SDK adapter comparisons require `tuya-device-sharing-sdk==0.2.15` from the test extras.
323
+ IL conformance tests use the specification checkout at `../ildevice` or `$ILDEVICE` and are skipped
324
+ when absent. Chain tests require the IL host's `ildevice.core` planner and are not collected without it.
325
+
326
+ | Path | Contents |
327
+ | --- | --- |
328
+ | `rust/engine/` | Interpreter, driver, Tuya primitives, C ABI and rule-pack JSON Schema |
329
+ | `src/tuya_interpreter/` | Python binding, inputs and outputs |
330
+ | `bindings/js/` | JavaScript/WASM binding and smoke test |
331
+ | `rules/builtin/` | Official rule layers and manifest |
332
+ | `scripts/` | Rule generators, golden-data tooling and benchmarks |
333
+ | `tests/` | Conversion, boundary, rule and conformance tests |
334
+
335
+ `rust/engine/schema.json` validates the **rule-pack format**; it is separate from the Tuya device
336
+ schema in `function` and `status_range`.
337
+
338
+ ## Releases
339
+
340
+ The [release workflow](.github/workflows/release.yml) builds and tests 13 platform wheels:
341
+
342
+ | Platform | Architectures |
343
+ | --- | --- |
344
+ | Linux manylinux (glibc) | ARMv7, ARM64, x86, x64 |
345
+ | Linux musllinux (musl) | ARMv7, ARM64, x86, x64 |
346
+ | macOS | ARM64, x64 |
347
+ | Windows | ARM64, x86, x64 |
348
+
349
+ The planned first release uses tag `v0.1.0-alpha.1`: crate version `0.1.0-alpha.1` and
350
+ PyPI version `0.1.0a1`, both named `tuya-interpreter`. The workflow checks that the tag matches
351
+ Cargo and builds Python distributions with the corresponding version.
352
+
353
+ A pushed version tag publishes to **crates.io and PyPI** after tests, all wheels, the source
354
+ archive and crate packaging pass. PR/manual runs build artifacts without publishing.
355
+ See [release setup](docs/releases.md) for PyPI Trusted Publishing, the crates.io first-registration
356
+ token, subsequent OIDC publishing and release commands.