salesforce-functions


Namesalesforce-functions JSON
Version 0.6.0 PyPI version JSON
download
home_pageNone
SummaryPython support for Salesforce Functions
upload_time2023-07-03 09:57:16
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseNone
keywords functions salesforce
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # sf-functions-python

[![PyPI](https://img.shields.io/pypi/v/salesforce-functions.svg?label=PyPI)](https://pypi.org/project/salesforce-functions/)
[![Supported Python versions](https://img.shields.io/pypi/pyversions/salesforce-functions.svg?label=Python)](https://pypi.org/project/salesforce-functions/)
[![CI](https://github.com/heroku/sf-functions-python/actions/workflows/ci.yml/badge.svg)](https://github.com/heroku/sf-functions-python/actions/workflows/ci.yml)

Python support for [Salesforce Functions](https://developer.salesforce.com/docs/platform/functions/overview).

> Note: This feature is a Beta Service. Customer may opt to try such Beta Service in its sole discretion. Any use of the Beta Service is subject to the applicable Beta Services Terms provided at [Agreements and Terms](https://www.salesforce.com/company/legal/agreements/). 

---

# Getting Started with Python for Functions

## Prerequisites

> Install commands assume an Apple macOS system with Homebrew available.  If you’re on another OS you’ll have to click through the links to get alternative install instructions.

### [Install Python 3](https://www.python.org/downloads/)

```sh
brew install python3
```

The installed Python version must be at least `3.10` or higher.

Check your version of python with `python3 --version`.

> On some machines Python and Pip commands must be run using python3 or pip3, which point to the Homebrew-managed Python interpreter. Using python or pip instead often points at the system installed Python interpreter.  

### [Install Git](https://git-scm.com/downloads)

```sh
brew install git
```

The installed Git version should be at least `2.36.0` or higher.

Check your version of git with `git --version`.

### [Install / Update the Salesforce CLI](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli_rc.htm)

[Install the Salesforce CLI](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm) if you haven't already.

Update to the latest version of Salesforce CLI that contains
Python functions support:

```sh
sfdx update
```

The command `sfdx update` updates both the `sfdx` and `sf` commands.

Check your version of the Salesforce CLI with `sf --version`. The installed version of `sf` should be `1.59.0` or higher.

### [Create a Salesfoce DX Project](https://developer.salesforce.com/docs/platform/functions/guide/create-dx-project.html)

Create a DX project in the directory you want your Salesforce Functions project to be located. 

```sh
sf generate project --name PythonFunctionsBeta
```

Some of the following commands run from within the SFDX project directory. 

Navigate to your SFDX directory:

```sh
cd PythonFunctionsBeta
```


Add the `Functions` feature needed for connecting and deploying Functions in scratch orgs. Edit the `config/project-scratch-def.json` file to include the **`Functions`** feature.

For example:
```json
{
  "orgName": "SomeOrgName",
  "edition": "Developer",
  "features": ["EnableSetPasswordInApi", "Functions"],
  "settings": {
    "lightningExperienceSettings": {
      "enableS1DesktopEnabled": true
    },
    "mobileSettings": {
      "enableS1EncryptedStoragePref2": false
    }
  }
}
```
> Note: We recommend using a Dev Hub and scratch org for Salesforce Functions development. See [Connect and Prepare your Development Environment](https://developer.salesforce.com/docs/platform/functions/guide/connect-dev-org.html).

Your SFDX project needs to be a git repo to deploy any Salesforce Function because the deployment process 
uses git tracked changes to figure out what to deploy.  Run the following commands to setup git:

```sh
git init
```

Commit your changes locally for deployment. 
> It is not a requirement to push your code to GitHub or any other code hosting site but can be useful for [sharing and maintaining functions code](https://developer.salesforce.com/docs/platform/functions/guide/dev-alm-workflow.html?q=github#maintain-and-share-function-source-code). 

### Connect Your Org

Configure your Salesforce org to develop and invoke Salesforce Functions. Develop your functions in scratch 
orgs with Dev Hub or in sandbox orgs. Follow the steps on 
[Configure Your Org](https://developer.salesforce.com/docs/platform/functions/guide/configure_your_org.html) to ensure everything 
is setup.

Once your Org is configured, log in and set it as the default Dev Hub with the following command:

```sh
sf login org --alias PythonOrg --set-default-dev-hub --set-default
```

**PythonOrg** is the the default Dev Hub for subsequent commands.

Create a scratch org:

```sh
sfdx force:org:create \
  --definitionfile config/project-scratch-def.json \
  --setalias PythonScratch \
  --setdefaultusername
```

Now when you run a Function, it will connect to and use the **PythonScratch** org.

### Connect Your Compute Environment

Log in to Salesforce Functions with the same credentials you used to connect your Dev Hub org.

```sh
sf login functions
```

Create the compute environment and associate it with the **PythonScratch** org we created while
connecting your org.

```sh
sf env create compute \
  --connected-org PythonScratch \
  --alias PythonCompute
```

Future functions deployed to the **PythonCompute** environment are linked to 
your scratch org.

### Assign Permissions

The default Python project requires `read` access to the `Account` object in your scratch org. Create 
a file named `force-app/main/default/permissionsets/Functions.permissionset-meta.xml` in your SFDX project and add the following content:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
    <description>Permissions for Salesforce Functions to access Salesforce org data</description>
    <hasActivationRequired>true</hasActivationRequired>
    <label>Functions</label>
    <objectPermissions>
        <allowCreate>false</allowCreate>
        <allowDelete>false</allowDelete>
        <allowEdit>false</allowEdit>
        <allowRead>true</allowRead>
        <modifyAllRecords>false</modifyAllRecords>
        <object>Account</object>
        <viewAllRecords>false</viewAllRecords>
    </objectPermissions>
</PermissionSet>
```

Upload the permission set to your org.

```sh
sf deploy metadata --ignore-conflicts
```

Then assign the permissions to the `Functions` profile.

```sh
sfdx force:user:permset:assign -n Functions
```

## Create and Run a Python Function Locally

### Generate the Python Function

From the root directory of your SFDX project, run:

```sh
sf generate function \
  --language python \
  --function-name hellopython
```

Navigate to the `hellopython` folder.

```sh
cd functions/hellopython
```

### Create the Python [Virtual Environment](https://docs.python.org/3/library/venv.html#creating-virtual-environments) & Install Dependencies

Create a "Virtual Environment" (venv) before installing the dependencies required to run the Python function locally.
Install using packages without affecting your system Python installation by setting up your virtual environment.

Create the virtual environment.

```sh
python3 -m venv .venv
```

Activate the virtual environment.  

On a **macOS / Linux system**:

```sh
source .venv/bin/activate
```

On a **Microsoft Windows system**:
```sh
.\.venv\Scripts\activate
```

> See the [Python documentation](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) for help with setting up a virtual environment.

Finally, install the dependencies into the virtual environment.

```sh
pip3 install --upgrade -r requirements.txt
```

Using a virtual environment ensures your function has all required dependencies before you run it.  

> Note: Starting the Function locally without setting up your virtual environment results in an error.

### Run the Python Function Locally

Start the function running locally. 

```sh
sf run function start
```

Messages logged by the running function will appear on http://localhost:8080.

### Invoke the Running Python Function

After starting the function, open a new command line terminal and navigate to the `hellopython` directory.

Invoke the function by sending it a payload.

```sh
sf run function --function-url http://localhost:8080 --payload '{}'
```

## Deploy the Python Function

Change to the root directory of your SFDX project before committing changes and running your function. 

```sh
cd ../../
```

### Commit your changes to Git

All code changes made to a function need to be staged and committed before you can deploy.

Commit all changes to your project.

```sh
git add .
git commit -m "Trying out python functions"
```

Deploy your functions project.

```sh
sf deploy functions --connected-org PythonScratch
```

This deployment process may take several minutes.

> Note: If you receive a `Request failed with status code 404` error message, check the earlier `sf env create compute` step was performed.

### Invoke the Function from Apex

Use Apex to invoke the function deployed to our scratch org. Generate an Apex class with:

```sh
sfdx force:apex:class:create \
  --classname ApexTrigger \
  --outputdir force-app/main/default/classes
```

Have your apex code lookup the reference to our function using the `functions.Function.get` method, invoke the function with an empty json payload, and
print the response.

Open `force-app/main/default/classes/ApexTrigger.cls` and replace it's contents with:

```java
public with sharing class ApexTrigger {
    public static void runFunction() {
        System.debug('Running hellopython');
        functions.Function fn = functions.Function.get('PythonFunctionsBeta.hellopython');
        functions.FunctionInvocation invocation = fn.invoke('{}');
        System.debug('Response: ' + invocation.getResponse());
    }
}
```

Upload this Apex class to your scratch org.

```sh
sfdx force:source:push --targetusername PythonScratch
```

Open a developer console.

```sh
sfdx force:org:open -p /_ui/common/apex/debug/ApexCSIPage
```

Execute the function from the developer console.

On a **macOS / Linux system**:

```sh
echo "ApexTrigger.runFunction();" | sfdx force:apex:execute -f /dev/stdin
```

On a **Microsoft Windows system**:

```sh
echo "FunctionApex.test();" | sfdx force:apex:execute
```

The developer console shows a log entry in the bottom panel after the function executes, which you can double-click to open.
Toggle the Debug Only filter to reduce the log messages to just the ones from the `ApexTrigger` function.

You should see a view like the one below:

![Developer Console](./assets/developer-console.png)

---

> NOTE: You may encounter the following error

```
System.CalloutException: Error during Salesforce Functions Sync Invocation. Ensure that 
function 'PythonFunctionsBeta.hellopython' is deployed and its status is 
available ('OK', 'up'). If issue persists, contact Salesforce Support.
```

If you see this then there may not be a problem, the function just might not be available yet in the compute 
environment. Wait several minutes and then try the command above again.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "salesforce-functions",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "functions,salesforce",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/f6/74/92f8e3b6b76341f6b898207c4ec9d2b269340599b80f3da1f72fe4ec1279/salesforce_functions-0.6.0.tar.gz",
    "platform": null,
    "description": "# sf-functions-python\n\n[![PyPI](https://img.shields.io/pypi/v/salesforce-functions.svg?label=PyPI)](https://pypi.org/project/salesforce-functions/)\n[![Supported Python versions](https://img.shields.io/pypi/pyversions/salesforce-functions.svg?label=Python)](https://pypi.org/project/salesforce-functions/)\n[![CI](https://github.com/heroku/sf-functions-python/actions/workflows/ci.yml/badge.svg)](https://github.com/heroku/sf-functions-python/actions/workflows/ci.yml)\n\nPython support for [Salesforce Functions](https://developer.salesforce.com/docs/platform/functions/overview).\n\n> Note: This feature is a Beta Service. Customer may opt to try such Beta Service in its sole discretion. Any use of the Beta Service is subject to the applicable Beta Services Terms provided at [Agreements and Terms](https://www.salesforce.com/company/legal/agreements/). \n\n---\n\n# Getting Started with Python for Functions\n\n## Prerequisites\n\n> Install commands assume an Apple macOS system with Homebrew available.  If you\u2019re on another OS you\u2019ll have to click through the links to get alternative install instructions.\n\n### [Install Python 3](https://www.python.org/downloads/)\n\n```sh\nbrew install python3\n```\n\nThe installed Python version must be at least `3.10` or higher.\n\nCheck your version of python with `python3 --version`.\n\n> On some machines Python and Pip commands must be run using python3 or pip3, which point to the Homebrew-managed Python interpreter. Using python or pip instead often points at the system installed Python interpreter.  \n\n### [Install Git](https://git-scm.com/downloads)\n\n```sh\nbrew install git\n```\n\nThe installed Git version should be at least `2.36.0` or higher.\n\nCheck your version of git with `git --version`.\n\n### [Install / Update the Salesforce CLI](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli_rc.htm)\n\n[Install the Salesforce CLI](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm) if you haven't already.\n\nUpdate to the latest version of Salesforce CLI that contains\nPython functions support:\n\n```sh\nsfdx update\n```\n\nThe command `sfdx update` updates both the `sfdx` and `sf` commands.\n\nCheck your version of the Salesforce CLI with `sf --version`. The installed version of `sf` should be `1.59.0` or higher.\n\n### [Create a Salesfoce DX Project](https://developer.salesforce.com/docs/platform/functions/guide/create-dx-project.html)\n\nCreate a DX project in the directory you want your Salesforce Functions project to be located. \n\n```sh\nsf generate project --name PythonFunctionsBeta\n```\n\nSome of the following commands run from within the SFDX project directory. \n\nNavigate to your SFDX directory:\n\n```sh\ncd PythonFunctionsBeta\n```\n\n\nAdd the `Functions` feature needed for connecting and deploying Functions in scratch orgs. Edit the `config/project-scratch-def.json` file to include the **`Functions`** feature.\n\nFor example:\n```json\n{\n  \"orgName\": \"SomeOrgName\",\n  \"edition\": \"Developer\",\n  \"features\": [\"EnableSetPasswordInApi\", \"Functions\"],\n  \"settings\": {\n    \"lightningExperienceSettings\": {\n      \"enableS1DesktopEnabled\": true\n    },\n    \"mobileSettings\": {\n      \"enableS1EncryptedStoragePref2\": false\n    }\n  }\n}\n```\n> Note: We recommend using a Dev Hub and scratch org for Salesforce Functions development. See [Connect and Prepare your Development Environment](https://developer.salesforce.com/docs/platform/functions/guide/connect-dev-org.html).\n\nYour SFDX project needs to be a git repo to deploy any Salesforce Function because the deployment process \nuses git tracked changes to figure out what to deploy.  Run the following commands to setup git:\n\n```sh\ngit init\n```\n\nCommit your changes locally for deployment. \n> It is not a requirement to push your code to GitHub or any other code hosting site but can be useful for [sharing and maintaining functions code](https://developer.salesforce.com/docs/platform/functions/guide/dev-alm-workflow.html?q=github#maintain-and-share-function-source-code). \n\n### Connect Your Org\n\nConfigure your Salesforce org to develop and invoke Salesforce Functions. Develop your functions in scratch \norgs with Dev Hub or in sandbox orgs. Follow the steps on \n[Configure Your Org](https://developer.salesforce.com/docs/platform/functions/guide/configure_your_org.html) to ensure everything \nis setup.\n\nOnce your Org is configured, log in and set it as the default Dev Hub with the following command:\n\n```sh\nsf login org --alias PythonOrg --set-default-dev-hub --set-default\n```\n\n**PythonOrg** is the the default Dev Hub for subsequent commands.\n\nCreate a scratch org:\n\n```sh\nsfdx force:org:create \\\n  --definitionfile config/project-scratch-def.json \\\n  --setalias PythonScratch \\\n  --setdefaultusername\n```\n\nNow when you run a Function, it will connect to and use the **PythonScratch** org.\n\n### Connect Your Compute Environment\n\nLog in to Salesforce Functions with the same credentials you used to connect your Dev Hub org.\n\n```sh\nsf login functions\n```\n\nCreate the compute environment and associate it with the **PythonScratch** org we created while\nconnecting your org.\n\n```sh\nsf env create compute \\\n  --connected-org PythonScratch \\\n  --alias PythonCompute\n```\n\nFuture functions deployed to the **PythonCompute** environment are linked to \nyour scratch org.\n\n### Assign Permissions\n\nThe default Python project requires `read` access to the `Account` object in your scratch org. Create \na file named `force-app/main/default/permissionsets/Functions.permissionset-meta.xml` in your SFDX project and add the following content:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<PermissionSet xmlns=\"http://soap.sforce.com/2006/04/metadata\">\n    <description>Permissions for Salesforce Functions to access Salesforce org data</description>\n    <hasActivationRequired>true</hasActivationRequired>\n    <label>Functions</label>\n    <objectPermissions>\n        <allowCreate>false</allowCreate>\n        <allowDelete>false</allowDelete>\n        <allowEdit>false</allowEdit>\n        <allowRead>true</allowRead>\n        <modifyAllRecords>false</modifyAllRecords>\n        <object>Account</object>\n        <viewAllRecords>false</viewAllRecords>\n    </objectPermissions>\n</PermissionSet>\n```\n\nUpload the permission set to your org.\n\n```sh\nsf deploy metadata --ignore-conflicts\n```\n\nThen assign the permissions to the `Functions` profile.\n\n```sh\nsfdx force:user:permset:assign -n Functions\n```\n\n## Create and Run a Python Function Locally\n\n### Generate the Python Function\n\nFrom the root directory of your SFDX project, run:\n\n```sh\nsf generate function \\\n  --language python \\\n  --function-name hellopython\n```\n\nNavigate to the `hellopython` folder.\n\n```sh\ncd functions/hellopython\n```\n\n### Create the Python [Virtual Environment](https://docs.python.org/3/library/venv.html#creating-virtual-environments) & Install Dependencies\n\nCreate a \"Virtual Environment\" (venv) before installing the dependencies required to run the Python function locally.\nInstall using packages without affecting your system Python installation by setting up your virtual environment.\n\nCreate the virtual environment.\n\n```sh\npython3 -m venv .venv\n```\n\nActivate the virtual environment.  \n\nOn a **macOS / Linux system**:\n\n```sh\nsource .venv/bin/activate\n```\n\nOn a **Microsoft Windows system**:\n```sh\n.\\.venv\\Scripts\\activate\n```\n\n> See the [Python documentation](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) for help with setting up a virtual environment.\n\nFinally, install the dependencies into the virtual environment.\n\n```sh\npip3 install --upgrade -r requirements.txt\n```\n\nUsing a virtual environment ensures your function has all required dependencies before you run it.  \n\n> Note: Starting the Function locally without setting up your virtual environment results in an error.\n\n### Run the Python Function Locally\n\nStart the function running locally. \n\n```sh\nsf run function start\n```\n\nMessages logged by the running function will appear on http://localhost:8080.\n\n### Invoke the Running Python Function\n\nAfter starting the function, open a new command line terminal and navigate to the `hellopython` directory.\n\nInvoke the function by sending it a payload.\n\n```sh\nsf run function --function-url http://localhost:8080 --payload '{}'\n```\n\n## Deploy the Python Function\n\nChange to the root directory of your SFDX project before committing changes and running your function. \n\n```sh\ncd ../../\n```\n\n### Commit your changes to Git\n\nAll code changes made to a function need to be staged and committed before you can deploy.\n\nCommit all changes to your project.\n\n```sh\ngit add .\ngit commit -m \"Trying out python functions\"\n```\n\nDeploy your functions project.\n\n```sh\nsf deploy functions --connected-org PythonScratch\n```\n\nThis deployment process may take several minutes.\n\n> Note: If you receive a `Request failed with status code 404` error message, check the earlier `sf env create compute` step was performed.\n\n### Invoke the Function from Apex\n\nUse Apex to invoke the function deployed to our scratch org. Generate an Apex class with:\n\n```sh\nsfdx force:apex:class:create \\\n  --classname ApexTrigger \\\n  --outputdir force-app/main/default/classes\n```\n\nHave your apex code lookup the reference to our function using the `functions.Function.get` method, invoke the function with an empty json payload, and\nprint the response.\n\nOpen `force-app/main/default/classes/ApexTrigger.cls` and replace it's contents with:\n\n```java\npublic with sharing class ApexTrigger {\n    public static void runFunction() {\n        System.debug('Running hellopython');\n        functions.Function fn = functions.Function.get('PythonFunctionsBeta.hellopython');\n        functions.FunctionInvocation invocation = fn.invoke('{}');\n        System.debug('Response: ' + invocation.getResponse());\n    }\n}\n```\n\nUpload this Apex class to your scratch org.\n\n```sh\nsfdx force:source:push --targetusername PythonScratch\n```\n\nOpen a developer console.\n\n```sh\nsfdx force:org:open -p /_ui/common/apex/debug/ApexCSIPage\n```\n\nExecute the function from the developer console.\n\nOn a **macOS / Linux system**:\n\n```sh\necho \"ApexTrigger.runFunction();\" | sfdx force:apex:execute -f /dev/stdin\n```\n\nOn a **Microsoft Windows system**:\n\n```sh\necho \"FunctionApex.test();\" | sfdx force:apex:execute\n```\n\nThe developer console shows a log entry in the bottom panel after the function executes, which you can double-click to open.\nToggle the Debug Only filter to reduce the log messages to just the ones from the `ApexTrigger` function.\n\nYou should see a view like the one below:\n\n![Developer Console](./assets/developer-console.png)\n\n---\n\n> NOTE: You may encounter the following error\n\n```\nSystem.CalloutException: Error during Salesforce Functions Sync Invocation. Ensure that \nfunction 'PythonFunctionsBeta.hellopython' is deployed and its status is \navailable ('OK', 'up'). If issue persists, contact Salesforce Support.\n```\n\nIf you see this then there may not be a problem, the function just might not be available yet in the compute \nenvironment. Wait several minutes and then try the command above again.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Python support for Salesforce Functions",
    "version": "0.6.0",
    "project_urls": {
        "Changelog": "https://github.com/heroku/sf-functions-python/blob/main/CHANGELOG.md",
        "Source": "https://github.com/heroku/sf-functions-python"
    },
    "split_keywords": [
        "functions",
        "salesforce"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bfa7340c293f2f23ce8141ed11b0566c653945726557892ab246dece70e569f1",
                "md5": "b8a43f93a561f7357bf4df8ebe1ab0bb",
                "sha256": "5b856f7d2aa061c2bc66b3084be44e746ef5d721525fa99b1c761f91bf0495fe"
            },
            "downloads": -1,
            "filename": "salesforce_functions-0.6.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b8a43f93a561f7357bf4df8ebe1ab0bb",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 31404,
            "upload_time": "2023-07-03T09:57:18",
            "upload_time_iso_8601": "2023-07-03T09:57:18.014043Z",
            "url": "https://files.pythonhosted.org/packages/bf/a7/340c293f2f23ce8141ed11b0566c653945726557892ab246dece70e569f1/salesforce_functions-0.6.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f67492f8e3b6b76341f6b898207c4ec9d2b269340599b80f3da1f72fe4ec1279",
                "md5": "c1c9a2e1bfdca129239c3cf220676e9c",
                "sha256": "dca303d2fa8779529a486dd766def59cd4d2b8c7a18948873382f95ee701c964"
            },
            "downloads": -1,
            "filename": "salesforce_functions-0.6.0.tar.gz",
            "has_sig": false,
            "md5_digest": "c1c9a2e1bfdca129239c3cf220676e9c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 23553,
            "upload_time": "2023-07-03T09:57:16",
            "upload_time_iso_8601": "2023-07-03T09:57:16.572116Z",
            "url": "https://files.pythonhosted.org/packages/f6/74/92f8e3b6b76341f6b898207c4ec9d2b269340599b80f3da1f72fe4ec1279/salesforce_functions-0.6.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-07-03 09:57:16",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "heroku",
    "github_project": "sf-functions-python",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "salesforce-functions"
}
        
Elapsed time: 0.08566s