# pbipy
     
`pbipy` is a Python Library for interacting with the Power BI Rest API. It aims to simplyify working with the Power BI Rest API and support programatic administration of Power BI in Python.
`pbipy` supports operations for Apps, Dataflows, Datasets, Gateways, Imports, Reports, and Workspaces (Groups), allowing users to perform actions on their PowerBI instance using Python.
## Installation
```console
pip install pbipy
```
Or to install the latest development code:
```console
pip install git+https://github.com/andrewvillazon/pbipy
```
## Getting Started: Authentication
To use `pbipy` you'll first need to acquire a `bearer_token`.
*How do I get a `bearer_token`?*
To acquire a `bearer_token` you'll need to authenticate against your [Registered Azure Power BI App](https://learn.microsoft.com/en-us/power-bi/developer/embedded/register-app?tabs=customers). Registering is the first step in turning on the Power BI Rest API, so from here on it's assumed your Power BI Rest API is up and running.
To authenticate against the Registered App, Microsoft provides the `MSAL` and `azure-identity` python libraries. These libraries support different ways of acquiring a `bearer_token` and which to use will depend on how your cloud/tenant is configured.
Because there are multiple ways to acquire the token, `pbipy` leaves it up to the user do this in the way that suits, rather than directly handling authentication (of course, this might change in future).
This `README` doesn't cover authentication in detail, however, these are some helpful resources that look at acquiring a `bearer_token` in the context of Power BI:
* [Power BI REST API with Python and MSAL. Part II.](https://www.datalineo.com/post/power-bi-rest-api-with-python-and-msal-part-ii)
* [Power BI REST API with Python Part III, azure-identity](https://www.datalineo.com/post/power-bi-rest-api-with-python-part-iii-azure-identity)
* [Monitoring Power BI using REST APIs from Python](https://data-goblins.com/power-bi/power-bi-api-python)
The example below uses the `msal` library to to get a bearer_token.
```python
import msal
# msal auth setup
def acquire_bearer_token(username, password, azure_tenant_id, client_id, scopes):
app = msal.PublicClientApplication(client_id, authority=azure_tenant_id)
result = app.acquire_token_by_username_password(username, password, scopes)
return result["access_token"]
bearer_token = acquire_bearer_token(
username="your-username",
password="your-password",
azure_tenant_id="https://login.microsoftonline.com/your-azure-tenant-id",
client_id="your-pbi-client-id",
scopes=["https://analysis.windows.net/powerbi/api/.default"],
)
```
The code that follows assumes you've authenticated and acquired your `bearer_token`.
## Useage
Start by creating the `PowerBI()` client. Interactions with the Power BI Rest API go through this object.
```python
from pbipy import PowerBI
pbi = PowerBI(bearer_token)
```
To interact with the API, simply call the relevant method from the client.
```python
# Grab the datasets from a workspace
pbi.datasets(group="f089354e-8366-4e18-aea3-4cb4a3a50b48")
```
`pbipy` converts API responses into regular Python objects, with snake case included! 🐍🐍
```python
sales = pbi.dataset("cfafbeb1-8037-4d0c-896e-a46fb27ff229")
print(type(sales))
print(hasattr(sales, "configured_by"))
# <class 'pbipy.Dataset'>
# True
```
Most methods take in an object id...
```python
dataset = pbi.dataset(
id="cfafbeb1-8037-4d0c-896e-a46fb27ff229",
group="a2f89923-421a-464e-bf4c-25eab39bb09f"
)
```
... or just pass in the object itself.
```python
group = pbi.group("a2f89923-421a-464e-bf4c-25eab39bb09f")
dataset = pbi.dataset(
"cfafbeb1-8037-4d0c-896e-a46fb27ff229"
,group=group
)
```
If you need to access the raw json representation, this is supported to.
```python
sales = pbi.dataset("cfafbeb1-8037-4d0c-896e-a46fb27ff229")
print(sales.raw)
# {
# "id": "cfafbeb1-8037-4d0c-896e-a46fb27ff229",
# "name": "SalesMarketing",
# "addRowsAPIEnabled": False,
# "configuredBy": "john@contoso.com",
# ...
# }
```
## Example: Working with Datasets
Let's see how `pbipy` works by performing some operations on a Dataset.
First, we initialize our client.
```python
from pbipy import PowerBI
pbi = PowerBI(bearer_token)
```
Now that we've got a client, we can load a Dataset from the API. To load a Dataset, we call the `dataset()` method with an `id` and `group` argument. In the Power BI Rest API, a **Group** and **Workspace** are synonymous and used interchangeably.
```python
sales = pbi.dataset(
id="cfafbeb1-8037-4d0c-896e-a46fb27ff229",
group="f089354e-8366-4e18-aea3-4cb4a3a50b48",
)
print(sales)
# <Dataset id='cfafbeb1-8037-4d0c-896e-a46fb27ff229', name='SalesMarketing', ...>
```
Dataset not updating? Let's look at the Refresh History.
We call the `refresh_history()` method on our Dataset. Easy.
```python
refresh_history = sales.refresh_history()
for entry in refresh_history:
print(entry)
# {"refreshType":"ViaApi", "startTime":"2017-06-13T09:25:43.153Z", "status": "Completed" ...}
```
Need to kick off a refresh? That's easy too.
```python
sales.refresh()
```
How about adding some user permissions to our Dataset? Just call the `add_user()` method with the User's details and permissions.
```python
# Give John 'Read' access on the dataset
sales.add_user("john@contoso.com", "User", "Read")
```
Lastly, if we're feeling adventurous, we can execute DAX against a Dataset and use the results in Python.
```python
dxq_result = sales.execute_queries("EVALUATE VALUES(MyTable)")
print(dxq_result)
# {
# "results": [
# {
# "tables": [
# {
# "rows": [
# {
# "MyTable[Year]": 2010,
# "MyTable[Quarter]": "Q1"
# },
# ...
# }
```
## Example: Working with the Admin object
`pbypi` also supports [Administrator Operations](https://learn.microsoft.com/en-us/rest/api/power-bi/admin), specialized operations available to users with Power BI Admin rights. Let's see how we can use these.
First, we need to initialize our client. Then we call the `admin` method and initialize an `Admin` object.
```python
from pbipy import PowerBI
pbi = PowerBI(bearer_token)
admin = pbi.admin()
```
Need to review some access on some reports? We can call the `report_users` method.
```python
users = admin.report_users("5b218778-e7a5-4d73-8187-f10824047715")
print(users[0])
# {"displayName": "John Nick", "emailAddress": "john@contoso.com", ...}
```
What about understanding User activity on your Power BI tenant?
```python
from datetime import datetime
start_dtm = datetime(2019, 8, 31, 0, 0, 0)
end_dtm = datetime(2019, 8, 31, 23, 59, 59)
activity_events = admin.activity_events(start_dtm, end_dtm)
print(activity_events)
# [
# {
# "Id": "41ce06d1",
# "CreationTime": "2019-08-13T07:55:15",
# "Operation": "ViewReport",
# ...
# },
# {
# "Id": "c632aa64",
# "CreationTime": "2019-08-13T07:55:10",
# "Operation": "GetSnapshots",
# ...
# }
# ]
```
## More examples
### Datasets in a Workspace
```python
datasets = pbi.datasets(group="f089354e-8366-4e18-aea3-4cb4a3a50b48")
for dataset in datasets:
print(dataset)
# <Dataset id='cfafbeb1-8037-4d0c-896e-a46fb27ff229', ...>
# <Dataset id='f7fc6510-e151-42a3-850b-d0805a391db0', ...>
```
### List Workspaces
```python
groups = pbi.groups()
for group in groups:
print(group)
# <Group id='a2f89923-421a-464e-bf4c-25eab39bb09f', name='contoso'>
# <Group id='3d9b93c6-7b6d-4801-a491-1738910904fd', name='marketing'>
```
### Create a Workspace
```python
group = pbi.create_group("contoso")
print(group)
# <Group id='a2f89923-421a-464e-bf4c-25eab39bb09f', name='contoso'>
```
### Users and their access
```python
group = pbi.group("a2f89923-421a-464e-bf4c-25eab39bb09f")
users = group.users()
for user in users:
print(user)
# {"identifier": "john@contoso.com", "groupUserAccessRight": "Admin", ... }
# {"identifier": "Adam@contoso.com", "groupUserAccessRight": "Member", ... }
```
## Power BI Rest API Operations
`pbipy` methods wrap around the Operations described in the Power BI Rest API Reference:
[Power BI REST APIs for embedded analytics and automation - Power BI REST API](https://learn.microsoft.com/en-us/rest/api/power-bi/)
## What's implemented?
Most of the core operations on Datasets, Workspaces (Groups), Reports, Apps, and Dataflows are implemented. Given the many available endpoints, not everything is covered by `pbipy`, so expect a few features to be missing.
If an operation is missing and you think it'd be useful, feel free to suggest it on the [Issues tab](https://github.com/andrewvillazon/pbipy/issues).
| PowerBI Component | Progress | Notes |
|--------------------- |---------- |-------------------------------------------------------------------------------------- |
| Datasets | Done | |
| Groups (Workspaces) | Done | |
| Reports | Done | |
| Apps | Done | |
| Dataflows | Done | |
| Gateways | Done | |
| Admin Operations | Done | Implements operations related to Datasets, Groups, Reports, Apps, and Dataflows only. |
| Imports | Done | Import from One Drive for Business not implemented. |
| Everything else | Backlog | |
## Contributing
`pbipy` is an open source project. Contributions such as bug reports, fixes, documentation or docstrings, enhancements, and ideas are welcome. `pbipy` uses github to host code, track issues, record feature requests, and accept pull requests.
View [CONTRIBUTING.md](https://github.com/andrewvillazon/pbipy/blob/master/CONTRIBUTING.md) to learn more about contributing.
## Acknowledgements
The design of this library was heavily inspired by (basically copied) the [pycontribs/jira](https://github.com/pycontribs/jira) library. It also borrows elements of [cmberryay's pypowerbi wrapper](https://github.com/cmberryau/pypowerbi).
Thank You to all the contributors to these libraries for the great examples of what an API Wrapper can be.
Raw data
{
"_id": null,
"home_page": "https://github.com/andrewvillazon/pbipy",
"name": "pbipy",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": null,
"author": "Andrew Villazon",
"author_email": "andrew.villazon@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/9f/5b/178f38876b0ec08afc0af793f30113bf7b940a3cacfa6a76573d8cfb45ee/pbipy-2.11.0.tar.gz",
"platform": null,
"description": "# pbipy\n\n     \n\n\n`pbipy` is a Python Library for interacting with the Power BI Rest API. It aims to simplyify working with the Power BI Rest API and support programatic administration of Power BI in Python.\n\n`pbipy` supports operations for Apps, Dataflows, Datasets, Gateways, Imports, Reports, and Workspaces (Groups), allowing users to perform actions on their PowerBI instance using Python.\n\n## Installation\n\n```console\npip install pbipy\n```\n\nOr to install the latest development code:\n\n```console\npip install git+https://github.com/andrewvillazon/pbipy\n```\n\n## Getting Started: Authentication\n\nTo use `pbipy` you'll first need to acquire a `bearer_token`.\n\n*How do I get a `bearer_token`?*\n\nTo acquire a `bearer_token` you'll need to authenticate against your [Registered Azure Power BI App](https://learn.microsoft.com/en-us/power-bi/developer/embedded/register-app?tabs=customers). Registering is the first step in turning on the Power BI Rest API, so from here on it's assumed your Power BI Rest API is up and running.\n\nTo authenticate against the Registered App, Microsoft provides the `MSAL` and `azure-identity` python libraries. These libraries support different ways of acquiring a `bearer_token` and which to use will depend on how your cloud/tenant is configured.\n\nBecause there are multiple ways to acquire the token, `pbipy` leaves it up to the user do this in the way that suits, rather than directly handling authentication (of course, this might change in future).\n\nThis `README` doesn't cover authentication in detail, however, these are some helpful resources that look at acquiring a `bearer_token` in the context of Power BI:\n\n* [Power BI REST API with Python and MSAL. Part II.](https://www.datalineo.com/post/power-bi-rest-api-with-python-and-msal-part-ii)\n* [Power BI REST API with Python Part III, azure-identity](https://www.datalineo.com/post/power-bi-rest-api-with-python-part-iii-azure-identity)\n* [Monitoring Power BI using REST APIs from Python](https://data-goblins.com/power-bi/power-bi-api-python)\n\nThe example below uses the `msal` library to to get a bearer_token.\n\n```python\nimport msal\n\n\n# msal auth setup\ndef acquire_bearer_token(username, password, azure_tenant_id, client_id, scopes):\n app = msal.PublicClientApplication(client_id, authority=azure_tenant_id)\n result = app.acquire_token_by_username_password(username, password, scopes)\n return result[\"access_token\"]\n\n\nbearer_token = acquire_bearer_token(\n username=\"your-username\",\n password=\"your-password\",\n azure_tenant_id=\"https://login.microsoftonline.com/your-azure-tenant-id\",\n client_id=\"your-pbi-client-id\",\n scopes=[\"https://analysis.windows.net/powerbi/api/.default\"],\n)\n```\n\nThe code that follows assumes you've authenticated and acquired your `bearer_token`.\n\n## Useage\n\nStart by creating the `PowerBI()` client. Interactions with the Power BI Rest API go through this object. \n\n```python\nfrom pbipy import PowerBI\n\npbi = PowerBI(bearer_token)\n```\n\nTo interact with the API, simply call the relevant method from the client.\n\n```python\n# Grab the datasets from a workspace\n\npbi.datasets(group=\"f089354e-8366-4e18-aea3-4cb4a3a50b48\")\n```\n\n`pbipy` converts API responses into regular Python objects, with snake case included! \ud83d\udc0d\ud83d\udc0d\n\n```python\nsales = pbi.dataset(\"cfafbeb1-8037-4d0c-896e-a46fb27ff229\")\n\nprint(type(sales))\nprint(hasattr(sales, \"configured_by\"))\n\n# <class 'pbipy.Dataset'>\n# True\n```\n\nMost methods take in an object id...\n\n```python\ndataset = pbi.dataset(\n id=\"cfafbeb1-8037-4d0c-896e-a46fb27ff229\",\n group=\"a2f89923-421a-464e-bf4c-25eab39bb09f\"\n)\n```\n\n... or just pass in the object itself.\n\n```python\ngroup = pbi.group(\"a2f89923-421a-464e-bf4c-25eab39bb09f\")\n\ndataset = pbi.dataset(\n \"cfafbeb1-8037-4d0c-896e-a46fb27ff229\"\n ,group=group\n)\n```\n\nIf you need to access the raw json representation, this is supported to.\n\n```python\nsales = pbi.dataset(\"cfafbeb1-8037-4d0c-896e-a46fb27ff229\")\n\nprint(sales.raw)\n\n# {\n# \"id\": \"cfafbeb1-8037-4d0c-896e-a46fb27ff229\",\n# \"name\": \"SalesMarketing\",\n# \"addRowsAPIEnabled\": False,\n# \"configuredBy\": \"john@contoso.com\",\n# ...\n# }\n```\n\n## Example: Working with Datasets\n\nLet's see how `pbipy` works by performing some operations on a Dataset.\n\nFirst, we initialize our client.\n\n```python\nfrom pbipy import PowerBI\n\npbi = PowerBI(bearer_token)\n```\n\nNow that we've got a client, we can load a Dataset from the API. To load a Dataset, we call the `dataset()` method with an `id` and `group` argument. In the Power BI Rest API, a **Group** and **Workspace** are synonymous and used interchangeably.\n\n```python\nsales = pbi.dataset(\n id=\"cfafbeb1-8037-4d0c-896e-a46fb27ff229\",\n group=\"f089354e-8366-4e18-aea3-4cb4a3a50b48\",\n)\n\nprint(sales)\n\n# <Dataset id='cfafbeb1-8037-4d0c-896e-a46fb27ff229', name='SalesMarketing', ...>\n```\n\nDataset not updating? Let's look at the Refresh History. \n\nWe call the `refresh_history()` method on our Dataset. Easy.\n\n```python\nrefresh_history = sales.refresh_history()\n\nfor entry in refresh_history:\n print(entry)\n\n# {\"refreshType\":\"ViaApi\", \"startTime\":\"2017-06-13T09:25:43.153Z\", \"status\": \"Completed\" ...}\n```\n\nNeed to kick off a refresh? That's easy too.\n\n```python\nsales.refresh()\n```\n\nHow about adding some user permissions to our Dataset? Just call the `add_user()` method with the User's details and permissions.\n\n```python\n# Give John 'Read' access on the dataset\nsales.add_user(\"john@contoso.com\", \"User\", \"Read\")\n```\n\nLastly, if we're feeling adventurous, we can execute DAX against a Dataset and use the results in Python.\n\n```python\ndxq_result = sales.execute_queries(\"EVALUATE VALUES(MyTable)\")\nprint(dxq_result)\n\n# {\n# \"results\": [\n# {\n# \"tables\": [\n# {\n# \"rows\": [\n# {\n# \"MyTable[Year]\": 2010,\n# \"MyTable[Quarter]\": \"Q1\"\n# },\n# ...\n# }\n```\n\n## Example: Working with the Admin object\n\n`pbypi` also supports [Administrator Operations](https://learn.microsoft.com/en-us/rest/api/power-bi/admin), specialized operations available to users with Power BI Admin rights. Let's see how we can use these.\n\nFirst, we need to initialize our client. Then we call the `admin` method and initialize an `Admin` object.\n\n```python\nfrom pbipy import PowerBI\n\npbi = PowerBI(bearer_token)\nadmin = pbi.admin()\n```\n\nNeed to review some access on some reports? We can call the `report_users` method.\n\n```python\nusers = admin.report_users(\"5b218778-e7a5-4d73-8187-f10824047715\")\nprint(users[0])\n\n# {\"displayName\": \"John Nick\", \"emailAddress\": \"john@contoso.com\", ...}\n```\n\nWhat about understanding User activity on your Power BI tenant?\n\n```python\nfrom datetime import datetime\n\nstart_dtm = datetime(2019, 8, 31, 0, 0, 0)\nend_dtm = datetime(2019, 8, 31, 23, 59, 59)\n\nactivity_events = admin.activity_events(start_dtm, end_dtm)\n\nprint(activity_events)\n\n# [\n# {\n# \"Id\": \"41ce06d1\", \n# \"CreationTime\": \"2019-08-13T07:55:15\", \n# \"Operation\": \"ViewReport\", \n# ...\n# },\n# {\n# \"Id\": \"c632aa64\", \n# \"CreationTime\": \"2019-08-13T07:55:10\", \n# \"Operation\": \"GetSnapshots\", \n# ...\n# }\n# ]\n```\n\n## More examples\n\n### Datasets in a Workspace\n\n```python\ndatasets = pbi.datasets(group=\"f089354e-8366-4e18-aea3-4cb4a3a50b48\")\n\nfor dataset in datasets:\n print(dataset)\n\n# <Dataset id='cfafbeb1-8037-4d0c-896e-a46fb27ff229', ...>\n# <Dataset id='f7fc6510-e151-42a3-850b-d0805a391db0', ...>\n```\n\n### List Workspaces\n\n```python\ngroups = pbi.groups()\n\nfor group in groups:\n print(group)\n\n# <Group id='a2f89923-421a-464e-bf4c-25eab39bb09f', name='contoso'>\n# <Group id='3d9b93c6-7b6d-4801-a491-1738910904fd', name='marketing'>\n```\n\n### Create a Workspace\n\n```python\ngroup = pbi.create_group(\"contoso\")\nprint(group)\n\n# <Group id='a2f89923-421a-464e-bf4c-25eab39bb09f', name='contoso'>\n```\n\n### Users and their access\n\n```python\ngroup = pbi.group(\"a2f89923-421a-464e-bf4c-25eab39bb09f\")\nusers = group.users()\n\nfor user in users:\n print(user)\n\n# {\"identifier\": \"john@contoso.com\", \"groupUserAccessRight\": \"Admin\", ... }\n# {\"identifier\": \"Adam@contoso.com\", \"groupUserAccessRight\": \"Member\", ... }\n```\n\n## Power BI Rest API Operations\n\n`pbipy` methods wrap around the Operations described in the Power BI Rest API Reference:\n\n[Power BI REST APIs for embedded analytics and automation - Power BI REST API](https://learn.microsoft.com/en-us/rest/api/power-bi/)\n\n\n## What's implemented?\n\nMost of the core operations on Datasets, Workspaces (Groups), Reports, Apps, and Dataflows are implemented. Given the many available endpoints, not everything is covered by `pbipy`, so expect a few features to be missing.\n\nIf an operation is missing and you think it'd be useful, feel free to suggest it on the [Issues tab](https://github.com/andrewvillazon/pbipy/issues).\n\n| PowerBI Component \t| Progress \t| Notes \t |\n|---------------------\t|----------\t|-------------------------------------------------------------------------------------- |\n| Datasets \t| Done \t| \t |\n| Groups (Workspaces) \t| Done \t| \t |\n| Reports \t| Done | \t |\n| Apps \t| Done \t| \t |\n| Dataflows \t| Done \t| \t |\n| Gateways \t| Done \t| \t |\n| Admin Operations \t| Done \t| Implements operations related to Datasets, Groups, Reports, Apps, and Dataflows only. |\n| Imports \t| Done \t| Import from One Drive for Business not implemented. |\n| Everything else \t| Backlog \t| \t |\n\n## Contributing\n\n`pbipy` is an open source project. Contributions such as bug reports, fixes, documentation or docstrings, enhancements, and ideas are welcome. `pbipy` uses github to host code, track issues, record feature requests, and accept pull requests.\n\nView [CONTRIBUTING.md](https://github.com/andrewvillazon/pbipy/blob/master/CONTRIBUTING.md) to learn more about contributing.\n\n## Acknowledgements\n\nThe design of this library was heavily inspired by (basically copied) the [pycontribs/jira](https://github.com/pycontribs/jira) library. It also borrows elements of [cmberryay's pypowerbi wrapper](https://github.com/cmberryau/pypowerbi).\n\nThank You to all the contributors to these libraries for the great examples of what an API Wrapper can be.\n",
"bugtrack_url": null,
"license": "Apache 2.0",
"summary": "A Python Library for interacting with the Power BI Rest API.",
"version": "2.11.0",
"project_urls": {
"Homepage": "https://github.com/andrewvillazon/pbipy"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "f411bc94681a76b95f10c3a642685dd74651c3d4166b6b057a5c5e93d0148eae",
"md5": "447dbba83950422b020aa8692b31ff73",
"sha256": "9aa5fcb515069c2074904b674d208f60f4fc686861427f4ec993708513e59a8f"
},
"downloads": -1,
"filename": "pbipy-2.11.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "447dbba83950422b020aa8692b31ff73",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.10",
"size": 46053,
"upload_time": "2024-07-10T19:34:47",
"upload_time_iso_8601": "2024-07-10T19:34:47.772702Z",
"url": "https://files.pythonhosted.org/packages/f4/11/bc94681a76b95f10c3a642685dd74651c3d4166b6b057a5c5e93d0148eae/pbipy-2.11.0-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9f5b178f38876b0ec08afc0af793f30113bf7b940a3cacfa6a76573d8cfb45ee",
"md5": "4bc0d88ecfc5c182ad9bb2b5a7ac1b7f",
"sha256": "a5f82c93ec2767635fda4b2cac0797bf9465d0118f4eef0a55c40565e6f367eb"
},
"downloads": -1,
"filename": "pbipy-2.11.0.tar.gz",
"has_sig": false,
"md5_digest": "4bc0d88ecfc5c182ad9bb2b5a7ac1b7f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 59811,
"upload_time": "2024-07-10T19:34:50",
"upload_time_iso_8601": "2024-07-10T19:34:50.182211Z",
"url": "https://files.pythonhosted.org/packages/9f/5b/178f38876b0ec08afc0af793f30113bf7b940a3cacfa6a76573d8cfb45ee/pbipy-2.11.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-10 19:34:50",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "andrewvillazon",
"github_project": "pbipy",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "pbipy"
}