soilsidekick 3.0.0

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 (332) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +9 -0
  3. data/README.md +267 -0
  4. data/Rakefile +10 -0
  5. data/docs/AIAnalysis.md +22 -0
  6. data/docs/AIAnalysisRecommendationsInner.md +22 -0
  7. data/docs/AIServicesApi.md +327 -0
  8. data/docs/BeginnerGuidance.md +34 -0
  9. data/docs/BeginnerGuidanceDetailedExplanation.md +24 -0
  10. data/docs/BeginnerGuidanceMetadata.md +22 -0
  11. data/docs/BeginnerGuidanceRequest.md +24 -0
  12. data/docs/BeginnerGuidanceRequestLocation.md +20 -0
  13. data/docs/BeginnerGuidanceRequestPlantContext.md +20 -0
  14. data/docs/CalculateCarbonCreditsRequest.md +26 -0
  15. data/docs/CalculateEnvironmentalImpactRequest.md +26 -0
  16. data/docs/CalculateEnvironmentalImpactRequestProposedTreatmentsInner.md +18 -0
  17. data/docs/CalculateEnvironmentalImpactRequestSoilData.md +28 -0
  18. data/docs/CalculateEnvironmentalImpactRequestWaterBodyData.md +18 -0
  19. data/docs/CarbonApi.md +79 -0
  20. data/docs/CarbonCreditCalculation.md +22 -0
  21. data/docs/CarbonCreditCalculationCalculationDetails.md +28 -0
  22. data/docs/CarbonCreditCalculationCalculationDetailsMetadata.md +22 -0
  23. data/docs/CarbonCreditCalculationCreditRecord.md +26 -0
  24. data/docs/ConsumerPlantCareApi.md +247 -0
  25. data/docs/County.md +26 -0
  26. data/docs/CountyLookup200Response.md +18 -0
  27. data/docs/CountyLookupRequest.md +18 -0
  28. data/docs/DynamicCare.md +28 -0
  29. data/docs/DynamicCareCareRecommendations.md +24 -0
  30. data/docs/DynamicCareCareRecommendationsHumidity.md +22 -0
  31. data/docs/DynamicCareCareRecommendationsLight.md +22 -0
  32. data/docs/DynamicCareCareRecommendationsWatering.md +24 -0
  33. data/docs/DynamicCareCurrentConditions.md +26 -0
  34. data/docs/DynamicCareMetadata.md +22 -0
  35. data/docs/DynamicCarePlant.md +22 -0
  36. data/docs/DynamicCareRequest.md +28 -0
  37. data/docs/DynamicCareRequestContainerDetails.md +22 -0
  38. data/docs/DynamicCareRequestEnvironment.md +20 -0
  39. data/docs/DynamicCareRequestLocation.md +22 -0
  40. data/docs/EnvironmentalApi.md +87 -0
  41. data/docs/EnvironmentalImpact.md +22 -0
  42. data/docs/EnvironmentalImpactDetailedAnalysis.md +26 -0
  43. data/docs/EnvironmentalImpactDetailedAnalysisEcoAlternatives.md +18 -0
  44. data/docs/EnvironmentalImpactDetailedAnalysisEcoAlternativesAlternativesInner.md +26 -0
  45. data/docs/EnvironmentalImpactDetailedAnalysisRunoffRisk.md +22 -0
  46. data/docs/EnvironmentalImpactImpactAssessment.md +26 -0
  47. data/docs/Error.md +22 -0
  48. data/docs/GenerateSmartReportSummaryRequest.md +20 -0
  49. data/docs/GenerateVRTPrescriptionRequest.md +22 -0
  50. data/docs/GeographicApi.md +79 -0
  51. data/docs/GetAgriculturalIntelligenceRequest.md +20 -0
  52. data/docs/GetLiveAgriculturalDataRequest.md +24 -0
  53. data/docs/GetPlantingCalendarRequest.md +20 -0
  54. data/docs/GetSatelliteDataRequest.md +20 -0
  55. data/docs/GetSeasonalPlanningAssistantRequest.md +26 -0
  56. data/docs/GetSeasonalPlanningAssistantRequestLocation.md +22 -0
  57. data/docs/GetSoilDataRequest.md +18 -0
  58. data/docs/GetTerritorialWaterAnalyticsRequest.md +22 -0
  59. data/docs/GetTerritorialWaterAnalyticsRequestDateRange.md +20 -0
  60. data/docs/LeafEnginesApi.md +87 -0
  61. data/docs/LeafEnginesCompatibility.md +22 -0
  62. data/docs/LeafEnginesCompatibilityData.md +32 -0
  63. data/docs/LeafEnginesCompatibilityDataBreakdown.md +22 -0
  64. data/docs/LeafEnginesCompatibilityDataBreakdownSoil.md +22 -0
  65. data/docs/LeafEnginesCompatibilityDataMetadata.md +22 -0
  66. data/docs/LeafEnginesCompatibilityUsage.md +20 -0
  67. data/docs/LeafenginesQueryRequest.md +22 -0
  68. data/docs/LeafenginesQueryRequestLocation.md +24 -0
  69. data/docs/LeafenginesQueryRequestOptions.md +22 -0
  70. data/docs/LeafenginesQueryRequestPlant.md +24 -0
  71. data/docs/LeafenginesQueryRequestPlantCareRequirements.md +22 -0
  72. data/docs/LeafenginesQueryRequestPlantCareRequirementsSoilPhRange.md +20 -0
  73. data/docs/LiveAgriculturalData.md +30 -0
  74. data/docs/LiveAgriculturalDataData.md +24 -0
  75. data/docs/PlantingCalendar.md +26 -0
  76. data/docs/SafeIdentification.md +26 -0
  77. data/docs/SafeIdentificationConfidenceBreakdown.md +24 -0
  78. data/docs/SafeIdentificationIdentification.md +22 -0
  79. data/docs/SafeIdentificationIdentificationPrimaryMatch.md +24 -0
  80. data/docs/SafeIdentificationMetadata.md +22 -0
  81. data/docs/SafeIdentificationRequest.md +22 -0
  82. data/docs/SafeIdentificationRequestContext.md +22 -0
  83. data/docs/SafeIdentificationRequestLocation.md +22 -0
  84. data/docs/SafeIdentificationRequestLocationCoordinates.md +20 -0
  85. data/docs/SafeIdentificationSafetyAnalysis.md +24 -0
  86. data/docs/SafeIdentificationSafetyAnalysisLookalikesInner.md +24 -0
  87. data/docs/SatelliteData.md +26 -0
  88. data/docs/SatelliteDataApi.md +79 -0
  89. data/docs/SeasonalPlanningResponse.md +24 -0
  90. data/docs/SeasonalPlanningResponseRecommendations.md +22 -0
  91. data/docs/SeasonalPlanningResponseWeatherData.md +28 -0
  92. data/docs/SmartReportSummary.md +22 -0
  93. data/docs/SmartReportSummarySummary.md +24 -0
  94. data/docs/SoilAnalysisApi.md +231 -0
  95. data/docs/SoilData.md +38 -0
  96. data/docs/TerritorialWaterAnalytics.md +22 -0
  97. data/docs/TerritorialWaterAnalyticsAnalytics.md +24 -0
  98. data/docs/TurboQuantApi.md +87 -0
  99. data/docs/TurboQuantCapabilities.md +30 -0
  100. data/docs/TurboQuantCapabilitiesEstimatedLatencyMs.md +20 -0
  101. data/docs/TurboQuantCapabilitiesRequest.md +22 -0
  102. data/docs/VRTApi.md +79 -0
  103. data/docs/VRTPrescription.md +24 -0
  104. data/docs/VRTPrescriptionZonesInner.md +22 -0
  105. data/docs/VisualCropAnalysis.md +24 -0
  106. data/docs/VisualCropAnalysisAnalysis.md +26 -0
  107. data/docs/VisualCropAnalysisRequest.md +24 -0
  108. data/docs/VisualCropAnalysisRequestLocation.md +22 -0
  109. data/docs/WaterQuality.md +30 -0
  110. data/docs/WaterQualityApi.md +151 -0
  111. data/git_push.sh +57 -0
  112. data/lib/soilsidekick/api/ai_services_api.rb +378 -0
  113. data/lib/soilsidekick/api/carbon_api.rb +90 -0
  114. data/lib/soilsidekick/api/consumer_plant_care_api.rb +289 -0
  115. data/lib/soilsidekick/api/environmental_api.rb +111 -0
  116. data/lib/soilsidekick/api/geographic_api.rb +90 -0
  117. data/lib/soilsidekick/api/leaf_engines_api.rb +111 -0
  118. data/lib/soilsidekick/api/satellite_data_api.rb +90 -0
  119. data/lib/soilsidekick/api/soil_analysis_api.rb +247 -0
  120. data/lib/soilsidekick/api/turbo_quant_api.rb +111 -0
  121. data/lib/soilsidekick/api/vrt_api.rb +90 -0
  122. data/lib/soilsidekick/api/water_quality_api.rb +158 -0
  123. data/lib/soilsidekick/api_client.rb +397 -0
  124. data/lib/soilsidekick/api_error.rb +58 -0
  125. data/lib/soilsidekick/api_model_base.rb +88 -0
  126. data/lib/soilsidekick/configuration.rb +312 -0
  127. data/lib/soilsidekick/models/ai_analysis.rb +167 -0
  128. data/lib/soilsidekick/models/ai_analysis_recommendations_inner.rb +199 -0
  129. data/lib/soilsidekick/models/beginner_guidance.rb +228 -0
  130. data/lib/soilsidekick/models/beginner_guidance_detailed_explanation.rb +179 -0
  131. data/lib/soilsidekick/models/beginner_guidance_metadata.rb +165 -0
  132. data/lib/soilsidekick/models/beginner_guidance_request.rb +229 -0
  133. data/lib/soilsidekick/models/beginner_guidance_request_location.rb +156 -0
  134. data/lib/soilsidekick/models/beginner_guidance_request_plant_context.rb +158 -0
  135. data/lib/soilsidekick/models/calculate_carbon_credits_request.rb +264 -0
  136. data/lib/soilsidekick/models/calculate_environmental_impact_request.rb +247 -0
  137. data/lib/soilsidekick/models/calculate_environmental_impact_request_proposed_treatments_inner.rb +181 -0
  138. data/lib/soilsidekick/models/calculate_environmental_impact_request_soil_data.rb +238 -0
  139. data/lib/soilsidekick/models/calculate_environmental_impact_request_water_body_data.rb +147 -0
  140. data/lib/soilsidekick/models/carbon_credit_calculation.rb +165 -0
  141. data/lib/soilsidekick/models/carbon_credit_calculation_calculation_details.rb +192 -0
  142. data/lib/soilsidekick/models/carbon_credit_calculation_calculation_details_metadata.rb +167 -0
  143. data/lib/soilsidekick/models/carbon_credit_calculation_credit_record.rb +217 -0
  144. data/lib/soilsidekick/models/county.rb +183 -0
  145. data/lib/soilsidekick/models/county_lookup200_response.rb +149 -0
  146. data/lib/soilsidekick/models/county_lookup_request.rb +183 -0
  147. data/lib/soilsidekick/models/dynamic_care.rb +196 -0
  148. data/lib/soilsidekick/models/dynamic_care_care_recommendations.rb +175 -0
  149. data/lib/soilsidekick/models/dynamic_care_care_recommendations_humidity.rb +165 -0
  150. data/lib/soilsidekick/models/dynamic_care_care_recommendations_light.rb +165 -0
  151. data/lib/soilsidekick/models/dynamic_care_care_recommendations_watering.rb +208 -0
  152. data/lib/soilsidekick/models/dynamic_care_current_conditions.rb +183 -0
  153. data/lib/soilsidekick/models/dynamic_care_metadata.rb +165 -0
  154. data/lib/soilsidekick/models/dynamic_care_plant.rb +199 -0
  155. data/lib/soilsidekick/models/dynamic_care_request.rb +262 -0
  156. data/lib/soilsidekick/models/dynamic_care_request_container_details.rb +199 -0
  157. data/lib/soilsidekick/models/dynamic_care_request_environment.rb +203 -0
  158. data/lib/soilsidekick/models/dynamic_care_request_location.rb +194 -0
  159. data/lib/soilsidekick/models/environmental_impact.rb +167 -0
  160. data/lib/soilsidekick/models/environmental_impact_detailed_analysis.rb +183 -0
  161. data/lib/soilsidekick/models/environmental_impact_detailed_analysis_eco_alternatives.rb +149 -0
  162. data/lib/soilsidekick/models/environmental_impact_detailed_analysis_eco_alternatives_alternatives_inner.rb +183 -0
  163. data/lib/soilsidekick/models/environmental_impact_detailed_analysis_runoff_risk.rb +199 -0
  164. data/lib/soilsidekick/models/environmental_impact_impact_assessment.rb +183 -0
  165. data/lib/soilsidekick/models/error.rb +165 -0
  166. data/lib/soilsidekick/models/generate_smart_report_summary_request.rb +215 -0
  167. data/lib/soilsidekick/models/generate_vrt_prescription_request.rb +223 -0
  168. data/lib/soilsidekick/models/get_agricultural_intelligence_request.rb +225 -0
  169. data/lib/soilsidekick/models/get_live_agricultural_data_request.rb +277 -0
  170. data/lib/soilsidekick/models/get_planting_calendar_request.rb +201 -0
  171. data/lib/soilsidekick/models/get_satellite_data_request.rb +226 -0
  172. data/lib/soilsidekick/models/get_seasonal_planning_assistant_request.rb +245 -0
  173. data/lib/soilsidekick/models/get_seasonal_planning_assistant_request_location.rb +165 -0
  174. data/lib/soilsidekick/models/get_soil_data_request.rb +176 -0
  175. data/lib/soilsidekick/models/get_territorial_water_analytics_request.rb +201 -0
  176. data/lib/soilsidekick/models/get_territorial_water_analytics_request_date_range.rb +156 -0
  177. data/lib/soilsidekick/models/leaf_engines_compatibility.rb +165 -0
  178. data/lib/soilsidekick/models/leaf_engines_compatibility_data.rb +247 -0
  179. data/lib/soilsidekick/models/leaf_engines_compatibility_data_breakdown.rb +165 -0
  180. data/lib/soilsidekick/models/leaf_engines_compatibility_data_breakdown_soil.rb +169 -0
  181. data/lib/soilsidekick/models/leaf_engines_compatibility_data_metadata.rb +167 -0
  182. data/lib/soilsidekick/models/leaf_engines_compatibility_usage.rb +156 -0
  183. data/lib/soilsidekick/models/leafengines_query_request.rb +199 -0
  184. data/lib/soilsidekick/models/leafengines_query_request_location.rb +174 -0
  185. data/lib/soilsidekick/models/leafengines_query_request_options.rb +165 -0
  186. data/lib/soilsidekick/models/leafengines_query_request_plant.rb +174 -0
  187. data/lib/soilsidekick/models/leafengines_query_request_plant_care_requirements.rb +211 -0
  188. data/lib/soilsidekick/models/leafengines_query_request_plant_care_requirements_soil_ph_range.rb +156 -0
  189. data/lib/soilsidekick/models/live_agricultural_data.rb +237 -0
  190. data/lib/soilsidekick/models/live_agricultural_data_data.rb +174 -0
  191. data/lib/soilsidekick/models/planting_calendar.rb +185 -0
  192. data/lib/soilsidekick/models/safe_identification.rb +184 -0
  193. data/lib/soilsidekick/models/safe_identification_confidence_breakdown.rb +174 -0
  194. data/lib/soilsidekick/models/safe_identification_identification.rb +200 -0
  195. data/lib/soilsidekick/models/safe_identification_identification_primary_match.rb +175 -0
  196. data/lib/soilsidekick/models/safe_identification_metadata.rb +167 -0
  197. data/lib/soilsidekick/models/safe_identification_request.rb +183 -0
  198. data/lib/soilsidekick/models/safe_identification_request_context.rb +223 -0
  199. data/lib/soilsidekick/models/safe_identification_request_location.rb +205 -0
  200. data/lib/soilsidekick/models/safe_identification_request_location_coordinates.rb +156 -0
  201. data/lib/soilsidekick/models/safe_identification_safety_analysis.rb +215 -0
  202. data/lib/soilsidekick/models/safe_identification_safety_analysis_lookalikes_inner.rb +177 -0
  203. data/lib/soilsidekick/models/satellite_data.rb +185 -0
  204. data/lib/soilsidekick/models/seasonal_planning_response.rb +174 -0
  205. data/lib/soilsidekick/models/seasonal_planning_response_recommendations.rb +169 -0
  206. data/lib/soilsidekick/models/seasonal_planning_response_weather_data.rb +192 -0
  207. data/lib/soilsidekick/models/smart_report_summary.rb +165 -0
  208. data/lib/soilsidekick/models/smart_report_summary_summary.rb +178 -0
  209. data/lib/soilsidekick/models/soil_data.rb +239 -0
  210. data/lib/soilsidekick/models/territorial_water_analytics.rb +165 -0
  211. data/lib/soilsidekick/models/territorial_water_analytics_analytics.rb +174 -0
  212. data/lib/soilsidekick/models/turbo_quant_capabilities.rb +253 -0
  213. data/lib/soilsidekick/models/turbo_quant_capabilities_estimated_latency_ms.rb +156 -0
  214. data/lib/soilsidekick/models/turbo_quant_capabilities_request.rb +201 -0
  215. data/lib/soilsidekick/models/visual_crop_analysis.rb +174 -0
  216. data/lib/soilsidekick/models/visual_crop_analysis_analysis.rb +219 -0
  217. data/lib/soilsidekick/models/visual_crop_analysis_request.rb +234 -0
  218. data/lib/soilsidekick/models/visual_crop_analysis_request_location.rb +165 -0
  219. data/lib/soilsidekick/models/vrt_prescription.rb +176 -0
  220. data/lib/soilsidekick/models/vrt_prescription_zones_inner.rb +165 -0
  221. data/lib/soilsidekick/models/water_quality.rb +235 -0
  222. data/lib/soilsidekick/version.rb +15 -0
  223. data/lib/soilsidekick.rb +146 -0
  224. data/soilsidekick.gemspec +39 -0
  225. data/spec/api/ai_services_api_spec.rb +95 -0
  226. data/spec/api/carbon_api_spec.rb +47 -0
  227. data/spec/api/consumer_plant_care_api_spec.rb +80 -0
  228. data/spec/api/environmental_api_spec.rb +50 -0
  229. data/spec/api/geographic_api_spec.rb +47 -0
  230. data/spec/api/leaf_engines_api_spec.rb +50 -0
  231. data/spec/api/satellite_data_api_spec.rb +47 -0
  232. data/spec/api/soil_analysis_api_spec.rb +74 -0
  233. data/spec/api/turbo_quant_api_spec.rb +50 -0
  234. data/spec/api/vrt_api_spec.rb +47 -0
  235. data/spec/api/water_quality_api_spec.rb +59 -0
  236. data/spec/models/ai_analysis_recommendations_inner_spec.rb +52 -0
  237. data/spec/models/ai_analysis_spec.rb +48 -0
  238. data/spec/models/beginner_guidance_detailed_explanation_spec.rb +54 -0
  239. data/spec/models/beginner_guidance_metadata_spec.rb +48 -0
  240. data/spec/models/beginner_guidance_request_location_spec.rb +42 -0
  241. data/spec/models/beginner_guidance_request_plant_context_spec.rb +42 -0
  242. data/spec/models/beginner_guidance_request_spec.rb +58 -0
  243. data/spec/models/beginner_guidance_spec.rb +84 -0
  244. data/spec/models/calculate_carbon_credits_request_spec.rb +64 -0
  245. data/spec/models/calculate_environmental_impact_request_proposed_treatments_inner_spec.rb +40 -0
  246. data/spec/models/calculate_environmental_impact_request_soil_data_spec.rb +74 -0
  247. data/spec/models/calculate_environmental_impact_request_spec.rb +60 -0
  248. data/spec/models/calculate_environmental_impact_request_water_body_data_spec.rb +36 -0
  249. data/spec/models/carbon_credit_calculation_calculation_details_metadata_spec.rb +48 -0
  250. data/spec/models/carbon_credit_calculation_calculation_details_spec.rb +66 -0
  251. data/spec/models/carbon_credit_calculation_credit_record_spec.rb +64 -0
  252. data/spec/models/carbon_credit_calculation_spec.rb +48 -0
  253. data/spec/models/county_lookup200_response_spec.rb +36 -0
  254. data/spec/models/county_lookup_request_spec.rb +36 -0
  255. data/spec/models/county_spec.rb +60 -0
  256. data/spec/models/dynamic_care_care_recommendations_humidity_spec.rb +48 -0
  257. data/spec/models/dynamic_care_care_recommendations_light_spec.rb +48 -0
  258. data/spec/models/dynamic_care_care_recommendations_spec.rb +54 -0
  259. data/spec/models/dynamic_care_care_recommendations_watering_spec.rb +58 -0
  260. data/spec/models/dynamic_care_current_conditions_spec.rb +60 -0
  261. data/spec/models/dynamic_care_metadata_spec.rb +48 -0
  262. data/spec/models/dynamic_care_plant_spec.rb +52 -0
  263. data/spec/models/dynamic_care_request_container_details_spec.rb +52 -0
  264. data/spec/models/dynamic_care_request_environment_spec.rb +50 -0
  265. data/spec/models/dynamic_care_request_location_spec.rb +48 -0
  266. data/spec/models/dynamic_care_request_spec.rb +70 -0
  267. data/spec/models/dynamic_care_spec.rb +66 -0
  268. data/spec/models/environmental_impact_detailed_analysis_eco_alternatives_alternatives_inner_spec.rb +60 -0
  269. data/spec/models/environmental_impact_detailed_analysis_eco_alternatives_spec.rb +36 -0
  270. data/spec/models/environmental_impact_detailed_analysis_runoff_risk_spec.rb +52 -0
  271. data/spec/models/environmental_impact_detailed_analysis_spec.rb +60 -0
  272. data/spec/models/environmental_impact_impact_assessment_spec.rb +60 -0
  273. data/spec/models/environmental_impact_spec.rb +48 -0
  274. data/spec/models/error_spec.rb +48 -0
  275. data/spec/models/generate_smart_report_summary_request_spec.rb +46 -0
  276. data/spec/models/generate_vrt_prescription_request_spec.rb +52 -0
  277. data/spec/models/get_agricultural_intelligence_request_spec.rb +46 -0
  278. data/spec/models/get_live_agricultural_data_request_spec.rb +58 -0
  279. data/spec/models/get_planting_calendar_request_spec.rb +42 -0
  280. data/spec/models/get_satellite_data_request_spec.rb +42 -0
  281. data/spec/models/get_seasonal_planning_assistant_request_location_spec.rb +48 -0
  282. data/spec/models/get_seasonal_planning_assistant_request_spec.rb +64 -0
  283. data/spec/models/get_soil_data_request_spec.rb +36 -0
  284. data/spec/models/get_territorial_water_analytics_request_date_range_spec.rb +42 -0
  285. data/spec/models/get_territorial_water_analytics_request_spec.rb +52 -0
  286. data/spec/models/leaf_engines_compatibility_data_breakdown_soil_spec.rb +48 -0
  287. data/spec/models/leaf_engines_compatibility_data_breakdown_spec.rb +48 -0
  288. data/spec/models/leaf_engines_compatibility_data_metadata_spec.rb +48 -0
  289. data/spec/models/leaf_engines_compatibility_data_spec.rb +82 -0
  290. data/spec/models/leaf_engines_compatibility_spec.rb +48 -0
  291. data/spec/models/leaf_engines_compatibility_usage_spec.rb +42 -0
  292. data/spec/models/leafengines_query_request_location_spec.rb +54 -0
  293. data/spec/models/leafengines_query_request_options_spec.rb +48 -0
  294. data/spec/models/leafengines_query_request_plant_care_requirements_soil_ph_range_spec.rb +42 -0
  295. data/spec/models/leafengines_query_request_plant_care_requirements_spec.rb +56 -0
  296. data/spec/models/leafengines_query_request_plant_spec.rb +54 -0
  297. data/spec/models/leafengines_query_request_spec.rb +48 -0
  298. data/spec/models/live_agricultural_data_data_spec.rb +54 -0
  299. data/spec/models/live_agricultural_data_spec.rb +76 -0
  300. data/spec/models/planting_calendar_spec.rb +60 -0
  301. data/spec/models/safe_identification_confidence_breakdown_spec.rb +54 -0
  302. data/spec/models/safe_identification_identification_primary_match_spec.rb +54 -0
  303. data/spec/models/safe_identification_identification_spec.rb +52 -0
  304. data/spec/models/safe_identification_metadata_spec.rb +48 -0
  305. data/spec/models/safe_identification_request_context_spec.rb +60 -0
  306. data/spec/models/safe_identification_request_location_coordinates_spec.rb +42 -0
  307. data/spec/models/safe_identification_request_location_spec.rb +48 -0
  308. data/spec/models/safe_identification_request_spec.rb +48 -0
  309. data/spec/models/safe_identification_safety_analysis_lookalikes_inner_spec.rb +54 -0
  310. data/spec/models/safe_identification_safety_analysis_spec.rb +58 -0
  311. data/spec/models/safe_identification_spec.rb +60 -0
  312. data/spec/models/satellite_data_spec.rb +60 -0
  313. data/spec/models/seasonal_planning_response_recommendations_spec.rb +48 -0
  314. data/spec/models/seasonal_planning_response_spec.rb +54 -0
  315. data/spec/models/seasonal_planning_response_weather_data_spec.rb +66 -0
  316. data/spec/models/smart_report_summary_spec.rb +48 -0
  317. data/spec/models/smart_report_summary_summary_spec.rb +54 -0
  318. data/spec/models/soil_data_spec.rb +96 -0
  319. data/spec/models/territorial_water_analytics_analytics_spec.rb +54 -0
  320. data/spec/models/territorial_water_analytics_spec.rb +48 -0
  321. data/spec/models/turbo_quant_capabilities_estimated_latency_ms_spec.rb +42 -0
  322. data/spec/models/turbo_quant_capabilities_request_spec.rb +52 -0
  323. data/spec/models/turbo_quant_capabilities_spec.rb +80 -0
  324. data/spec/models/visual_crop_analysis_analysis_spec.rb +64 -0
  325. data/spec/models/visual_crop_analysis_request_location_spec.rb +48 -0
  326. data/spec/models/visual_crop_analysis_request_spec.rb +58 -0
  327. data/spec/models/visual_crop_analysis_spec.rb +54 -0
  328. data/spec/models/vrt_prescription_spec.rb +54 -0
  329. data/spec/models/vrt_prescription_zones_inner_spec.rb +48 -0
  330. data/spec/models/water_quality_spec.rb +76 -0
  331. data/spec/spec_helper.rb +111 -0
  332. metadata +543 -0
@@ -0,0 +1,158 @@
1
+ =begin
2
+ #SoilSidekick Pro API
3
+
4
+ #Agricultural intelligence and soil analysis API with tier-based access control. ## What's New in 1.2.0 - **Consumer Plant Care APIs**: Three new endpoints addressing top pain points in plant ID apps: - `/safe-identification`: Toxic lookalike warnings and environmental context - `/dynamic-care`: Hyper-localized, real-time care recommendations - `/beginner-guidance`: Judgment-free, jargon-free plant guidance ## Authentication All endpoints require an API key passed via the `x-api-key` header: ``` x-api-key: ak_your_api_key_here ``` API keys are generated through the dashboard and use the `ak_*` format. ## Rate Limiting Rate limits are enforced based on your subscription tier: - **Free**: 10 req/min, 100 req/hour, 1,000 req/day - **Starter**: 30 req/min, 500 req/hour, 5,000 req/day - **Pro**: 100 req/min, 2,000 req/hour, 25,000 req/day - **Enterprise**: 500 req/min, 10,000 req/hour, 100,000 req/day Rate limit information is returned in response headers: - `X-RateLimit-Limit`: Maximum requests in window - `X-RateLimit-Remaining`: Remaining requests in window - `X-RateLimit-Reset`: Unix timestamp when limit resets ## Response Time SLAs All endpoints return response time headers for performance monitoring: - `X-Response-Time`: Human-readable response time (e.g., \"245ms\") - `X-Response-Time-Ms`: Response time in milliseconds - `X-Response-Time-Target`: Target response time for this endpoint - `X-Response-Time-Max`: Maximum acceptable response time - `X-Response-Time-Status`: Performance status (`optimal`, `acceptable`, `exceeded`) ### Response Time Targets by Category | Category | Target | Maximum | Endpoints | |----------|--------|---------|-----------| | **Fast** | 200ms | 500ms | county-lookup, check-subscription | | **Standard** | 500ms | 1,500ms | get-soil-data, territorial-water-quality | | **Complex** | 2,000ms | 5,000ms | agricultural-intelligence, gpt5-chat, visual-crop-analysis | | **Heavy** | 5,000ms | 15,000ms | live-agricultural-data, generate-vrt-prescription |
5
+
6
+ The version of the OpenAPI document: 3.0.0
7
+ Contact: support@soilsidekickpro.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.23.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module SoilSidekick
17
+ class BeginnerGuidanceRequestPlantContext < ApiModelBase
18
+ # Common plant name if known
19
+ attr_accessor :plant_name
20
+
21
+ # Base64 image for context
22
+ attr_accessor :image
23
+
24
+ # Attribute mapping from ruby-style variable name to JSON key.
25
+ def self.attribute_map
26
+ {
27
+ :'plant_name' => :'plant_name',
28
+ :'image' => :'image'
29
+ }
30
+ end
31
+
32
+ # Returns attribute mapping this model knows about
33
+ def self.acceptable_attribute_map
34
+ attribute_map
35
+ end
36
+
37
+ # Returns all the JSON keys this model knows about
38
+ def self.acceptable_attributes
39
+ acceptable_attribute_map.values
40
+ end
41
+
42
+ # Attribute type mapping.
43
+ def self.openapi_types
44
+ {
45
+ :'plant_name' => :'String',
46
+ :'image' => :'String'
47
+ }
48
+ end
49
+
50
+ # List of attributes with nullable: true
51
+ def self.openapi_nullable
52
+ Set.new([
53
+ ])
54
+ end
55
+
56
+ # Initializes the object
57
+ # @param [Hash] attributes Model attributes in the form of hash
58
+ def initialize(attributes = {})
59
+ if (!attributes.is_a?(Hash))
60
+ fail ArgumentError, "The input argument (attributes) must be a hash in `SoilSidekick::BeginnerGuidanceRequestPlantContext` initialize method"
61
+ end
62
+
63
+ # check to see if the attribute exists and convert string to symbol for hash key
64
+ acceptable_attribute_map = self.class.acceptable_attribute_map
65
+ attributes = attributes.each_with_object({}) { |(k, v), h|
66
+ if (!acceptable_attribute_map.key?(k.to_sym))
67
+ fail ArgumentError, "`#{k}` is not a valid attribute in `SoilSidekick::BeginnerGuidanceRequestPlantContext`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
68
+ end
69
+ h[k.to_sym] = v
70
+ }
71
+
72
+ if attributes.key?(:'plant_name')
73
+ self.plant_name = attributes[:'plant_name']
74
+ end
75
+
76
+ if attributes.key?(:'image')
77
+ self.image = attributes[:'image']
78
+ end
79
+ end
80
+
81
+ # Show invalid properties with the reasons. Usually used together with valid?
82
+ # @return Array for valid properties with the reasons
83
+ def list_invalid_properties
84
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
85
+ invalid_properties = Array.new
86
+ invalid_properties
87
+ end
88
+
89
+ # Check to see if the all the properties in the model are valid
90
+ # @return true if the model is valid
91
+ def valid?
92
+ warn '[DEPRECATED] the `valid?` method is obsolete'
93
+ true
94
+ end
95
+
96
+ # Checks equality by comparing each attribute.
97
+ # @param [Object] Object to be compared
98
+ def ==(o)
99
+ return true if self.equal?(o)
100
+ self.class == o.class &&
101
+ plant_name == o.plant_name &&
102
+ image == o.image
103
+ end
104
+
105
+ # @see the `==` method
106
+ # @param [Object] Object to be compared
107
+ def eql?(o)
108
+ self == o
109
+ end
110
+
111
+ # Calculates hash code according to all attributes.
112
+ # @return [Integer] Hash code
113
+ def hash
114
+ [plant_name, image].hash
115
+ end
116
+
117
+ # Builds the object from hash
118
+ # @param [Hash] attributes Model attributes in the form of hash
119
+ # @return [Object] Returns the model itself
120
+ def self.build_from_hash(attributes)
121
+ return nil unless attributes.is_a?(Hash)
122
+ attributes = attributes.transform_keys(&:to_sym)
123
+ transformed_hash = {}
124
+ openapi_types.each_pair do |key, type|
125
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
126
+ transformed_hash["#{key}"] = nil
127
+ elsif type =~ /\AArray<(.*)>/i
128
+ # check to ensure the input is an array given that the attribute
129
+ # is documented as an array but the input is not
130
+ if attributes[attribute_map[key]].is_a?(Array)
131
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
132
+ end
133
+ elsif !attributes[attribute_map[key]].nil?
134
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
135
+ end
136
+ end
137
+ new(transformed_hash)
138
+ end
139
+
140
+ # Returns the object in the form of hash
141
+ # @return [Hash] Returns the object in the form of hash
142
+ def to_hash
143
+ hash = {}
144
+ self.class.attribute_map.each_pair do |attr, param|
145
+ value = self.send(attr)
146
+ if value.nil?
147
+ is_nullable = self.class.openapi_nullable.include?(attr)
148
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
149
+ end
150
+
151
+ hash[param] = _to_hash(value)
152
+ end
153
+ hash
154
+ end
155
+
156
+ end
157
+
158
+ end
@@ -0,0 +1,264 @@
1
+ =begin
2
+ #SoilSidekick Pro API
3
+
4
+ #Agricultural intelligence and soil analysis API with tier-based access control. ## What's New in 1.2.0 - **Consumer Plant Care APIs**: Three new endpoints addressing top pain points in plant ID apps: - `/safe-identification`: Toxic lookalike warnings and environmental context - `/dynamic-care`: Hyper-localized, real-time care recommendations - `/beginner-guidance`: Judgment-free, jargon-free plant guidance ## Authentication All endpoints require an API key passed via the `x-api-key` header: ``` x-api-key: ak_your_api_key_here ``` API keys are generated through the dashboard and use the `ak_*` format. ## Rate Limiting Rate limits are enforced based on your subscription tier: - **Free**: 10 req/min, 100 req/hour, 1,000 req/day - **Starter**: 30 req/min, 500 req/hour, 5,000 req/day - **Pro**: 100 req/min, 2,000 req/hour, 25,000 req/day - **Enterprise**: 500 req/min, 10,000 req/hour, 100,000 req/day Rate limit information is returned in response headers: - `X-RateLimit-Limit`: Maximum requests in window - `X-RateLimit-Remaining`: Remaining requests in window - `X-RateLimit-Reset`: Unix timestamp when limit resets ## Response Time SLAs All endpoints return response time headers for performance monitoring: - `X-Response-Time`: Human-readable response time (e.g., \"245ms\") - `X-Response-Time-Ms`: Response time in milliseconds - `X-Response-Time-Target`: Target response time for this endpoint - `X-Response-Time-Max`: Maximum acceptable response time - `X-Response-Time-Status`: Performance status (`optimal`, `acceptable`, `exceeded`) ### Response Time Targets by Category | Category | Target | Maximum | Endpoints | |----------|--------|---------|-----------| | **Fast** | 200ms | 500ms | county-lookup, check-subscription | | **Standard** | 500ms | 1,500ms | get-soil-data, territorial-water-quality | | **Complex** | 2,000ms | 5,000ms | agricultural-intelligence, gpt5-chat, visual-crop-analysis | | **Heavy** | 5,000ms | 15,000ms | live-agricultural-data, generate-vrt-prescription |
5
+
6
+ The version of the OpenAPI document: 3.0.0
7
+ Contact: support@soilsidekickpro.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.23.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module SoilSidekick
17
+ class CalculateCarbonCreditsRequest < ApiModelBase
18
+ # Name of the field
19
+ attr_accessor :field_name
20
+
21
+ # Field size in acres
22
+ attr_accessor :field_size_acres
23
+
24
+ # Soil organic matter percentage
25
+ attr_accessor :soil_organic_matter
26
+
27
+ # Reference to existing soil analysis
28
+ attr_accessor :soil_analysis_id
29
+
30
+ attr_accessor :verification_type
31
+
32
+ class EnumAttributeValidator
33
+ attr_reader :datatype
34
+ attr_reader :allowable_values
35
+
36
+ def initialize(datatype, allowable_values)
37
+ @allowable_values = allowable_values.map do |value|
38
+ case datatype.to_s
39
+ when /Integer/i
40
+ value.to_i
41
+ when /Float/i
42
+ value.to_f
43
+ else
44
+ value
45
+ end
46
+ end
47
+ end
48
+
49
+ def valid?(value)
50
+ !value || allowable_values.include?(value)
51
+ end
52
+ end
53
+
54
+ # Attribute mapping from ruby-style variable name to JSON key.
55
+ def self.attribute_map
56
+ {
57
+ :'field_name' => :'field_name',
58
+ :'field_size_acres' => :'field_size_acres',
59
+ :'soil_organic_matter' => :'soil_organic_matter',
60
+ :'soil_analysis_id' => :'soil_analysis_id',
61
+ :'verification_type' => :'verification_type'
62
+ }
63
+ end
64
+
65
+ # Returns attribute mapping this model knows about
66
+ def self.acceptable_attribute_map
67
+ attribute_map
68
+ end
69
+
70
+ # Returns all the JSON keys this model knows about
71
+ def self.acceptable_attributes
72
+ acceptable_attribute_map.values
73
+ end
74
+
75
+ # Attribute type mapping.
76
+ def self.openapi_types
77
+ {
78
+ :'field_name' => :'String',
79
+ :'field_size_acres' => :'Float',
80
+ :'soil_organic_matter' => :'Float',
81
+ :'soil_analysis_id' => :'String',
82
+ :'verification_type' => :'String'
83
+ }
84
+ end
85
+
86
+ # List of attributes with nullable: true
87
+ def self.openapi_nullable
88
+ Set.new([
89
+ ])
90
+ end
91
+
92
+ # Initializes the object
93
+ # @param [Hash] attributes Model attributes in the form of hash
94
+ def initialize(attributes = {})
95
+ if (!attributes.is_a?(Hash))
96
+ fail ArgumentError, "The input argument (attributes) must be a hash in `SoilSidekick::CalculateCarbonCreditsRequest` initialize method"
97
+ end
98
+
99
+ # check to see if the attribute exists and convert string to symbol for hash key
100
+ acceptable_attribute_map = self.class.acceptable_attribute_map
101
+ attributes = attributes.each_with_object({}) { |(k, v), h|
102
+ if (!acceptable_attribute_map.key?(k.to_sym))
103
+ fail ArgumentError, "`#{k}` is not a valid attribute in `SoilSidekick::CalculateCarbonCreditsRequest`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
104
+ end
105
+ h[k.to_sym] = v
106
+ }
107
+
108
+ if attributes.key?(:'field_name')
109
+ self.field_name = attributes[:'field_name']
110
+ else
111
+ self.field_name = nil
112
+ end
113
+
114
+ if attributes.key?(:'field_size_acres')
115
+ self.field_size_acres = attributes[:'field_size_acres']
116
+ else
117
+ self.field_size_acres = nil
118
+ end
119
+
120
+ if attributes.key?(:'soil_organic_matter')
121
+ self.soil_organic_matter = attributes[:'soil_organic_matter']
122
+ end
123
+
124
+ if attributes.key?(:'soil_analysis_id')
125
+ self.soil_analysis_id = attributes[:'soil_analysis_id']
126
+ end
127
+
128
+ if attributes.key?(:'verification_type')
129
+ self.verification_type = attributes[:'verification_type']
130
+ end
131
+ end
132
+
133
+ # Show invalid properties with the reasons. Usually used together with valid?
134
+ # @return Array for valid properties with the reasons
135
+ def list_invalid_properties
136
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
137
+ invalid_properties = Array.new
138
+ if @field_name.nil?
139
+ invalid_properties.push('invalid value for "field_name", field_name cannot be nil.')
140
+ end
141
+
142
+ if @field_size_acres.nil?
143
+ invalid_properties.push('invalid value for "field_size_acres", field_size_acres cannot be nil.')
144
+ end
145
+
146
+ if @field_size_acres < 0.1
147
+ invalid_properties.push('invalid value for "field_size_acres", must be greater than or equal to 0.1.')
148
+ end
149
+
150
+ invalid_properties
151
+ end
152
+
153
+ # Check to see if the all the properties in the model are valid
154
+ # @return true if the model is valid
155
+ def valid?
156
+ warn '[DEPRECATED] the `valid?` method is obsolete'
157
+ return false if @field_name.nil?
158
+ return false if @field_size_acres.nil?
159
+ return false if @field_size_acres < 0.1
160
+ verification_type_validator = EnumAttributeValidator.new('String', ["self_reported", "third_party", "satellite"])
161
+ return false unless verification_type_validator.valid?(@verification_type)
162
+ true
163
+ end
164
+
165
+ # Custom attribute writer method with validation
166
+ # @param [Object] field_name Value to be assigned
167
+ def field_name=(field_name)
168
+ if field_name.nil?
169
+ fail ArgumentError, 'field_name cannot be nil'
170
+ end
171
+
172
+ @field_name = field_name
173
+ end
174
+
175
+ # Custom attribute writer method with validation
176
+ # @param [Object] field_size_acres Value to be assigned
177
+ def field_size_acres=(field_size_acres)
178
+ if field_size_acres.nil?
179
+ fail ArgumentError, 'field_size_acres cannot be nil'
180
+ end
181
+
182
+ if field_size_acres < 0.1
183
+ fail ArgumentError, 'invalid value for "field_size_acres", must be greater than or equal to 0.1.'
184
+ end
185
+
186
+ @field_size_acres = field_size_acres
187
+ end
188
+
189
+ # Custom attribute writer method checking allowed values (enum).
190
+ # @param [Object] verification_type Object to be assigned
191
+ def verification_type=(verification_type)
192
+ validator = EnumAttributeValidator.new('String', ["self_reported", "third_party", "satellite"])
193
+ unless validator.valid?(verification_type)
194
+ fail ArgumentError, "invalid value for \"verification_type\", must be one of #{validator.allowable_values}."
195
+ end
196
+ @verification_type = verification_type
197
+ end
198
+
199
+ # Checks equality by comparing each attribute.
200
+ # @param [Object] Object to be compared
201
+ def ==(o)
202
+ return true if self.equal?(o)
203
+ self.class == o.class &&
204
+ field_name == o.field_name &&
205
+ field_size_acres == o.field_size_acres &&
206
+ soil_organic_matter == o.soil_organic_matter &&
207
+ soil_analysis_id == o.soil_analysis_id &&
208
+ verification_type == o.verification_type
209
+ end
210
+
211
+ # @see the `==` method
212
+ # @param [Object] Object to be compared
213
+ def eql?(o)
214
+ self == o
215
+ end
216
+
217
+ # Calculates hash code according to all attributes.
218
+ # @return [Integer] Hash code
219
+ def hash
220
+ [field_name, field_size_acres, soil_organic_matter, soil_analysis_id, verification_type].hash
221
+ end
222
+
223
+ # Builds the object from hash
224
+ # @param [Hash] attributes Model attributes in the form of hash
225
+ # @return [Object] Returns the model itself
226
+ def self.build_from_hash(attributes)
227
+ return nil unless attributes.is_a?(Hash)
228
+ attributes = attributes.transform_keys(&:to_sym)
229
+ transformed_hash = {}
230
+ openapi_types.each_pair do |key, type|
231
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
232
+ transformed_hash["#{key}"] = nil
233
+ elsif type =~ /\AArray<(.*)>/i
234
+ # check to ensure the input is an array given that the attribute
235
+ # is documented as an array but the input is not
236
+ if attributes[attribute_map[key]].is_a?(Array)
237
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
238
+ end
239
+ elsif !attributes[attribute_map[key]].nil?
240
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
241
+ end
242
+ end
243
+ new(transformed_hash)
244
+ end
245
+
246
+ # Returns the object in the form of hash
247
+ # @return [Hash] Returns the object in the form of hash
248
+ def to_hash
249
+ hash = {}
250
+ self.class.attribute_map.each_pair do |attr, param|
251
+ value = self.send(attr)
252
+ if value.nil?
253
+ is_nullable = self.class.openapi_nullable.include?(attr)
254
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
255
+ end
256
+
257
+ hash[param] = _to_hash(value)
258
+ end
259
+ hash
260
+ end
261
+
262
+ end
263
+
264
+ end
@@ -0,0 +1,247 @@
1
+ =begin
2
+ #SoilSidekick Pro API
3
+
4
+ #Agricultural intelligence and soil analysis API with tier-based access control. ## What's New in 1.2.0 - **Consumer Plant Care APIs**: Three new endpoints addressing top pain points in plant ID apps: - `/safe-identification`: Toxic lookalike warnings and environmental context - `/dynamic-care`: Hyper-localized, real-time care recommendations - `/beginner-guidance`: Judgment-free, jargon-free plant guidance ## Authentication All endpoints require an API key passed via the `x-api-key` header: ``` x-api-key: ak_your_api_key_here ``` API keys are generated through the dashboard and use the `ak_*` format. ## Rate Limiting Rate limits are enforced based on your subscription tier: - **Free**: 10 req/min, 100 req/hour, 1,000 req/day - **Starter**: 30 req/min, 500 req/hour, 5,000 req/day - **Pro**: 100 req/min, 2,000 req/hour, 25,000 req/day - **Enterprise**: 500 req/min, 10,000 req/hour, 100,000 req/day Rate limit information is returned in response headers: - `X-RateLimit-Limit`: Maximum requests in window - `X-RateLimit-Remaining`: Remaining requests in window - `X-RateLimit-Reset`: Unix timestamp when limit resets ## Response Time SLAs All endpoints return response time headers for performance monitoring: - `X-Response-Time`: Human-readable response time (e.g., \"245ms\") - `X-Response-Time-Ms`: Response time in milliseconds - `X-Response-Time-Target`: Target response time for this endpoint - `X-Response-Time-Max`: Maximum acceptable response time - `X-Response-Time-Status`: Performance status (`optimal`, `acceptable`, `exceeded`) ### Response Time Targets by Category | Category | Target | Maximum | Endpoints | |----------|--------|---------|-----------| | **Fast** | 200ms | 500ms | county-lookup, check-subscription | | **Standard** | 500ms | 1,500ms | get-soil-data, territorial-water-quality | | **Complex** | 2,000ms | 5,000ms | agricultural-intelligence, gpt5-chat, visual-crop-analysis | | **Heavy** | 5,000ms | 15,000ms | live-agricultural-data, generate-vrt-prescription |
5
+
6
+ The version of the OpenAPI document: 3.0.0
7
+ Contact: support@soilsidekickpro.com
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.23.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module SoilSidekick
17
+ class CalculateEnvironmentalImpactRequest < ApiModelBase
18
+ attr_accessor :analysis_id
19
+
20
+ attr_accessor :county_fips
21
+
22
+ attr_accessor :soil_data
23
+
24
+ attr_accessor :proposed_treatments
25
+
26
+ attr_accessor :water_body_data
27
+
28
+ # Attribute mapping from ruby-style variable name to JSON key.
29
+ def self.attribute_map
30
+ {
31
+ :'analysis_id' => :'analysis_id',
32
+ :'county_fips' => :'county_fips',
33
+ :'soil_data' => :'soil_data',
34
+ :'proposed_treatments' => :'proposed_treatments',
35
+ :'water_body_data' => :'water_body_data'
36
+ }
37
+ end
38
+
39
+ # Returns attribute mapping this model knows about
40
+ def self.acceptable_attribute_map
41
+ attribute_map
42
+ end
43
+
44
+ # Returns all the JSON keys this model knows about
45
+ def self.acceptable_attributes
46
+ acceptable_attribute_map.values
47
+ end
48
+
49
+ # Attribute type mapping.
50
+ def self.openapi_types
51
+ {
52
+ :'analysis_id' => :'String',
53
+ :'county_fips' => :'String',
54
+ :'soil_data' => :'CalculateEnvironmentalImpactRequestSoilData',
55
+ :'proposed_treatments' => :'Array<CalculateEnvironmentalImpactRequestProposedTreatmentsInner>',
56
+ :'water_body_data' => :'CalculateEnvironmentalImpactRequestWaterBodyData'
57
+ }
58
+ end
59
+
60
+ # List of attributes with nullable: true
61
+ def self.openapi_nullable
62
+ Set.new([
63
+ ])
64
+ end
65
+
66
+ # Initializes the object
67
+ # @param [Hash] attributes Model attributes in the form of hash
68
+ def initialize(attributes = {})
69
+ if (!attributes.is_a?(Hash))
70
+ fail ArgumentError, "The input argument (attributes) must be a hash in `SoilSidekick::CalculateEnvironmentalImpactRequest` initialize method"
71
+ end
72
+
73
+ # check to see if the attribute exists and convert string to symbol for hash key
74
+ acceptable_attribute_map = self.class.acceptable_attribute_map
75
+ attributes = attributes.each_with_object({}) { |(k, v), h|
76
+ if (!acceptable_attribute_map.key?(k.to_sym))
77
+ fail ArgumentError, "`#{k}` is not a valid attribute in `SoilSidekick::CalculateEnvironmentalImpactRequest`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
78
+ end
79
+ h[k.to_sym] = v
80
+ }
81
+
82
+ if attributes.key?(:'analysis_id')
83
+ self.analysis_id = attributes[:'analysis_id']
84
+ else
85
+ self.analysis_id = nil
86
+ end
87
+
88
+ if attributes.key?(:'county_fips')
89
+ self.county_fips = attributes[:'county_fips']
90
+ else
91
+ self.county_fips = nil
92
+ end
93
+
94
+ if attributes.key?(:'soil_data')
95
+ self.soil_data = attributes[:'soil_data']
96
+ else
97
+ self.soil_data = nil
98
+ end
99
+
100
+ if attributes.key?(:'proposed_treatments')
101
+ if (value = attributes[:'proposed_treatments']).is_a?(Array)
102
+ self.proposed_treatments = value
103
+ end
104
+ end
105
+
106
+ if attributes.key?(:'water_body_data')
107
+ self.water_body_data = attributes[:'water_body_data']
108
+ end
109
+ end
110
+
111
+ # Show invalid properties with the reasons. Usually used together with valid?
112
+ # @return Array for valid properties with the reasons
113
+ def list_invalid_properties
114
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
115
+ invalid_properties = Array.new
116
+ if @analysis_id.nil?
117
+ invalid_properties.push('invalid value for "analysis_id", analysis_id cannot be nil.')
118
+ end
119
+
120
+ if @county_fips.nil?
121
+ invalid_properties.push('invalid value for "county_fips", county_fips cannot be nil.')
122
+ end
123
+
124
+ pattern = Regexp.new(/^[0-9]{5}$/)
125
+ if @county_fips !~ pattern
126
+ invalid_properties.push("invalid value for \"county_fips\", must conform to the pattern #{pattern}.")
127
+ end
128
+
129
+ if @soil_data.nil?
130
+ invalid_properties.push('invalid value for "soil_data", soil_data cannot be nil.')
131
+ end
132
+
133
+ invalid_properties
134
+ end
135
+
136
+ # Check to see if the all the properties in the model are valid
137
+ # @return true if the model is valid
138
+ def valid?
139
+ warn '[DEPRECATED] the `valid?` method is obsolete'
140
+ return false if @analysis_id.nil?
141
+ return false if @county_fips.nil?
142
+ return false if @county_fips !~ Regexp.new(/^[0-9]{5}$/)
143
+ return false if @soil_data.nil?
144
+ true
145
+ end
146
+
147
+ # Custom attribute writer method with validation
148
+ # @param [Object] analysis_id Value to be assigned
149
+ def analysis_id=(analysis_id)
150
+ if analysis_id.nil?
151
+ fail ArgumentError, 'analysis_id cannot be nil'
152
+ end
153
+
154
+ @analysis_id = analysis_id
155
+ end
156
+
157
+ # Custom attribute writer method with validation
158
+ # @param [Object] county_fips Value to be assigned
159
+ def county_fips=(county_fips)
160
+ if county_fips.nil?
161
+ fail ArgumentError, 'county_fips cannot be nil'
162
+ end
163
+
164
+ pattern = Regexp.new(/^[0-9]{5}$/)
165
+ if county_fips !~ pattern
166
+ fail ArgumentError, "invalid value for \"county_fips\", must conform to the pattern #{pattern}."
167
+ end
168
+
169
+ @county_fips = county_fips
170
+ end
171
+
172
+ # Custom attribute writer method with validation
173
+ # @param [Object] soil_data Value to be assigned
174
+ def soil_data=(soil_data)
175
+ if soil_data.nil?
176
+ fail ArgumentError, 'soil_data cannot be nil'
177
+ end
178
+
179
+ @soil_data = soil_data
180
+ end
181
+
182
+ # Checks equality by comparing each attribute.
183
+ # @param [Object] Object to be compared
184
+ def ==(o)
185
+ return true if self.equal?(o)
186
+ self.class == o.class &&
187
+ analysis_id == o.analysis_id &&
188
+ county_fips == o.county_fips &&
189
+ soil_data == o.soil_data &&
190
+ proposed_treatments == o.proposed_treatments &&
191
+ water_body_data == o.water_body_data
192
+ end
193
+
194
+ # @see the `==` method
195
+ # @param [Object] Object to be compared
196
+ def eql?(o)
197
+ self == o
198
+ end
199
+
200
+ # Calculates hash code according to all attributes.
201
+ # @return [Integer] Hash code
202
+ def hash
203
+ [analysis_id, county_fips, soil_data, proposed_treatments, water_body_data].hash
204
+ end
205
+
206
+ # Builds the object from hash
207
+ # @param [Hash] attributes Model attributes in the form of hash
208
+ # @return [Object] Returns the model itself
209
+ def self.build_from_hash(attributes)
210
+ return nil unless attributes.is_a?(Hash)
211
+ attributes = attributes.transform_keys(&:to_sym)
212
+ transformed_hash = {}
213
+ openapi_types.each_pair do |key, type|
214
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
215
+ transformed_hash["#{key}"] = nil
216
+ elsif type =~ /\AArray<(.*)>/i
217
+ # check to ensure the input is an array given that the attribute
218
+ # is documented as an array but the input is not
219
+ if attributes[attribute_map[key]].is_a?(Array)
220
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
221
+ end
222
+ elsif !attributes[attribute_map[key]].nil?
223
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
224
+ end
225
+ end
226
+ new(transformed_hash)
227
+ end
228
+
229
+ # Returns the object in the form of hash
230
+ # @return [Hash] Returns the object in the form of hash
231
+ def to_hash
232
+ hash = {}
233
+ self.class.attribute_map.each_pair do |attr, param|
234
+ value = self.send(attr)
235
+ if value.nil?
236
+ is_nullable = self.class.openapi_nullable.include?(attr)
237
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
238
+ end
239
+
240
+ hash[param] = _to_hash(value)
241
+ end
242
+ hash
243
+ end
244
+
245
+ end
246
+
247
+ end