flextool 4.0.0__tar.gz → 4.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. {flextool-4.0.0 → flextool-4.0.2}/PKG-INFO +9 -4
  2. {flextool-4.0.0 → flextool-4.0.2}/README.md +8 -3
  3. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/update_dialog.py +41 -17
  4. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/main_window.py +20 -8
  5. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/platform_utils.py +14 -11
  6. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/install_info.py +26 -3
  7. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/self_update.py +3 -4
  8. {flextool-4.0.0 → flextool-4.0.2}/flextool.egg-info/PKG-INFO +9 -4
  9. {flextool-4.0.0 → flextool-4.0.2}/pyproject.toml +1 -1
  10. {flextool-4.0.0 → flextool-4.0.2}/LICENSE.txt +0 -0
  11. {flextool-4.0.0 → flextool-4.0.2}/flextool/__init__.py +0 -0
  12. {flextool-4.0.0 → flextool-4.0.2}/flextool/_mem_sampler.py +0 -0
  13. {flextool-4.0.0 → flextool-4.0.2}/flextool/_resources.py +0 -0
  14. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/__init__.py +0 -0
  15. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/__main__.py +0 -0
  16. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_cli.py +0 -0
  17. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_db_alt.py +0 -0
  18. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_final_outputs.py +0 -0
  19. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_guard.py +0 -0
  20. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_loop.py +0 -0
  21. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_readers.py +0 -0
  22. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_report.py +0 -0
  23. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_sizing.py +0 -0
  24. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_solve.py +0 -0
  25. {flextool-4.0.0 → flextool-4.0.2}/flextool/calibrate/_solve_status.py +0 -0
  26. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/__init__.py +0 -0
  27. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/_console.py +0 -0
  28. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/_timing.py +0 -0
  29. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_execute_flextool_workflow.py +0 -0
  30. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_export_to_tabular.py +0 -0
  31. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_import_sensitivities.py +0 -0
  32. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_migrate_database.py +0 -0
  33. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_open_results_db.py +0 -0
  34. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_read_matpower.py +0 -0
  35. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_read_old_flextool.py +0 -0
  36. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_read_self_describing_tabular_input.py +0 -0
  37. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_read_tabular_input.py +0 -0
  38. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_run_flextool.py +0 -0
  39. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_scenario_results.py +0 -0
  40. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_solve_mps.py +0 -0
  41. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_update_flextool.py +0 -0
  42. {flextool-4.0.0 → flextool-4.0.2}/flextool/cli/cmd_write_outputs.py +0 -0
  43. {flextool-4.0.0 → flextool-4.0.2}/flextool/common_utils/__init__.py +0 -0
  44. {flextool-4.0.0 → flextool-4.0.2}/flextool/common_utils/plot_mem_shape.py +0 -0
  45. {flextool-4.0.0 → flextool-4.0.2}/flextool/common_utils/precision.py +0 -0
  46. {flextool-4.0.0 → flextool-4.0.2}/flextool/decomposition/__init__.py +0 -0
  47. {flextool-4.0.0 → flextool-4.0.2}/flextool/decomposition/region_decomposition.py +0 -0
  48. {flextool-4.0.0 → flextool-4.0.2}/flextool/decomposition/region_filter.py +0 -0
  49. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/__init__.py +0 -0
  50. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_axis_enums.py +0 -0
  51. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_benders.py +0 -0
  52. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_block_layout.py +0 -0
  53. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_blocks.py +0 -0
  54. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_commodity_ladder.py +0 -0
  55. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_cumulative_invest.py +0 -0
  56. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_db_loader.py +0 -0
  57. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_db_reader.py +0 -0
  58. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_dc_power_flow.py +0 -0
  59. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_delay.py +0 -0
  60. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_derived_arithmetic.py +0 -0
  61. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_derived_block.py +0 -0
  62. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_derived_branch.py +0 -0
  63. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_derived_existing.py +0 -0
  64. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_derived_npv.py +0 -0
  65. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_derived_params.py +0 -0
  66. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_derived_profile.py +0 -0
  67. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_derived_walks.py +0 -0
  68. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_determinism.py +0 -0
  69. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_direct_params.py +0 -0
  70. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_dump_csvs.py +0 -0
  71. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_arc_unions.py +0 -0
  72. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_calc_params.py +0 -0
  73. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_chain_params.py +0 -0
  74. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_co2_accumulators.py +0 -0
  75. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_dispatchers.py +0 -0
  76. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_energy_margin.py +0 -0
  77. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_energy_margin_adder.py +0 -0
  78. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_entity_annual.py +0 -0
  79. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_inflow_scaling.py +0 -0
  80. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_leaf_sets.py +0 -0
  81. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_lp_scaling.py +0 -0
  82. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_mid_sets.py +0 -0
  83. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_pdt_params.py +0 -0
  84. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_per_solve.py +0 -0
  85. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_period_calc.py +0 -0
  86. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_period_params.py +0 -0
  87. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_provider_io.py +0 -0
  88. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_reserve.py +0 -0
  89. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_solve_time.py +0 -0
  90. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_emit_solve_writers.py +0 -0
  91. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_flex_data_accumulator.py +0 -0
  92. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_flex_data_provider.py +0 -0
  93. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_group_slack.py +0 -0
  94. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_inmemory_reader.py +0 -0
  95. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_input_source.py +0 -0
  96. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_invest_seeds.py +0 -0
  97. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_native_input_writer.py +0 -0
  98. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_native_run_model.py +0 -0
  99. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_orchestration.py +0 -0
  100. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_output_writer.py +0 -0
  101. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_param_shapes.py +0 -0
  102. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_parquet_bundle.py +0 -0
  103. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_pdt_join.py +0 -0
  104. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_pdt_lookup.py +0 -0
  105. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_per_solve_sets.py +0 -0
  106. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_projection_params.py +0 -0
  107. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_provider_keys.py +0 -0
  108. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_provider_translators.py +0 -0
  109. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_recursive_solve.py +0 -0
  110. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_region_filter.py +0 -0
  111. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_reserve.py +0 -0
  112. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_solve_acceptance.py +0 -0
  113. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_solve_config.py +0 -0
  114. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_solve_context.py +0 -0
  115. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_solve_handoff.py +0 -0
  116. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_solve_state.py +0 -0
  117. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_solver_base.py +0 -0
  118. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_solver_dispatch.py +0 -0
  119. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_spinedb_reader.py +0 -0
  120. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_stochastic.py +0 -0
  121. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_subprocess_solve.py +0 -0
  122. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_timeline.py +0 -0
  123. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_vectorize.py +0 -0
  124. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/_warm.py +0 -0
  125. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/autoscale/__init__.py +0 -0
  126. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/autoscale/_config.py +0 -0
  127. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/autoscale/_layer2.py +0 -0
  128. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/autoscale/_layer2_types.py +0 -0
  129. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/autoscale/_quantity_types.py +0 -0
  130. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/autoscale/_report.py +0 -0
  131. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/chain.py +0 -0
  132. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/input.py +0 -0
  133. {flextool-4.0.0 → flextool-4.0.2}/flextool/engine_polars/model.py +0 -0
  134. {flextool-4.0.0 → flextool-4.0.2}/flextool/env_check.py +0 -0
  135. {flextool-4.0.0 → flextool-4.0.2}/flextool/export_to_tabular/__init__.py +0 -0
  136. {flextool-4.0.0 → flextool-4.0.2}/flextool/export_to_tabular/db_reader.py +0 -0
  137. {flextool-4.0.0 → flextool-4.0.2}/flextool/export_to_tabular/excel_writer.py +0 -0
  138. {flextool-4.0.0 → flextool-4.0.2}/flextool/export_to_tabular/export_settings.yaml +0 -0
  139. {flextool-4.0.0 → flextool-4.0.2}/flextool/export_to_tabular/export_to_excel.py +0 -0
  140. {flextool-4.0.0 → flextool-4.0.2}/flextool/export_to_tabular/formatting.py +0 -0
  141. {flextool-4.0.0 → flextool-4.0.2}/flextool/export_to_tabular/sheet_config.py +0 -0
  142. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/__init__.py +0 -0
  143. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/__main__.py +0 -0
  144. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/calibrate_commands.py +0 -0
  145. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/calibrate_jobs.py +0 -0
  146. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/check_tree.py +0 -0
  147. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/cli_format.py +0 -0
  148. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/config_parser.py +0 -0
  149. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/data_models.py +0 -0
  150. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/db_editor_integration.py +0 -0
  151. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/db_version_check.py +0 -0
  152. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/__init__.py +0 -0
  153. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/add_dialog.py +0 -0
  154. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/calibrate_dialog.py +0 -0
  155. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/file_picker.py +0 -0
  156. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/group_picker.py +0 -0
  157. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/migration_consent_dialog.py +0 -0
  158. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/migration_progress_dialog.py +0 -0
  159. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/plot_dialog.py +0 -0
  160. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/plot_settings_picker.py +0 -0
  161. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/dialogs/project_dialog.py +0 -0
  162. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/downsampling.py +0 -0
  163. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/error_handling.py +0 -0
  164. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/execution_manager.py +0 -0
  165. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/execution_window.py +0 -0
  166. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/hover_tooltip.py +0 -0
  167. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/input_sources.py +0 -0
  168. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/network_graph.py +0 -0
  169. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/output_actions.py +0 -0
  170. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/output_log_window.py +0 -0
  171. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/plot_cache.py +0 -0
  172. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/plot_canvas.py +0 -0
  173. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/plot_config_reader.py +0 -0
  174. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/project_utils.py +0 -0
  175. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/result_viewer.py +0 -0
  176. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/scenario_key.py +0 -0
  177. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/scenario_lists.py +0 -0
  178. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/settings_io.py +0 -0
  179. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/solve_reader.py +0 -0
  180. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/tree_reorder.py +0 -0
  181. {flextool-4.0.0 → flextool-4.0.2}/flextool/gui/ui_metrics.py +0 -0
  182. {flextool-4.0.0 → flextool-4.0.2}/flextool/input_derivation/__init__.py +0 -0
  183. {flextool-4.0.0 → flextool-4.0.2}/flextool/input_derivation/_commodity_ladder.py +0 -0
  184. {flextool-4.0.0 → flextool-4.0.2}/flextool/input_derivation/_commodity_ladder_sets.py +0 -0
  185. {flextool-4.0.0 → flextool-4.0.2}/flextool/input_derivation/_dc_power_flow.py +0 -0
  186. {flextool-4.0.0 → flextool-4.0.2}/flextool/input_derivation/_method_constants.py +0 -0
  187. {flextool-4.0.0 → flextool-4.0.2}/flextool/input_derivation/_process_method.py +0 -0
  188. {flextool-4.0.0 → flextool-4.0.2}/flextool/input_derivation/_specs.py +0 -0
  189. {flextool-4.0.0 → flextool-4.0.2}/flextool/input_derivation/_validators.py +0 -0
  190. {flextool-4.0.0 → flextool-4.0.2}/flextool/lean_parquet.py +0 -0
  191. {flextool-4.0.0 → flextool-4.0.2}/flextool/model_builder/__init__.py +0 -0
  192. {flextool-4.0.0 → flextool-4.0.2}/flextool/model_builder/build_model.py +0 -0
  193. {flextool-4.0.0 → flextool-4.0.2}/flextool/model_builder/encoding.py +0 -0
  194. {flextool-4.0.0 → flextool-4.0.2}/flextool/model_builder/names.py +0 -0
  195. {flextool-4.0.0 → flextool-4.0.2}/flextool/model_builder/profiles.py +0 -0
  196. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/__init__.py +0 -0
  197. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/axis_helpers.py +0 -0
  198. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/color_template.py +0 -0
  199. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/config.py +0 -0
  200. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/format_helpers.py +0 -0
  201. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/legend_helpers.py +0 -0
  202. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/orchestrator.py +0 -0
  203. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/perf.py +0 -0
  204. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/plan.py +0 -0
  205. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/plot_bars.py +0 -0
  206. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/plot_bars_detail.py +0 -0
  207. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/plot_lines.py +0 -0
  208. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/shared_manifest.py +0 -0
  209. {flextool-4.0.0 → flextool-4.0.2}/flextool/plot_outputs/subplot_helpers.py +0 -0
  210. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/__init__.py +0 -0
  211. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/import_old_excel_input.json +0 -0
  212. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/read_matpower.py +0 -0
  213. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/read_old_flextool.py +0 -0
  214. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/read_self_describing_excel.py +0 -0
  215. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/read_tabular_with_specification.py +0 -0
  216. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/write_old_flextool_to_db.py +0 -0
  217. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/write_self_describing_to_db.py +0 -0
  218. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_inputs/write_to_input_db.py +0 -0
  219. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/__init__.py +0 -0
  220. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/_annualize.py +0 -0
  221. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/_inmemory_helpers.py +0 -0
  222. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/_output_meta.py +0 -0
  223. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/calc_capacity_flows.py +0 -0
  224. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/calc_connections.py +0 -0
  225. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/calc_costs.py +0 -0
  226. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/calc_group_flows.py +0 -0
  227. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/calc_slacks.py +0 -0
  228. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/calc_storage_vre.py +0 -0
  229. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/drop_levels.py +0 -0
  230. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/handoff_writers.py +0 -0
  231. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/out_ancillary.py +0 -0
  232. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/out_capacity.py +0 -0
  233. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/out_costs.py +0 -0
  234. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/out_flowgroup.py +0 -0
  235. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/out_flows.py +0 -0
  236. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/out_group.py +0 -0
  237. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/out_node.py +0 -0
  238. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/persist_realized_slice.py +0 -0
  239. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/process_results.py +0 -0
  240. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/read_highs_solution.py +0 -0
  241. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/read_parameters.py +0 -0
  242. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/read_sets.py +0 -0
  243. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/read_variables.py +0 -0
  244. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/solve_order.py +0 -0
  245. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/spinedb_replay.py +0 -0
  246. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/union_realized_slice.py +0 -0
  247. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/write_outputs.py +0 -0
  248. {flextool-4.0.0 → flextool-4.0.2}/flextool/process_outputs/write_spinedb.py +0 -0
  249. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/__init__.py +0 -0
  250. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/clustering.py +0 -0
  251. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/force_include.py +0 -0
  252. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/netload.py +0 -0
  253. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/netload_inputs.py +0 -0
  254. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/netload_iterate.py +0 -0
  255. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/preprocess.py +0 -0
  256. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/scenario_stack.py +0 -0
  257. {flextool-4.0.0 → flextool-4.0.2}/flextool/representative_periods/weights.py +0 -0
  258. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/__init__.py +0 -0
  259. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/config_builder.py +0 -0
  260. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/constants.py +0 -0
  261. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/data_models.py +0 -0
  262. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/db_reader.py +0 -0
  263. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/dispatch_data.py +0 -0
  264. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/dispatch_mappings.py +0 -0
  265. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/dispatch_plots.py +0 -0
  266. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/input_entity_colors.py +0 -0
  267. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/orchestrator.py +0 -0
  268. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/plan_union.py +0 -0
  269. {flextool-4.0.0 → flextool-4.0.2}/flextool/scenario_comparison/plot_settings_seed.py +0 -0
  270. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/AXIS_CONTRACT.md +0 -0
  271. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/howto_aggregate_output.json +0 -0
  272. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/howto_connections.json +0 -0
  273. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/howto_demand.json +0 -0
  274. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/howto_hydro_reservoir.json +0 -0
  275. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/howto_hydro_reservoir_with_pump.json +0 -0
  276. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/howto_non_sync_and_curtailment.json +0 -0
  277. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/howto_ramp_and_start_up.json +0 -0
  278. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/howto_stochastics.json +0 -0
  279. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/templates_examples.json +0 -0
  280. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/canonical_databases/templates_time_settings_only.json +0 -0
  281. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/comparison_settings_template.json +0 -0
  282. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/default_plot_settings.yaml +0 -0
  283. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/default_plots.yaml +0 -0
  284. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/flextool_axis_contract.json +0 -0
  285. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/flextool_axis_contract.schema.json +0 -0
  286. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/old_flextool_import_template.json +0 -0
  287. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/output_info_template.json +0 -0
  288. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/output_settings_template.json +0 -0
  289. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_constant_default.json +0 -0
  290. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_default_optional_output.json +0 -0
  291. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_default_value.json +0 -0
  292. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_drop_down.json +0 -0
  293. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_lifetime_method.json +0 -0
  294. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_optional_outputs.json +0 -0
  295. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_output_node_flows.json +0 -0
  296. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_results_master.json +0 -0
  297. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_rolling_start_remove.json +0 -0
  298. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_rolling_window.json +0 -0
  299. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_storage_binding_defaults.json +0 -0
  300. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_v2.json +0 -0
  301. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/pre_v26/flextool_template_v25.json +0 -0
  302. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/spinedb_results_schema.json +0 -0
  303. {flextool-4.0.0 → flextool-4.0.2}/flextool/schemas/spinedb_schema.json +0 -0
  304. {flextool-4.0.0 → flextool-4.0.2}/flextool/solver_config/copt.opt.template +0 -0
  305. {flextool-4.0.0 → flextool-4.0.2}/flextool/solver_config/cplex.opt.template +0 -0
  306. {flextool-4.0.0 → flextool-4.0.2}/flextool/solver_config/gurobi.opt.template +0 -0
  307. {flextool-4.0.0 → flextool-4.0.2}/flextool/solver_config/highs.opt.template +0 -0
  308. {flextool-4.0.0 → flextool-4.0.2}/flextool/solver_config/xpress.opt.template +0 -0
  309. {flextool-4.0.0 → flextool-4.0.2}/flextool/spinedb_backend/__init__.py +0 -0
  310. {flextool-4.0.0 → flextool-4.0.2}/flextool/spinedb_backend/_axis_enums.py +0 -0
  311. {flextool-4.0.0 → flextool-4.0.2}/flextool/spinedb_backend/_backend.py +0 -0
  312. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/__init__.py +0 -0
  313. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/canonical_databases.py +0 -0
  314. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/db_migration.py +0 -0
  315. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/ensure_settings_db.py +0 -0
  316. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/export_database.py +0 -0
  317. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/extend_tests_fixture.py +0 -0
  318. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/generate_canonical.py +0 -0
  319. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/initialize_database.py +0 -0
  320. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/sync_master_json_template.py +0 -0
  321. {flextool-4.0.0 → flextool-4.0.2}/flextool/update_flextool/test_fixtures.py +0 -0
  322. {flextool-4.0.0 → flextool-4.0.2}/flextool.egg-info/SOURCES.txt +0 -0
  323. {flextool-4.0.0 → flextool-4.0.2}/flextool.egg-info/dependency_links.txt +0 -0
  324. {flextool-4.0.0 → flextool-4.0.2}/flextool.egg-info/entry_points.txt +0 -0
  325. {flextool-4.0.0 → flextool-4.0.2}/flextool.egg-info/requires.txt +0 -0
  326. {flextool-4.0.0 → flextool-4.0.2}/flextool.egg-info/top_level.txt +0 -0
  327. {flextool-4.0.0 → flextool-4.0.2}/setup.cfg +0 -0
  328. {flextool-4.0.0 → flextool-4.0.2}/tests/test_bar_layout.py +0 -0
  329. {flextool-4.0.0 → flextool-4.0.2}/tests/test_bar_sub_pixel_labels.py +0 -0
  330. {flextool-4.0.0 → flextool-4.0.2}/tests/test_blocks.py +0 -0
  331. {flextool-4.0.0 → flextool-4.0.2}/tests/test_branch_weights.py +0 -0
  332. {flextool-4.0.0 → flextool-4.0.2}/tests/test_color_template.py +0 -0
  333. {flextool-4.0.0 → flextool-4.0.2}/tests/test_commodity_ladder_rolling.py +0 -0
  334. {flextool-4.0.0 → flextool-4.0.2}/tests/test_comparison_excel.py +0 -0
  335. {flextool-4.0.0 → flextool-4.0.2}/tests/test_comparison_project_root.py +0 -0
  336. {flextool-4.0.0 → flextool-4.0.2}/tests/test_complete_period_share_reduction.py +0 -0
  337. {flextool-4.0.0 → flextool-4.0.2}/tests/test_connection_node_warnings.py +0 -0
  338. {flextool-4.0.0 → flextool-4.0.2}/tests/test_console_run_tool.py +0 -0
  339. {flextool-4.0.0 → flextool-4.0.2}/tests/test_cost_aggregation_semantics.py +0 -0
  340. {flextool-4.0.0 → flextool-4.0.2}/tests/test_cost_breakdown_by_entity.py +0 -0
  341. {flextool-4.0.0 → flextool-4.0.2}/tests/test_csv_dump_roundtrip.py +0 -0
  342. {flextool-4.0.0 → flextool-4.0.2}/tests/test_dc_power_flow.py +0 -0
  343. {flextool-4.0.0 → flextool-4.0.2}/tests/test_dispatch_consumer_and_connection_signs.py +0 -0
  344. {flextool-4.0.0 → flextool-4.0.2}/tests/test_dispatch_node_debug_and_tree.py +0 -0
  345. {flextool-4.0.0 → flextool-4.0.2}/tests/test_dispatch_order_specials.py +0 -0
  346. {flextool-4.0.0 → flextool-4.0.2}/tests/test_dispatch_scenario_tag.py +0 -0
  347. {flextool-4.0.0 → flextool-4.0.2}/tests/test_ensure_settings_db.py +0 -0
  348. {flextool-4.0.0 → flextool-4.0.2}/tests/test_entity_unitsize_invariant.py +0 -0
  349. {flextool-4.0.0 → flextool-4.0.2}/tests/test_entity_universe_carrier.py +0 -0
  350. {flextool-4.0.0 → flextool-4.0.2}/tests/test_env_check.py +0 -0
  351. {flextool-4.0.0 → flextool-4.0.2}/tests/test_export_to_tabular.py +0 -0
  352. {flextool-4.0.0 → flextool-4.0.2}/tests/test_extend_tests_fixture.py +0 -0
  353. {flextool-4.0.0 → flextool-4.0.2}/tests/test_flowgroup_indicators.py +0 -0
  354. {flextool-4.0.0 → flextool-4.0.2}/tests/test_force_include.py +0 -0
  355. {flextool-4.0.0 → flextool-4.0.2}/tests/test_group_output_warnings.py +0 -0
  356. {flextool-4.0.0 → flextool-4.0.2}/tests/test_handoff_writers.py +0 -0
  357. {flextool-4.0.0 → flextool-4.0.2}/tests/test_input_entity_colors.py +0 -0
  358. {flextool-4.0.0 → flextool-4.0.2}/tests/test_lh2_three_region.py +0 -0
  359. {flextool-4.0.0 → flextool-4.0.2}/tests/test_min_load_rolling.py +0 -0
  360. {flextool-4.0.0 → flextool-4.0.2}/tests/test_non_anticipativity.py +0 -0
  361. {flextool-4.0.0 → flextool-4.0.2}/tests/test_old_flextool_importer_schema_drift.py +0 -0
  362. {flextool-4.0.0 → flextool-4.0.2}/tests/test_open_results_db.py +0 -0
  363. {flextool-4.0.0 → flextool-4.0.2}/tests/test_output_column_metadata.py +0 -0
  364. {flextool-4.0.0 → flextool-4.0.2}/tests/test_output_metadata_renderers.py +0 -0
  365. {flextool-4.0.0 → flextool-4.0.2}/tests/test_parameter_group_coverage.py +0 -0
  366. {flextool-4.0.0 → flextool-4.0.2}/tests/test_plan_union.py +0 -0
  367. {flextool-4.0.0 → flextool-4.0.2}/tests/test_plot_draw_order.py +0 -0
  368. {flextool-4.0.0 → flextool-4.0.2}/tests/test_plot_pipeline.py +0 -0
  369. {flextool-4.0.0 → flextool-4.0.2}/tests/test_plot_plan_chunk_reconstruction.py +0 -0
  370. {flextool-4.0.0 → flextool-4.0.2}/tests/test_plot_plan_time_labels_roundtrip.py +0 -0
  371. {flextool-4.0.0 → flextool-4.0.2}/tests/test_plot_settings_seed.py +0 -0
  372. {flextool-4.0.0 → flextool-4.0.2}/tests/test_precision.py +0 -0
  373. {flextool-4.0.0 → flextool-4.0.2}/tests/test_read_highs_solution.py +0 -0
  374. {flextool-4.0.0 → flextool-4.0.2}/tests/test_regional_filter.py +0 -0
  375. {flextool-4.0.0 → flextool-4.0.2}/tests/test_representative_periods.py +0 -0
  376. {flextool-4.0.0 → flextool-4.0.2}/tests/test_rp_alternative_name.py +0 -0
  377. {flextool-4.0.0 → flextool-4.0.2}/tests/test_rp_force_include_wiring.py +0 -0
  378. {flextool-4.0.0 → flextool-4.0.2}/tests/test_rp_solves_filter.py +0 -0
  379. {flextool-4.0.0 → flextool-4.0.2}/tests/test_scenario_colors.py +0 -0
  380. {flextool-4.0.0 → flextool-4.0.2}/tests/test_scenario_stack.py +0 -0
  381. {flextool-4.0.0 → flextool-4.0.2}/tests/test_scenarios.py +0 -0
  382. {flextool-4.0.0 → flextool-4.0.2}/tests/test_self_describing_reader.py +0 -0
  383. {flextool-4.0.0 → flextool-4.0.2}/tests/test_shared_axis_manifest.py +0 -0
  384. {flextool-4.0.0 → flextool-4.0.2}/tests/test_simple_bar_entity_color.py +0 -0
  385. {flextool-4.0.0 → flextool-4.0.2}/tests/test_solve_config.py +0 -0
  386. {flextool-4.0.0 → flextool-4.0.2}/tests/test_solve_reader.py +0 -0
  387. {flextool-4.0.0 → flextool-4.0.2}/tests/test_synthesize_invest_dual.py +0 -0
  388. {flextool-4.0.0 → flextool-4.0.2}/tests/test_timings_csv.py +0 -0
  389. {flextool-4.0.0 → flextool-4.0.2}/tests/test_unidirectional_connection.py +0 -0
  390. {flextool-4.0.0 → flextool-4.0.2}/tests/test_unit_online_dt_columns.py +0 -0
  391. {flextool-4.0.0 → flextool-4.0.2}/tests/test_v52_migration.py +0 -0
  392. {flextool-4.0.0 → flextool-4.0.2}/tests/test_v63_migration.py +0 -0
  393. {flextool-4.0.0 → flextool-4.0.2}/tests/test_v64_migration.py +0 -0
  394. {flextool-4.0.0 → flextool-4.0.2}/tests/test_v65_migration.py +0 -0
  395. {flextool-4.0.0 → flextool-4.0.2}/tests/test_v66_migration.py +0 -0
  396. {flextool-4.0.0 → flextool-4.0.2}/tests/test_v67_migration.py +0 -0
  397. {flextool-4.0.0 → flextool-4.0.2}/tests/test_v68_migration.py +0 -0
  398. {flextool-4.0.0 → flextool-4.0.2}/tests/test_v69_migration.py +0 -0
  399. {flextool-4.0.0 → flextool-4.0.2}/tests/test_workdir_empty_default.py +0 -0
  400. {flextool-4.0.0 → flextool-4.0.2}/tests/test_xlsx_workflow.py +0 -0
  401. {flextool-4.0.0 → flextool-4.0.2}/tests/test_years_represented.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flextool
3
- Version: 4.0.0
3
+ Version: 4.0.2
4
4
  Summary: IRENA FlexTool is an energy and power systems model for understanding the role of variable power generation in future energy systems.
5
5
  Author: IRENA FlexTool contributors
6
6
  License: © International Renewable Energy Agency 2018-2022
@@ -155,8 +155,8 @@ terminal so the new PATH takes effect.
155
155
 
156
156
  Install FlexTool into a virtual environment to keep its packages separate from
157
157
  other Python applications. If you want to install into the base Python (perhaps
158
- because you do not otherwise use Python), just run the last command from below,
159
- `pip install flextool`.
158
+ because you do not otherwise use Python), just run the last `pip install`
159
+ command from below.
160
160
 
161
161
  ```
162
162
  python -m venv .venv # Windows: py -m venv .venv
@@ -165,9 +165,14 @@ python -m venv .venv # Windows: py -m venv .venv
165
165
  # Windows CMD: .\.venv\Scripts\activate.bat
166
166
  # Linux / macOS: . .venv/bin/activate
167
167
  python -m pip install --upgrade pip
168
- pip install flextool
168
+ pip install "flextool[toolbox,viewer]"
169
169
  ```
170
170
 
171
+ The `[toolbox,viewer]` extras add the Spine Toolbox database editor (for editing
172
+ and viewing input and result databases) and the network-graph result view. To
173
+ install without Spine Toolbox (edit/view data in a spreadsheet only), you can
174
+ use plain `pip install flextool`.
175
+
171
176
  Your prompt should now show `(.venv)`. Verify with `python --version` — it
172
177
  should report 3.11 or newer.
173
178
 
@@ -87,8 +87,8 @@ terminal so the new PATH takes effect.
87
87
 
88
88
  Install FlexTool into a virtual environment to keep its packages separate from
89
89
  other Python applications. If you want to install into the base Python (perhaps
90
- because you do not otherwise use Python), just run the last command from below,
91
- `pip install flextool`.
90
+ because you do not otherwise use Python), just run the last `pip install`
91
+ command from below.
92
92
 
93
93
  ```
94
94
  python -m venv .venv # Windows: py -m venv .venv
@@ -97,9 +97,14 @@ python -m venv .venv # Windows: py -m venv .venv
97
97
  # Windows CMD: .\.venv\Scripts\activate.bat
98
98
  # Linux / macOS: . .venv/bin/activate
99
99
  python -m pip install --upgrade pip
100
- pip install flextool
100
+ pip install "flextool[toolbox,viewer]"
101
101
  ```
102
102
 
103
+ The `[toolbox,viewer]` extras add the Spine Toolbox database editor (for editing
104
+ and viewing input and result databases) and the network-graph result view. To
105
+ install without Spine Toolbox (edit/view data in a spreadsheet only), you can
106
+ use plain `pip install flextool`.
107
+
103
108
  Your prompt should now show `(.venv)`. Verify with `python --version` — it
104
109
  should report 3.11 or newer.
105
110
 
@@ -34,6 +34,7 @@ class UpdateDialog(tk.Toplevel):
34
34
  install_description: str,
35
35
  is_git: bool,
36
36
  default_toolbox: bool,
37
+ toolbox_installed: bool,
37
38
  check_on_startup: bool,
38
39
  update_available: bool | None,
39
40
  check_fn: Callable[[], bool],
@@ -45,14 +46,17 @@ class UpdateDialog(tk.Toplevel):
45
46
  self.resizable(False, False)
46
47
 
47
48
  self.proceed: bool = False
48
- self.include_toolbox: bool = default_toolbox
49
+ # For an Update: keep Spine Toolbox current if it is already installed.
50
+ self.include_toolbox: bool = toolbox_installed
51
+ # Set True by the dedicated "Install Spine Toolbox" button.
52
+ self.install_toolbox: bool = False
53
+ self._toolbox_installed: bool = toolbox_installed
49
54
  self.check_on_startup: bool = check_on_startup
50
55
  self.update_available: bool | None = update_available
51
56
  self._initial_check_on_startup: bool = check_on_startup
52
57
  self._check_fn = check_fn
53
58
  self._post_to_main = post_to_main
54
59
 
55
- self._toolbox_var = tk.BooleanVar(value=default_toolbox)
56
60
  self._check_startup_var = tk.BooleanVar(value=check_on_startup)
57
61
  self._status_var = tk.StringVar()
58
62
 
@@ -79,20 +83,31 @@ class UpdateDialog(tk.Toplevel):
79
83
  body, textvariable=self._status_var, wraplength=440, justify="left",
80
84
  ).pack(anchor="w", pady=(0, 8))
81
85
 
82
- ttk.Checkbutton(
83
- body, text="Install Spine Toolbox", variable=self._toolbox_var,
84
- ).pack(anchor="w")
85
- ttk.Label(
86
- body,
87
- text=(
88
- "Spine Toolbox is a large optional dependency. It is required "
89
- "to open .sqlite input sources in the Spine DB Editor. Leave "
90
- "unchecked if you do not need it."
91
- ),
92
- wraplength=440,
93
- justify="left",
94
- foreground="#888888",
95
- ).pack(anchor="w", padx=(24, 0), pady=(0, 8))
86
+ if not toolbox_installed:
87
+ ttk.Label(
88
+ body,
89
+ text=(
90
+ "Spine Toolbox is not installed. It is a large optional "
91
+ "dependency required to open .sqlite input sources in the "
92
+ "Spine DB Editor."
93
+ ),
94
+ wraplength=440,
95
+ justify="left",
96
+ foreground="#888888",
97
+ ).pack(anchor="w", pady=(0, 4))
98
+ ttk.Button(
99
+ body,
100
+ text="Install Spine Toolbox",
101
+ command=self._on_install_toolbox,
102
+ ).pack(anchor="w", pady=(0, 8))
103
+ else:
104
+ ttk.Label(
105
+ body,
106
+ text="Spine Toolbox is installed.",
107
+ wraplength=440,
108
+ justify="left",
109
+ foreground="#888888",
110
+ ).pack(anchor="w", pady=(0, 8))
96
111
 
97
112
  ttk.Label(
98
113
  body,
@@ -186,9 +201,18 @@ class UpdateDialog(tk.Toplevel):
186
201
 
187
202
  # ── Button handlers ─────────────────────────────────────────────
188
203
 
204
+ def _on_install_toolbox(self) -> None:
205
+ """Install only the Spine Toolbox extra, regardless of FlexTool version."""
206
+ self.proceed = True
207
+ self.install_toolbox = True
208
+ self.include_toolbox = True
209
+ self.check_on_startup = bool(self._check_startup_var.get())
210
+ self._close()
211
+
189
212
  def _on_update(self) -> None:
190
213
  self.proceed = True
191
- self.include_toolbox = bool(self._toolbox_var.get())
214
+ # include_toolbox already reflects whether Toolbox is installed (kept
215
+ # current during the update); install_toolbox stays False.
192
216
  self.check_on_startup = bool(self._check_startup_var.get())
193
217
  self._close()
194
218
 
@@ -3126,14 +3126,15 @@ class MainWindow(tk.Tk):
3126
3126
  # spine-db-editor not found: point at 'Update FlexTool' and
3127
3127
  # offer the system default .sqlite app as a fallback.
3128
3128
  # askyesnocancel: Yes=Update, No=default app, Cancel=nothing.
3129
+ from flextool.update_flextool import install_info
3129
3130
  choice = messagebox.askyesnocancel(
3130
3131
  "Spine DB Editor not available",
3131
3132
  "The 'spine-db-editor' command was not found, so .sqlite "
3132
3133
  "input sources cannot be opened in the Spine DB Editor.\n\n"
3133
3134
  "It is part of Spine Toolbox. You can install it via "
3134
3135
  "'Update FlexTool' (tick 'Install Spine Toolbox'), or "
3135
- 'manually from the flextool directory:\n\n'
3136
- ' pip install -e ".[toolbox]"\n\n'
3136
+ "manually:\n\n"
3137
+ f" {install_info.manual_toolbox_command()}\n\n"
3137
3138
  "Open 'Update FlexTool' now?\n\n"
3138
3139
  "Choose 'No' to open the file with your system's default "
3139
3140
  "application for .sqlite files instead.",
@@ -3175,6 +3176,7 @@ class MainWindow(tk.Tk):
3175
3176
  install_description=install_info.describe_install(),
3176
3177
  is_git=install_info.is_git_install(),
3177
3178
  default_toolbox=default_toolbox,
3179
+ toolbox_installed=install_info.toolbox_installed(),
3178
3180
  check_on_startup=self.global_settings.check_updates_on_startup,
3179
3181
  update_available=self._update_available,
3180
3182
  check_fn=install_info.update_available,
@@ -3194,16 +3196,25 @@ class MainWindow(tk.Tk):
3194
3196
  if not dlg.proceed:
3195
3197
  return
3196
3198
 
3197
- steps, cwd = install_info.upgrade_steps(dlg.include_toolbox)
3199
+ if dlg.install_toolbox:
3200
+ steps, cwd = install_info.install_toolbox_steps()
3201
+ description = "Install Spine Toolbox"
3202
+ intro = "Installing Spine Toolbox…\n"
3203
+ else:
3204
+ steps, cwd = install_info.upgrade_steps(dlg.include_toolbox)
3205
+ description = "Update FlexTool"
3206
+ intro = (
3207
+ "Updating FlexTool"
3208
+ + (" with Spine Toolbox" if dlg.include_toolbox else "")
3209
+ + "…\n"
3210
+ )
3198
3211
  self._run_cli_job(
3199
3212
  steps,
3200
3213
  job_type=JobType.UPDATE,
3201
- description="Update FlexTool",
3214
+ description=description,
3202
3215
  action_key="update_flextool",
3203
3216
  cwd=cwd,
3204
- intro="Updating FlexTool"
3205
- + (" with Spine Toolbox" if dlg.include_toolbox else "")
3206
- + "…\n",
3217
+ intro=intro,
3207
3218
  on_finish=self._update_finished,
3208
3219
  )
3209
3220
 
@@ -3284,6 +3295,7 @@ class MainWindow(tk.Tk):
3284
3295
  if self.execution_window is not None:
3285
3296
  self.execution_window.select_job(job.job_id)
3286
3297
 
3298
+ from flextool.update_flextool import install_info
3287
3299
  if messagebox.askyesno(
3288
3300
  "Could not open database",
3289
3301
  "The Spine DB Editor failed to start, so the database could not "
@@ -3292,7 +3304,7 @@ class MainWindow(tk.Tk):
3292
3304
  "The full error is shown in the Execution window. You can "
3293
3305
  "(re)install Spine Toolbox via 'Update FlexTool' (tick 'Install "
3294
3306
  "Spine Toolbox'), or manually:\n\n"
3295
- ' pip install -e ".[toolbox]"\n\n'
3307
+ f" {install_info.manual_toolbox_command()}\n\n"
3296
3308
  "Open 'Update FlexTool' now?",
3297
3309
  parent=self,
3298
3310
  ):
@@ -4,7 +4,6 @@ from __future__ import annotations
4
4
 
5
5
  import logging
6
6
  import os
7
- import shutil
8
7
  import subprocess
9
8
  import sys
10
9
  from pathlib import Path
@@ -95,24 +94,28 @@ def open_folder(dirpath: Path) -> None:
95
94
 
96
95
 
97
96
  def open_spine_db_editor(db_url: str) -> subprocess.Popen | None:
98
- """Launch spine-db-editor as a subprocess.
99
-
100
- Command: ``spine-db-editor <db_url>``
97
+ """Launch the Spine DB editor on *db_url* as a subprocess, using the current
98
+ environment's Spine Toolbox (``python -m spinetoolbox.spine_db_editor.main``,
99
+ matching the CLI launcher) rather than a ``spine-db-editor`` found anywhere
100
+ on PATH.
101
101
 
102
102
  Returns:
103
- The :class:`subprocess.Popen` object, or ``None`` if
104
- ``spine-db-editor`` is not found on the system PATH.
103
+ The :class:`subprocess.Popen` object, or ``None`` if Spine Toolbox is
104
+ not installed in this environment.
105
105
  """
106
- exe = shutil.which("spine-db-editor")
107
- if exe is None:
108
- logger.warning("spine-db-editor not found on PATH")
106
+ import importlib.util
107
+
108
+ if importlib.util.find_spec("spinetoolbox") is None:
109
+ logger.warning("spinetoolbox is not installed in this environment")
109
110
  return None
110
111
 
111
112
  try:
112
- proc = subprocess.Popen([exe, db_url])
113
+ proc = subprocess.Popen(
114
+ [sys.executable, "-m", "spinetoolbox.spine_db_editor.main", db_url]
115
+ )
113
116
  return proc
114
117
  except OSError:
115
- logger.warning("Failed to launch spine-db-editor", exc_info=True)
118
+ logger.warning("Failed to launch the Spine DB editor", exc_info=True)
116
119
  return None
117
120
 
118
121
 
@@ -18,7 +18,6 @@ from __future__ import annotations
18
18
  import importlib.metadata as _im
19
19
  import json
20
20
  import logging
21
- import shutil
22
21
  import subprocess
23
22
  import sys
24
23
  from pathlib import Path
@@ -58,12 +57,15 @@ def flextool_version() -> str:
58
57
 
59
58
 
60
59
  def toolbox_installed() -> bool:
61
- """Whether Spine Toolbox (and thus the Spine DB Editor) is installed."""
60
+ """Whether Spine Toolbox is installed *in the current environment* (the venv
61
+ running FlexTool). Deliberately does NOT fall back to a PATH lookup — a
62
+ ``spine-db-editor`` from a different environment would otherwise read as
63
+ installed even though it isn't importable here."""
62
64
  try:
63
65
  _im.distribution("spinetoolbox")
64
66
  return True
65
67
  except _im.PackageNotFoundError:
66
- return shutil.which("spine-db-editor") is not None
68
+ return False
67
69
 
68
70
 
69
71
  def describe_install() -> str:
@@ -74,6 +76,27 @@ def describe_install() -> str:
74
76
  return f"PyPI install (version {flextool_version()})"
75
77
 
76
78
 
79
+ def manual_toolbox_command() -> str:
80
+ """Shell command a user can run by hand to add Spine Toolbox, matched to the
81
+ current install type — editable ``-e .[toolbox]`` in a git checkout (running
82
+ the PyPI form there would clobber the editable install), otherwise the PyPI
83
+ ``flextool[toolbox]`` form."""
84
+ if git_checkout_root() is not None:
85
+ return 'pip install -e ".[toolbox]"'
86
+ return 'pip install "flextool[toolbox]"'
87
+
88
+
89
+ def install_toolbox_steps() -> tuple[list[list[str]], Path | None]:
90
+ """Command(s) to install *just* the Spine Toolbox extra, without updating
91
+ FlexTool itself. Editable ``-e .[toolbox]`` (run in the repo root) for a git
92
+ checkout, otherwise the PyPI ``flextool[toolbox]`` form."""
93
+ py = sys.executable
94
+ root = git_checkout_root()
95
+ if root is not None:
96
+ return [[py, "-m", "pip", "install", "-e", ".[toolbox]"]], root
97
+ return [[py, "-m", "pip", "install", "flextool[toolbox]"]], None
98
+
99
+
77
100
  def upgrade_steps(include_toolbox: bool) -> tuple[list[list[str]], Path | None]:
78
101
  """Build the command(s) that upgrade FlexTool in place.
79
102
 
@@ -269,7 +269,7 @@ def ensure_runtime_files(verbose: bool = False) -> None:
269
269
 
270
270
  # 5. results.sqlite (and its template), both create-if-missing.
271
271
  try:
272
- result_template_path = str(package_data_path("schemas/pre_v26/flextool_template_results_master.json"))
272
+ result_template_path = str(package_data_path("schemas/spinedb_results_schema.json"))
273
273
  if not os.path.exists("templates/results_template.sqlite"):
274
274
  initialize_result_database("templates/results_template.sqlite", result_template_path)
275
275
  if not os.path.exists("results.sqlite") and os.path.exists("templates/results_template.sqlite"):
@@ -379,7 +379,7 @@ def update_flextool(skip_git):
379
379
  # Refresh the results template (unconditional) and ensure results.sqlite
380
380
  # exists (ensure_runtime_files seeds it; this is a belt-and-braces copy
381
381
  # for the case it was removed since).
382
- result_template_path = str(package_data_path("schemas/pre_v26/flextool_template_results_master.json"))
382
+ result_template_path = str(package_data_path("schemas/spinedb_results_schema.json"))
383
383
  if os.path.exists('templates/results_template.sqlite'):
384
384
  os.remove('templates/results_template.sqlite')
385
385
  initialize_result_database('templates/results_template.sqlite', result_template_path)
@@ -392,8 +392,7 @@ def update_flextool(skip_git):
392
392
  template = json.load(json_file)
393
393
  with DatabaseMapping('sqlite:///' + 'results.sqlite', create = False, upgrade = True) as db:
394
394
  #these update the old descriptions, but wont remove them or change names (the new name is created, but old stays)
395
- (num,log) = import_data(db, object_parameters = template["object_parameters"])
396
- (num,log) = import_data(db, relationship_parameters = template["relationship_parameters"])
395
+ (num,log) = import_data(db, parameter_definitions = template["parameter_definitions"])
397
396
  try:
398
397
  db.commit_session("Updated relationship_parameters, object parameters to the Results.sqlite")
399
398
  except NothingToCommit:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flextool
3
- Version: 4.0.0
3
+ Version: 4.0.2
4
4
  Summary: IRENA FlexTool is an energy and power systems model for understanding the role of variable power generation in future energy systems.
5
5
  Author: IRENA FlexTool contributors
6
6
  License: © International Renewable Energy Agency 2018-2022
@@ -155,8 +155,8 @@ terminal so the new PATH takes effect.
155
155
 
156
156
  Install FlexTool into a virtual environment to keep its packages separate from
157
157
  other Python applications. If you want to install into the base Python (perhaps
158
- because you do not otherwise use Python), just run the last command from below,
159
- `pip install flextool`.
158
+ because you do not otherwise use Python), just run the last `pip install`
159
+ command from below.
160
160
 
161
161
  ```
162
162
  python -m venv .venv # Windows: py -m venv .venv
@@ -165,9 +165,14 @@ python -m venv .venv # Windows: py -m venv .venv
165
165
  # Windows CMD: .\.venv\Scripts\activate.bat
166
166
  # Linux / macOS: . .venv/bin/activate
167
167
  python -m pip install --upgrade pip
168
- pip install flextool
168
+ pip install "flextool[toolbox,viewer]"
169
169
  ```
170
170
 
171
+ The `[toolbox,viewer]` extras add the Spine Toolbox database editor (for editing
172
+ and viewing input and result databases) and the network-graph result view. To
173
+ install without Spine Toolbox (edit/view data in a spreadsheet only), you can
174
+ use plain `pip install flextool`.
175
+
171
176
  Your prompt should now show `(.venv)`. Verify with `python --version` — it
172
177
  should report 3.11 or newer.
173
178
 
@@ -3,7 +3,7 @@ build-backend = "setuptools.build_meta"
3
3
 
4
4
  [project]
5
5
  name = "flextool"
6
- version = "4.0.0"
6
+ version = "4.0.2"
7
7
  description = "IRENA FlexTool is an energy and power systems model for understanding the role of variable power generation in future energy systems."
8
8
  readme = "README.md"
9
9
  license = { file = "LICENSE.txt" }
File without changes
File without changes