# Automation Professionals' Integration Toolkit Module

**URL:** <https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934>\
**Category:** 3rd Party Modules\
**Tags:** perspective, ignition81, vision, scripting, ignition83\
**Created:** [June 13, 2023, 12:42am UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934 "2023-06-13T00:42:35Z")\
**Posts on this page:** 1\
**Showing post:** 122

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 14, 2024, 8:54pm UTC](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934/122 "2024-05-14T20:54:44Z")

</div>

Automation Professionals is pleased to announce a **beta** release of this Integration Toolkit:

For Ignition v8.1+, as usual: ~~v2.0.16.241352008~~

This beta introduces a number of new **scripting** features:

- Inspired by @Mathias_Melling above, the souped-up dictionary functionality of the `BindableVarMap` data type has been factored out, as [system.util.VarMap](https://www.automation-pros.com/toolkit/doc/scripting.html#varmap). Serializable to the extent its contents are serializable, just like dictionaries, and safe for use with persistence. 😁

- The `PythonAsJavaException` wrapper from my `later.py` script has been re-implemented in java as `PyAsJavaException`, exposed via the helper function [system.reflect.asThrowable()](https://www.automation-pros.com/toolkit/doc/reflection.html#asthrowable). This implementation extracts the package to include with the function or class+method on each line of the resulting traceback. And it is serializable, suitable for inclusion in gateway network or designer/client messaging.

- As a side-effect of the work on `PyAsJavaException`, [system.reflect.getModulePath()](https://www.automation-pros.com/toolkit/doc/reflection.html#getmodulepath) is available for use within project library scripts. Particularly useful when naming logger instances.

And **finally** , something that has been percolating for a while now:

- A solution to testing gateway code in the designer script console, in the form of a **decorator** for project library functions: [@system.util.runInGateway](https://www.automation-pros.com/toolkit/doc/utility.html#runingateway). Place this decorator in front of your gateway-scope-only library function and calls from Designer or Vision Client scopes will be automatically turned into an RPC call to the gateway instance of the code, and that instance's return value passed back to the calling scope.

The above can be approximated with message handlers on a per-project basis, but that approximation suffers from significant extra opportunities for errors, and lack of parallelism at scale.

Try something like this code snippet, perhaps in `toolkit`:

```python
logger = system.util.getLogger(system.util.getProjectName() + '.' + system.reflect.getModulePath())

@system.util.runInGateway
def gwLoggerTest(someMessage):
	logger.info(someMessage)
	return "Logged: " + someMessage

```

(Remember to save your project.) Then try this in the designer script console:

```python
print toolkit.gwLoggerTest("Hold my beer!")

```

Then go look at your gateway logs. 😁

{ It is a beta because travel and client crises have limited testing time... }

---

_[View the full topic](https://forum.inductiveautomation.com/t/automation-professionals-integration-toolkit-module/74934)._
