canopy-ag-sdk 0.1.0__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 (295) hide show
  1. canopy_ag_sdk-0.1.0/.gitignore +283 -0
  2. canopy_ag_sdk-0.1.0/PKG-INFO +104 -0
  3. canopy_ag_sdk-0.1.0/README.md +92 -0
  4. canopy_ag_sdk-0.1.0/config.yml +11 -0
  5. canopy_ag_sdk-0.1.0/project.json +45 -0
  6. canopy_ag_sdk-0.1.0/pyproject.toml +52 -0
  7. canopy_ag_sdk-0.1.0/src/canopy_sdk/__init__.py +32 -0
  8. canopy_ag_sdk-0.1.0/src/canopy_sdk/client.py +144 -0
  9. canopy_ag_sdk-0.1.0/src/canopy_sdk/redaction.py +36 -0
  10. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/__init__.py +8 -0
  11. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/__init__.py +1 -0
  12. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/device_events/__init__.py +1 -0
  13. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/device_events/device_events_controller_find_all.py +169 -0
  14. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/device_events/device_events_controller_get_status.py +156 -0
  15. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/device_events/device_events_controller_webhook.py +116 -0
  16. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/devices/__init__.py +1 -0
  17. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/devices/devices_controller_audit.py +196 -0
  18. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/devices/devices_controller_create.py +178 -0
  19. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/devices/devices_controller_find_all.py +251 -0
  20. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/devices/devices_controller_find_one.py +176 -0
  21. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/devices/devices_controller_relay_device_number_readiness.py +233 -0
  22. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/devices/devices_controller_remove.py +113 -0
  23. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/devices/devices_controller_update.py +194 -0
  24. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/grow_zones/__init__.py +1 -0
  25. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/grow_zones/grow_zones_controller_create.py +174 -0
  26. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/grow_zones/grow_zones_controller_find_all.py +238 -0
  27. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/grow_zones/grow_zones_controller_find_one.py +176 -0
  28. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/grow_zones/grow_zones_controller_get_status.py +172 -0
  29. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/grow_zones/grow_zones_controller_remove.py +113 -0
  30. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/grow_zones/grow_zones_controller_update.py +194 -0
  31. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/health/__init__.py +1 -0
  32. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/health/health_controller_get_health.py +89 -0
  33. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/__init__.py +1 -0
  34. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_create_preference.py +178 -0
  35. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_deliver_batch.py +113 -0
  36. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_deliver_latest.py +103 -0
  37. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_find_all.py +193 -0
  38. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_find_all_preferences.py +161 -0
  39. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_find_runtime_for_zone_and_date.py +134 -0
  40. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_generate.py +174 -0
  41. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_generate_manual_preview.py +190 -0
  42. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_get_preference_audit.py +184 -0
  43. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_get_schedule_adherence.py +230 -0
  44. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_get_schedules_by_batch.py +181 -0
  45. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_get_summary.py +103 -0
  46. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_list_batches.py +195 -0
  47. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_regenerate.py +115 -0
  48. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_run_pipeline.py +115 -0
  49. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_update_preference.py +198 -0
  50. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_validate_plan.py +186 -0
  51. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_schedules/irrigation_schedules_controller_validate_plan_by_relay.py +194 -0
  52. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zone_maps/__init__.py +1 -0
  53. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zone_maps/irrigation_zone_maps_controller_create.py +174 -0
  54. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zone_maps/irrigation_zone_maps_controller_find_all.py +193 -0
  55. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zone_maps/irrigation_zone_maps_controller_find_by_irrigation_zone.py +177 -0
  56. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zone_maps/irrigation_zone_maps_controller_find_one.py +176 -0
  57. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zone_maps/irrigation_zone_maps_controller_remove.py +113 -0
  58. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zone_maps/irrigation_zone_maps_controller_update.py +190 -0
  59. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/__init__.py +1 -0
  60. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_create.py +174 -0
  61. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_find_all.py +253 -0
  62. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_find_one.py +176 -0
  63. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_get_active_run.py +192 -0
  64. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_get_ganged_relays.py +111 -0
  65. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_get_run_now_constraints.py +111 -0
  66. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_remove.py +113 -0
  67. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_run_now.py +125 -0
  68. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_stop.py +113 -0
  69. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/irrigation_zones_controller_update.py +194 -0
  70. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/irrigation_zones/recommended_runtime_controller_get_recommended_runtime.py +140 -0
  71. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/locations/__init__.py +1 -0
  72. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/locations/locations_controller_create.py +174 -0
  73. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/locations/locations_controller_find_all.py +223 -0
  74. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/locations/locations_controller_find_one.py +176 -0
  75. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/locations/locations_controller_remove.py +113 -0
  76. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/locations/locations_controller_update.py +194 -0
  77. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/__init__.py +1 -0
  78. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/manual_irrigation_schedules_controller_create.py +174 -0
  79. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/manual_irrigation_schedules_controller_create_by_relay.py +197 -0
  80. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/manual_irrigation_schedules_controller_find_active.py +161 -0
  81. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/manual_irrigation_schedules_controller_find_all.py +195 -0
  82. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/manual_irrigation_schedules_controller_find_one.py +176 -0
  83. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/manual_irrigation_schedules_controller_remove.py +113 -0
  84. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/manual_irrigation_schedules_controller_toggle_active.py +172 -0
  85. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/manual_irrigation_schedules/manual_irrigation_schedules_controller_update.py +190 -0
  86. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/observations/__init__.py +1 -0
  87. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/observations/observations_controller_create.py +186 -0
  88. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/observations/observations_controller_find_all.py +187 -0
  89. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/observations/observations_controller_find_latest.py +238 -0
  90. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/observations/observations_controller_find_series.py +303 -0
  91. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/__init__.py +1 -0
  92. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/plant_lots_controller_append_event.py +198 -0
  93. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/plant_lots_controller_create.py +178 -0
  94. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/plant_lots_controller_find_all.py +292 -0
  95. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/plant_lots_controller_find_events.py +213 -0
  96. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/plant_lots_controller_find_one.py +176 -0
  97. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/plant_lots_controller_import.py +202 -0
  98. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/plant_lots_controller_remove.py +113 -0
  99. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_lots/plant_lots_controller_update.py +194 -0
  100. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_varieties/__init__.py +1 -0
  101. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_varieties/plant_varieties_controller_create.py +174 -0
  102. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_varieties/plant_varieties_controller_find_all.py +223 -0
  103. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_varieties/plant_varieties_controller_find_one.py +176 -0
  104. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_varieties/plant_varieties_controller_remove.py +116 -0
  105. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/plant_varieties/plant_varieties_controller_update.py +194 -0
  106. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/__init__.py +1 -0
  107. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_create_preference.py +178 -0
  108. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_find_all.py +191 -0
  109. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_find_all_preferences.py +161 -0
  110. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_force_generate.py +156 -0
  111. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_generate.py +156 -0
  112. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_generate_custom.py +174 -0
  113. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_get_by_date.py +177 -0
  114. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_get_preference_audit.py +184 -0
  115. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_remove_preference.py +113 -0
  116. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/runtimes/runtimes_controller_update_preference.py +198 -0
  117. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/sensor_registry/__init__.py +1 -0
  118. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/sensor_registry/sensor_registry_controller_find_all.py +254 -0
  119. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/service_credentials/__init__.py +1 -0
  120. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/service_credentials/tenant_service_credentials_controller_list.py +85 -0
  121. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/service_credentials/tenant_service_credentials_controller_mint.py +115 -0
  122. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/service_credentials/tenant_service_credentials_controller_mintable_scopes.py +136 -0
  123. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/service_credentials/tenant_service_credentials_controller_revoke.py +105 -0
  124. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/tenants/__init__.py +1 -0
  125. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/tenants/tenant_controller_create.py +116 -0
  126. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/tenants/tenant_controller_create_tenant_database.py +108 -0
  127. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/tenants/tenant_controller_find_all.py +85 -0
  128. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/tenants/tenant_controller_find_one.py +105 -0
  129. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/tenants/tenant_controller_remove.py +111 -0
  130. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/api/tenants/tenant_controller_update.py +126 -0
  131. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/client.py +272 -0
  132. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/errors.py +16 -0
  133. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/__init__.py +343 -0
  134. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/constraint_violation_dto.py +133 -0
  135. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/constraint_violation_dto_details.py +47 -0
  136. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/constraint_violation_dto_severity.py +9 -0
  137. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_device_dto.py +168 -0
  138. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_device_dto_configuration.py +47 -0
  139. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_device_dto_metadata.py +47 -0
  140. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_grow_zone_dto.py +146 -0
  141. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_grow_zone_dto_boundary.py +55 -0
  142. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_irrigation_zone_dto.py +191 -0
  143. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_irrigation_zone_dto_area_unit.py +11 -0
  144. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_irrigation_zone_dto_flow_rate_unit.py +11 -0
  145. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_irrigation_zone_map_dto.py +98 -0
  146. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_location_dto.py +98 -0
  147. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_manual_irrigation_schedule_by_relay_dto.py +156 -0
  148. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_manual_irrigation_schedule_by_relay_dto_recurrence_type.py +12 -0
  149. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_manual_irrigation_schedule_dto.py +154 -0
  150. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_manual_irrigation_schedule_dto_recurrence_type.py +12 -0
  151. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_observation_dto.py +131 -0
  152. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_observation_dto_subject_type.py +10 -0
  153. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_plant_lot_dto.py +151 -0
  154. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_plant_lot_dto_container_class.py +22 -0
  155. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_plant_lot_dto_current_stage.py +12 -0
  156. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_plant_lot_event_dto.py +105 -0
  157. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_plant_lot_event_dto_event_type.py +14 -0
  158. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_plant_lot_event_dto_payload.py +50 -0
  159. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_plant_variety_dto.py +99 -0
  160. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_runtime_preference_dto.py +71 -0
  161. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_runtime_preference_dto_key.py +11 -0
  162. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_schedule_preference_dto.py +81 -0
  163. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_schedule_preference_dto_key.py +11 -0
  164. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/create_tenant_dto.py +81 -0
  165. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/custom_zone_duration_dto.py +69 -0
  166. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_audit_response_dto.py +157 -0
  167. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_audit_response_dto_summary.py +53 -0
  168. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_entity.py +311 -0
  169. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_entity_configuration.py +47 -0
  170. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_entity_metadata.py +47 -0
  171. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_events_controller_find_all_event_type.py +9 -0
  172. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_status_dto.py +130 -0
  173. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_status_dto_current_status.py +10 -0
  174. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_status_summary_dto.py +86 -0
  175. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/device_status_summary_dto_summary.py +52 -0
  176. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/devices_controller_find_all_response_200.py +92 -0
  177. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/generate_custom_runtimes_dto.py +86 -0
  178. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/generate_manual_schedule_dto.py +47 -0
  179. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/generate_schedule_dto.py +79 -0
  180. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/grow_zone_entity.py +194 -0
  181. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/grow_zone_entity_boundary.py +54 -0
  182. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/grow_zone_status_dto.py +129 -0
  183. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/grow_zone_status_dto_device_connectivity.py +10 -0
  184. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/grow_zone_status_dto_status.py +11 -0
  185. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/grow_zone_status_response_dto.py +84 -0
  186. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/grow_zones_controller_find_all_response_200.py +92 -0
  187. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/import_plant_lots_response_dto.py +91 -0
  188. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedule_batch_entity.py +97 -0
  189. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedule_batch_entity_metadata.py +47 -0
  190. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedule_dto.py +216 -0
  191. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedule_entity.py +193 -0
  192. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedule_preference_entity.py +81 -0
  193. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedule_preference_entity_key.py +11 -0
  194. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedules_controller_find_all_response_200.py +92 -0
  195. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedules_controller_get_preference_audit_key.py +11 -0
  196. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_schedules_controller_list_batches_response_200.py +92 -0
  197. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_zone_entity.py +171 -0
  198. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_zone_entity_area_unit.py +11 -0
  199. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_zone_entity_flow_rate_unit.py +11 -0
  200. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_zone_map_entity.py +79 -0
  201. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_zone_maps_controller_find_all_response_200.py +92 -0
  202. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/irrigation_zones_controller_find_all_response_200.py +92 -0
  203. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/location_entity.py +109 -0
  204. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/locations_controller_find_all_response_200.py +92 -0
  205. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/manual_irrigation_schedule_entity.py +155 -0
  206. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/manual_irrigation_schedule_entity_recurrence_type.py +12 -0
  207. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/manual_irrigation_schedules_controller_find_all_response_200.py +92 -0
  208. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/mint_tenant_service_credential_dto.py +83 -0
  209. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/mint_tenant_service_credential_dto_roles_item.py +16 -0
  210. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/mintable_scopes_response_dto.py +85 -0
  211. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/normalization_collision_dto.py +93 -0
  212. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/observation_entity.py +159 -0
  213. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/observation_series_bucket_dto.py +101 -0
  214. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/observations_controller_find_all_subject_type.py +10 -0
  215. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/observations_controller_find_latest_subject_type.py +10 -0
  216. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/observations_controller_find_series_bucket.py +9 -0
  217. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/observations_controller_find_series_subject_type.py +10 -0
  218. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/paginated_response_dto.py +67 -0
  219. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/pagination_meta.py +101 -0
  220. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lot_event_response_dto.py +177 -0
  221. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lot_event_response_dto_payload_type_0.py +47 -0
  222. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lot_import_error_dto.py +80 -0
  223. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lot_response_dto.py +328 -0
  224. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lots_controller_find_all_container_class.py +22 -0
  225. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lots_controller_find_all_current_stage.py +12 -0
  226. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lots_controller_find_all_response_200.py +92 -0
  227. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lots_controller_find_events_response_200.py +92 -0
  228. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_lots_controller_import_body.py +75 -0
  229. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_varieties_controller_find_all_response_200.py +92 -0
  230. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/plant_variety_entity.py +99 -0
  231. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/regenerate_dto.py +61 -0
  232. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/relay_device_number_device_readiness_dto.py +161 -0
  233. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/relay_device_number_readiness_dto.py +136 -0
  234. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/run_now_dto.py +61 -0
  235. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/run_pipeline_dto.py +79 -0
  236. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/run_pipeline_dto_mode.py +9 -0
  237. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/runtime_batch_entity.py +69 -0
  238. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/runtime_entity.py +149 -0
  239. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/runtime_preference_entity.py +71 -0
  240. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/runtime_preference_entity_key.py +11 -0
  241. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/runtimes_controller_find_all_response_200.py +92 -0
  242. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/runtimes_controller_get_preference_audit_key.py +11 -0
  243. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/schedule_adherence_response_dto.py +100 -0
  244. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/schedule_constraints.py +81 -0
  245. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/schedule_generation_response.py +110 -0
  246. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/sensor_registry_controller_find_all_response_200.py +92 -0
  247. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/sensor_registry_entity.py +180 -0
  248. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/sensor_registry_entity_calibration_type_0.py +52 -0
  249. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/sensor_registry_entity_metrics.py +52 -0
  250. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/shaped_cycle_dto.py +93 -0
  251. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/stale_device_dto.py +116 -0
  252. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/tenant_config_audit_log_entity.py +149 -0
  253. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/tenant_config_audit_log_entity_action.py +9 -0
  254. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/unavailable_mint_scope_dto.py +72 -0
  255. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/unavailable_mint_scope_dto_scope.py +16 -0
  256. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/unnormalizable_device_dto.py +94 -0
  257. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/unresolved_device_identifier_dto.py +101 -0
  258. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_device_dto.py +167 -0
  259. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_device_dto_configuration.py +47 -0
  260. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_device_dto_metadata.py +47 -0
  261. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_grow_zone_dto.py +144 -0
  262. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_grow_zone_dto_boundary.py +55 -0
  263. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_irrigation_zone_dto.py +189 -0
  264. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_irrigation_zone_dto_area_unit.py +11 -0
  265. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_irrigation_zone_dto_flow_rate_unit.py +11 -0
  266. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_irrigation_zone_map_dto.py +97 -0
  267. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_location_dto.py +97 -0
  268. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_manual_irrigation_schedule_dto.py +161 -0
  269. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_manual_irrigation_schedule_dto_recurrence_type.py +12 -0
  270. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_plant_lot_dto.py +174 -0
  271. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_plant_lot_dto_container_class.py +22 -0
  272. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_plant_lot_dto_current_stage.py +12 -0
  273. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_plant_variety_dto.py +97 -0
  274. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_runtime_preference_dto.py +78 -0
  275. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_runtime_preference_dto_key.py +11 -0
  276. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_schedule_preference_dto.py +87 -0
  277. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_schedule_preference_dto_key.py +11 -0
  278. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_tenant_dto.py +70 -0
  279. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/update_tenant_dto_subscription_level.py +11 -0
  280. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/validate_plan_by_relay_cycle_dto.py +90 -0
  281. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/validate_plan_by_relay_dto.py +75 -0
  282. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/validate_plan_cycle_dto.py +90 -0
  283. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/validate_plan_dto.py +75 -0
  284. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/validate_plan_response_dto.py +101 -0
  285. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/webhook_payload_dto.py +139 -0
  286. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/webhook_payload_dto_event.py +9 -0
  287. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/webhook_payload_dto_metadata.py +47 -0
  288. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/models/zone_adherence_dto.py +142 -0
  289. canopy_ag_sdk-0.1.0/src/canopy_sdk_client/types.py +54 -0
  290. canopy_ag_sdk-0.1.0/tests/test_env_contract.py +65 -0
  291. canopy_ag_sdk-0.1.0/tests/test_quickstart.py +42 -0
  292. canopy_ag_sdk-0.1.0/tests/test_redaction.py +101 -0
  293. canopy_ag_sdk-0.1.0/tests/test_version_parity.py +38 -0
  294. canopy_ag_sdk-0.1.0/tools/generate.sh +37 -0
  295. canopy_ag_sdk-0.1.0/tools/stg_smoke.py +91 -0
@@ -0,0 +1,283 @@
1
+ # See https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
2
+
3
+ # compiled output
4
+ dist
5
+ tmp
6
+ out-tsc
7
+
8
+ # Playwright
9
+ test-results/
10
+ playwright-report/
11
+ playwright-smoke-report/
12
+ blob-report/
13
+ playwright/.cache/
14
+
15
+ # dependencies
16
+ node_modules
17
+
18
+ # IDEs and editors
19
+ /.idea
20
+ .project
21
+ .classpath
22
+ .c9/
23
+ *.launch
24
+ .settings/
25
+ *.sublime-workspace
26
+
27
+ # IDE - VSCode
28
+ .vscode/*
29
+ !.vscode/settings.json
30
+ !.vscode/tasks.json
31
+ !.vscode/launch.json
32
+ !.vscode/extensions.json
33
+
34
+ # misc
35
+ /.sass-cache
36
+ /connect.lock
37
+ /coverage
38
+ /libpeerconnection.log
39
+ npm-debug.log
40
+ yarn-error.log
41
+ testem.log
42
+ /typings
43
+
44
+ # System Files
45
+ .DS_Store
46
+ Thumbs.db
47
+
48
+ # Flutter/Dart specific
49
+ .dart_tool/
50
+ .flutter-plugins
51
+ .flutter-plugins-dependencies
52
+ .packages
53
+ .pub-cache/
54
+ .pub/
55
+ **/build/
56
+ # Style Dictionary generated tokens are committed for diff review + so the
57
+ # tools/check-design-tokens.mjs check has a ground-truth snapshot to compare
58
+ # against. Un-ignore the SD output dir specifically.
59
+ !react/ui/src/tokens/build/
60
+ ios/Pods/
61
+ ios/.symlinks/
62
+ ios/Flutter/Flutter.framework
63
+ ios/Flutter/Flutter.podspec
64
+ ios/Runner/GeneratedPluginRegistrant.*
65
+ android/.gradle/
66
+ android/captures/
67
+ android/gradlew
68
+ android/gradlew.bat
69
+ android/local.properties
70
+ android/**/GeneratedPluginRegistrant.java
71
+ android/key.properties
72
+ *.jks
73
+ macos/Pods/
74
+ macos/.symlinks/
75
+ windows/flutter/
76
+ .fvm/
77
+
78
+ .nx/cache
79
+ .nx/workspace-data
80
+ .cursor/rules/nx-rules.mdc
81
+ .github/instructions/nx.instructions.md
82
+
83
+
84
+ # NestJs build output
85
+ **/dist
86
+
87
+ # Node modules
88
+ **/node_modules
89
+
90
+ # compiled output# Tests
91
+ /coverage
92
+ /.nyc_output
93
+
94
+ # Jest cache
95
+ /.jest
96
+ .jest/
97
+ /.jest-cache
98
+ .jest-cache//node_modules
99
+ /build
100
+
101
+ # Logs
102
+ logs
103
+ *.log
104
+ npm-debug.log*
105
+ pnpm-debug.log*
106
+ yarn-debug.log*
107
+ yarn-error.log*
108
+ lerna-debug.log*
109
+
110
+ # OS
111
+ .DS_Store
112
+
113
+ # Tests
114
+ /coverage
115
+ /.nyc_output
116
+
117
+ # IDEs and editors
118
+ /.idea
119
+ .project
120
+ .classpath
121
+ .c9/
122
+ *.launch
123
+ .settings/
124
+ *.sublime-workspace
125
+
126
+ # IDE - VSCode
127
+ .vscode/*
128
+ !.vscode/settings.json
129
+ !.vscode/tasks.json
130
+ !.vscode/launch.json
131
+ !.vscode/extensions.json
132
+
133
+ # dotenv environment variable files
134
+ **/.env
135
+ .env.development.local
136
+ .env.test.local
137
+ .env.production.local
138
+ .env.local
139
+ .env*
140
+ !**/.env.example
141
+ !**/.env.*.example
142
+ !.env.example
143
+ !**/.env.e2e
144
+ # canopy-mobile dev-profile runtime config: PUBLIC by design (Firebase web
145
+ # apiKey + dev API hosts, same values as the k8s webConfig ConfigMap) and
146
+ # committed so `expo start` gets the dev EXPO_PUBLIC_* vars (mobile auth E3-s3).
147
+ !apps/canopy-mobile/.env.development
148
+
149
+ # temp directory
150
+ .temp
151
+ .tmp
152
+
153
+ # Runtime data
154
+ pids
155
+ *.pid
156
+ *.seed
157
+ *.pid.lock
158
+
159
+ # Diagnostic reports (https://nodejs.org/api/report.html)
160
+ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
161
+
162
+ # helm/kube secrets
163
+ **/*.secret.yaml
164
+ **/*.secret.*
165
+
166
+ # migration-tool local k8s run manifests (operational scratch, not deployed via GitOps)
167
+ tools/canopy-migration-tool/k8s/
168
+
169
+ # database files
170
+ *.sqlite
171
+ *.sqlite3
172
+
173
+ # Data directories
174
+ **/data/
175
+
176
+ # backups
177
+ *.bak
178
+ *.backup
179
+ backups/
180
+
181
+ # release manifests (generated artifacts)
182
+ release-manifests/
183
+
184
+ # secrets folder
185
+ **/secrets*
186
+ vite.config.*.timestamp*
187
+
188
+ # Next.js
189
+ .next
190
+ out
191
+
192
+ vitest.config.*.timestamp*
193
+
194
+ # Python
195
+ *.py[cod]
196
+ __pycache__/
197
+ *.so
198
+ *.egg
199
+ *.egg-info/
200
+ dist-python/
201
+ build-python/
202
+ .eggs/
203
+ .pytest_cache/
204
+ .mypy_cache/
205
+ .ruff_cache/
206
+ .coverage
207
+ .coverage.*
208
+ htmlcov/
209
+ *.cover
210
+ .hypothesis/
211
+ *.log
212
+ .uv/
213
+ .venv/
214
+ venv/
215
+ ENV/
216
+ env/
217
+ pip-log.txt
218
+ pip-delete-this-directory.txt
219
+ .Python
220
+ # Ralph orchestration files
221
+ .ralph/
222
+ .ralph-task-*.md
223
+ .spec-task.md
224
+
225
+ # Canopy agent worktrees (created by /canopy-handoff via `git worktree add`)
226
+ # Registered worktrees are already excluded from `git status` by git itself; this
227
+ # entry is defensive against orphan state from failed `git worktree remove` runs
228
+ # or manual `mkdir .worktrees/...` outside the canopy-* skill flow.
229
+ .worktrees/
230
+
231
+ # tools/<name>/output/ — per-run artifacts from operator CLIs
232
+ # (e.g. tools/tenant-inventory/output/<timestamp>.{json,md}).
233
+ # Per-run manifests should never land in PRs.
234
+ tools/*/output/
235
+
236
+ .nx/polygraph
237
+ .claude/worktrees
238
+ .claude/settings.local.json
239
+
240
+ # Storybook static build outputs
241
+ react/ui/storybook-static/
242
+
243
+ # eflow story plan dirs — local scratch, exchanged via Notion Tech Notes, never committed
244
+ .plan/
245
+
246
+ # eflow session-hook runtime state — per-session bookkeeping, never committed
247
+ .eflow/
248
+
249
+ # Playwright MCP debug output (console logs, page snapshots) — local scratch
250
+ .playwright-mcp/
251
+
252
+ # Expo
253
+ node_modules/
254
+ .expo/
255
+ .yarn/
256
+ dist/
257
+ npm-debug.*
258
+ *.jks
259
+ *.p8
260
+ *.p12
261
+ *.key
262
+ *.mobileprovision
263
+ *.orig.*
264
+ web-build/
265
+ cache/
266
+
267
+
268
+ # entitlement-backfill runbook bundle artifact (docs/auth/entitlement-backfill-runbook.md)
269
+ .backfill-cli.cjs
270
+
271
+ # TypeScript incremental-build cache — machine-specific, never committed
272
+ *.tsbuildinfo
273
+
274
+ .nx/self-healing
275
+ .nx/migrate-runs
276
+
277
+ # canopy-mobile Android toolchain env (generated by apps/canopy-mobile/tools/android-setup.sh)
278
+ apps/canopy-mobile/.android-env.sh
279
+
280
+ # Warm npm cache baked into the ARC runner image at build time (see
281
+ # .github/workflows/build-runner-image.yml) — contents are generated, never committed.
282
+ .github/runner-image/npm-cache/*
283
+ !.github/runner-image/npm-cache/.gitkeep
@@ -0,0 +1,104 @@
1
+ Metadata-Version: 2.5
2
+ Name: canopy-ag-sdk
3
+ Version: 0.1.0
4
+ Summary: Official Python SDK for the Canopy Customer API (api-stg.canopy.ag/v1): openapi-python-client generated transport + a thin wrapper with env contract and API-key redaction.
5
+ License: MIT
6
+ Keywords: canopy,iot,irrigation,openapi,sdk
7
+ Requires-Python: >=3.11
8
+ Requires-Dist: attrs>=22.2.0
9
+ Requires-Dist: httpx<0.29,>=0.23.1
10
+ Requires-Dist: python-dateutil>=2.8.0
11
+ Description-Content-Type: text/markdown
12
+
13
+ # canopy-ag-sdk
14
+
15
+ Official Python SDK for the [Canopy Customer API](https://api-stg.canopy.ag/v1) —
16
+ transport generated from the committed public spec (`spec/public/openapi.json`)
17
+ by [openapi-python-client](https://github.com/openapi-generators/openapi-python-client),
18
+ wrapped by a thin hand-written layer that owns the env contract and API-key
19
+ redaction.
20
+
21
+ ## Install
22
+
23
+ ```sh
24
+ pip install canopy-ag-sdk
25
+ ```
26
+
27
+ > **Package-name note:** the distribution is `canopy-ag-sdk` but the import
28
+ > names are `canopy_sdk` (wrapper) and `canopy_sdk_client` (generated
29
+ > transport) — a Python distribution name and its import name need not match.
30
+ > The distribution is **not** `canopy-sdk`: that name was already taken on PyPI
31
+ > by an unrelated project (Pinecone's RAG framework / context engine) before
32
+ > Canopy's first publish, so `canopy-ag-sdk` was chosen to mirror the
33
+ > `@canopy-ag/` npm scope used by the TypeScript SDK. That squatted
34
+ > distribution installs top-level `canopy` / `canopy_cli` / `canopy_server`, so
35
+ > it does not collide with our import names even if both are installed. See
36
+ > [`docs/ci/public-sdk-publishing.md`](../../../docs/ci/public-sdk-publishing.md)
37
+ > (`.github/workflows/publish-public-sdk.yml`) for how publishing (PyPI OIDC
38
+ > trusted publishing — no token) and versioning (the version tracks
39
+ > `spec/public/openapi.json` `info.version`) work.
40
+
41
+ Requires Python >= 3.11 (the generated client pins `httpx >= 0.23.1, < 0.29`).
42
+
43
+ ## Quickstart — list irrigation zones
44
+
45
+ Only `CANOPY_API_KEY` needs to be set (7 lines of code):
46
+
47
+ ```python
48
+ from canopy_sdk import CanopyClient
49
+ from canopy_sdk_client.api.irrigation_zones import irrigation_zones_controller_find_all
50
+
51
+ client = CanopyClient() # reads CANOPY_API_KEY
52
+ zones = irrigation_zones_controller_find_all.sync(
53
+ client=client.raw, x_tenant_id="<your-tenant-uuid>"
54
+ )
55
+ print(zones)
56
+ ```
57
+
58
+ Every operation in the public spec has a module under `canopy_sdk_client.api.*`
59
+ with `sync` / `sync_detailed` / `asyncio` / `asyncio_detailed` variants; pass
60
+ `client=client.raw` to any of them.
61
+
62
+ ## Environment contract
63
+
64
+ | Variable | Required | Behavior |
65
+ | --------------------- | -------- | --------------------------------------------------------------------------------------- |
66
+ | `CANOPY_API_KEY` | yes | `CanopyClient()` **fails fast** with `MissingApiKeyError` naming this variable if unset. |
67
+ | `CANOPY_API_BASE_URL` | no | Overrides the default base URL `https://api-stg.canopy.ag/v1` (`DEFAULT_BASE_URL`). |
68
+
69
+ Both can also be passed programmatically — `CanopyClient(api_key=..., base_url=...)`
70
+ (arguments win over the environment).
71
+
72
+ ## Key redaction guarantee
73
+
74
+ The API key never appears in:
75
+
76
+ - `repr()` / `str()` of `CanopyClient` (rendered as `[REDACTED]`),
77
+ - exceptions raised through the request path (scrubbed by a wrapping transport),
78
+ - httpx logs at default (INFO) level.
79
+
80
+ Pinned by the leak tests in `tests/test_redaction.py` (written first, per the
81
+ story brief). **Do not `repr()` the raw generated client** (`client.raw`) —
82
+ its attrs-generated repr is not redacted; treat it as a transport handle only.
83
+
84
+ ## Regenerating the transport
85
+
86
+ `src/canopy_sdk_client/` is generated code — committed, drift-gated in CI
87
+ (`sdk-python-drift` in `.github/workflows/pr-checks.yml`), and never hand-edited.
88
+ After any change to `spec/public/openapi.json`:
89
+
90
+ ```sh
91
+ npx nx run sdk-python:generate # or: bash libs/sdk/python/tools/generate.sh
92
+ ```
93
+
94
+ Generator + ruff post-hook versions are pinned inside `tools/generate.sh` so
95
+ regeneration is byte-identical everywhere.
96
+
97
+ ## Development
98
+
99
+ ```sh
100
+ npx nx run sdk-python:install # uv sync
101
+ npx nx run sdk-python:test # uv run pytest tests/ -v
102
+ npx nx run sdk-python:lint # ruff check on the hand-written surface
103
+ npx nx run sdk-python:build # uv build (wheel + sdist)
104
+ ```
@@ -0,0 +1,92 @@
1
+ # canopy-ag-sdk
2
+
3
+ Official Python SDK for the [Canopy Customer API](https://api-stg.canopy.ag/v1) —
4
+ transport generated from the committed public spec (`spec/public/openapi.json`)
5
+ by [openapi-python-client](https://github.com/openapi-generators/openapi-python-client),
6
+ wrapped by a thin hand-written layer that owns the env contract and API-key
7
+ redaction.
8
+
9
+ ## Install
10
+
11
+ ```sh
12
+ pip install canopy-ag-sdk
13
+ ```
14
+
15
+ > **Package-name note:** the distribution is `canopy-ag-sdk` but the import
16
+ > names are `canopy_sdk` (wrapper) and `canopy_sdk_client` (generated
17
+ > transport) — a Python distribution name and its import name need not match.
18
+ > The distribution is **not** `canopy-sdk`: that name was already taken on PyPI
19
+ > by an unrelated project (Pinecone's RAG framework / context engine) before
20
+ > Canopy's first publish, so `canopy-ag-sdk` was chosen to mirror the
21
+ > `@canopy-ag/` npm scope used by the TypeScript SDK. That squatted
22
+ > distribution installs top-level `canopy` / `canopy_cli` / `canopy_server`, so
23
+ > it does not collide with our import names even if both are installed. See
24
+ > [`docs/ci/public-sdk-publishing.md`](../../../docs/ci/public-sdk-publishing.md)
25
+ > (`.github/workflows/publish-public-sdk.yml`) for how publishing (PyPI OIDC
26
+ > trusted publishing — no token) and versioning (the version tracks
27
+ > `spec/public/openapi.json` `info.version`) work.
28
+
29
+ Requires Python >= 3.11 (the generated client pins `httpx >= 0.23.1, < 0.29`).
30
+
31
+ ## Quickstart — list irrigation zones
32
+
33
+ Only `CANOPY_API_KEY` needs to be set (7 lines of code):
34
+
35
+ ```python
36
+ from canopy_sdk import CanopyClient
37
+ from canopy_sdk_client.api.irrigation_zones import irrigation_zones_controller_find_all
38
+
39
+ client = CanopyClient() # reads CANOPY_API_KEY
40
+ zones = irrigation_zones_controller_find_all.sync(
41
+ client=client.raw, x_tenant_id="<your-tenant-uuid>"
42
+ )
43
+ print(zones)
44
+ ```
45
+
46
+ Every operation in the public spec has a module under `canopy_sdk_client.api.*`
47
+ with `sync` / `sync_detailed` / `asyncio` / `asyncio_detailed` variants; pass
48
+ `client=client.raw` to any of them.
49
+
50
+ ## Environment contract
51
+
52
+ | Variable | Required | Behavior |
53
+ | --------------------- | -------- | --------------------------------------------------------------------------------------- |
54
+ | `CANOPY_API_KEY` | yes | `CanopyClient()` **fails fast** with `MissingApiKeyError` naming this variable if unset. |
55
+ | `CANOPY_API_BASE_URL` | no | Overrides the default base URL `https://api-stg.canopy.ag/v1` (`DEFAULT_BASE_URL`). |
56
+
57
+ Both can also be passed programmatically — `CanopyClient(api_key=..., base_url=...)`
58
+ (arguments win over the environment).
59
+
60
+ ## Key redaction guarantee
61
+
62
+ The API key never appears in:
63
+
64
+ - `repr()` / `str()` of `CanopyClient` (rendered as `[REDACTED]`),
65
+ - exceptions raised through the request path (scrubbed by a wrapping transport),
66
+ - httpx logs at default (INFO) level.
67
+
68
+ Pinned by the leak tests in `tests/test_redaction.py` (written first, per the
69
+ story brief). **Do not `repr()` the raw generated client** (`client.raw`) —
70
+ its attrs-generated repr is not redacted; treat it as a transport handle only.
71
+
72
+ ## Regenerating the transport
73
+
74
+ `src/canopy_sdk_client/` is generated code — committed, drift-gated in CI
75
+ (`sdk-python-drift` in `.github/workflows/pr-checks.yml`), and never hand-edited.
76
+ After any change to `spec/public/openapi.json`:
77
+
78
+ ```sh
79
+ npx nx run sdk-python:generate # or: bash libs/sdk/python/tools/generate.sh
80
+ ```
81
+
82
+ Generator + ruff post-hook versions are pinned inside `tools/generate.sh` so
83
+ regeneration is byte-identical everywhere.
84
+
85
+ ## Development
86
+
87
+ ```sh
88
+ npx nx run sdk-python:install # uv sync
89
+ npx nx run sdk-python:test # uv run pytest tests/ -v
90
+ npx nx run sdk-python:lint # ruff check on the hand-written surface
91
+ npx nx run sdk-python:build # uv build (wheel + sdist)
92
+ ```
@@ -0,0 +1,11 @@
1
+ # openapi-python-client config for the Canopy Python SDK.
2
+ # Consumed by tools/generate.sh (which pins the generator + ruff versions).
3
+ # package_name_override controls the generated top-level package directory
4
+ # (committed at src/canopy_sdk_client, imported by the canopy_sdk wrapper);
5
+ # project_name_override is the PyPI distribution name the wrapper ships under.
6
+ # Keep project_name_override in sync with [project] name in pyproject.toml —
7
+ # "canopy-sdk" is squatted on PyPI, so the distribution is "canopy-ag-sdk".
8
+ # (generate.sh passes --meta none, so this value emits no files; it is kept
9
+ # accurate so the generated config never contradicts the shipped manifest.)
10
+ project_name_override: canopy-ag-sdk
11
+ package_name_override: canopy_sdk_client
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "sdk-python",
3
+ "$schema": "../../../node_modules/nx/schemas/project-schema.json",
4
+ "sourceRoot": "libs/sdk/python/src",
5
+ "projectType": "library",
6
+ "tags": ["type:util", "scope:shared", "platform:python"],
7
+ "targets": {
8
+ "install": {
9
+ "executor": "nx:run-commands",
10
+ "options": {
11
+ "command": "cd libs/sdk/python && uv sync",
12
+ "cwd": "."
13
+ }
14
+ },
15
+ "generate": {
16
+ "executor": "nx:run-commands",
17
+ "options": {
18
+ "command": "bash libs/sdk/python/tools/generate.sh",
19
+ "cwd": "{workspaceRoot}"
20
+ }
21
+ },
22
+ "test": {
23
+ "executor": "nx:run-commands",
24
+ "options": {
25
+ "command": "cd libs/sdk/python && uv run pytest tests/ -v",
26
+ "cwd": "."
27
+ }
28
+ },
29
+ "lint": {
30
+ "executor": "nx:run-commands",
31
+ "options": {
32
+ "command": "cd libs/sdk/python && uv run ruff check src/canopy_sdk tests/",
33
+ "cwd": "."
34
+ }
35
+ },
36
+ "build": {
37
+ "executor": "nx:run-commands",
38
+ "outputs": ["{workspaceRoot}/libs/sdk/python/dist"],
39
+ "options": {
40
+ "command": "cd libs/sdk/python && uv build --out-dir dist",
41
+ "cwd": "."
42
+ }
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,52 @@
1
+ [project]
2
+ # Distribution name. NOT "canopy-sdk": that name is already taken on PyPI by an
3
+ # unrelated project (Pinecone's RAG framework / context engine, 0.9.0), so it is
4
+ # unobtainable. "canopy-ag-sdk" mirrors the @canopy-ag/ npm scope used by the
5
+ # TypeScript SDK. The IMPORT names stay canopy_sdk / canopy_sdk_client (see
6
+ # [tool.hatch.build.targets.wheel] below) — a distribution name and an import
7
+ # name need not match, and the squatted distribution installs top-level
8
+ # `canopy` / `canopy_cli` / `canopy_server`, so there is no import collision
9
+ # even for a consumer who installs both.
10
+ name = "canopy-ag-sdk"
11
+ version = "0.1.0"
12
+ description = "Official Python SDK for the Canopy Customer API (api-stg.canopy.ag/v1): openapi-python-client generated transport + a thin wrapper with env contract and API-key redaction."
13
+ readme = "README.md"
14
+ license = { text = "MIT" }
15
+ requires-python = ">=3.11"
16
+ keywords = ["canopy", "sdk", "openapi", "irrigation", "iot"]
17
+ dependencies = [
18
+ # Inherited from the openapi-python-client (0.29.x) generated client.
19
+ "httpx>=0.23.1,<0.29",
20
+ "attrs>=22.2.0",
21
+ "python-dateutil>=2.8.0",
22
+ ]
23
+
24
+ [dependency-groups]
25
+ dev = [
26
+ "pytest>=7.4.0",
27
+ "ruff>=0.6.0",
28
+ ]
29
+
30
+ [build-system]
31
+ requires = ["hatchling"]
32
+ build-backend = "hatchling.build"
33
+
34
+ [tool.hatch.build.targets.wheel]
35
+ # Two top-level packages in one distribution: the hand-written wrapper
36
+ # (canopy_sdk) and the committed generated transport (canopy_sdk_client —
37
+ # regenerated only via tools/generate.sh, never hand-edited).
38
+ packages = ["src/canopy_sdk", "src/canopy_sdk_client"]
39
+
40
+ [tool.pytest.ini_options]
41
+ testpaths = ["tests"]
42
+ # JUnit XML lands in the workspace-shared test-results/ tree consumed by
43
+ # scripts/summarize-test-results.ts. Path is relative to this file's directory
44
+ # (libs/sdk/python/), so ../../../ resolves to the repo root.
45
+ addopts = "--junitxml=../../../test-results/sdk-python-pytest.xml"
46
+
47
+ [tool.ruff]
48
+ line-length = 100
49
+ target-version = "py311"
50
+ # Generated code is ruff-formatted by the generator's own pinned post-hooks;
51
+ # lint only the hand-written surface.
52
+ extend-exclude = ["src/canopy_sdk_client"]
@@ -0,0 +1,32 @@
1
+ """canopy-ag-sdk — official Python SDK for the Canopy Customer API.
2
+
3
+ Installed as ``pip install canopy-ag-sdk``; imported as ``canopy_sdk``.
4
+
5
+ Quickstart (only ``CANOPY_API_KEY`` needs to be set)::
6
+
7
+ from canopy_sdk import CanopyClient
8
+ from canopy_sdk_client.api.irrigation_zones import irrigation_zones_controller_find_all
9
+
10
+ client = CanopyClient() # reads CANOPY_API_KEY
11
+ zones = irrigation_zones_controller_find_all.sync(
12
+ client=client.raw, x_tenant_id="<your-tenant-uuid>"
13
+ )
14
+ print(zones)
15
+ """
16
+
17
+ from .client import (
18
+ DEFAULT_BASE_URL,
19
+ CanopyClient,
20
+ CanopyError,
21
+ MissingApiKeyError,
22
+ )
23
+ from .redaction import REDACTED, redact_secret
24
+
25
+ __all__ = [
26
+ "DEFAULT_BASE_URL",
27
+ "REDACTED",
28
+ "CanopyClient",
29
+ "CanopyError",
30
+ "MissingApiKeyError",
31
+ "redact_secret",
32
+ ]