Version 1.5.2 ============= Improvements ------------ - Added lazy-loading support for APSIM runtime modules to prevent early CLR initialization. - Consolidates all apsimNGpy public API into a single access point to enable easier discovery and support lazy importing. Bug Fixes --------- - Fixed issues with APSIM binary path configuration when importing ``apsimNGpy``. - Improved compatibility with Ruff static analysis for ``TYPE_CHECKING`` imports. - fixed f strings errors in early versions of python - Fixed the add_crop_replacements method and removed the deprecated _crop argument. Future releases will allow this method to be called without arguments, automatically detecting available plant modules and adding them to the replacements folder. Tests ----- - Added tests verifying lazy attribute resolution and caching behavior. - Added tests ensuring unittest modules are correctly exposed. Version 1.5 ----------- Improvements ~~~~~~~~~~~~ - Moved ``pythonet_config`` from the ``core`` module to the ``starter`` module to improve module organization and streamline initialization flow. - Verified compatibility with the latest APSIM binary (build 7990). - Added ``__len__`` to ``ApsimModel``: - ``len(model)`` now returns the number of loaded simulations. - Internally delegates to ``len(self.simulations)``. - Added ``__getitem__`` to ``ApsimModel``: - ``model[index]`` returns the simulation at the specified index. - ``model["SimulationName"]`` returns the simulation matching the given name. APSIM Runtime Loading Improvements =================================== The ``apsimNGpy.bin_context`` class now lazily loads all apsimNGpy modules and classes that depend on the .NET runtime and the APSIM binary path. This ensures that APSIM-specific objects are initialized and atatched to a specific APSIM version defined by the binary path, improving version control. startup performance and runtime safety. In addition, a new ``Apsim`` class has been introduced at the top-level ``apsimNGpy`` module to enable dynamic management of different APSIM versions across scripts or projects. This allows users to explicitly control which APSIM binary is loaded at runtime. Users may initialize the ``Apsim`` class in one of two modes: - **Auto mode** — No binary path is provided; the system resolves the APSIM installation automatically from the config.in path located in the user directory or from from global env. - **Explicit mode** — A binary path is supplied to load APSIM-dependent modules from a specific installation. This design provides greater flexibility, version isolation, and improved runtime control when working with multiple APSIM installations. Examples -------- Auto mode (automatic binary resolution): .. code-block:: python from apsimNGpy import Apsim apsim = Apsim() Models = apsim.CLR.Models Explicit mode (manual binary selection): .. code-block:: python from apsimNGpy import Apsim apsim = Apsim(bin_path="path/to/apsim/bin") Models = apsim.CLR.Models Using ``with context key word`` for scoped runtime control: .. code-block:: python from apsimNGpy import Apsim with Apsim("path/to/apsim/bin") as apsim: with apsim.ApsimModel("Maize") as model: model.run() print(model.summarize_numeric()) use env path with a specified binary path key .. code-block:: python from apsimNGpy import Apsim with Apsim(dotenv_path = "path/to/apsim/bin.env",bin_key = '9780') as apsim: with apsim.ApsimModel("Maize") as model: model.run() print(model.summarize_numeric()) Deprecations ~~~~~~~~~~~~ The following methods are deprecated and will be removed in **v1.6.0**: - ``evaluate_simulated_output()`` Use ``evaluate()`` instead. - ``preview_simulation()`` Use ``open_in_gui()`` instead. - ``inspect_file()`` Use ``tree()`` instead.