HydPy 6.2.dev1__cp313-cp313-win_amd64.whl
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.
- hydpy/__init__.py +275 -0
- hydpy/aliases.py +2554 -0
- hydpy/auxs/__init__.py +0 -0
- hydpy/auxs/anntools.py +1305 -0
- hydpy/auxs/armatools.py +883 -0
- hydpy/auxs/calibtools.py +3337 -0
- hydpy/auxs/interptools.py +1094 -0
- hydpy/auxs/iuhtools.py +543 -0
- hydpy/auxs/networktools.py +597 -0
- hydpy/auxs/ppolytools.py +809 -0
- hydpy/auxs/quadtools.py +61 -0
- hydpy/auxs/roottools.py +228 -0
- hydpy/auxs/smoothtools.py +273 -0
- hydpy/auxs/statstools.py +2125 -0
- hydpy/auxs/validtools.py +81 -0
- hydpy/conf/HydPyConfigBase.xsd +68637 -0
- hydpy/conf/HydPyConfigBase.xsdt +358 -0
- hydpy/conf/HydPyConfigMultipleRuns.xsd +25 -0
- hydpy/conf/HydPyConfigSingleRun.xsd +24 -0
- hydpy/conf/__init__.py +0 -0
- hydpy/conf/a_coefficients_explicit_lobatto_sequence.npy +0 -0
- hydpy/conf/support_points_for_smoothpar_logistic2.npy +0 -0
- hydpy/config.py +42 -0
- hydpy/core/__init__.py +0 -0
- hydpy/core/aliastools.py +214 -0
- hydpy/core/autodoctools.py +1947 -0
- hydpy/core/auxfiletools.py +1169 -0
- hydpy/core/devicetools.py +3810 -0
- hydpy/core/exceptiontools.py +269 -0
- hydpy/core/filetools.py +1985 -0
- hydpy/core/hydpytools.py +3089 -0
- hydpy/core/importtools.py +1398 -0
- hydpy/core/indextools.py +345 -0
- hydpy/core/itemtools.py +1849 -0
- hydpy/core/masktools.py +460 -0
- hydpy/core/modeltools.py +4868 -0
- hydpy/core/netcdftools.py +2683 -0
- hydpy/core/objecttools.py +2023 -0
- hydpy/core/optiontools.py +1045 -0
- hydpy/core/parametertools.py +4674 -0
- hydpy/core/printtools.py +222 -0
- hydpy/core/propertytools.py +643 -0
- hydpy/core/pubtools.py +254 -0
- hydpy/core/selectiontools.py +1571 -0
- hydpy/core/sequencetools.py +4476 -0
- hydpy/core/seriestools.py +339 -0
- hydpy/core/testtools.py +2483 -0
- hydpy/core/timetools.py +3567 -0
- hydpy/core/typingtools.py +333 -0
- hydpy/core/variabletools.py +2615 -0
- hydpy/cythons/__init__.py +24 -0
- hydpy/cythons/annutils.pxd +33 -0
- hydpy/cythons/annutils.pyi +25 -0
- hydpy/cythons/annutils.pyx +120 -0
- hydpy/cythons/autogen/__init__.py +0 -0
- hydpy/cythons/autogen/annutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/annutils.pxd +42 -0
- hydpy/cythons/autogen/annutils.pyx +129 -0
- hydpy/cythons/autogen/c_arma.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_arma.pxd +179 -0
- hydpy/cythons/autogen/c_arma.pyx +356 -0
- hydpy/cythons/autogen/c_arma_rimorido.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_arma_rimorido.pxd +179 -0
- hydpy/cythons/autogen/c_arma_rimorido.pyx +356 -0
- hydpy/cythons/autogen/c_conv.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv.pxd +198 -0
- hydpy/cythons/autogen/c_conv.pyx +491 -0
- hydpy/cythons/autogen/c_conv_idw.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_idw.pxd +124 -0
- hydpy/cythons/autogen/c_conv_idw.pyx +264 -0
- hydpy/cythons/autogen/c_conv_idw_ed.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_idw_ed.pxd +197 -0
- hydpy/cythons/autogen/c_conv_idw_ed.pyx +481 -0
- hydpy/cythons/autogen/c_conv_nn.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_nn.pxd +120 -0
- hydpy/cythons/autogen/c_conv_nn.pyx +224 -0
- hydpy/cythons/autogen/c_dam.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam.pxd +805 -0
- hydpy/cythons/autogen/c_dam.pyx +1477 -0
- hydpy/cythons/autogen/c_dam_llake.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_llake.pxd +364 -0
- hydpy/cythons/autogen/c_dam_llake.pyx +705 -0
- hydpy/cythons/autogen/c_dam_lreservoir.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_lreservoir.pxd +365 -0
- hydpy/cythons/autogen/c_dam_lreservoir.pyx +708 -0
- hydpy/cythons/autogen/c_dam_lretention.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_lretention.pxd +340 -0
- hydpy/cythons/autogen/c_dam_lretention.pyx +625 -0
- hydpy/cythons/autogen/c_dam_pump.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_pump.pxd +402 -0
- hydpy/cythons/autogen/c_dam_pump.pyx +724 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.pxd +452 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.pyx +829 -0
- hydpy/cythons/autogen/c_dam_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_sluice.pxd +404 -0
- hydpy/cythons/autogen/c_dam_sluice.pyx +726 -0
- hydpy/cythons/autogen/c_dam_v001.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v001.pxd +452 -0
- hydpy/cythons/autogen/c_dam_v001.pyx +816 -0
- hydpy/cythons/autogen/c_dam_v002.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v002.pxd +394 -0
- hydpy/cythons/autogen/c_dam_v002.pyx +703 -0
- hydpy/cythons/autogen/c_dam_v003.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v003.pxd +417 -0
- hydpy/cythons/autogen/c_dam_v003.pyx +744 -0
- hydpy/cythons/autogen/c_dam_v004.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v004.pxd +486 -0
- hydpy/cythons/autogen/c_dam_v004.pyx +891 -0
- hydpy/cythons/autogen/c_dam_v005.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v005.pxd +524 -0
- hydpy/cythons/autogen/c_dam_v005.pyx +928 -0
- hydpy/cythons/autogen/c_dummy.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy.pxd +151 -0
- hydpy/cythons/autogen/c_dummy.pyx +263 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_node2node.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_node2node.pxd +89 -0
- hydpy/cythons/autogen/c_dummy_node2node.pyx +148 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_snowcover.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowcover.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowcover.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_soilwater.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_soilwater.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_soilwater.pyx +104 -0
- hydpy/cythons/autogen/c_evap.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap.pxd +1029 -0
- hydpy/cythons/autogen/c_evap.pyx +2601 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.pxd +227 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.pyx +584 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.pxd +193 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.pyx +478 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.pxd +681 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.pyx +1642 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.pxd +532 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.pyx +1296 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.pxd +179 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.pyx +328 -0
- hydpy/cythons/autogen/c_evap_pet_m.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_m.pxd +124 -0
- hydpy/cythons/autogen/c_evap_pet_m.pyx +214 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.pxd +126 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.pyx +214 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.pxd +305 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.pyx +624 -0
- hydpy/cythons/autogen/c_evap_ret_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_io.pxd +112 -0
- hydpy/cythons/autogen/c_evap_ret_io.pyx +176 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.pxd +139 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.pyx +273 -0
- hydpy/cythons/autogen/c_exch.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch.pxd +230 -0
- hydpy/cythons/autogen/c_exch.pyx +462 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.pxd +134 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.pyx +255 -0
- hydpy/cythons/autogen/c_exch_waterlevel.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_waterlevel.pxd +54 -0
- hydpy/cythons/autogen/c_exch_waterlevel.pyx +78 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.pxd +156 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.pyx +282 -0
- hydpy/cythons/autogen/c_ga.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga.pxd +353 -0
- hydpy/cythons/autogen/c_ga.pyx +1204 -0
- hydpy/cythons/autogen/c_ga_garto.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga_garto.pxd +330 -0
- hydpy/cythons/autogen/c_ga_garto.pyx +1105 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.pxd +236 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.pyx +944 -0
- hydpy/cythons/autogen/c_gland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland.pxd +437 -0
- hydpy/cythons/autogen/c_gland.pyx +726 -0
- hydpy/cythons/autogen/c_gland_gr4.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr4.pxd +382 -0
- hydpy/cythons/autogen/c_gland_gr4.pyx +605 -0
- hydpy/cythons/autogen/c_gland_gr5.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr5.pxd +368 -0
- hydpy/cythons/autogen/c_gland_gr5.pyx +568 -0
- hydpy/cythons/autogen/c_gland_gr6.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr6.pxd +420 -0
- hydpy/cythons/autogen/c_gland_gr6.pyx +673 -0
- hydpy/cythons/autogen/c_hland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland.pxd +855 -0
- hydpy/cythons/autogen/c_hland.pyx +2486 -0
- hydpy/cythons/autogen/c_hland_96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96.pxd +631 -0
- hydpy/cythons/autogen/c_hland_96.pyx +1724 -0
- hydpy/cythons/autogen/c_hland_96c.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96c.pxd +621 -0
- hydpy/cythons/autogen/c_hland_96c.pyx +1822 -0
- hydpy/cythons/autogen/c_hland_96p.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96p.pxd +683 -0
- hydpy/cythons/autogen/c_hland_96p.pyx +1911 -0
- hydpy/cythons/autogen/c_kinw.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw.pxd +509 -0
- hydpy/cythons/autogen/c_kinw.pyx +965 -0
- hydpy/cythons/autogen/c_kinw_williams.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw_williams.pxd +409 -0
- hydpy/cythons/autogen/c_kinw_williams.pyx +763 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.pxd +220 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.pyx +440 -0
- hydpy/cythons/autogen/c_lland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland.pxd +1386 -0
- hydpy/cythons/autogen/c_lland.pyx +3679 -0
- hydpy/cythons/autogen/c_lland_dd.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_dd.pxd +679 -0
- hydpy/cythons/autogen/c_lland_dd.pyx +1719 -0
- hydpy/cythons/autogen/c_lland_knauf.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_knauf.pxd +1096 -0
- hydpy/cythons/autogen/c_lland_knauf.pyx +2784 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.pxd +1369 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.pyx +3625 -0
- hydpy/cythons/autogen/c_meteo.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo.pxd +469 -0
- hydpy/cythons/autogen/c_meteo.pyx +879 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.pxd +75 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.pyx +107 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.pxd +209 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.pyx +339 -0
- hydpy/cythons/autogen/c_meteo_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_io.pxd +63 -0
- hydpy/cythons/autogen/c_meteo_glob_io.pyx +91 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.pxd +289 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.pyx +527 -0
- hydpy/cythons/autogen/c_meteo_precip_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_precip_io.pxd +112 -0
- hydpy/cythons/autogen/c_meteo_precip_io.pyx +176 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pxd +87 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pyx +123 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.pxd +209 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.pyx +343 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.pxd +286 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.pyx +519 -0
- hydpy/cythons/autogen/c_meteo_temp_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_temp_io.pxd +112 -0
- hydpy/cythons/autogen/c_meteo_temp_io.pyx +176 -0
- hydpy/cythons/autogen/c_musk.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk.pxd +282 -0
- hydpy/cythons/autogen/c_musk.pyx +605 -0
- hydpy/cythons/autogen/c_musk_classic.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk_classic.pxd +138 -0
- hydpy/cythons/autogen/c_musk_classic.pyx +226 -0
- hydpy/cythons/autogen/c_musk_mct.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk_mct.pxd +282 -0
- hydpy/cythons/autogen/c_musk_mct.pyx +609 -0
- hydpy/cythons/autogen/c_rconc.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc.pxd +119 -0
- hydpy/cythons/autogen/c_rconc.pyx +174 -0
- hydpy/cythons/autogen/c_rconc_nash.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc_nash.pxd +111 -0
- hydpy/cythons/autogen/c_rconc_nash.pyx +185 -0
- hydpy/cythons/autogen/c_rconc_uh.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc_uh.pxd +92 -0
- hydpy/cythons/autogen/c_rconc_uh.pyx +125 -0
- hydpy/cythons/autogen/c_sw1d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d.pxd +511 -0
- hydpy/cythons/autogen/c_sw1d.pyx +1263 -0
- hydpy/cythons/autogen/c_sw1d_channel.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_channel.pxd +119 -0
- hydpy/cythons/autogen/c_sw1d_channel.pyx +300 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.pxd +240 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.pyx +476 -0
- hydpy/cythons/autogen/c_sw1d_lias.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_lias.pxd +320 -0
- hydpy/cythons/autogen/c_sw1d_lias.pyx +619 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.pxd +325 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.pyx +644 -0
- hydpy/cythons/autogen/c_sw1d_network.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_network.pxd +90 -0
- hydpy/cythons/autogen/c_sw1d_network.pyx +246 -0
- hydpy/cythons/autogen/c_sw1d_pump.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_pump.pxd +256 -0
- hydpy/cythons/autogen/c_sw1d_pump.pyx +502 -0
- hydpy/cythons/autogen/c_sw1d_q_in.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_q_in.pxd +224 -0
- hydpy/cythons/autogen/c_sw1d_q_in.pyx +383 -0
- hydpy/cythons/autogen/c_sw1d_q_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_q_out.pxd +224 -0
- hydpy/cythons/autogen/c_sw1d_q_out.pyx +383 -0
- hydpy/cythons/autogen/c_sw1d_storage.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_storage.pxd +193 -0
- hydpy/cythons/autogen/c_sw1d_storage.pyx +349 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.pxd +212 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.pyx +404 -0
- hydpy/cythons/autogen/c_test.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test.pxd +175 -0
- hydpy/cythons/autogen/c_test.pyx +348 -0
- hydpy/cythons/autogen/c_test_discontinous.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_discontinous.pxd +146 -0
- hydpy/cythons/autogen/c_test_discontinous.pyx +256 -0
- hydpy/cythons/autogen/c_test_stiff0d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_stiff0d.pxd +146 -0
- hydpy/cythons/autogen/c_test_stiff0d.pyx +250 -0
- hydpy/cythons/autogen/c_test_stiff1d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_stiff1d.pxd +145 -0
- hydpy/cythons/autogen/c_test_stiff1d.pyx +294 -0
- hydpy/cythons/autogen/c_whmod.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod.pxd +482 -0
- hydpy/cythons/autogen/c_whmod.pyx +1156 -0
- hydpy/cythons/autogen/c_whmod_rural.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod_rural.pxd +411 -0
- hydpy/cythons/autogen/c_whmod_rural.pyx +982 -0
- hydpy/cythons/autogen/c_whmod_urban.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod_urban.pxd +482 -0
- hydpy/cythons/autogen/c_whmod_urban.pyx +1155 -0
- hydpy/cythons/autogen/c_wland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland.pxd +842 -0
- hydpy/cythons/autogen/c_wland.pyx +1890 -0
- hydpy/cythons/autogen/c_wland_gd.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland_gd.pxd +829 -0
- hydpy/cythons/autogen/c_wland_gd.pyx +1847 -0
- hydpy/cythons/autogen/c_wland_wag.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland_wag.pxd +810 -0
- hydpy/cythons/autogen/c_wland_wag.pyx +1780 -0
- hydpy/cythons/autogen/c_wq.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq.pxd +275 -0
- hydpy/cythons/autogen/c_wq.pyx +652 -0
- hydpy/cythons/autogen/c_wq_trapeze.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_trapeze.pxd +170 -0
- hydpy/cythons/autogen/c_wq_trapeze.pyx +400 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.pxd +243 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.pyx +578 -0
- hydpy/cythons/autogen/c_wq_walrus.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_walrus.pxd +61 -0
- hydpy/cythons/autogen/c_wq_walrus.pyx +82 -0
- hydpy/cythons/autogen/configutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/configutils.pxd +17 -0
- hydpy/cythons/autogen/configutils.pyx +119 -0
- hydpy/cythons/autogen/interfaceutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/interfaceutils.pxd +31 -0
- hydpy/cythons/autogen/interfaceutils.pyx +82 -0
- hydpy/cythons/autogen/interputils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/interputils.pxd +42 -0
- hydpy/cythons/autogen/interputils.pyx +118 -0
- hydpy/cythons/autogen/masterinterface.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/masterinterface.pxd +153 -0
- hydpy/cythons/autogen/masterinterface.pyx +222 -0
- hydpy/cythons/autogen/pointerutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/pointerutils.pxd +31 -0
- hydpy/cythons/autogen/pointerutils.pyx +650 -0
- hydpy/cythons/autogen/ppolyutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/ppolyutils.pxd +35 -0
- hydpy/cythons/autogen/ppolyutils.pyx +59 -0
- hydpy/cythons/autogen/quadutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/quadutils.pxd +26 -0
- hydpy/cythons/autogen/quadutils.pyx +973 -0
- hydpy/cythons/autogen/rootutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/rootutils.pxd +28 -0
- hydpy/cythons/autogen/rootutils.pyx +109 -0
- hydpy/cythons/autogen/sequenceutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/sequenceutils.pxd +45 -0
- hydpy/cythons/autogen/sequenceutils.pyx +101 -0
- hydpy/cythons/autogen/smoothutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/smoothutils.pxd +29 -0
- hydpy/cythons/autogen/smoothutils.pyx +833 -0
- hydpy/cythons/configutils.pxd +8 -0
- hydpy/cythons/configutils.pyi +5 -0
- hydpy/cythons/configutils.pyx +110 -0
- hydpy/cythons/interfaceutils.pxd +22 -0
- hydpy/cythons/interfaceutils.pyi +15 -0
- hydpy/cythons/interfaceutils.pyx +73 -0
- hydpy/cythons/interputils.pxd +33 -0
- hydpy/cythons/interputils.pyi +32 -0
- hydpy/cythons/interputils.pyx +109 -0
- hydpy/cythons/modelutils.py +2990 -0
- hydpy/cythons/pointerutils.pxd +22 -0
- hydpy/cythons/pointerutils.pyi +89 -0
- hydpy/cythons/pointerutils.pyx +641 -0
- hydpy/cythons/ppolyutils.pxd +26 -0
- hydpy/cythons/ppolyutils.pyi +21 -0
- hydpy/cythons/ppolyutils.pyx +50 -0
- hydpy/cythons/quadutils.pxd +17 -0
- hydpy/cythons/quadutils.pyi +13 -0
- hydpy/cythons/quadutils.pyx +964 -0
- hydpy/cythons/rootutils.pxd +19 -0
- hydpy/cythons/rootutils.pyi +21 -0
- hydpy/cythons/rootutils.pyx +100 -0
- hydpy/cythons/sequenceutils.pxd +36 -0
- hydpy/cythons/sequenceutils.pyi +7 -0
- hydpy/cythons/sequenceutils.pyx +92 -0
- hydpy/cythons/smoothutils.pxd +20 -0
- hydpy/cythons/smoothutils.pyi +15 -0
- hydpy/cythons/smoothutils.pyx +824 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_dill_assl.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_kalk.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_leun.py +14 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_marb.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_dill_assl_lahn_leun.py +5 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_leun_lahn_kalk.py +5 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_marb_lahn_leun.py +5 -0
- hydpy/data/HydPy-H-Lahn/control/default/land.py +9 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_dill_assl.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_kalk.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_leun.py +56 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_marb.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_dill_assl_lahn_leun.py +7 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_leun_lahn_kalk.py +7 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_marb_lahn_leun.py +7 -0
- hydpy/data/HydPy-H-Lahn/multiple_runs.xml +309 -0
- hydpy/data/HydPy-H-Lahn/multiple_runs_alpha.xml +71 -0
- hydpy/data/HydPy-H-Lahn/network/default/headwaters.py +11 -0
- hydpy/data/HydPy-H-Lahn/network/default/nonheadwaters.py +11 -0
- hydpy/data/HydPy-H-Lahn/network/default/streams.py +8 -0
- hydpy/data/HydPy-H-Lahn/series/default/dill_assl_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalairtemperature.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalevapotranspiration.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_p.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_t.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_kalk_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_leun_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_marb_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/obs_q.nc +0 -0
- hydpy/data/HydPy-H-Lahn/single_run.xml +152 -0
- hydpy/data/HydPy-H-Lahn/single_run.xmlt +143 -0
- hydpy/data/__init__.py +17 -0
- hydpy/docs/__init__.py +0 -0
- hydpy/docs/autofigs/__init__.py +0 -0
- hydpy/docs/bib/__init__.py +0 -0
- hydpy/docs/bib/refs.bib +566 -0
- hydpy/docs/combine_docversions.py +133 -0
- hydpy/docs/draw_model_sketches.py +1301 -0
- hydpy/docs/enable_autodoc.py +7 -0
- hydpy/docs/figs/HydPy-G-GR4.png +0 -0
- hydpy/docs/figs/HydPy-G-GR5.png +0 -0
- hydpy/docs/figs/HydPy-G-GR6.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96-COSERO.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96-PREVAH.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96.png +0 -0
- hydpy/docs/figs/HydPy-H-Lahn.png +0 -0
- hydpy/docs/figs/HydPy-KinW-Williams.png +0 -0
- hydpy/docs/figs/HydPy-L-DD.png +0 -0
- hydpy/docs/figs/HydPy-W-Wag.png +0 -0
- hydpy/docs/figs/HydPy_Logo.png +0 -0
- hydpy/docs/figs/HydPy_Logo_Text.png +0 -0
- hydpy/docs/figs/IDLE-editor.png +0 -0
- hydpy/docs/figs/IDLE-shell.png +0 -0
- hydpy/docs/figs/LAWA_river-basin-bumbers.png +0 -0
- hydpy/docs/figs/__init__.py +0 -0
- hydpy/docs/html_/__init__.py +0 -0
- hydpy/docs/polish_html.py +57 -0
- hydpy/docs/prepare.py +224 -0
- hydpy/docs/publish_docs.py +53 -0
- hydpy/docs/rst/HydPy-ARMA.rst +27 -0
- hydpy/docs/rst/HydPy-Conv.rst +22 -0
- hydpy/docs/rst/HydPy-Dam.rst +79 -0
- hydpy/docs/rst/HydPy-Dummy.rst +21 -0
- hydpy/docs/rst/HydPy-Evap.rst +26 -0
- hydpy/docs/rst/HydPy-Exch.rst +36 -0
- hydpy/docs/rst/HydPy-G.rst +40 -0
- hydpy/docs/rst/HydPy-GA.rst +34 -0
- hydpy/docs/rst/HydPy-H.rst +24 -0
- hydpy/docs/rst/HydPy-KinW.rst +32 -0
- hydpy/docs/rst/HydPy-L.rst +42 -0
- hydpy/docs/rst/HydPy-Meteo.rst +28 -0
- hydpy/docs/rst/HydPy-Musk.rst +21 -0
- hydpy/docs/rst/HydPy-Rconc.rst +17 -0
- hydpy/docs/rst/HydPy-SW1D.rst +49 -0
- hydpy/docs/rst/HydPy-Test.rst +19 -0
- hydpy/docs/rst/HydPy-W.rst +20 -0
- hydpy/docs/rst/HydPy-WHMod.rst +19 -0
- hydpy/docs/rst/HydPy-WQ.rst +20 -0
- hydpy/docs/rst/__init__.py +0 -0
- hydpy/docs/rst/additional_repositories.rst +40 -0
- hydpy/docs/rst/auxiliaries.rst +31 -0
- hydpy/docs/rst/continuous_integration.rst +75 -0
- hydpy/docs/rst/core.rst +75 -0
- hydpy/docs/rst/cythons.rst +47 -0
- hydpy/docs/rst/definitions.rst +506 -0
- hydpy/docs/rst/developer_guide.rst +54 -0
- hydpy/docs/rst/example_projects.rst +40 -0
- hydpy/docs/rst/execution.rst +22 -0
- hydpy/docs/rst/framework_tools.rst +56 -0
- hydpy/docs/rst/how_to_read_the_reference_manual.rst +156 -0
- hydpy/docs/rst/hydpydependencies.rst +55 -0
- hydpy/docs/rst/index.rst +125 -0
- hydpy/docs/rst/installation.rst +155 -0
- hydpy/docs/rst/model_families.rst +79 -0
- hydpy/docs/rst/model_overview.rst +291 -0
- hydpy/docs/rst/modelimports.rst +10 -0
- hydpy/docs/rst/options.rst +119 -0
- hydpy/docs/rst/programming_style.rst +572 -0
- hydpy/docs/rst/project_structure.rst +520 -0
- hydpy/docs/rst/quickstart.rst +304 -0
- hydpy/docs/rst/reference_manual.rst +29 -0
- hydpy/docs/rst/required_tools.rst +50 -0
- hydpy/docs/rst/simulation.rst +514 -0
- hydpy/docs/rst/submodel_interfaces.rst +32 -0
- hydpy/docs/rst/tests_and_documentation.rst +85 -0
- hydpy/docs/rst/user_guide.rst +38 -0
- hydpy/docs/rst/version_control.rst +116 -0
- hydpy/docs/rst/zbibliography.rst +8 -0
- hydpy/docs/sphinx/__init__.py +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/frameset.html +11 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/rstsource.html +15 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/versionchanges.html +33 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/defindex.html +35 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/domainindex.html +56 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex-single.html +63 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex-split.html +41 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex.html +76 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/globaltoc.html +11 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/layout.html +221 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/localtoc.html +15 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/opensearch.xml +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/page.html +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/relations.html +23 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/search.html +65 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/searchbox.html +21 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/searchfield.html +23 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/sourcelink.html +18 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/basic.css_t +925 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/doctools.js +156 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/documentation_options.js_t +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/file.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/language_data.js_t +26 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/minus.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/plus.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/searchtools.js +574 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/sphinx_highlight.js +154 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/theme.conf +16 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/layout.html +23 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/static/classic.css_t +358 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/static/sidebar.js_t +72 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/theme.conf +32 -0
- hydpy/docs/sphinx/conf.py +398 -0
- hydpy/docs/sphinx/defaultlinks_extension.py +36 -0
- hydpy/docs/sphinx/integrationtest_extension.py +104 -0
- hydpy/docs/sphinx/projectstructure_extension.py +58 -0
- hydpy/docs/sphinx/submodelgraph_extension.py +53 -0
- hydpy/exe/__init__.py +0 -0
- hydpy/exe/commandtools.py +651 -0
- hydpy/exe/hyd.py +277 -0
- hydpy/exe/modelimports.py +41 -0
- hydpy/exe/replacetools.py +216 -0
- hydpy/exe/servertools.py +2348 -0
- hydpy/exe/xmltools.py +3280 -0
- hydpy/interfaces/__init__.py +0 -0
- hydpy/interfaces/aetinterfaces.py +94 -0
- hydpy/interfaces/dischargeinterfaces.py +45 -0
- hydpy/interfaces/petinterfaces.py +117 -0
- hydpy/interfaces/precipinterfaces.py +42 -0
- hydpy/interfaces/radiationinterfaces.py +79 -0
- hydpy/interfaces/rconcinterfaces.py +30 -0
- hydpy/interfaces/routinginterfaces.py +324 -0
- hydpy/interfaces/soilinterfaces.py +96 -0
- hydpy/interfaces/stateinterfaces.py +98 -0
- hydpy/interfaces/tempinterfaces.py +46 -0
- hydpy/models/__init__.py +0 -0
- hydpy/models/arma/__init__.py +14 -0
- hydpy/models/arma/arma_control.py +383 -0
- hydpy/models/arma/arma_derived.py +204 -0
- hydpy/models/arma/arma_fluxes.py +41 -0
- hydpy/models/arma/arma_inlets.py +11 -0
- hydpy/models/arma/arma_logs.py +19 -0
- hydpy/models/arma/arma_model.py +461 -0
- hydpy/models/arma/arma_outlets.py +11 -0
- hydpy/models/arma_rimorido.py +381 -0
- hydpy/models/conv/__init__.py +12 -0
- hydpy/models/conv/conv_control.py +303 -0
- hydpy/models/conv/conv_derived.py +271 -0
- hydpy/models/conv/conv_fluxes.py +54 -0
- hydpy/models/conv/conv_inlets.py +11 -0
- hydpy/models/conv/conv_model.py +687 -0
- hydpy/models/conv/conv_outlets.py +11 -0
- hydpy/models/conv_idw.py +120 -0
- hydpy/models/conv_idw_ed.py +184 -0
- hydpy/models/conv_nn.py +112 -0
- hydpy/models/dam/__init__.py +16 -0
- hydpy/models/dam/dam_aides.py +17 -0
- hydpy/models/dam/dam_control.py +346 -0
- hydpy/models/dam/dam_derived.py +559 -0
- hydpy/models/dam/dam_factors.py +46 -0
- hydpy/models/dam/dam_fluxes.py +179 -0
- hydpy/models/dam/dam_inlets.py +29 -0
- hydpy/models/dam/dam_logs.py +52 -0
- hydpy/models/dam/dam_model.py +5011 -0
- hydpy/models/dam/dam_outlets.py +23 -0
- hydpy/models/dam/dam_receivers.py +41 -0
- hydpy/models/dam/dam_senders.py +23 -0
- hydpy/models/dam/dam_solver.py +75 -0
- hydpy/models/dam/dam_states.py +11 -0
- hydpy/models/dam_llake.py +499 -0
- hydpy/models/dam_lreservoir.py +548 -0
- hydpy/models/dam_lretention.py +343 -0
- hydpy/models/dam_pump.py +278 -0
- hydpy/models/dam_pump_sluice.py +339 -0
- hydpy/models/dam_sluice.py +319 -0
- hydpy/models/dam_v001.py +1127 -0
- hydpy/models/dam_v002.py +381 -0
- hydpy/models/dam_v003.py +422 -0
- hydpy/models/dam_v004.py +665 -0
- hydpy/models/dam_v005.py +479 -0
- hydpy/models/dummy/__init__.py +15 -0
- hydpy/models/dummy/dummy_control.py +22 -0
- hydpy/models/dummy/dummy_fluxes.py +11 -0
- hydpy/models/dummy/dummy_inlets.py +11 -0
- hydpy/models/dummy/dummy_inputs.py +41 -0
- hydpy/models/dummy/dummy_model.py +196 -0
- hydpy/models/dummy/dummy_outlets.py +11 -0
- hydpy/models/dummy_interceptedwater.py +85 -0
- hydpy/models/dummy_node2node.py +83 -0
- hydpy/models/dummy_snowalbedo.py +84 -0
- hydpy/models/dummy_snowcover.py +84 -0
- hydpy/models/dummy_snowycanopy.py +86 -0
- hydpy/models/dummy_soilwater.py +85 -0
- hydpy/models/evap/__init__.py +13 -0
- hydpy/models/evap/evap_control.py +354 -0
- hydpy/models/evap/evap_derived.py +236 -0
- hydpy/models/evap/evap_factors.py +188 -0
- hydpy/models/evap/evap_fixed.py +68 -0
- hydpy/models/evap/evap_fluxes.py +150 -0
- hydpy/models/evap/evap_inputs.py +54 -0
- hydpy/models/evap/evap_logs.py +91 -0
- hydpy/models/evap/evap_masks.py +48 -0
- hydpy/models/evap/evap_model.py +9170 -0
- hydpy/models/evap/evap_parameters.py +149 -0
- hydpy/models/evap/evap_sequences.py +32 -0
- hydpy/models/evap/evap_states.py +18 -0
- hydpy/models/evap_aet_hbv96.py +372 -0
- hydpy/models/evap_aet_minhas.py +331 -0
- hydpy/models/evap_aet_morsim.py +627 -0
- hydpy/models/evap_pet_ambav1.py +483 -0
- hydpy/models/evap_pet_hbv96.py +147 -0
- hydpy/models/evap_pet_m.py +94 -0
- hydpy/models/evap_pet_mlc.py +107 -0
- hydpy/models/evap_ret_fao56.py +265 -0
- hydpy/models/evap_ret_io.py +74 -0
- hydpy/models/evap_ret_tw2002.py +165 -0
- hydpy/models/exch/__init__.py +14 -0
- hydpy/models/exch/exch_control.py +262 -0
- hydpy/models/exch/exch_derived.py +36 -0
- hydpy/models/exch/exch_factors.py +26 -0
- hydpy/models/exch/exch_fluxes.py +48 -0
- hydpy/models/exch/exch_inlets.py +11 -0
- hydpy/models/exch/exch_logs.py +12 -0
- hydpy/models/exch/exch_model.py +451 -0
- hydpy/models/exch/exch_outlets.py +17 -0
- hydpy/models/exch/exch_receivers.py +17 -0
- hydpy/models/exch_branch_hbv96.py +186 -0
- hydpy/models/exch_waterlevel.py +73 -0
- hydpy/models/exch_weir_hbv96.py +609 -0
- hydpy/models/ga/__init__.py +14 -0
- hydpy/models/ga/ga_aides.py +17 -0
- hydpy/models/ga/ga_control.py +208 -0
- hydpy/models/ga/ga_derived.py +77 -0
- hydpy/models/ga/ga_fluxes.py +83 -0
- hydpy/models/ga/ga_inputs.py +26 -0
- hydpy/models/ga/ga_logs.py +17 -0
- hydpy/models/ga/ga_model.py +2952 -0
- hydpy/models/ga/ga_states.py +87 -0
- hydpy/models/ga_garto.py +1001 -0
- hydpy/models/ga_garto_submodel1.py +79 -0
- hydpy/models/gland/__init__.py +14 -0
- hydpy/models/gland/gland_control.py +90 -0
- hydpy/models/gland/gland_derived.py +113 -0
- hydpy/models/gland/gland_fluxes.py +137 -0
- hydpy/models/gland/gland_inputs.py +12 -0
- hydpy/models/gland/gland_model.py +1439 -0
- hydpy/models/gland/gland_outlets.py +11 -0
- hydpy/models/gland/gland_states.py +90 -0
- hydpy/models/gland_gr4.py +501 -0
- hydpy/models/gland_gr5.py +463 -0
- hydpy/models/gland_gr6.py +487 -0
- hydpy/models/hland/__init__.py +20 -0
- hydpy/models/hland/hland_aides.py +19 -0
- hydpy/models/hland/hland_constants.py +37 -0
- hydpy/models/hland/hland_control.py +1530 -0
- hydpy/models/hland/hland_derived.py +683 -0
- hydpy/models/hland/hland_factors.py +57 -0
- hydpy/models/hland/hland_fixed.py +42 -0
- hydpy/models/hland/hland_fluxes.py +279 -0
- hydpy/models/hland/hland_inputs.py +19 -0
- hydpy/models/hland/hland_masks.py +107 -0
- hydpy/models/hland/hland_model.py +4664 -0
- hydpy/models/hland/hland_outlets.py +11 -0
- hydpy/models/hland/hland_parameters.py +227 -0
- hydpy/models/hland/hland_sequences.py +382 -0
- hydpy/models/hland/hland_states.py +236 -0
- hydpy/models/hland_96.py +1812 -0
- hydpy/models/hland_96c.py +1196 -0
- hydpy/models/hland_96p.py +1204 -0
- hydpy/models/kinw/__init__.py +18 -0
- hydpy/models/kinw/kinw_aides.py +306 -0
- hydpy/models/kinw/kinw_control.py +270 -0
- hydpy/models/kinw/kinw_derived.py +197 -0
- hydpy/models/kinw/kinw_fixed.py +33 -0
- hydpy/models/kinw/kinw_fluxes.py +37 -0
- hydpy/models/kinw/kinw_inlets.py +11 -0
- hydpy/models/kinw/kinw_model.py +3026 -0
- hydpy/models/kinw/kinw_outlets.py +11 -0
- hydpy/models/kinw/kinw_solver.py +45 -0
- hydpy/models/kinw/kinw_states.py +17 -0
- hydpy/models/kinw_williams.py +1299 -0
- hydpy/models/kinw_williams_ext.py +768 -0
- hydpy/models/lland/__init__.py +42 -0
- hydpy/models/lland/lland_aides.py +38 -0
- hydpy/models/lland/lland_constants.py +88 -0
- hydpy/models/lland/lland_control.py +1329 -0
- hydpy/models/lland/lland_derived.py +380 -0
- hydpy/models/lland/lland_factors.py +18 -0
- hydpy/models/lland/lland_fixed.py +128 -0
- hydpy/models/lland/lland_fluxes.py +626 -0
- hydpy/models/lland/lland_inlets.py +12 -0
- hydpy/models/lland/lland_inputs.py +33 -0
- hydpy/models/lland/lland_logs.py +17 -0
- hydpy/models/lland/lland_masks.py +212 -0
- hydpy/models/lland/lland_model.py +7690 -0
- hydpy/models/lland/lland_outlets.py +12 -0
- hydpy/models/lland/lland_parameters.py +195 -0
- hydpy/models/lland/lland_sequences.py +67 -0
- hydpy/models/lland/lland_states.py +280 -0
- hydpy/models/lland_dd.py +2270 -0
- hydpy/models/lland_knauf.py +2156 -0
- hydpy/models/lland_knauf_ic.py +1920 -0
- hydpy/models/meteo/__init__.py +12 -0
- hydpy/models/meteo/meteo_control.py +154 -0
- hydpy/models/meteo/meteo_derived.py +159 -0
- hydpy/models/meteo/meteo_factors.py +88 -0
- hydpy/models/meteo/meteo_fixed.py +19 -0
- hydpy/models/meteo/meteo_fluxes.py +46 -0
- hydpy/models/meteo/meteo_inputs.py +47 -0
- hydpy/models/meteo/meteo_logs.py +30 -0
- hydpy/models/meteo/meteo_model.py +2904 -0
- hydpy/models/meteo/meteo_parameters.py +14 -0
- hydpy/models/meteo/meteo_sequences.py +22 -0
- hydpy/models/meteo_clear_glob_io.py +77 -0
- hydpy/models/meteo_glob_fao56.py +217 -0
- hydpy/models/meteo_glob_io.py +68 -0
- hydpy/models/meteo_glob_morsim.py +444 -0
- hydpy/models/meteo_precip_io.py +76 -0
- hydpy/models/meteo_psun_sun_glob_io.py +83 -0
- hydpy/models/meteo_sun_fao56.py +188 -0
- hydpy/models/meteo_sun_morsim.py +466 -0
- hydpy/models/meteo_temp_io.py +76 -0
- hydpy/models/musk/__init__.py +15 -0
- hydpy/models/musk/musk_control.py +328 -0
- hydpy/models/musk/musk_derived.py +32 -0
- hydpy/models/musk/musk_factors.py +53 -0
- hydpy/models/musk/musk_fluxes.py +24 -0
- hydpy/models/musk/musk_inlets.py +11 -0
- hydpy/models/musk/musk_masks.py +15 -0
- hydpy/models/musk/musk_model.py +838 -0
- hydpy/models/musk/musk_outlets.py +11 -0
- hydpy/models/musk/musk_sequences.py +88 -0
- hydpy/models/musk/musk_solver.py +68 -0
- hydpy/models/musk/musk_states.py +64 -0
- hydpy/models/musk_classic.py +228 -0
- hydpy/models/musk_mct.py +1247 -0
- hydpy/models/rconc/__init__.py +12 -0
- hydpy/models/rconc/rconc_control.py +473 -0
- hydpy/models/rconc/rconc_derived.py +76 -0
- hydpy/models/rconc/rconc_fluxes.py +19 -0
- hydpy/models/rconc/rconc_logs.py +74 -0
- hydpy/models/rconc/rconc_model.py +260 -0
- hydpy/models/rconc/rconc_states.py +11 -0
- hydpy/models/rconc_nash.py +48 -0
- hydpy/models/rconc_uh.py +53 -0
- hydpy/models/sw1d/__init__.py +17 -0
- hydpy/models/sw1d/sw1d_control.py +356 -0
- hydpy/models/sw1d/sw1d_derived.py +85 -0
- hydpy/models/sw1d/sw1d_factors.py +78 -0
- hydpy/models/sw1d/sw1d_fixed.py +12 -0
- hydpy/models/sw1d/sw1d_fluxes.py +55 -0
- hydpy/models/sw1d/sw1d_inlets.py +17 -0
- hydpy/models/sw1d/sw1d_model.py +3385 -0
- hydpy/models/sw1d/sw1d_outlets.py +11 -0
- hydpy/models/sw1d/sw1d_receivers.py +11 -0
- hydpy/models/sw1d/sw1d_senders.py +11 -0
- hydpy/models/sw1d/sw1d_states.py +23 -0
- hydpy/models/sw1d_channel.py +2051 -0
- hydpy/models/sw1d_gate_out.py +599 -0
- hydpy/models/sw1d_lias.py +105 -0
- hydpy/models/sw1d_lias_sluice.py +531 -0
- hydpy/models/sw1d_network.py +1219 -0
- hydpy/models/sw1d_pump.py +448 -0
- hydpy/models/sw1d_q_in.py +79 -0
- hydpy/models/sw1d_q_out.py +81 -0
- hydpy/models/sw1d_storage.py +78 -0
- hydpy/models/sw1d_weir_out.py +75 -0
- hydpy/models/test/__init__.py +14 -0
- hydpy/models/test/test_control.py +28 -0
- hydpy/models/test/test_fluxes.py +17 -0
- hydpy/models/test/test_model.py +201 -0
- hydpy/models/test/test_solver.py +48 -0
- hydpy/models/test/test_states.py +17 -0
- hydpy/models/test_discontinous.py +46 -0
- hydpy/models/test_stiff0d.py +47 -0
- hydpy/models/test_stiff1d.py +42 -0
- hydpy/models/whmod/__init__.py +21 -0
- hydpy/models/whmod/whmod_constants.py +77 -0
- hydpy/models/whmod/whmod_control.py +333 -0
- hydpy/models/whmod/whmod_derived.py +210 -0
- hydpy/models/whmod/whmod_factors.py +9 -0
- hydpy/models/whmod/whmod_fluxes.py +105 -0
- hydpy/models/whmod/whmod_inputs.py +15 -0
- hydpy/models/whmod/whmod_masks.py +178 -0
- hydpy/models/whmod/whmod_model.py +2091 -0
- hydpy/models/whmod/whmod_parameters.py +155 -0
- hydpy/models/whmod/whmod_sequences.py +193 -0
- hydpy/models/whmod/whmod_states.py +73 -0
- hydpy/models/whmod_rural.py +794 -0
- hydpy/models/whmod_urban.py +1011 -0
- hydpy/models/wland/__init__.py +43 -0
- hydpy/models/wland/wland_aides.py +55 -0
- hydpy/models/wland/wland_constants.py +103 -0
- hydpy/models/wland/wland_control.py +508 -0
- hydpy/models/wland/wland_derived.py +330 -0
- hydpy/models/wland/wland_factors.py +11 -0
- hydpy/models/wland/wland_fixed.py +12 -0
- hydpy/models/wland/wland_fluxes.py +166 -0
- hydpy/models/wland/wland_inputs.py +33 -0
- hydpy/models/wland/wland_masks.py +54 -0
- hydpy/models/wland/wland_model.py +3755 -0
- hydpy/models/wland/wland_outlets.py +11 -0
- hydpy/models/wland/wland_parameters.py +214 -0
- hydpy/models/wland/wland_sequences.py +108 -0
- hydpy/models/wland/wland_solver.py +45 -0
- hydpy/models/wland/wland_states.py +56 -0
- hydpy/models/wland_gd.py +888 -0
- hydpy/models/wland_wag.py +1244 -0
- hydpy/models/wq/__init__.py +14 -0
- hydpy/models/wq/wq_control.py +117 -0
- hydpy/models/wq/wq_derived.py +182 -0
- hydpy/models/wq/wq_factors.py +79 -0
- hydpy/models/wq/wq_fluxes.py +17 -0
- hydpy/models/wq/wq_model.py +1889 -0
- hydpy/models/wq_trapeze.py +168 -0
- hydpy/models/wq_trapeze_strickler.py +101 -0
- hydpy/models/wq_walrus.py +57 -0
- hydpy/py.typed +0 -0
- hydpy/tests/.coveragerc +22 -0
- hydpy/tests/__init__.py +0 -0
- hydpy/tests/check_consistency.py +32 -0
- hydpy/tests/hydpydoctestcustomize.pth +1 -0
- hydpy/tests/hydpydoctestcustomize.py +15 -0
- hydpy/tests/iotesting/__init__.py +0 -0
- hydpy/tests/run_doctests.py +233 -0
- hydpy-6.2.dev1.data/scripts/hyd.py +277 -0
- hydpy-6.2.dev1.dist-info/LICENSE +165 -0
- hydpy-6.2.dev1.dist-info/METADATA +163 -0
- hydpy-6.2.dev1.dist-info/RECORD +890 -0
- hydpy-6.2.dev1.dist-info/WHEEL +5 -0
- hydpy-6.2.dev1.dist-info/licenses_hydpy_installer.txt +42 -0
- hydpy-6.2.dev1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,651 @@
|
|
|
1
|
+
"""This module implements some main features for using *HydPy* from your command line
|
|
2
|
+
tools via script |hyd|."""
|
|
3
|
+
|
|
4
|
+
# import...
|
|
5
|
+
# ...from standard library
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
import contextlib
|
|
8
|
+
import datetime
|
|
9
|
+
import inspect
|
|
10
|
+
import os
|
|
11
|
+
import runpy
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
import time
|
|
15
|
+
import traceback
|
|
16
|
+
|
|
17
|
+
# ...from hydpy
|
|
18
|
+
import hydpy
|
|
19
|
+
import hydpy.tests.run_doctests
|
|
20
|
+
from hydpy import config
|
|
21
|
+
from hydpy.core import objecttools
|
|
22
|
+
from hydpy.core.typingtools import *
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@overload
|
|
26
|
+
def run_subprocess(
|
|
27
|
+
command: str, *, verbose: bool = True, blocking: Literal[True] = ...
|
|
28
|
+
) -> subprocess.CompletedProcess[str]:
|
|
29
|
+
"""non-blocking"""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@overload
|
|
33
|
+
def run_subprocess(
|
|
34
|
+
command: str, *, verbose: bool = True, blocking: Literal[False]
|
|
35
|
+
) -> subprocess.Popen[str]:
|
|
36
|
+
"""blocking"""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def run_subprocess(
|
|
40
|
+
command: str, *, verbose: bool = True, blocking: bool = True
|
|
41
|
+
) -> subprocess.CompletedProcess[str] | subprocess.Popen[str]:
|
|
42
|
+
"""Execute the given command in a new process.
|
|
43
|
+
|
|
44
|
+
Only when both `verbose` and `blocking` are |True|, |run_subprocess| prints all
|
|
45
|
+
responses to the current value of `sys.stdout`:
|
|
46
|
+
|
|
47
|
+
>>> from hydpy import run_subprocess
|
|
48
|
+
>>> import platform
|
|
49
|
+
>>> esc = "" if "windows" in platform.platform().lower() else "\\\\"
|
|
50
|
+
>>> result = run_subprocess(f"python -c print{esc}(1+1{esc})")
|
|
51
|
+
2
|
|
52
|
+
|
|
53
|
+
With verbose being |False|, |run_subprocess| never prints anything:
|
|
54
|
+
|
|
55
|
+
>>> result = run_subprocess(f"python -c print{esc}(1+1{esc})", verbose=False)
|
|
56
|
+
|
|
57
|
+
>>> process = run_subprocess("python", blocking=False, verbose=False)
|
|
58
|
+
>>> process.kill()
|
|
59
|
+
>>> _ = process.communicate()
|
|
60
|
+
|
|
61
|
+
When `verbose` is |True| and `blocking` is |False|, |run_subprocess| prints all
|
|
62
|
+
responses to the console ("invisible" for doctests):
|
|
63
|
+
|
|
64
|
+
>>> process = run_subprocess("python", blocking=False)
|
|
65
|
+
>>> process.kill()
|
|
66
|
+
>>> _ = process.communicate()
|
|
67
|
+
"""
|
|
68
|
+
command = command.strip()
|
|
69
|
+
if command.startswith("python"):
|
|
70
|
+
command = f"{sys.executable}{command[6:]}"
|
|
71
|
+
if blocking:
|
|
72
|
+
result1 = subprocess.run(
|
|
73
|
+
command,
|
|
74
|
+
capture_output=True,
|
|
75
|
+
encoding="utf-8",
|
|
76
|
+
shell=True,
|
|
77
|
+
check=False,
|
|
78
|
+
env=dict(os.environ),
|
|
79
|
+
)
|
|
80
|
+
if verbose: # due to doctest replacing sys.stdout
|
|
81
|
+
for output in (result1.stdout, result1.stderr):
|
|
82
|
+
output = output.strip()
|
|
83
|
+
if output:
|
|
84
|
+
print(output)
|
|
85
|
+
return result1
|
|
86
|
+
stdouterr = None if verbose else subprocess.DEVNULL
|
|
87
|
+
result2 = subprocess.Popen( # pylint: disable=consider-using-with
|
|
88
|
+
command,
|
|
89
|
+
stdout=stdouterr,
|
|
90
|
+
stderr=stdouterr,
|
|
91
|
+
encoding="utf-8",
|
|
92
|
+
shell=True,
|
|
93
|
+
env=dict(os.environ),
|
|
94
|
+
)
|
|
95
|
+
return result2
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def exec_commands(commands: str, **parameters: Any) -> None:
|
|
99
|
+
"""Execute the given Python commands.
|
|
100
|
+
|
|
101
|
+
Function |exec_commands| is thought for testing purposes only (see the main
|
|
102
|
+
documentation on module |hyd|).
|
|
103
|
+
|
|
104
|
+
Separate individual commands by semicolons and replaced whitespaces with
|
|
105
|
+
underscores:
|
|
106
|
+
|
|
107
|
+
>>> from hydpy.exe.commandtools import exec_commands
|
|
108
|
+
>>> exec_commands("x_=_1+1;print(x)")
|
|
109
|
+
Start to execute the commands ['x_=_1+1', 'print(x)'] for testing purposes.
|
|
110
|
+
2
|
|
111
|
+
|
|
112
|
+
|exec_commands| interprets double underscores as a single underscores:
|
|
113
|
+
|
|
114
|
+
>>> exec_commands("x_=_1;print(x.____class____)")
|
|
115
|
+
Start to execute the commands ['x_=_1', 'print(x.____class____)'] \
|
|
116
|
+
for testing purposes.
|
|
117
|
+
<class 'int'>
|
|
118
|
+
|
|
119
|
+
|exec_commands| evaluates additional keyword arguments before it executes the given
|
|
120
|
+
commands:
|
|
121
|
+
|
|
122
|
+
>>> exec_commands("e=x==y;print(e)", x=1, y=2)
|
|
123
|
+
Start to execute the commands ['e=x==y', 'print(e)'] for testing purposes.
|
|
124
|
+
False
|
|
125
|
+
"""
|
|
126
|
+
cmdlist = commands.split(";")
|
|
127
|
+
print(f"Start to execute the commands {cmdlist} for testing purposes.")
|
|
128
|
+
locals_: dict[str, Any] = {}
|
|
129
|
+
for par, value in parameters.items():
|
|
130
|
+
exec(f"{par} = {value}", {}, locals_)
|
|
131
|
+
for command in cmdlist:
|
|
132
|
+
command = command.replace("__", "temptemptemp")
|
|
133
|
+
command = command.replace("_", " ")
|
|
134
|
+
command = command.replace("temptemptemp", "_")
|
|
135
|
+
exec(command, {}, locals_)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def run_doctests() -> int: # pylint: disable=inconsistent-return-statements
|
|
139
|
+
"""Execute the main function of script `run_doctests.py` from remote.
|
|
140
|
+
|
|
141
|
+
Whenever in doubt about the functioning of your *HydPy* installation, call the
|
|
142
|
+
script function |run_doctests|. It executes all tests employed before your actual
|
|
143
|
+
*HydPy* version was released, which allows you to check for possible
|
|
144
|
+
incompatibilities with the site-packages or the configuration of your specific
|
|
145
|
+
system.
|
|
146
|
+
|
|
147
|
+
|run_doctests| calls the mentioned function with default arguments and returns its
|
|
148
|
+
exit code:
|
|
149
|
+
|
|
150
|
+
>>> from hydpy import run_doctests
|
|
151
|
+
>>> from unittest import mock
|
|
152
|
+
>>> with mock.patch("hydpy.tests.run_doctests.main.callback",
|
|
153
|
+
... side_effect=SystemExit(1)) as main:
|
|
154
|
+
... run_doctests()
|
|
155
|
+
1
|
|
156
|
+
>>> assert "hydpy_path=None" in str(main.mock_calls)
|
|
157
|
+
>>> assert "file_doctests=[]" in str(main.mock_calls)
|
|
158
|
+
>>> assert "python_mode=True" in str(main.mock_calls)
|
|
159
|
+
>>> assert "cython_mode=True" in str(main.mock_calls)
|
|
160
|
+
"""
|
|
161
|
+
try:
|
|
162
|
+
callback = cast(Callable[..., NoReturn], hydpy.tests.run_doctests.main.callback)
|
|
163
|
+
callback(hydpy_path=None, file_doctests=[], python_mode=True, cython_mode=True)
|
|
164
|
+
except SystemExit as exc:
|
|
165
|
+
return code if isinstance(code := exc.code, int) else 999
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def exec_script(filepath: str) -> None:
|
|
169
|
+
"""Execute an arbitrary Python script.
|
|
170
|
+
|
|
171
|
+
Function |run_simulation| allows you to execute a predefined *HydPy* workflow. You
|
|
172
|
+
can configure many details of this workflow but not change its general structure.
|
|
173
|
+
Use function |exec_script| execute *HydPy* remotely but strive for more flexibility.
|
|
174
|
+
As its name suggests, function |exec_script| executes any valid Python code relying
|
|
175
|
+
on the standard library and the available site-packages.
|
|
176
|
+
|
|
177
|
+
Function |exec_script| requires the name of the script to be executed as a single
|
|
178
|
+
argument:
|
|
179
|
+
|
|
180
|
+
>>> from hydpy import print_latest_logfile, Node, TestIO, run_subprocess
|
|
181
|
+
>>> TestIO.clear()
|
|
182
|
+
>>> with TestIO():
|
|
183
|
+
... result = run_subprocess('hyd.py logfile="default" exec_script temp.py')
|
|
184
|
+
... print_latest_logfile() # doctest: +ELLIPSIS
|
|
185
|
+
Invoking hyd.py with arguments `logfile=default, exec_script, temp.py` \
|
|
186
|
+
resulted in the following error:
|
|
187
|
+
File `...temp.py` does not exist.
|
|
188
|
+
...
|
|
189
|
+
|
|
190
|
+
Function |exec_script| can use all *HydPy* features. As a simple example, we write
|
|
191
|
+
a Python script that initialises a |Node| object and prints its string
|
|
192
|
+
representation (into the log file):
|
|
193
|
+
|
|
194
|
+
>>> with TestIO():
|
|
195
|
+
... with open("temp.py", "w") as file_:
|
|
196
|
+
... _ = file_.write("from hydpy import Node\\n")
|
|
197
|
+
... _ = file_.write('print(repr(Node("valid_name")))\\n')
|
|
198
|
+
... result = run_subprocess('hyd.py logfile="default" exec_script temp.py')
|
|
199
|
+
... print_latest_logfile()
|
|
200
|
+
Node("valid_name", variable="Q")
|
|
201
|
+
<BLANKLINE>
|
|
202
|
+
|
|
203
|
+
Errors are reported as usual:
|
|
204
|
+
|
|
205
|
+
>>> with TestIO():
|
|
206
|
+
... with open("temp.py", "w") as file_:
|
|
207
|
+
... _ = file_.write("from hydpy import Node\\n")
|
|
208
|
+
... _ = file_.write('print(repr(Node("invalid name")))\\n')
|
|
209
|
+
... result = run_subprocess('hyd.py logfile="default" exec_script temp.py')
|
|
210
|
+
... print_latest_logfile() # doctest: +ELLIPSIS
|
|
211
|
+
Invoking hyd.py with arguments `logfile=default, exec_script, temp.py` resulted \
|
|
212
|
+
in the following error:
|
|
213
|
+
While trying to initialize a `Node` object with value `invalid name` of type \
|
|
214
|
+
`str`, the following error occurred: The given name string `invalid name` does not \
|
|
215
|
+
define a valid variable identifier. Valid identifiers do not contain characters like \
|
|
216
|
+
`-` or empty spaces, do not start with numbers, cannot be mistaken with Python \
|
|
217
|
+
built-ins like `for`...)
|
|
218
|
+
...
|
|
219
|
+
"""
|
|
220
|
+
if not os.path.isfile(filepath):
|
|
221
|
+
raise FileNotFoundError(f"File `{os.path.abspath(filepath)}` does not exist.")
|
|
222
|
+
runpy.run_path(filepath)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def start_shell(filepath: str = "") -> None:
|
|
226
|
+
"""Open an interactive Python shell.
|
|
227
|
+
|
|
228
|
+
Writing "hyd.py start_shell" into your command line tool opens an interactive
|
|
229
|
+
Python console with the most relevant *HydPy* features being imported already. In
|
|
230
|
+
our first example, we directly prepare an |Element| object (without needing to
|
|
231
|
+
import class |Element| first) and print its string representation:
|
|
232
|
+
|
|
233
|
+
>>> import subprocess
|
|
234
|
+
>>> from hydpy import TestIO
|
|
235
|
+
>>> TestIO.clear()
|
|
236
|
+
>>> with TestIO():
|
|
237
|
+
... with subprocess.Popen(
|
|
238
|
+
... "hyd.py start_shell",
|
|
239
|
+
... stdin=subprocess.PIPE,
|
|
240
|
+
... stdout=subprocess.PIPE,
|
|
241
|
+
... stderr=subprocess.PIPE,
|
|
242
|
+
... encoding="utf-8",
|
|
243
|
+
... shell=True) as process:
|
|
244
|
+
... response = process.communicate(
|
|
245
|
+
... 'print(repr(Element("e1", outlets="n1")))')
|
|
246
|
+
... print(response[0])
|
|
247
|
+
Element("e1",
|
|
248
|
+
outlets="n1")
|
|
249
|
+
<BLANKLINE>
|
|
250
|
+
|
|
251
|
+
You can pass the name of a Python file as an additional argument, which enables
|
|
252
|
+
interaction with the file results. We create the example file `test.py` for
|
|
253
|
+
demonstration purposes, simply defining a |Nodes| object handling two individual
|
|
254
|
+
nodes:
|
|
255
|
+
|
|
256
|
+
>>> with TestIO():
|
|
257
|
+
... with open("test.py", "w") as file_:
|
|
258
|
+
... _ = file_.write("from hydpy import Nodes\\n")
|
|
259
|
+
... _ = file_.write('nodes = Nodes("n1", "n2")\\n')
|
|
260
|
+
|
|
261
|
+
Now we can, execute this file and, for example, query the names of
|
|
262
|
+
the defined nodes interactively:
|
|
263
|
+
|
|
264
|
+
>>> with TestIO():
|
|
265
|
+
... with subprocess.Popen(
|
|
266
|
+
... "hyd.py start_shell test.py",
|
|
267
|
+
... stdin=subprocess.PIPE,
|
|
268
|
+
... stdout=subprocess.PIPE,
|
|
269
|
+
... stderr=subprocess.PIPE,
|
|
270
|
+
... encoding="utf-8",
|
|
271
|
+
... shell=True) as process:
|
|
272
|
+
... response = process.communicate(
|
|
273
|
+
... "print(nodes.names)")
|
|
274
|
+
... print(response[0])
|
|
275
|
+
('n1', 'n2')
|
|
276
|
+
<BLANKLINE>
|
|
277
|
+
"""
|
|
278
|
+
if filepath:
|
|
279
|
+
filepath_ = filepath
|
|
280
|
+
else:
|
|
281
|
+
filepath_ = "__hydpy_temp__"
|
|
282
|
+
with open("__hydpy_temp__", "w", encoding=config.ENCODING) as file_:
|
|
283
|
+
file_.write("from hydpy import *")
|
|
284
|
+
subprocess.run([sys.executable, "-i", filepath_], check=True)
|
|
285
|
+
if not filepath:
|
|
286
|
+
os.remove(filepath_)
|
|
287
|
+
|
|
288
|
+
# First steps to use IPython instead:
|
|
289
|
+
# import IPython
|
|
290
|
+
# IPython.start_ipython()
|
|
291
|
+
# console = IPython.get_ipython()
|
|
292
|
+
# console.run_code(compile("print(1+1", "_", "exec"))
|
|
293
|
+
# console.run_code(compile("from hydpy import *", "_", "exec"))
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def print_latest_logfile(dirpath: str = ".", wait: float = 0.0) -> None:
|
|
297
|
+
"""Print the latest log file in the current or the given working directory.
|
|
298
|
+
|
|
299
|
+
When executing processes in parallel, |print_latest_logfile| may be called before
|
|
300
|
+
any log file exists. Then pass an appropriate number of seconds to the argument
|
|
301
|
+
`wait`. |print_latest_logfile| prints the contents of the latest log file as soon
|
|
302
|
+
as it finds one. Function |print_latest_logfile| works only for "default" logfile
|
|
303
|
+
names, as described in the documentation on function |prepare_logfile|.
|
|
304
|
+
|
|
305
|
+
>>> from hydpy import TestIO, print_latest_logfile, run_subprocess
|
|
306
|
+
>>> TestIO.clear()
|
|
307
|
+
>>> with TestIO():
|
|
308
|
+
... result = run_subprocess("hyd.py")
|
|
309
|
+
... print_latest_logfile(wait=0.5) # doctest: +ELLIPSIS
|
|
310
|
+
Traceback (most recent call last):
|
|
311
|
+
...
|
|
312
|
+
FileNotFoundError: Cannot find a default HydPy log file in directory ...iotesting.
|
|
313
|
+
|
|
314
|
+
>>> with TestIO():
|
|
315
|
+
... result1 = run_subprocess('hyd.py logfile="default" test=1')
|
|
316
|
+
... result2 = run_subprocess('hyd.py logfile="default" test=2')
|
|
317
|
+
... print_latest_logfile(wait=0.5) # doctest: +ELLIPSIS
|
|
318
|
+
Invoking hyd.py with arguments `logfile=default, test=2` resulted in the \
|
|
319
|
+
following error:
|
|
320
|
+
...
|
|
321
|
+
"""
|
|
322
|
+
now = time.perf_counter()
|
|
323
|
+
wait += now
|
|
324
|
+
filenames = []
|
|
325
|
+
while now <= wait:
|
|
326
|
+
for filename in sorted(os.listdir(dirpath)):
|
|
327
|
+
if filename.startswith("hydpy_") and filename.endswith(".log"):
|
|
328
|
+
filenames.append(filename)
|
|
329
|
+
if filenames:
|
|
330
|
+
break
|
|
331
|
+
time.sleep(0.1)
|
|
332
|
+
now = time.perf_counter()
|
|
333
|
+
if not filenames:
|
|
334
|
+
raise FileNotFoundError(
|
|
335
|
+
f"Cannot find a default HydPy log file in directory "
|
|
336
|
+
f"{os.path.abspath(dirpath)}."
|
|
337
|
+
)
|
|
338
|
+
with open(sorted(filenames)[-1], encoding=config.ENCODING) as logfile:
|
|
339
|
+
print(logfile.read())
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def prepare_logfile(filename: str) -> str:
|
|
343
|
+
"""Prepare an empty log file eventually and return its absolute path.
|
|
344
|
+
|
|
345
|
+
When passing the "filename" `stdout`, |prepare_logfile| does not prepare any file
|
|
346
|
+
and just returns `stdout`:
|
|
347
|
+
|
|
348
|
+
>>> from hydpy.exe.commandtools import prepare_logfile
|
|
349
|
+
>>> prepare_logfile("stdout")
|
|
350
|
+
'stdout'
|
|
351
|
+
|
|
352
|
+
When passing the "filename" `default`, |prepare_logfile| generates a filename
|
|
353
|
+
containing the actual date and time, prepares an empty file on disk, and returns
|
|
354
|
+
its path:
|
|
355
|
+
|
|
356
|
+
>>> from hydpy import repr_, TestIO
|
|
357
|
+
>>> from hydpy.core.testtools import mock_datetime_now
|
|
358
|
+
>>> from datetime import datetime
|
|
359
|
+
>>> with TestIO():
|
|
360
|
+
... with mock_datetime_now(datetime(2000, 1, 1, 12, 30, 0)):
|
|
361
|
+
... filepath = prepare_logfile("default")
|
|
362
|
+
>>> import os
|
|
363
|
+
>>> os.path.exists(filepath)
|
|
364
|
+
True
|
|
365
|
+
>>> repr_(filepath) # doctest: +ELLIPSIS
|
|
366
|
+
'...hydpy/tests/iotesting/hydpy_2000-01-01_12-30-00.log'
|
|
367
|
+
|
|
368
|
+
For all other strings, |prepare_logfile| does not add any date or time information
|
|
369
|
+
to the filename:
|
|
370
|
+
|
|
371
|
+
>>> with TestIO():
|
|
372
|
+
... with mock_datetime_now(datetime(2000, 1, 1, 12, 30, 0)):
|
|
373
|
+
... filepath = prepare_logfile("my_log_file.txt")
|
|
374
|
+
>>> os.path.exists(filepath)
|
|
375
|
+
True
|
|
376
|
+
>>> repr_(filepath) # doctest: +ELLIPSIS
|
|
377
|
+
'...hydpy/tests/iotesting/my_log_file.txt'
|
|
378
|
+
"""
|
|
379
|
+
if filename == "stdout":
|
|
380
|
+
return filename
|
|
381
|
+
if filename == "default":
|
|
382
|
+
filename = datetime.datetime.now().strftime("hydpy_%Y-%m-%d_%H-%M-%S.log")
|
|
383
|
+
with open(filename, "w", encoding=config.ENCODING):
|
|
384
|
+
pass
|
|
385
|
+
return os.path.abspath(filename)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
@contextlib.contextmanager
|
|
389
|
+
def _activate_logfile(
|
|
390
|
+
filepath: str,
|
|
391
|
+
logstyle: str,
|
|
392
|
+
level_stdout: Literal["info", "warning", "exception"],
|
|
393
|
+
level_stderr: Literal["warning", "exception"],
|
|
394
|
+
) -> Generator[None, None, None]:
|
|
395
|
+
try:
|
|
396
|
+
if filepath == "stdout":
|
|
397
|
+
sys.stdout = cast(
|
|
398
|
+
TextIO, LogFileInterface(sys.stdout, logstyle, level_stdout)
|
|
399
|
+
)
|
|
400
|
+
sys.stderr = cast(
|
|
401
|
+
TextIO, LogFileInterface(sys.stderr, logstyle, level_stderr)
|
|
402
|
+
)
|
|
403
|
+
yield
|
|
404
|
+
else:
|
|
405
|
+
with open(filepath, "a", encoding=config.ENCODING) as logfile:
|
|
406
|
+
sys.stdout = cast(
|
|
407
|
+
TextIO, LogFileInterface(logfile, logstyle, level_stdout)
|
|
408
|
+
)
|
|
409
|
+
sys.stderr = cast(
|
|
410
|
+
TextIO, LogFileInterface(logfile, logstyle, level_stderr)
|
|
411
|
+
)
|
|
412
|
+
yield
|
|
413
|
+
finally:
|
|
414
|
+
sys.stdout = sys.__stdout__
|
|
415
|
+
sys.stderr = sys.__stderr__
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
def execute_scriptfunction() -> int | None:
|
|
419
|
+
"""Execute a HydPy script function.
|
|
420
|
+
|
|
421
|
+
Function |execute_scriptfunction| is indirectly applied and explained in the
|
|
422
|
+
documentation on module |hyd|.
|
|
423
|
+
"""
|
|
424
|
+
logstyle = "plain"
|
|
425
|
+
logfilepath = prepare_logfile("stdout")
|
|
426
|
+
errorstyle = "multiline"
|
|
427
|
+
try:
|
|
428
|
+
args_given = []
|
|
429
|
+
kwargs_given = {}
|
|
430
|
+
for arg in sys.argv[1:]:
|
|
431
|
+
if len(arg) < 3:
|
|
432
|
+
args_given.append(arg)
|
|
433
|
+
else:
|
|
434
|
+
result = parse_argument(arg)
|
|
435
|
+
if isinstance(result, str):
|
|
436
|
+
args_given.append(arg)
|
|
437
|
+
else:
|
|
438
|
+
kwargs_given[result[0]] = result[1]
|
|
439
|
+
logfilepath = prepare_logfile(kwargs_given.pop("logfile", "stdout"))
|
|
440
|
+
logstyle = kwargs_given.pop("logstyle", "plain")
|
|
441
|
+
errorstyle = kwargs_given.pop("errorstyle", "multiline")
|
|
442
|
+
if errorstyle not in ("multiline", "single_line", "splittable"):
|
|
443
|
+
errorstyle, errorstyle_ = "multiline", errorstyle
|
|
444
|
+
raise ValueError(
|
|
445
|
+
f"The given error message style `{errorstyle_}` is not available. "
|
|
446
|
+
f"Please choose one of the following: `multiline`, `single_line`, "
|
|
447
|
+
f"and `splittable`."
|
|
448
|
+
) from None
|
|
449
|
+
try:
|
|
450
|
+
funcname = str(args_given.pop(0))
|
|
451
|
+
except IndexError:
|
|
452
|
+
raise ValueError(
|
|
453
|
+
"The first positional argument defining the function to be called is "
|
|
454
|
+
"missing."
|
|
455
|
+
) from None
|
|
456
|
+
try:
|
|
457
|
+
func = hydpy.pub.scriptfunctions[funcname]
|
|
458
|
+
except KeyError:
|
|
459
|
+
available_funcs = objecttools.enumeration(
|
|
460
|
+
sorted(hydpy.pub.scriptfunctions.keys())
|
|
461
|
+
)
|
|
462
|
+
raise ValueError(
|
|
463
|
+
f"There is no `{funcname}` function callable by `hyd.py`. Choose one "
|
|
464
|
+
f"of the following instead: {available_funcs}."
|
|
465
|
+
) from None
|
|
466
|
+
argspec = inspect.getfullargspec(func)
|
|
467
|
+
args_possible = argspec.args
|
|
468
|
+
if argspec.defaults:
|
|
469
|
+
args_required = args_possible[: -len(argspec.defaults)]
|
|
470
|
+
else:
|
|
471
|
+
args_required = args_possible
|
|
472
|
+
nmb_args_possible = len(args_possible)
|
|
473
|
+
nmb_args_required = len(args_required)
|
|
474
|
+
nmb_args_given = len(args_given)
|
|
475
|
+
if nmb_args_given < nmb_args_required or nmb_args_given > nmb_args_possible:
|
|
476
|
+
enum_args_given = ""
|
|
477
|
+
if nmb_args_given:
|
|
478
|
+
enum_args_given = f" ({objecttools.enumeration(args_given)})"
|
|
479
|
+
if nmb_args_given < nmb_args_required:
|
|
480
|
+
args = args_required
|
|
481
|
+
nmb_args = nmb_args_required
|
|
482
|
+
condition = "requires"
|
|
483
|
+
else:
|
|
484
|
+
args = args_possible
|
|
485
|
+
nmb_args = nmb_args_possible
|
|
486
|
+
condition = "allows"
|
|
487
|
+
enum_args = ""
|
|
488
|
+
if nmb_args:
|
|
489
|
+
enum_args = f" ({objecttools.enumeration(args)})"
|
|
490
|
+
raise ValueError(
|
|
491
|
+
f"Function `{funcname}` {condition} `{nmb_args:d}` "
|
|
492
|
+
f"positional arguments{enum_args}, but "
|
|
493
|
+
f"`{nmb_args_given:d}` are given{enum_args_given}."
|
|
494
|
+
)
|
|
495
|
+
with _activate_logfile(logfilepath, logstyle, "info", "warning"):
|
|
496
|
+
return func(*args_given, **kwargs_given)
|
|
497
|
+
except BaseException as exc:
|
|
498
|
+
_print_error(
|
|
499
|
+
exc=exc, logfilepath=logfilepath, logstyle=logstyle, errorstyle=errorstyle
|
|
500
|
+
)
|
|
501
|
+
return 1
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def _print_error(
|
|
505
|
+
*, exc: BaseException, logfilepath: str, logstyle: str, errorstyle: str
|
|
506
|
+
) -> None:
|
|
507
|
+
|
|
508
|
+
if logstyle not in LogFileInterface.style2infotype2string:
|
|
509
|
+
logstyle = "plain"
|
|
510
|
+
|
|
511
|
+
with _activate_logfile(logfilepath, logstyle, "exception", "exception"):
|
|
512
|
+
|
|
513
|
+
args = sys.argv[1:]
|
|
514
|
+
if (nmb := len(args)) > 1:
|
|
515
|
+
argphrase = f"with arguments `{', '.join(args)}`"
|
|
516
|
+
elif nmb == 1:
|
|
517
|
+
argphrase = f"with argument `{args[0]}`"
|
|
518
|
+
else:
|
|
519
|
+
argphrase = "without arguments"
|
|
520
|
+
|
|
521
|
+
sep = "\n" if errorstyle == "multiline" else "__hydpy_newline__"
|
|
522
|
+
message = (
|
|
523
|
+
f"Invoking hyd.py {argphrase} resulted in the following error:"
|
|
524
|
+
f"{' ' if errorstyle == 'single_line' else sep}"
|
|
525
|
+
f"{str(exc)}"
|
|
526
|
+
)
|
|
527
|
+
if errorstyle != "single_line":
|
|
528
|
+
traceback_ = "".join(traceback.format_tb(sys.exc_info()[2]))
|
|
529
|
+
if errorstyle == "splittable":
|
|
530
|
+
traceback_ = traceback_.replace("\n", sep)
|
|
531
|
+
message = (
|
|
532
|
+
f"{message}{sep}{sep}"
|
|
533
|
+
f"See the following stack traceback for debugging:{sep}"
|
|
534
|
+
f"{traceback_}"
|
|
535
|
+
)
|
|
536
|
+
if errorstyle == "splittable":
|
|
537
|
+
message = message.replace("\n", "__hydpy_newline__")
|
|
538
|
+
|
|
539
|
+
print(message, file=sys.stderr)
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
class LogFileInterface:
|
|
543
|
+
"""Wraps a usual file object, exposing all its methods while modifying only the
|
|
544
|
+
`write` method.
|
|
545
|
+
|
|
546
|
+
At the moment, class |LogFileInterface| supports only two log styles, as explained
|
|
547
|
+
in the documentation on module |hyd|. The following example shows its basic
|
|
548
|
+
usage:
|
|
549
|
+
|
|
550
|
+
>>> from hydpy import TestIO
|
|
551
|
+
>>> from hydpy.exe.commandtools import LogFileInterface
|
|
552
|
+
>>> with TestIO():
|
|
553
|
+
... logfile = open("test.log", "w")
|
|
554
|
+
>>> lfi = LogFileInterface(
|
|
555
|
+
... logfile, logstyle="prefixed", infotype="exception")
|
|
556
|
+
>>> lfi.write("a message\\n")
|
|
557
|
+
>>> lfi.write("another message\\n")
|
|
558
|
+
>>> lfi.close()
|
|
559
|
+
>>> with TestIO():
|
|
560
|
+
... with open("test.log", "r") as logfile:
|
|
561
|
+
... print(logfile.read())
|
|
562
|
+
error: a message
|
|
563
|
+
error: another message
|
|
564
|
+
<BLANKLINE>
|
|
565
|
+
|
|
566
|
+
The class member `style2infotype2string` defines the currently available log styles.
|
|
567
|
+
"""
|
|
568
|
+
|
|
569
|
+
style2infotype2string = {
|
|
570
|
+
"plain": {"info": "", "warning": "", "exception": ""},
|
|
571
|
+
"prefixed": {"info": "info: ", "warning": "warning: ", "exception": "error: "},
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
logfile: TextIO
|
|
575
|
+
infotype: Literal["info", "warning", "exception"]
|
|
576
|
+
|
|
577
|
+
def __init__(
|
|
578
|
+
self,
|
|
579
|
+
logfile: TextIO,
|
|
580
|
+
logstyle: str,
|
|
581
|
+
infotype: Literal["info", "warning", "exception"],
|
|
582
|
+
) -> None:
|
|
583
|
+
self.logfile = logfile
|
|
584
|
+
self._infotype = infotype
|
|
585
|
+
try:
|
|
586
|
+
stdtype2string = self.style2infotype2string[logstyle]
|
|
587
|
+
except KeyError:
|
|
588
|
+
styles = objecttools.enumeration(sorted(self.style2infotype2string.keys()))
|
|
589
|
+
raise ValueError(
|
|
590
|
+
f"The given log file style {logstyle} is not available. "
|
|
591
|
+
f"Please choose one of the following: {styles}."
|
|
592
|
+
) from None
|
|
593
|
+
self._string = stdtype2string[infotype]
|
|
594
|
+
|
|
595
|
+
def write(self, string: str) -> None:
|
|
596
|
+
"""Write the given string as explained in the main documentation on class
|
|
597
|
+
|LogFileInterface|."""
|
|
598
|
+
substrings = (f"{self._string}{s}" if s else "" for s in string.split("\n"))
|
|
599
|
+
self.logfile.write("\n".join(substrings))
|
|
600
|
+
|
|
601
|
+
def __getattr__(self, name: str) -> Any:
|
|
602
|
+
return getattr(self.logfile, name)
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
def parse_argument(string: str) -> str | tuple[str, str]:
|
|
606
|
+
"""Return a single value for a string understood as a positional argument or a
|
|
607
|
+
|tuple| containing a keyword and its value for a string understood as a keyword
|
|
608
|
+
argument.
|
|
609
|
+
|
|
610
|
+
|parse_argument| is intended to be used as a helper function for function
|
|
611
|
+
|execute_scriptfunction| only. See the following examples to see which types of
|
|
612
|
+
keyword arguments |execute_scriptfunction| covers:
|
|
613
|
+
|
|
614
|
+
>>> from hydpy.exe.commandtools import parse_argument
|
|
615
|
+
>>> parse_argument("x=3")
|
|
616
|
+
('x', '3')
|
|
617
|
+
>>> parse_argument('"x=3"')
|
|
618
|
+
'"x=3"'
|
|
619
|
+
>>> parse_argument("'x=3'")
|
|
620
|
+
"'x=3'"
|
|
621
|
+
>>> parse_argument('x="3==3"')
|
|
622
|
+
('x', '"3==3"')
|
|
623
|
+
>>> parse_argument("x='3==3'")
|
|
624
|
+
('x', "'3==3'")
|
|
625
|
+
"""
|
|
626
|
+
idx_equal = string.find("=")
|
|
627
|
+
if idx_equal == -1:
|
|
628
|
+
return string
|
|
629
|
+
idx_quote = idx_equal + 1
|
|
630
|
+
for quote in ('"', "'"):
|
|
631
|
+
idx = string.find(quote)
|
|
632
|
+
if -1 < idx < idx_quote:
|
|
633
|
+
idx_quote = idx
|
|
634
|
+
if idx_equal < idx_quote:
|
|
635
|
+
return string[:idx_equal], string[idx_equal + 1 :]
|
|
636
|
+
return string
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
def print_textandtime(text: str) -> None:
|
|
640
|
+
"""Print the given string and the current date and time with high precision for
|
|
641
|
+
logging purposes.
|
|
642
|
+
|
|
643
|
+
>>> from hydpy.exe.commandtools import print_textandtime
|
|
644
|
+
>>> from hydpy.core.testtools import mock_datetime_now
|
|
645
|
+
>>> from datetime import datetime
|
|
646
|
+
>>> with mock_datetime_now(datetime(2000, 1, 1, 12, 30, 0, 123456)):
|
|
647
|
+
... print_textandtime("something happens")
|
|
648
|
+
something happens (2000-01-01 12:30:00.123456).
|
|
649
|
+
"""
|
|
650
|
+
timestring = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
|
|
651
|
+
print(f"{text} ({timestring}).")
|