Showing preview only (1,597K chars total). Download the full file or copy to clipboard to get everything.
Repository: platformio/platformio-core
Branch: develop
Commit: 73d9f3dbea80
Files: 350
Total size: 1.5 MB
Directory structure:
gitextract_4sox4ymo/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE.md
│ └── workflows/
│ ├── core.yml
│ ├── deployment.yml
│ ├── docs.yml
│ ├── examples.yml
│ └── projects.yml
├── .gitignore
├── .gitmodules
├── .pylintrc
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── HISTORY.rst
├── LICENSE
├── Makefile
├── README.rst
├── SECURITY.md
├── platformio/
│ ├── __init__.py
│ ├── __main__.py
│ ├── account/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── client.py
│ │ ├── commands/
│ │ │ ├── __init__.py
│ │ │ ├── destroy.py
│ │ │ ├── forgot.py
│ │ │ ├── login.py
│ │ │ ├── logout.py
│ │ │ ├── password.py
│ │ │ ├── register.py
│ │ │ ├── show.py
│ │ │ ├── token.py
│ │ │ └── update.py
│ │ ├── org/
│ │ │ ├── __init__.py
│ │ │ ├── cli.py
│ │ │ └── commands/
│ │ │ ├── __init__.py
│ │ │ ├── add.py
│ │ │ ├── create.py
│ │ │ ├── destroy.py
│ │ │ ├── list.py
│ │ │ ├── remove.py
│ │ │ └── update.py
│ │ ├── team/
│ │ │ ├── __init__.py
│ │ │ ├── cli.py
│ │ │ └── commands/
│ │ │ ├── __init__.py
│ │ │ ├── add.py
│ │ │ ├── create.py
│ │ │ ├── destroy.py
│ │ │ ├── list.py
│ │ │ ├── remove.py
│ │ │ └── update.py
│ │ └── validate.py
│ ├── app.py
│ ├── assets/
│ │ ├── schema/
│ │ │ └── library.json
│ │ └── system/
│ │ └── 99-platformio-udev.rules
│ ├── builder/
│ │ ├── __init__.py
│ │ ├── main.py
│ │ └── tools/
│ │ ├── __init__.py
│ │ ├── pioasm.py
│ │ ├── piobuild.py
│ │ ├── piohooks.py
│ │ ├── pioino.py
│ │ ├── piointegration.py
│ │ ├── piolib.py
│ │ ├── piomaxlen.py
│ │ ├── piomisc.py
│ │ ├── pioplatform.py
│ │ ├── pioproject.py
│ │ ├── piosize.py
│ │ ├── piotarget.py
│ │ ├── piotest.py
│ │ └── pioupload.py
│ ├── cache.py
│ ├── check/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── defect.py
│ │ └── tools/
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── clangtidy.py
│ │ ├── cppcheck.py
│ │ └── pvsstudio.py
│ ├── cli.py
│ ├── commands/
│ │ ├── __init__.py
│ │ ├── boards.py
│ │ ├── ci.py
│ │ ├── device/
│ │ │ └── __init__.py
│ │ ├── lib.py
│ │ ├── platform.py
│ │ ├── settings.py
│ │ ├── update.py
│ │ └── upgrade.py
│ ├── compat.py
│ ├── debug/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── config/
│ │ │ ├── __init__.py
│ │ │ ├── base.py
│ │ │ ├── blackmagic.py
│ │ │ ├── factory.py
│ │ │ ├── generic.py
│ │ │ ├── jlink.py
│ │ │ ├── mspdebug.py
│ │ │ ├── native.py
│ │ │ ├── qemu.py
│ │ │ └── renode.py
│ │ ├── exception.py
│ │ ├── helpers.py
│ │ └── process/
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── client.py
│ │ ├── gdb.py
│ │ └── server.py
│ ├── dependencies.py
│ ├── device/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── finder.py
│ │ ├── list/
│ │ │ ├── __init__.py
│ │ │ ├── command.py
│ │ │ └── util.py
│ │ └── monitor/
│ │ ├── __init__.py
│ │ ├── command.py
│ │ ├── filters/
│ │ │ ├── __init__.py
│ │ │ ├── base.py
│ │ │ ├── hexlify.py
│ │ │ ├── log2file.py
│ │ │ ├── send_on_enter.py
│ │ │ └── time.py
│ │ └── terminal.py
│ ├── exception.py
│ ├── fs.py
│ ├── home/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── rpc/
│ │ │ ├── __init__.py
│ │ │ ├── handlers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── account.py
│ │ │ │ ├── app.py
│ │ │ │ ├── base.py
│ │ │ │ ├── ide.py
│ │ │ │ ├── misc.py
│ │ │ │ ├── os.py
│ │ │ │ ├── piocore.py
│ │ │ │ ├── platform.py
│ │ │ │ ├── project.py
│ │ │ │ └── registry.py
│ │ │ └── server.py
│ │ └── run.py
│ ├── http.py
│ ├── maintenance.py
│ ├── package/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── commands/
│ │ │ ├── __init__.py
│ │ │ ├── exec.py
│ │ │ ├── install.py
│ │ │ ├── list.py
│ │ │ ├── outdated.py
│ │ │ ├── pack.py
│ │ │ ├── publish.py
│ │ │ ├── search.py
│ │ │ ├── show.py
│ │ │ ├── uninstall.py
│ │ │ ├── unpublish.py
│ │ │ └── update.py
│ │ ├── download.py
│ │ ├── exception.py
│ │ ├── lockfile.py
│ │ ├── manager/
│ │ │ ├── __init__.py
│ │ │ ├── _download.py
│ │ │ ├── _install.py
│ │ │ ├── _legacy.py
│ │ │ ├── _registry.py
│ │ │ ├── _symlink.py
│ │ │ ├── _uninstall.py
│ │ │ ├── _update.py
│ │ │ ├── base.py
│ │ │ ├── core.py
│ │ │ ├── library.py
│ │ │ ├── platform.py
│ │ │ └── tool.py
│ │ ├── manifest/
│ │ │ ├── __init__.py
│ │ │ ├── parser.py
│ │ │ └── schema.py
│ │ ├── meta.py
│ │ ├── pack.py
│ │ ├── unpack.py
│ │ ├── vcsclient.py
│ │ └── version.py
│ ├── platform/
│ │ ├── __init__.py
│ │ ├── _packages.py
│ │ ├── _run.py
│ │ ├── base.py
│ │ ├── board.py
│ │ ├── exception.py
│ │ └── factory.py
│ ├── proc.py
│ ├── project/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── commands/
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── init.py
│ │ │ └── metadata.py
│ │ ├── config.py
│ │ ├── exception.py
│ │ ├── helpers.py
│ │ ├── integration/
│ │ │ ├── __init__.py
│ │ │ ├── generator.py
│ │ │ └── tpls/
│ │ │ ├── clion/
│ │ │ │ └── .gitignore.tpl
│ │ │ ├── codeblocks/
│ │ │ │ └── platformio.cbp.tpl
│ │ │ ├── eclipse/
│ │ │ │ ├── .cproject.tpl
│ │ │ │ ├── .project.tpl
│ │ │ │ └── .settings/
│ │ │ │ ├── PlatformIO Debugger.launch.tpl
│ │ │ │ ├── language.settings.xml.tpl
│ │ │ │ └── org.eclipse.cdt.core.prefs.tpl
│ │ │ ├── emacs/
│ │ │ │ ├── .ccls.tpl
│ │ │ │ └── .gitignore.tpl
│ │ │ ├── netbeans/
│ │ │ │ └── nbproject/
│ │ │ │ ├── configurations.xml.tpl
│ │ │ │ ├── private/
│ │ │ │ │ ├── configurations.xml.tpl
│ │ │ │ │ ├── launcher.properties.tpl
│ │ │ │ │ └── private.xml.tpl
│ │ │ │ └── project.xml.tpl
│ │ │ ├── qtcreator/
│ │ │ │ ├── .gitignore.tpl
│ │ │ │ ├── Makefile.tpl
│ │ │ │ ├── platformio.cflags.tpl
│ │ │ │ ├── platformio.config.tpl
│ │ │ │ ├── platformio.creator.tpl
│ │ │ │ ├── platformio.cxxflags.tpl
│ │ │ │ ├── platformio.files.tpl
│ │ │ │ └── platformio.includes.tpl
│ │ │ ├── sublimetext/
│ │ │ │ ├── .ccls.tpl
│ │ │ │ └── platformio.sublime-project.tpl
│ │ │ ├── vim/
│ │ │ │ ├── .ccls.tpl
│ │ │ │ └── .gitignore.tpl
│ │ │ ├── visualstudio/
│ │ │ │ ├── platformio.vcxproj.filters.tpl
│ │ │ │ └── platformio.vcxproj.tpl
│ │ │ └── vscode/
│ │ │ ├── .gitignore.tpl
│ │ │ └── .vscode/
│ │ │ ├── c_cpp_properties.json.tpl
│ │ │ ├── extensions.json.tpl
│ │ │ └── launch.json.tpl
│ │ ├── options.py
│ │ └── savedeps.py
│ ├── public.py
│ ├── registry/
│ │ ├── __init__.py
│ │ ├── access/
│ │ │ ├── __init__.py
│ │ │ ├── cli.py
│ │ │ ├── commands/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── grant.py
│ │ │ │ ├── list.py
│ │ │ │ ├── private.py
│ │ │ │ ├── public.py
│ │ │ │ └── revoke.py
│ │ │ └── validate.py
│ │ ├── client.py
│ │ └── mirror.py
│ ├── remote/
│ │ ├── __init__.py
│ │ ├── ac/
│ │ │ ├── __init__.py
│ │ │ ├── base.py
│ │ │ ├── process.py
│ │ │ ├── psync.py
│ │ │ └── serial.py
│ │ ├── cli.py
│ │ ├── client/
│ │ │ ├── __init__.py
│ │ │ ├── agent_list.py
│ │ │ ├── agent_service.py
│ │ │ ├── async_base.py
│ │ │ ├── base.py
│ │ │ ├── device_list.py
│ │ │ ├── device_monitor.py
│ │ │ ├── run_or_test.py
│ │ │ └── update_core.py
│ │ ├── factory/
│ │ │ ├── __init__.py
│ │ │ ├── client.py
│ │ │ └── ssl.py
│ │ └── projectsync.py
│ ├── run/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── helpers.py
│ │ └── processor.py
│ ├── system/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── commands/
│ │ │ ├── __init__.py
│ │ │ ├── completion.py
│ │ │ ├── info.py
│ │ │ └── prune.py
│ │ ├── completion.py
│ │ └── prune.py
│ ├── telemetry.py
│ ├── test/
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── exception.py
│ │ ├── helpers.py
│ │ ├── reports/
│ │ │ ├── __init__.py
│ │ │ ├── base.py
│ │ │ ├── json.py
│ │ │ ├── junit.py
│ │ │ └── stdout.py
│ │ ├── result.py
│ │ └── runners/
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── doctest.py
│ │ ├── factory.py
│ │ ├── googletest.py
│ │ ├── readers/
│ │ │ ├── __init__.py
│ │ │ ├── native.py
│ │ │ └── serial.py
│ │ └── unity.py
│ └── util.py
├── scripts/
│ ├── docspregen.py
│ ├── fixsymlink.py
│ └── install_devplatforms.py
├── setup.py
├── tests/
│ ├── __init__.py
│ ├── commands/
│ │ ├── __init__.py
│ │ ├── pkg/
│ │ │ ├── __init__.py
│ │ │ ├── test_exec.py
│ │ │ ├── test_install.py
│ │ │ ├── test_list.py
│ │ │ ├── test_outdated.py
│ │ │ ├── test_search.py
│ │ │ ├── test_show.py
│ │ │ ├── test_uninstall.py
│ │ │ └── test_update.py
│ │ ├── test_account_org_team.py
│ │ ├── test_boards.py
│ │ ├── test_check.py
│ │ ├── test_ci.py
│ │ ├── test_init.py
│ │ ├── test_lib.py
│ │ ├── test_lib_complex.py
│ │ ├── test_platform.py
│ │ ├── test_run.py
│ │ ├── test_settings.py
│ │ └── test_test.py
│ ├── conftest.py
│ ├── misc/
│ │ ├── __init__.py
│ │ ├── ino2cpp/
│ │ │ ├── __init__.py
│ │ │ ├── examples/
│ │ │ │ ├── basic/
│ │ │ │ │ └── basic.ino
│ │ │ │ ├── multifiles/
│ │ │ │ │ ├── bar.ino
│ │ │ │ │ └── foo.pde
│ │ │ │ └── strmultilines/
│ │ │ │ └── main.ino
│ │ │ └── test_ino2cpp.py
│ │ ├── test_maintenance.py
│ │ └── test_misc.py
│ ├── package/
│ │ ├── __init__.py
│ │ ├── test_manager.py
│ │ ├── test_manifest.py
│ │ ├── test_meta.py
│ │ └── test_pack.py
│ ├── project/
│ │ ├── __init__.py
│ │ ├── test_config.py
│ │ ├── test_metadata.py
│ │ └── test_savedeps.py
│ └── test_examples.py
└── tox.ini
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
custom: https://platformio.org/donate
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
What kind of issue is this?
- [ ] **Question**.
This issue tracker is not the place for questions. If you want to ask how to do something,
or to understand why something isn't working the way you expect it to,
use [Community Forums](https://community.platformio.org) or [Premium Support](https://platformio.org/support)
- [ ] **PlatformIO IDE**.
All issues related to PlatformIO IDE should be reported to the
[PlatformIO IDE for VSCode](https://github.com/platformio/platformio-vscode-ide/issues) repository
- [ ] **Development Platform or Board**.
All issues (building, uploading, adding new boards, etc.) related to PlatformIO development platforms
should be reported to appropriate repository related to your hardware
https://github.com/topics/platformio-platform
- [ ] **Feature Request**.
Start by telling us what problem you’re trying to solve. Often a solution
already exists! Don’t send pull requests to implement new features without first getting our
support. Sometimes we leave features out on purpose to keep the project small.
- [ ] **PlatformIO Core**.
If you’ve found a bug, please provide an information below.
*You can erase any parts of this template not applicable to your Issue.*
------------------------------------------------------------------
### Configuration
**Operating system**:
**PlatformIO Version** (`platformio --version`):
### Description of problem
#### Steps to Reproduce
1.
2.
3.
### Actual Results
### Expected Results
### If problems with PlatformIO Build System:
**The content of `platformio.ini`:**
```ini
Insert here...
```
**Source file to reproduce issue:**
```cpp
Insert here...
```
### Additional info
================================================
FILE: .github/workflows/core.yml
================================================
name: Core
on: [push, pull_request]
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: ["3.11", "3.12", "3.13", "3.14"]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
with:
submodules: "recursive"
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install tox
- name: Run "codespell" on Linux
if: startsWith(matrix.os, 'ubuntu')
run: |
python -m pip install codespell
make codespell
- name: Core System Info
run: |
tox -e py
- name: Integration Tests
if: ${{ matrix.python-version == '3.11' }}
run: |
tox -e testcore
- name: Slack Notification
uses: homoluctus/slatify@master
if: failure()
with:
type: ${{ job.status }}
job_name: '*Core*'
commit: true
url: ${{ secrets.SLACK_BUILD_WEBHOOK }}
token: ${{ secrets.SLACK_GITHUB_TOKEN }}
================================================
FILE: .github/workflows/deployment.yml
================================================
name: Deployment
on:
push:
branches:
- "master"
- "release/**"
jobs:
deployment:
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v6
with:
submodules: "recursive"
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install tox build
- name: Deployment Tests
env:
TEST_EMAIL_LOGIN: ${{ secrets.TEST_EMAIL_LOGIN }}
TEST_EMAIL_PASSWORD: ${{ secrets.TEST_EMAIL_PASSWORD }}
TEST_EMAIL_IMAP_SERVER: ${{ secrets.TEST_EMAIL_IMAP_SERVER }}
run: |
tox -e testcore
- name: Build Python distributions
run: python -m build
- name: Publish package to PyPI
if: ${{ github.ref == 'refs/heads/master' }}
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
================================================
FILE: .github/workflows/docs.yml
================================================
name: Docs
on: [push, pull_request]
jobs:
build:
name: Build Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
submodules: "recursive"
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install tox
- name: Build docs
run: |
tox -e docs
- name: Slack Notification
uses: homoluctus/slatify@master
if: failure()
with:
type: ${{ job.status }}
job_name: '*Docs*'
commit: true
url: ${{ secrets.SLACK_BUILD_WEBHOOK }}
token: ${{ secrets.SLACK_GITHUB_TOKEN }}
- name: Preserve Docs
if: ${{ github.event_name == 'push' }}
run: |
tar -czvf docs.tar.gz -C docs/_build html rtdpage
- name: Save artifact
if: ${{ github.event_name == 'push' }}
uses: actions/upload-artifact@v4
with:
name: docs
path: ./docs.tar.gz
deploy:
name: Deploy Docs
needs: build
runs-on: ubuntu-latest
env:
DOCS_REPO: platformio/platformio-docs
DOCS_DIR: platformio-docs
LATEST_DOCS_DIR: latest-docs
RELEASE_BUILD: ${{ startsWith(github.ref, 'refs/tags/v') }}
if: ${{ github.event_name == 'push' }}
steps:
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: docs
- name: Unpack artifact
run: |
mkdir ./${{ env.LATEST_DOCS_DIR }}
tar -xzf ./docs.tar.gz -C ./${{ env.LATEST_DOCS_DIR }}
- name: Delete Artifact
uses: geekyeggo/delete-artifact@v5
with:
name: docs
- name: Select Docs type
id: get-destination-dir
run: |
if [[ ${{ env.RELEASE_BUILD }} == true ]]; then
echo "::set-output name=dst_dir::stable"
else
echo "::set-output name=dst_dir::latest"
fi
- name: Checkout latest Docs
continue-on-error: true
uses: actions/checkout@v6
with:
repository: ${{ env.DOCS_REPO }}
path: ${{ env.DOCS_DIR }}
ref: gh-pages
- name: Synchronize Docs
run: |
rm -rf ${{ env.DOCS_DIR }}/.git
rm -rf ${{ env.DOCS_DIR }}/en/${{ steps.get-destination-dir.outputs.dst_dir }}
mkdir -p ${{ env.DOCS_DIR }}/en/${{ steps.get-destination-dir.outputs.dst_dir }}
cp -rf ${{ env.LATEST_DOCS_DIR }}/html/* ${{ env.DOCS_DIR }}/en/${{ steps.get-destination-dir.outputs.dst_dir }}
if [[ ${{ env.RELEASE_BUILD }} == false ]]; then
rm -rf ${{ env.DOCS_DIR }}/page
mkdir -p ${{ env.DOCS_DIR }}/page
cp -rf ${{ env.LATEST_DOCS_DIR }}/rtdpage/* ${{ env.DOCS_DIR }}/page
fi
- name: Validate Docs
run: |
if [ -z "$(ls -A ${{ env.DOCS_DIR }})" ]; then
echo "Docs folder is empty. Aborting!"
exit 1
fi
- name: Deploy to Github Pages
uses: peaceiris/actions-gh-pages@v4
with:
personal_token: ${{ secrets.DEPLOY_GH_DOCS_TOKEN }}
external_repository: ${{ env.DOCS_REPO }}
publish_dir: ./${{ env.DOCS_DIR }}
commit_message: Sync Docs
================================================
FILE: .github/workflows/examples.yml
================================================
name: Examples
on: [push, pull_request]
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
env:
PIO_INSTALL_DEVPLATFORM_OWNERNAMES: "platformio"
PIO_INSTALL_DEVPLATFORM_NAMES: "aceinna_imu,atmelavr,atmelmegaavr,atmelsam,espressif32,espressif8266,nordicnrf52,raspberrypi,ststm32,teensy"
steps:
- name: Free Disk Space
uses: endersonmenezes/free-disk-space@v3
with:
remove_android: true
remove_dotnet: true
remove_haskell: true
# Faster cleanup
remove_packages_one_command: true
rm_cmd: "rmz"
- uses: actions/checkout@v6
with:
submodules: "recursive"
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install tox
- name: Run on Linux
if: startsWith(matrix.os, 'ubuntu')
run: |
# Free space
sudo apt clean
# docker rmi $(docker image ls -aq)
df -h
tox -e testexamples
- name: Run on macOS
if: startsWith(matrix.os, 'macos')
run: |
df -h
tox -e testexamples
- name: Run on Windows
if: startsWith(matrix.os, 'windows')
env:
PLATFORMIO_CORE_DIR: C:/pio
PLATFORMIO_WORKSPACE_DIR: C:/pio-workspace/$PROJECT_HASH
run: |
tox -e testexamples
- name: Slack Notification
uses: homoluctus/slatify@master
if: failure()
with:
type: ${{ job.status }}
job_name: '*Examples*'
commit: true
url: ${{ secrets.SLACK_BUILD_WEBHOOK }}
token: ${{ secrets.SLACK_GITHUB_TOKEN }}
================================================
FILE: .github/workflows/projects.yml
================================================
name: Projects
on: [push, pull_request]
jobs:
build:
strategy:
fail-fast: false
matrix:
project:
- marlin:
repository: "MarlinFirmware/Marlin"
folder: "Marlin"
config_dir: "Marlin"
env_name: "mega2560"
- smartknob:
repository: "scottbez1/smartknob"
folder: "smartknob"
config_dir: "smartknob"
env_name: "view"
- espurna:
repository: "xoseperez/espurna"
folder: "espurna"
config_dir: "espurna/code"
env_name: "nodemcu-lolin"
- OpenMQTTGateway:
repository: "1technophile/OpenMQTTGateway"
folder: "OpenMQTTGateway"
config_dir: "OpenMQTTGateway"
env_name: "esp32-m5atom-lite"
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
with:
submodules: "recursive"
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: 3.11
- name: Install PlatformIO
run: pip install -U .
- name: Check out ${{ matrix.project.repository }}
uses: actions/checkout@v6
with:
submodules: "recursive"
repository: ${{ matrix.project.repository }}
path: ${{ matrix.project.folder }}
- name: Compile ${{ matrix.project.repository }}
run: pio run -d ${{ matrix.project.config_dir }} -e ${{ matrix.project.env_name }}
================================================
FILE: .gitignore
================================================
*.egg-info
*.pyc
__pycache__
.tox
docs/_build
dist
build
.cache
coverage.xml
.coverage
htmlcov
.pytest_cache
================================================
FILE: .gitmodules
================================================
[submodule "examples"]
path = examples
url = https://github.com/platformio/platformio-examples.git
[submodule "docs"]
path = docs
url = https://github.com/platformio/platformio-docs.git
branch = develop
================================================
FILE: .pylintrc
================================================
[REPORTS]
output-format=colorized
[MESSAGES CONTROL]
disable=
missing-docstring,
duplicate-code,
invalid-name,
too-few-public-methods,
consider-using-f-string,
cyclic-import,
use-dict-literal
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
See https://piolabs.com/legal/code-of-conduct.html
================================================
FILE: CONTRIBUTING.md
================================================
Contributing
------------
To get started, <a href="https://cla-assistant.io/platformio/platformio-core">sign the Contributor License Agreement</a>.
1. Fork the repository on GitHub
2. Clone repository `git clone --recursive https://github.com/YourGithubUsername/platformio-core.git`
3. Run `pip install tox`
4. Go to the root of the PlatformIO Core project where `tox.ini` is located (``cd platformio-core``) and run `tox -e py39`.
You can replace `py39` with your own Python version. For example, `py311` means Python 3.11.
5. Activate current development environment:
* Windows: `.tox\py39\Scripts\activate`
* Bash/ZSH: `source .tox/py39/bin/activate`
* Fish: `source .tox/py39/bin/activate.fish`
6. Make changes to code, documentation, etc.
7. Lint source code `make before-commit`
8. Run the tests `make test`
9. Build documentation `tox -e docs` (creates a directory _build under docs where you can find the html)
10. Commit changes to your forked repository
11. Submit a Pull Request on GitHub
================================================
FILE: HISTORY.rst
================================================
Release Notes
=============
.. |PIOCONF| replace:: `"platformio.ini" <https://docs.platformio.org/en/latest/projectconf.html>`__ configuration file
.. |LIBRARYJSON| replace:: `library.json <https://docs.platformio.org/en/latest/manifests/library-json/index.html>`__
.. |LDF| replace:: `LDF <https://docs.platformio.org/en/latest/librarymanager/ldf.html>`__
.. |INTERPOLATION| replace:: `Interpolation of Values <https://docs.platformio.org/en/latest/projectconf/interpolation.html>`__
.. |UNITTESTING| replace:: `Unit Testing <https://docs.platformio.org/en/latest/advanced/unit-testing/index.html>`__
.. |DEBUGGING| replace:: `Debugging <https://docs.platformio.org/en/latest/plus/debugging.html>`__
.. |STATICCODEANALYSIS| replace:: `Static Code Analysis <https://docs.platformio.org/en/latest/advanced/static-code-analysis/index.html>`__
.. |PIOHOME| replace:: `PIO Home <https://docs.platformio.org/en/latest/home/index.html>`__
.. _release_notes_6:
PlatformIO Core 6
-----------------
Unlock the true potential of embedded software development with
PlatformIO's collaborative ecosystem, embracing declarative principles,
test-driven methodologies, and modern toolchains for unrivaled success.
6.1.19 (2026-02-04)
~~~~~~~~~~~~~~~~~~~
* Added support for Python 3.14
* Upgraded the `Doctest <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/doctest.html>`__ testing framework to version 2.4.12, the `GoogleTest <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/doctest.html>`__ to version 1.17.0, and the `Unity <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/unity.html>`__ to version 2.6.1, incorporating the latest features and improvements for enhanced testing capabilities
* Enhanced compatibility with the CCLS language server, improving integration with editors like `Emacs <https://docs.platformio.org/en/latest/integration/ide/emacs.html>`__, `Sublime Text <https://docs.platformio.org/en/latest/integration/ide/sublimetext.html>`__, and `Vim <https://docs.platformio.org/en/latest/integration/ide/vim.html>`__ (`issue #5186 <https://github.com/platformio/platformio-core/issues/5186>`_)
* Improved error messages for package installation to make it easier to understand when a package is missing or incompatible (`pull #5336 <https://github.com/platformio/platformio-core/pull/5336>`_).
* Fixed a regression issue where custom build flags were not properly reflected in the `compile_commands.json <https://docs.platformio.org/en/latest/integration/compile_commands.html>`__ file, ensuring accurate compilation database generation
* Fixed an issue where fully-qualified serial port URLs (e.g., ``rfc2217://host:port``) were incorrectly treated as wildcard patterns (`issue #5225 <https://github.com/platformio/platformio-core/issues/5225>`_)
* Fixed an issue where the toolchain path in static analysis was not handled correctly if it contained spaces (`pull #5351 <https://github.com/platformio/platformio-core/issues/5351>`_)
* Fixed installation failure when the executable path contains spaces for ``postinstall`` scripts and handling both list and string command formats (`pull #5366 <https://github.com/platformio/platformio-core/pull/5366>`_)
* Fixed cleanup of the ``.pio/libdeps`` folder so that leftover libraries are properly removed when the `lib_deps <https://docs.platformio.org/en/latest/projectconf/sections/env/options/library/lib_deps.html>`__ option is empty (`issue #5110 <https://github.com/platformio/platformio-core/issues/5110>`_)
6.1.18 (2025-03-11)
~~~~~~~~~~~~~~~~~~~
* Resolved a regression issue that prevented |PIOHOME| from opening external links (`issue #5084 <https://github.com/platformio/platformio-core/issues/5084>`_)
6.1.17 (2025-02-13)
~~~~~~~~~~~~~~~~~~~
* Introduced the `PLATFORMIO_RUN_JOBS <https://docs.platformio.org/en/latest/envvars.html#envvar-PLATFORMIO_RUN_JOBS>`__ environment variable, allowing manual override of the number of parallel build jobs (`issue #5077 <https://github.com/platformio/platformio-core/issues/5077>`_)
* Added support for ``tar.xz`` tarball dependencies (`pull #4974 <https://github.com/platformio/platformio-core/pull/4974>`_)
* Ensured that dependencies of private libraries are no longer unnecessarily re-installed, optimizing dependency management and reducing redundant operations (`issue #4987 <https://github.com/platformio/platformio-core/issues/4987>`_)
* Resolved an issue where the ``compiledb`` target failed to properly escape compiler executable paths containing spaces (`issue #4998 <https://github.com/platformio/platformio-core/issues/4998>`_)
* Resolved an issue with incorrect path resolution when linking static libraries via the `build_flags <https://docs.platformio.org/en/latest/projectconf/sections/env/options/build/build_flags.html>`__ option (`issue #5004 <https://github.com/platformio/platformio-core/issues/5004>`_)
* Resolved an issue where the ``--project-dir`` flag did not function correctly with the `pio check <https://docs.platformio.org/en/latest/core/userguide/cmd_check.html>`__ and `pio debug <https://docs.platformio.org/en/latest/core/userguide/cmd_debug.html>`__ commands (`issue #5029 <https://github.com/platformio/platformio-core/issues/5029>`_)
* Resolved an issue where the |LDF| occasionally excluded bundled platform libraries from the dependency graph (`pull #4941 <https://github.com/platformio/platformio-core/pull/4941>`_)
6.1.16 (2024-09-26)
~~~~~~~~~~~~~~~~~~~
* Added support for Python 3.13
* Introduced the `PLATFORMIO_SYSTEM_TYPE <https://docs.platformio.org/en/latest/envvars.html#envvar-PLATFORMIO_SYSTEM_TYPE>`__ environment variable, enabling manual override of the detected system type for greater flexibility and control in custom build environments
* Enhanced internet connection checks by falling back to HTTPS protocol when HTTP (port 80) fails (`issue #4980 <https://github.com/platformio/platformio-core/issues/4980>`_)
* Upgraded the build engine to the latest version of SCons (4.8.1) to improve build performance, reliability, and compatibility with other tools and systems (`release notes <https://github.com/SCons/scons/releases/tag/4.8.1>`__)
* Upgraded the `Doctest <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/doctest.html>`__ testing framework to version 2.4.11, the `GoogleTest <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/doctest.html>`__ to version 1.15.2, and the `Unity <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/unity.html>`__ to version 2.6.0, incorporating the latest features and improvements for enhanced testing capabilities
* Corrected an issue where the incorrect public class was imported for the ``DoctestTestRunner`` (`issue #4949 <https://github.com/platformio/platformio-core/issues/4949>`_)
6.1.15 (2024-04-25)
~~~~~~~~~~~~~~~~~~~
* Resolved an issue where the |LDF| couldn't locate a library dependency declared via version control system repository (`issue #4885 <https://github.com/platformio/platformio-core/issues/4885>`_)
* Resolved an issue related to the inaccurate detection of the Clang compiler (`pull #4897 <https://github.com/platformio/platformio-core/pull/4897>`_)
6.1.14 (2024-03-21)
~~~~~~~~~~~~~~~~~~~
* Introduced the ``--json-output`` option to the `pio test <https://docs.platformio.org/en/latest/core/userguide/cmd_test.html>`__ command, enabling users to generate test results in the JSON format
* Upgraded the build engine to the latest version of SCons (4.7.0) to improve build performance, reliability, and compatibility with other tools and systems (`release notes <https://github.com/SCons/scons/releases/tag/4.7.0>`__)
* Broadened version support for the ``pyelftools`` dependency, enabling compatibility with lower versions and facilitating integration with a wider range of third-party tools (`issue #4834 <https://github.com/platformio/platformio-core/issues/4834>`_)
* Addressed an issue where passing a relative path (``--project-dir``) to the `pio project init <https://docs.platformio.org/en/latest/core/userguide/project/cmd_init.html>`__ command resulted in an error (`issue #4847 <https://github.com/platformio/platformio-core/issues/4847>`_)
* Enhanced |STATICCODEANALYSIS| to accommodate scenarios where custom ``src_dir`` or ``include_dir`` are located outside the project folder (`pull #4874 <https://github.com/platformio/platformio-core/pull/4874>`_)
* Corrected the validation of ``symlink://`` `package specifications <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_install.html#local-folder>`__ , resolving an issue that caused the package manager to repeatedly reinstall dependencies (`pull #4870 <https://github.com/platformio/platformio-core/pull/4870>`_)
* Resolved an issue related to the relative package path in the `pio pkg publish <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_publish.html>`__ command
* Resolved an issue where the |LDF| selected an incorrect library version (`issue #4860 <https://github.com/platformio/platformio-core/issues/4860>`_)
* Resolved an issue with the ``hexlify`` filter in the `device monitor <https://docs.platformio.org/en/latest/core/userguide/device/cmd_monitor.html>`__ command, ensuring proper representation of characters with Unicode code points higher than 127 (`issue #4732 <https://github.com/platformio/platformio-core/issues/4732>`_)
6.1.13 (2024-01-12)
~~~~~~~~~~~~~~~~~~~
* Expanded support for SCons variables declared in the legacy format ``${SCONS_VARNAME}`` (`issue #4828 <https://github.com/platformio/platformio-core/issues/4828>`_)
6.1.12 (2024-01-10)
~~~~~~~~~~~~~~~~~~~
* Added support for Python 3.12
* Introduced the capability to launch the debug server in a separate process (`issue #4722 <https://github.com/platformio/platformio-core/issues/4722>`_)
* Introduced a warning during the verification of MCU maximum RAM usage, signaling when the allocated RAM surpasses 100% (`issue #4791 <https://github.com/platformio/platformio-core/issues/4791>`_)
* Drastically enhanced the speed of project building when operating in verbose mode (`issue #4783 <https://github.com/platformio/platformio-core/issues/4783>`_)
* Upgraded the build engine to the latest version of SCons (4.6.0) to improve build performance, reliability, and compatibility with other tools and systems (`release notes <https://github.com/SCons/scons/releases/tag/4.6.0>`__)
* Enhanced the handling of built-in variables in |PIOCONF| during |INTERPOLATION| (`issue #4695 <https://github.com/platformio/platformio-core/issues/4695>`_)
* Enhanced PIP dependency declarations for improved reliability and extended support to include Python 3.6 (`issue #4819 <https://github.com/platformio/platformio-core/issues/4819>`_)
* Implemented automatic installation of missing dependencies when utilizing a SOCKS proxy (`issue #4822 <https://github.com/platformio/platformio-core/issues/4822>`_)
* Implemented a fail-safe mechanism to terminate a debugging session if an unknown CLI option is passed (`issue #4699 <https://github.com/platformio/platformio-core/issues/4699>`_)
* Rectified an issue where ``${platformio.name}`` erroneously represented ``None`` as the default `project name <https://docs.platformio.org/en/latest/projectconf/sections/platformio/options/generic/name.html>`__ (`issue #4717 <https://github.com/platformio/platformio-core/issues/4717>`_)
* Resolved an issue where the ``COMPILATIONDB_INCLUDE_TOOLCHAIN`` setting was not correctly applying to private libraries (`issue #4762 <https://github.com/platformio/platformio-core/issues/4762>`_)
* Resolved an issue where ``get_systype()`` inaccurately returned the architecture when executed within a Docker container on a 64-bit kernel with a 32-bit userspace (`issue #4777 <https://github.com/platformio/platformio-core/issues/4777>`_)
* Resolved an issue with incorrect handling of the ``check_src_filters`` option when used in multiple environments (`issue #4788 <https://github.com/platformio/platformio-core/issues/4788>`_)
* Resolved an issue where running `pio project metadata <https://docs.platformio.org/en/latest/core/userguide/project/cmd_metadata.html>`__ resulted in duplicated "include" entries (`issue #4723 <https://github.com/platformio/platformio-core/issues/4723>`_)
* Resolved an issue where native debugging failed on the host machine (`issue #4745 <https://github.com/platformio/platformio-core/issues/4745>`_)
* Resolved an issue where custom debug configurations were being inadvertently overwritten in VSCode's ``launch.json`` (`issue #4810 <https://github.com/platformio/platformio-core/issues/4810>`_)
6.1.11 (2023-08-31)
~~~~~~~~~~~~~~~~~~~
* Resolved a possible issue that may cause generated projects for `PlatformIO IDE for VSCode <https://docs.platformio.org/en/latest/integration/ide/vscode.html>`__ to fail to launch a debug session because of a missing "objdump" binary when GDB is not part of the toolchain package
* Resolved a regression issue that resulted in the malfunction of the Memory Inspection feature within |PIOHOME|
6.1.10 (2023-08-11)
~~~~~~~~~~~~~~~~~~~
* Resolved an issue that caused generated projects for `PlatformIO IDE for VSCode <https://docs.platformio.org/en/latest/integration/ide/vscode.html>`__ to break when the ``-iprefix`` compiler flag was used
* Resolved an issue encountered while utilizing the `pio pkg exec <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_exec.html>`__ command on the Windows platform to execute Python scripts from a package
* Implemented a crucial improvement to the `pio run <https://docs.platformio.org/en/latest/core/userguide/cmd_run.html>`__ command, guaranteeing that the ``monitor`` target is not executed if any of the preceding targets, such as ``upload``, encounter failures
* `Cppcheck <https://docs.platformio.org/en/latest/plus/check-tools/cppcheck.html>`__ v2.11 with new checks, CLI commands and various analysis improvements
* Resolved a critical issue that arose on macOS ARM platforms due to the Python "requests" module, leading to a "ModuleNotFoundError: No module named 'chardet'" (`issue #4702 <https://github.com/platformio/platformio-core/issues/4702>`_)
6.1.9 (2023-07-06)
~~~~~~~~~~~~~~~~~~
* Rectified a regression bug that occurred when the ``-include`` flag was passed via the `build_flags <https://docs.platformio.org/en/latest/projectconf/sections/env/options/build/build_flags.html>`__ option as a relative path and subsequently expanded (`issue #4683 <https://github.com/platformio/platformio-core/issues/4683>`_)
* Resolved an issue that resulted in unresolved absolute toolchain paths when generating the `Compilation database "compile_commands.json" <https://docs.platformio.org/en/latest/integration/compile_commands.html>`__ (`issue #4684 <https://github.com/platformio/platformio-core/issues/4684>`_)
6.1.8 (2023-07-05)
~~~~~~~~~~~~~~~~~~
* Added a new ``--lint`` option to the `pio project config <https://docs.platformio.org/en/latest/core/userguide/project/cmd_config.html>`__ command, enabling users to efficiently perform linting on the |PIOCONF|
* Enhanced the parsing of the |PIOCONF| to provide comprehensive diagnostic information
* Expanded the functionality of the |LIBRARYJSON| manifest by allowing the use of the underscore symbol in the `keywords <https://docs.platformio.org/en/latest/manifests/library-json/fields/keywords.html>`__ field
* Optimized project integration templates to address the issue of long paths on Windows (`issue #4652 <https://github.com/platformio/platformio-core/issues/4652>`_)
* Refactored |UNITTESTING| engine to resolve compiler warnings with "-Wpedantic" option (`pull #4671 <https://github.com/platformio/platformio-core/pull/4671>`_)
* Eliminated erroneous warning regarding the use of obsolete PlatformIO Core when downgrading to the stable version (`issue #4664 <https://github.com/platformio/platformio-core/issues/4664>`_)
* Updated the `pio project metadata <https://docs.platformio.org/en/latest/core/userguide/project/cmd_metadata.html>`__ command to return C/C++ flags as parsed Unix shell arguments when dumping project build metadata
* Resolved a critical issue related to the usage of the ``-include`` flag within the `build_flags <https://docs.platformio.org/en/latest/projectconf/sections/env/options/build/build_flags.html>`__ option, specifically when employing dynamic variables (`issue #4682 <https://github.com/platformio/platformio-core/issues/4682>`_)
* Removed PlatformIO IDE for Atom from the documentation as `Atom has been deprecated <https://github.blog/2022-06-08-sunsetting-atom/>`__
6.1.7 (2023-05-08)
~~~~~~~~~~~~~~~~~~
* Introduced a new ``--sample-code`` option to the `pio project init <https://docs.platformio.org/en/latest/core/userguide/project/cmd_init.html>`__ command, which allows users to include sample code in the newly created project
* Added validation for `project working environment names <https://docs.platformio.org/en/latest/projectconf/sections/env/index.html#working-env-name>`__ to ensure that they only contain lowercase letters ``a-z``, numbers ``0-9``, and special characters ``_`` (underscore) and ``-`` (hyphen)
* Added the ability to show a detailed library dependency tree only in `verbose mode <https://docs.platformio.org/en/latest/core/userguide/cmd_run.html#cmdoption-pio-run-v>`__, which can help you understand the relationship between libraries and troubleshoot issues more effectively (`issue #4517 <https://github.com/platformio/platformio-core/issues/4517>`_)
* Added the ability to run only the `device monitor <https://docs.platformio.org/en/latest/core/userguide/device/cmd_monitor.html>`__ when using the `pio run -t monitor <https://docs.platformio.org/en/latest/core/userguide/cmd_run.html>`__ command, saving you time and resources by skipping the build process
* Implemented a new feature to store device monitor logs in the project's ``logs`` folder, making it easier to access and review device monitor logs for your projects (`issue #4596 <https://github.com/platformio/platformio-core/issues/4596>`_)
* Improved support for projects located on Windows network drives, including Network Shared Folder, Dropbox, OneDrive, Google Drive, and other similar services (`issue #3417 <https://github.com/platformio/platformio-core/issues/3417>`_)
* Improved source file filtering functionality for the `Static Code Analysis <https://docs.platformio.org/en/latest/advanced/static-code-analysis/index.html>`__ feature, making it easier to analyze only the code you need to
* Upgraded the build engine to the latest version of SCons (4.5.2) to improve build performance, reliability, and compatibility with other tools and systems (`release notes <https://github.com/SCons/scons/releases/tag/4.5.2>`__)
* Implemented a fix for shell injection vulnerabilities when converting INO files to CPP, ensuring your code is safe and secure (`issue #4532 <https://github.com/platformio/platformio-core/issues/4532>`_)
* Restored the project generator for the `NetBeans IDE <https://docs.platformio.org/en/latest/integration/ide/netbeans.html>`__, providing you with more flexibility and options for your development workflow
* Resolved installation issues with PIO Remote on Raspberry Pi and other small form-factor PCs (`issue #4425 <https://github.com/platformio/platformio-core/issues/4425>`_, `issue #4493 <https://github.com/platformio/platformio-core/issues/4493>`_, `issue #4607 <https://github.com/platformio/platformio-core/issues/4607>`_)
* Resolved an issue where the `build_cache_dir <https://docs.platformio.org/en/latest/projectconf/sections/platformio/options/directory/build_cache_dir.html>`__ setting was not being recognized consistently across multiple environments (`issue #4574 <https://github.com/platformio/platformio-core/issues/4574>`_)
* Resolved an issue where organization details could not be updated using the `pio org update <https://docs.platformio.org/en/latest/core/userguide/org/cmd_update.html>`__ command
* Resolved an issue where the incorrect debugging environment was generated for VSCode in "Auto" mode (`issue #4597 <https://github.com/platformio/platformio-core/issues/4597>`_)
* Resolved an issue where native tests would fail if a custom program name was specified (`issue #4546 <https://github.com/platformio/platformio-core/issues/4546>`_)
* Resolved an issue where the PlatformIO |DEBUGGING| solution was not escaping the tool installation process into MI2 correctly (`issue #4565 <https://github.com/platformio/platformio-core/issues/4565>`_)
* Resolved an issue where multiple targets were not executed sequentially (`issue #4604 <https://github.com/platformio/platformio-core/issues/4604>`_)
* Resolved an issue where upgrading PlatformIO Core fails on Windows with Python 3.11 (`issue #4540 <https://github.com/platformio/platformio-core/issues/4540>`_)
6.1.6 (2023-01-23)
~~~~~~~~~~~~~~~~~~
* Added support for Python 3.11
* Added a new `name <https://docs.platformio.org/en/latest/projectconf/sections/platformio/options/generic/description.html>`__ configuration option to customize a project name (`pull #4498 <https://github.com/platformio/platformio-core/pull/4498>`_)
* Made assets (templates, ``99-platformio-udev.rules``) part of Python's module (`issue #4458 <https://github.com/platformio/platformio-core/issues/4458>`_)
* Updated `Clang-Tidy <https://docs.platformio.org/en/latest/plus/check-tools/clang-tidy.html>`__ check tool to v15.0.5 with new diagnostics and bugfixes
* Removed dependency on the "zeroconf" package and install it only when a user lists mDNS devices (issue with zeroconf's LGPL license)
* Show the real error message instead of "Can not remove temporary directory" when |PIOCONF| is broken (`issue #4480 <https://github.com/platformio/platformio-core/issues/4480>`_)
* Fixed an issue with an incorrect test summary when a testcase name includes a colon (`issue #4508 <https://github.com/platformio/platformio-core/issues/4508>`_)
* Fixed an issue when `extends <https://docs.platformio.org/en/latest/projectconf/sections/env/options/advanced/extends.html>`__ did not override options in the right order (`issue #4462 <https://github.com/platformio/platformio-core/issues/4462>`_)
* Fixed an issue when `pio pkg list <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_list.html>`__ and `pio pkg uninstall <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_uninstall.html>`__ commands fail if there are circular dependencies in the |LIBRARYJSON| manifests (`issue #4475 <https://github.com/platformio/platformio-core/issues/4475>`_)
6.1.5 (2022-11-01)
~~~~~~~~~~~~~~~~~~
* Added a new `enable_proxy_strict_ssl <https://docs.platformio.org/en/latest/core/userguide/cmd_settings.html>`__ setting to disable the proxy server certificate verification (`issue #4432 <https://github.com/platformio/platformio-core/issues/4432>`_)
* Documented `PlatformIO Core Proxy Configuration <https://docs.platformio.org/en/latest/core/installation/proxy-configuration.html>`__
* Speeded up device port finder by avoiding loading board HWIDs from development platforms
* Improved caching of build metadata in debug mode
* Fixed an issue when `pio pkg install --storage-dir <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_install.html>`__ command requires PlatformIO project (`issue #4410 <https://github.com/platformio/platformio-core/issues/4410>`_)
6.1.4 (2022-08-12)
~~~~~~~~~~~~~~~~~~
* Added support for accepting the original FileNode environment in a "callback" function when using `Build Middlewares <https://docs.platformio.org/en/latest/scripting/middlewares.html>`__ (`pull #4380 <https://github.com/platformio/platformio-core/pull/4380>`_)
* Improved device port finder when using dual channel UART converter (`issue #4367 <https://github.com/platformio/platformio-core/issues/4367>`_)
* Improved project dependency resolving when using the `pio project init --ide <https://docs.platformio.org/en/latest/core/userguide/project/cmd_init.html>`__ command
* Upgraded build engine to the SCons 4.4.0 (`release notes <https://github.com/SCons/scons/releases/tag/4.4.0>`__)
* Keep custom "unwantedRecommendations" when generating projects for VSCode (`issue #4383 <https://github.com/platformio/platformio-core/issues/4383>`_)
* Do not resolve project dependencies for the ``cleanall`` target (`issue #4344 <https://github.com/platformio/platformio-core/issues/4344>`_)
* Warn about calling "env.BuildSources" in a POST-type script (`issue #4385 <https://github.com/platformio/platformio-core/issues/4385>`_)
* Fixed an issue when escaping macros/defines for IDE integration (`issue #4360 <https://github.com/platformio/platformio-core/issues/4360>`_)
* Fixed an issue when the "cleanall" target removes dependencies from all working environments (`issue #4386 <https://github.com/platformio/platformio-core/issues/4386>`_)
6.1.3 (2022-07-18)
~~~~~~~~~~~~~~~~~~
* Fixed a regression bug when opening device monitor without any filters (`issue #4363 <https://github.com/platformio/platformio-core/issues/4363>`_)
6.1.2 (2022-07-18)
~~~~~~~~~~~~~~~~~~
* Export a ``PIO_UNIT_TESTING`` macro to the project source files and dependent libraries in the |UNITTESTING| mode
* Improved detection of Windows architecture (`issue #4353 <https://github.com/platformio/platformio-core/issues/4353>`_)
* Warn about unknown `device monitor filters <https://docs.platformio.org/en/latest/core/userguide/device/cmd_monitor.html#filters>`__ (`issue #4362 <https://github.com/platformio/platformio-core/issues/4362>`_)
* Fixed a regression bug when `libArchive <https://docs.platformio.org/en/latest/manifests/library-json/fields/build/libarchive.html>`__ option declared in the |LIBRARYJSON| manifest was ignored (`issue #4351 <https://github.com/platformio/platformio-core/issues/4351>`_)
* Fixed an issue when the `pio pkg publish <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_publish.html>`__ command didn't work with Python 3.6 (`issue #4352 <https://github.com/platformio/platformio-core/issues/4352>`_)
6.1.1 (2022-07-11)
~~~~~~~~~~~~~~~~~~
* Added new ``monitor_encoding`` project configuration option to configure `Device Monitor <https://docs.platformio.org/en/latest/core/userguide/device/cmd_monitor.html>`__ (`issue #4350 <https://github.com/platformio/platformio-core/issues/4350>`_)
* Allowed specifying project environments for `pio ci <https://docs.platformio.org/en/latest/core/userguide/cmd_ci.html>`__ command (`issue #4347 <https://github.com/platformio/platformio-core/issues/4347>`_)
* Show "TimeoutError" only in the verbose mode when can not find a serial port
* Fixed an issue when a serial port was not automatically detected if the board has predefined HWIDs
* Fixed an issue with endless scanning of project dependencies (`issue #4349 <https://github.com/platformio/platformio-core/issues/4349>`_)
* Fixed an issue with |LDF| when incompatible libraries were used for the working project environment with the missed framework (`pull #4346 <https://github.com/platformio/platformio-core/pull/4346>`_)
6.1.0 (2022-07-06)
~~~~~~~~~~~~~~~~~~
* **Device Manager**
- Automatically reconnect device monitor if a connection fails
- Added new `pio device monitor --no-reconnect <https://docs.platformio.org/en/latest/core/userguide/device/cmd_monitor.html#cmdoption-pio-device-monitor-no-reconnect>`__ option to disable automatic reconnection
- Handle device monitor disconnects more gracefully (`issue #3939 <https://github.com/platformio/platformio-core/issues/3939>`_)
- Improved a serial port finder for `Black Magic Probe <https://docs.platformio.org/en/latest/plus/debug-tools/blackmagic.html>`__ (`issue #4023 <https://github.com/platformio/platformio-core/issues/4023>`_)
- Improved a serial port finder for a board with predefined HWIDs
- Replaced ``monitor_flags`` with independent project configuration options: `monitor_parity <https://docs.platformio.org/en/latest/projectconf/section_env_monitor.html#monitor-parity>`__, `monitor_eol <https://docs.platformio.org/en/latest/projectconf/section_env_monitor.html#monitor-eol>`__, `monitor_raw <https://docs.platformio.org/en/latest/projectconf/section_env_monitor.html#monitor-raw>`__, `monitor_echo <https://docs.platformio.org/en/latest/projectconf/section_env_monitor.html#monitor-echo>`__
- Fixed an issue when the monitor filters were not applied in their order (`issue #4320 <https://github.com/platformio/platformio-core/issues/4320>`_)
* **Unit Testing**
- Updated "Getting Started" documentation for `GoogleTest <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/googletest.html>`__ testing and mocking framework
- Export |UNITTESTING| flags only to the project build environment (``projenv``, files in "src" folder)
- Merged the "building" stage with "uploading" for the embedded target (`issue #4307 <https://github.com/platformio/platformio-core/issues/4307>`_)
- Do not resolve dependencies from the project "src" folder when the `test_build_src <https://docs.platformio.org/en/latest//projectconf/section_env_test.html#test-build-src>`__ option is not enabled
- Do not immediately terminate a testing program when results are received
- Fixed an issue when a custom `pio test --project-config <https://docs.platformio.org/en/latest/core/userguide/cmd_test.html#cmdoption-pio-test-c>`__ was not handled properly (`issue #4299 <https://github.com/platformio/platformio-core/issues/4299>`_)
- Fixed an issue when testing results were wrong in the verbose mode (`issue #4336 <https://github.com/platformio/platformio-core/issues/4336>`_)
* **Build System**
- Significantly improved support for `Pre & Post Actions <https://docs.platformio.org/en/latest/scripting/actions.html>`__
* Allowed to declare actions in the `PRE-type scripts <https://docs.platformio.org/en/latest/scripting/launch_types.html>`__ even if the target is not ready yet
* Allowed library maintainers to use Pre & Post Actions in the library `extraScript <https://docs.platformio.org/en/latest/manifests/library-json/fields/build/extrascript.html>`__
- Documented `Stringification <https://docs.platformio.org/en/latest/projectconf/section_env_build.html#stringification>`__ – converting a macro argument into a string constant (`issue #4310 <https://github.com/platformio/platformio-core/issues/4310>`_)
- Added new `pio run --monitor-port <https://docs.platformio.org/en/latest/core/userguide/cmd_run.html#cmdoption-pio-run-monitor-port>`__ option to specify custom device monitor port to the ``monitor`` target (`issue #4337 <https://github.com/platformio/platformio-core/issues/4337>`_)
- Added ``env.StringifyMacro(value)`` helper function for the `Advanced Scripting <https://docs.platformio.org/en/latest/scripting/index.html>`__
- Allowed to ``Import("projenv")`` in a library extra script (`issue #4305 <https://github.com/platformio/platformio-core/issues/4305>`_)
- Fixed an issue when the `build_unflags <https://docs.platformio.org/en/latest/projectconf/section_env_build.html#build-unflags>`__ operation ignores a flag value (`issue #4309 <https://github.com/platformio/platformio-core/issues/4309>`_)
- Fixed an issue when the `build_unflags <https://docs.platformio.org/en/latest/projectconf/section_env_build.html#build-unflags>`__ option was not applied to the ``ASPPFLAGS`` scope
- Fixed an issue on Windows OS when flags were wrapped to the temporary file while generating the `Compilation database "compile_commands.json" <https://docs.platformio.org/en/latest/integration/compile_commands.html>`__
- Fixed an issue with the |LDF| when recursively scanning dependencies in the ``chain`` mode
- Fixed a "PermissionError" on Windows when running "clean" or "cleanall" targets (`issue #4331 <https://github.com/platformio/platformio-core/issues/4331>`_)
* **Package Management**
- Fixed an issue when library dependencies were installed for the incompatible project environment (`issue #4338 <https://github.com/platformio/platformio-core/issues/4338>`_)
* **Miscellaneous**
- Warn about incompatible Bash version for the `Shell Completion <https://docs.platformio.org/en/latest/core/userguide/system/completion/index.html>`__ (`issue #4326 <https://github.com/platformio/platformio-core/issues/4326>`_)
6.0.2 (2022-06-01)
~~~~~~~~~~~~~~~~~~
* Control |UNITTESTING| verbosity with a new multilevel `pio test -v <https://docs.platformio.org/en/latest/core/userguide/cmd_test.html#cmdoption-pio-test-v>`__ command option (`issue #4276 <https://github.com/platformio/platformio-core/issues/4276>`_)
* Follow symbolic links during searching for the unit test suites (`issue #4288 <https://github.com/platformio/platformio-core/issues/4288>`_)
* Show a warning when testing an empty project without a test suite (`issue #4278 <https://github.com/platformio/platformio-core/issues/4278>`_)
* Improved support for `Asking for input (prompts) <https://docs.platformio.org/en/latest/scripting/examples/asking_for_input.html>`_
* Fixed an issue when the `build_src_flags <https://docs.platformio.org/en/latest/projectconf/section_env_build.html#build-src-flags>`__ option was applied outside the project scope (`issue #4277 <https://github.com/platformio/platformio-core/issues/4277>`_)
* Fixed an issue with debugging assembly files without preprocessor (".s")
6.0.1 (2022-05-17)
~~~~~~~~~~~~~~~~~~
* Improved support for the renamed configuration options (`issue #4270 <https://github.com/platformio/platformio-core/issues/4270>`_)
* Fixed an issue when calling the built-in `pio device monitor <https://docs.platformio.org/en/latest/core/userguide/device/cmd_monitor.html#filters>`__ filters
* Fixed an issue when using |INTERPOLATION| and merging str+int options (`issue #4271 <https://github.com/platformio/platformio-core/issues/4271>`_)
6.0.0 (2022-05-16)
~~~~~~~~~~~~~~~~~~
Please check the `Migration guide from 5.x to 6.0 <https://docs.platformio.org/en/latest/core/migration.html>`__.
* **Package Management**
- New unified Package Management CLI (``pio pkg``):
* `pio pkg exec <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_exec.html>`_ - run command from package tool (`issue #4163 <https://github.com/platformio/platformio-core/issues/4163>`_)
* `pio pkg install <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_install.html>`_ - install the project dependencies or custom packages
* `pio pkg list <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_list.html>`__ - list installed packages
* `pio pkg outdated <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_outdated.html>`__ - check for project outdated packages
* `pio pkg search <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_search.html>`__ - search for packages
* `pio pkg show <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_show.html>`__ - show package information
* `pio pkg uninstall <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_uninstall.html>`_ - uninstall the project dependencies or custom packages
* `pio pkg update <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_update.html>`__ - update the project dependencies or custom packages
- Package Manifest
* Added support for `"scripts" <https://docs.platformio.org/en/latest/librarymanager/config.html#scripts>`__ (`issue #485 <https://github.com/platformio/platformio-core/issues/485>`_)
* Added support for `multi-licensed <https://docs.platformio.org/en/latest/librarymanager/config.html#license>`__ packages using SPDX Expressions (`issue #4037 <https://github.com/platformio/platformio-core/issues/4037>`_)
* Added support for `"dependencies" <https://docs.platformio.org/en/latest/librarymanager/config.html#dependencies>`__ declared in a "tool" package manifest
- Added support for `symbolic links <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_install.html#local-folder>`__ allowing pointing the local source folder to the Package Manager (`issue #3348 <https://github.com/platformio/platformio-core/issues/3348>`_)
- Automatically install dependencies of the local (private) project libraries (`issue #2910 <https://github.com/platformio/platformio-core/issues/2910>`_)
- Improved detection of a package type from the tarball archive (`issue #3828 <https://github.com/platformio/platformio-core/issues/3828>`_)
- Ignore files according to the patterns declared in ".gitignore" when using the `pio package pack <https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_pack.html>`__ command (`issue #4188 <https://github.com/platformio/platformio-core/issues/4188>`_)
- Dropped automatic updates of global libraries and development platforms (`issue #4179 <https://github.com/platformio/platformio-core/issues/4179>`_)
- Dropped support for the "pythonPackages" field in "platform.json" manifest in favor of `Extra Python Dependencies <https://docs.platformio.org/en/latest/scripting/examples/extra_python_packages.html>`__
- Fixed an issue when manually removed dependencies from the |PIOCONF| were not uninstalled from the storage (`issue #3076 <https://github.com/platformio/platformio-core/issues/3076>`_)
* **Unit Testing**
- Refactored from scratch |UNITTESTING| solution and its documentation
- New: `Test Hierarchy <https://docs.platformio.org/en/latest/advanced/unit-testing/structure.html>`_ (`issue #4135 <https://github.com/platformio/platformio-core/issues/4135>`_)
- New: `Doctest <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/doctest.html>`__ testing framework (`issue #4240 <https://github.com/platformio/platformio-core/issues/4240>`_)
- New: `GoogleTest <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/googletest.html>`__ testing and mocking framework (`issue #3572 <https://github.com/platformio/platformio-core/issues/3572>`_)
- New: `Semihosting <https://docs.platformio.org/en/latest/advanced/unit-testing/semihosting.html>`__ (`issue #3516 <https://github.com/platformio/platformio-core/issues/3516>`_)
- New: Hardware `Simulators <https://docs.platformio.org/en/latest/advanced/unit-testing/simulators/index.html>`__ for Unit Testing (QEMU, Renode, SimAVR, and custom solutions)
- New: ``test`` `build configuration <https://docs.platformio.org/en/latest/projectconf/build_configurations.html>`__
- Added support for a `custom testing framework <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/custom/index.html>`_
- Added support for a custom `testing command <https://docs.platformio.org/en/latest/projectconf/section_env_test.html#test-testing-command>`__
- Added support for a `custom Unity library <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/custom/examples/custom_unity_library.html>`__ (`issue #3980 <https://github.com/platformio/platformio-core/issues/3980>`_)
- Added support for the ``socket://`` and ``rfc2217://`` protocols using `test_port <https://docs.platformio.org/en/latest/projectconf/section_env_test.html#test-port>`__ option (`issue #4229 <https://github.com/platformio/platformio-core/issues/4229>`_)
- List available project tests with a new `pio test --list-tests <https://docs.platformio.org/en/latest/core/userguide/cmd_test.html#cmdoption-pio-test-list-tests>`__ option
- Pass extra arguments to the testing program with a new `pio test --program-arg <https://docs.platformio.org/en/latest/core/userguide/cmd_test.html#cmdoption-pio-test-a>`__ option (`issue #3132 <https://github.com/platformio/platformio-core/issues/3132>`_)
- Generate reports in JUnit and JSON formats using the `pio test <https://docs.platformio.org/en/latest/core/userguide/cmd_test.html>`__ command (`issue #2891 <https://github.com/platformio/platformio-core/issues/2891>`_)
- Provide more information when the native program crashed on a host (errored with a non-zero return code) (`issue #3429 <https://github.com/platformio/platformio-core/issues/3429>`_)
- Improved automatic detection of a testing serial port (`issue #4076 <https://github.com/platformio/platformio-core/issues/4076>`_)
- Fixed an issue when command line parameters (``--ignore``, ``--filter``) do not override values defined in the |PIOCONF| (`issue #3845 <https://github.com/platformio/platformio-core/issues/3845>`_)
- Renamed the "test_build_project_src" project configuration option to the `test_build_src <https://docs.platformio.org/en/latest//projectconf/section_env_test.html#test-build-src>`__
- Removed the "test_transport" option in favor of the `Custom "unity_config.h" <https://docs.platformio.org/en/latest/advanced/unit-testing/frameworks/unity.html>`_
* **Static Code Analysis**
- Updated analysis tools:
* `Cppcheck <https://docs.platformio.org/en/latest/plus/check-tools/cppcheck.html>`__ v2.7 with various checker improvements and fixed false positives
* `PVS-Studio <https://docs.platformio.org/en/latest/plus/check-tools/pvs-studio.html>`__ v7.18 with improved and updated semantic analysis system
- Added support for the custom `Clang-Tidy <https://docs.platformio.org/en/latest/plus/check-tools/clang-tidy.html>`__ configuration file (`issue #4186 <https://github.com/platformio/platformio-core/issues/4186>`_)
- Added ability to override a tool version using the `platform_packages <https://docs.platformio.org/en/latest/projectconf/section_env_platform.html#platform-packages>`__ option (`issue #3798 <https://github.com/platformio/platformio-core/issues/3798>`_)
- Fixed an issue with improper handling of defects that don't specify a source file (`issue #4237 <https://github.com/platformio/platformio-core/issues/4237>`_)
* **Build System**
- Show project dependency licenses when building in the verbose mode
- Fixed an issue when |LDF| ignores the project `lib_deps <https://docs.platformio.org/en/latest/projectconf/section_env_library.html#lib-deps>`__ while resolving library dependencies (`issue #3598 <https://github.com/platformio/platformio-core/issues/3598>`_)
- Fixed an issue with calling an extra script located outside a project (`issue #4220 <https://github.com/platformio/platformio-core/issues/4220>`_)
- Fixed an issue when GCC preprocessor was applied to the ".s" assembly files on case-sensitive OS such as Window OS (`issue #3917 <https://github.com/platformio/platformio-core/issues/3917>`_)
- Fixed an issue when |LDF| ignores `build_src_flags <https://docs.platformio.org/en/latest/projectconf/section_env_build.html#build-src-flags>`__ in the "deep+" mode (`issue #4253 <https://github.com/platformio/platformio-core/issues/4253>`_)
* **Integration**
- Added a new build variable (``COMPILATIONDB_INCLUDE_TOOLCHAIN``) to include toolchain paths in the compilation database (`issue #3735 <https://github.com/platformio/platformio-core/issues/3735>`_)
- Changed a default path for compilation database `compile_commands.json <https://docs.platformio.org/en/latest/integration/compile_commands.html>`__ to the project root
- Enhanced integration for Qt Creator (`issue #3046 <https://github.com/platformio/platformio-core/issues/3046>`_)
* **Project Configuration**
- Extended |INTERPOLATION| with ``${this}`` pattern (`issue #3953 <https://github.com/platformio/platformio-core/issues/3953>`_)
- Embed environment name of the current section in the |PIOCONF| using ``${this.__env__}`` pattern
- Renamed the "src_build_flags" project configuration option to the `build_src_flags <https://docs.platformio.org/en/latest/projectconf/section_env_build.html#build-src-flags>`__
- Renamed the "src_filter" project configuration option to the `build_src_filter <https://docs.platformio.org/en/latest/projectconf/section_env_build.html#build-src-filter>`__
* **Miscellaneous**
- Pass extra arguments to the `native <https://docs.platformio.org/en/latest/platforms/native.html>`__ program with a new `pio run --program-arg <https://docs.platformio.org/en/latest/core/userguide/cmd_run.html#cmdoption-pio-run-a>`__ option (`issue #4246 <https://github.com/platformio/platformio-core/issues/4246>`_)
- Improved PIO Remote setup on credit-card sized computers (Raspberry Pi, BeagleBon, etc) (`issue #3865 <https://github.com/platformio/platformio-core/issues/3865>`_)
- Finally removed all tracks to the Python 2.7, the Python 3.6 is the minimum supported version.
.. _release_notes_5:
PlatformIO Core 5
-----------------
See `PlatformIO Core 5.0 history <https://github.com/platformio/platformio-core/blob/v5.2.5/HISTORY.rst>`__.
.. _release_notes_4:
PlatformIO Core 4
-----------------
See `PlatformIO Core 4.0 history <https://github.com/platformio/platformio-core/blob/v4.3.4/HISTORY.rst>`__.
PlatformIO Core 3
-----------------
See `PlatformIO Core 3.0 history <https://github.com/platformio/platformio-core/blob/v3.6.7/HISTORY.rst>`__.
PlatformIO Core 2
-----------------
See `PlatformIO Core 2.0 history <https://github.com/platformio/platformio-core/blob/v2.11.2/HISTORY.rst>`__.
PlatformIO Core 1
-----------------
See `PlatformIO Core 1.0 history <https://github.com/platformio/platformio-core/blob/v1.5.0/HISTORY.rst>`__.
PlatformIO Core Preview
-----------------------
See `PlatformIO Core Preview history <https://github.com/platformio/platformio-core/blob/v0.10.2/HISTORY.rst>`__.
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
================================================
FILE: Makefile
================================================
lint:
pylint --rcfile=./.pylintrc ./tests
pylint --rcfile=./.pylintrc ./platformio
isort:
isort ./platformio
isort ./tests
format:
black ./platformio
black ./tests
codespell:
codespell --skip "./build,./docs/_build" -L "AtLeast,TRE,ans,dout,homestate,ser"
test:
pytest --verbose --exitfirst -n 6 --dist=loadscope tests --ignore tests/test_examples.py
before-commit: codespell isort format lint
clean-docs:
rm -rf docs/_build
clean: clean-docs
find . -name \*.pyc -delete
find . -name __pycache__ -delete
rm -rf .cache
rm -rf build
rm -rf htmlcov
rm -f .coverage
profile:
# Usage $ > make PIOARGS="boards" profile
python -m cProfile -o .tox/.tmp/cprofile.prof -m platformio ${PIOARGS}
snakeviz .tox/.tmp/cprofile.prof
pack:
python setup.py sdist
publish:
python setup.py sdist upload
================================================
FILE: README.rst
================================================
PlatformIO Core
===============
.. image:: https://github.com/platformio/platformio-core/workflows/Core/badge.svg
:target: https://docs.platformio.org/en/latest/core/index.html
:alt: CI Build for PlatformIO Core
.. image:: https://github.com/platformio/platformio-core/workflows/Docs/badge.svg
:target: https://docs.platformio.org?utm_source=github&utm_medium=core
:alt: CI Build for Docs
.. image:: https://github.com/platformio/platformio-core/workflows/Examples/badge.svg
:target: https://github.com/platformio/platformio-examples
:alt: CI Build for dev-platform examples
.. image:: https://github.com/platformio/platformio-core/workflows/Projects/badge.svg
:target: https://docs.platformio.org/en/latest/tutorials/index.html#projects
:alt: CI Build for the Community Projects
.. image:: https://img.shields.io/pypi/v/platformio.svg
:target: https://pypi.python.org/pypi/platformio/
:alt: Latest Version
.. image:: https://img.shields.io/badge/PlatformIO-Labs-orange.svg
:alt: PlatformIO Labs
:target: https://piolabs.com/?utm_source=github&utm_medium=core
**Quick Links:** `Homepage <https://platformio.org?utm_source=github&utm_medium=core>`_ |
`PlatformIO IDE <https://platformio.org/platformio-ide?utm_source=github&utm_medium=core>`_ |
`Registry <https://registry.platformio.org?utm_source=github&utm_medium=core>`_ |
`Project Examples <https://github.com/platformio/platformio-examples/>`__ |
`Docs <https://docs.platformio.org?utm_source=github&utm_medium=core>`_ |
`Donate <https://platformio.org/donate?utm_source=github&utm_medium=core>`_ |
`Contact Us <https://piolabs.com/?utm_source=github&utm_medium=core>`_
**Social:** `LinkedIn <https://www.linkedin.com/company/platformio/>`_ |
`Twitter <https://twitter.com/PlatformIO_Org>`_ |
`Facebook <https://www.facebook.com/platformio>`_ |
`Community Forums <https://community.platformio.org?utm_source=github&utm_medium=core>`_
.. image:: https://raw.githubusercontent.com/platformio/platformio-web/develop/app/images/platformio-ide-laptop.png
:target: https://platformio.org?utm_source=github&utm_medium=core
`PlatformIO <https://platformio.org>`_: Your Gateway to Embedded Software Development Excellence.
Unlock the true potential of embedded software development with
PlatformIO's collaborative ecosystem, embracing declarative principles,
test-driven methodologies, and modern toolchains for unrivaled success.
* Open source, maximum permissive Apache 2.0 license
* Cross-platform IDE and Unified Debugger
* Static Code Analyzer and Remote Unit Testing
* Multi-platform and Multi-architecture Build System
* Firmware File Explorer and Memory Inspection
Get Started
-----------
* `What is PlatformIO? <https://docs.platformio.org/en/latest/what-is-platformio.html?utm_source=github&utm_medium=core>`_
* `PlatformIO IDE <https://platformio.org/platformio-ide?utm_source=github&utm_medium=core>`_
* `PlatformIO Core (CLI) <https://docs.platformio.org/en/latest/core.html?utm_source=github&utm_medium=core>`_
* `Project Examples <https://github.com/platformio/platformio-examples?utm_source=github&utm_medium=core>`__
Solutions
---------
* `Library Management <https://docs.platformio.org/en/latest/librarymanager/index.html?utm_source=github&utm_medium=core>`_
* `Desktop IDEs Integration <https://docs.platformio.org/en/latest/ide.html?utm_source=github&utm_medium=core>`_
* `Continuous Integration <https://docs.platformio.org/en/latest/ci/index.html?utm_source=github&utm_medium=core>`_
**Advanced**
* `Debugging <https://docs.platformio.org/en/latest/plus/debugging.html?utm_source=github&utm_medium=core>`_
* `Unit Testing <https://docs.platformio.org/en/latest/advanced/unit-testing/index.html?utm_source=github&utm_medium=core>`_
* `Static Code Analysis <https://docs.platformio.org/en/latest/plus/pio-check.html?utm_source=github&utm_medium=core>`_
* `Remote Development <https://docs.platformio.org/en/latest/plus/pio-remote.html?utm_source=github&utm_medium=core>`_
Registry
--------
* `Libraries <https://registry.platformio.org/search?t=library&utm_source=github&utm_medium=core>`_
* `Development Platforms <https://registry.platformio.org/search?t=platform&utm_source=github&utm_medium=core>`_
* `Development Tools <https://registry.platformio.org/search?t=tool&utm_source=github&utm_medium=core>`_
Contributing
------------
See `contributing guidelines <https://github.com/platformio/platformio/blob/develop/CONTRIBUTING.md>`_.
Telemetry / Privacy Policy
--------------------------
Share minimal diagnostics and usage information to help us make PlatformIO better.
It is enabled by default. For more information see:
* `Telemetry Setting <https://docs.platformio.org/en/latest/userguide/cmd_settings.html?utm_source=github&utm_medium=core#enable-telemetry>`_
License
-------
Copyright (c) 2014-present PlatformIO <contact@platformio.org>
The PlatformIO is licensed under the permissive Apache 2.0 license,
so you can use it in both commercial and personal projects with confidence.
.. image:: https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg
:target: https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md
:alt: SWUbanner
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
We are committed to ensuring the security and protection of PlatformIO Core.
To this end, we support only the following versions:
| Version | Supported |
| ------- | ------------------ |
| 6.1.x | :white_check_mark: |
| < 6.1 | :x: |
Unsupported versions of the PlatformIO Core may have known vulnerabilities or security issues that could compromise the security of our organization's systems and data.
Therefore, it is important that all developers use only supported versions of the PlatformIO Core.
## Reporting a Vulnerability
We take the security of our systems and data very seriously. We encourage responsible disclosure of any vulnerabilities or security issues that you may find in our systems or applications. If you believe you have discovered a vulnerability, please report it to us immediately.
To report a vulnerability, please send an email to our security team at contact@piolabs.com. Please include as much information as possible, including:
- A description of the vulnerability and how it can be exploited
- Steps to reproduce the vulnerability
- Any additional information that can help us understand and reproduce the vulnerability
Once we receive your report, our security team will acknowledge receipt within 24 hours and will work to validate the reported vulnerability. We will provide periodic updates on the progress of the vulnerability assessment, and will notify you once a fix has been deployed.
If the vulnerability is accepted, we will work to remediate the issue as quickly as possible. We may also provide credit or recognition to the individual who reported the vulnerability, at our discretion.
If the vulnerability is declined, we will provide a justification for our decision and may offer guidance on how to improve the report or how to test the system more effectively.
Please note that we will not take any legal action against individuals who report vulnerabilities in good faith and in accordance with this policy.
Thank you for helping us keep our systems and data secure.
================================================
FILE: platformio/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
VERSION = (6, 1, "20a2")
__version__ = ".".join([str(s) for s in VERSION])
__title__ = "platformio"
__description__ = (
"Your Gateway to Embedded Software Development Excellence. "
"Unlock the true potential of embedded software development "
"with PlatformIO's collaborative ecosystem, embracing "
"declarative principles, test-driven methodologies, and "
"modern toolchains for unrivaled success."
)
__url__ = "https://platformio.org"
__author__ = "PlatformIO Labs"
__email__ = "contact@piolabs.com"
__license__ = "Apache Software License"
__copyright__ = "Copyright 2014-present PlatformIO Labs"
__accounts_api__ = "https://api.accounts.platformio.org"
__registry_mirror_hosts__ = [
"registry.platformio.org",
"registry.nm1.platformio.org",
]
__pioremote_endpoint__ = "ssl:host=remote.platformio.org:port=4413"
__check_internet_hosts__ = [
"185.199.110.153", # Github.com
"88.198.170.159", # platformio.org
"github.com",
] + __registry_mirror_hosts__
================================================
FILE: platformio/__main__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
import traceback
import click
from platformio import __version__, exception, maintenance
from platformio.cli import PlatformioCLI
from platformio.compat import IS_CYGWIN, ensure_python3
@click.command(
cls=PlatformioCLI, context_settings=dict(help_option_names=["-h", "--help"])
)
@click.version_option(__version__, prog_name="PlatformIO Core")
@click.option("--force", "-f", is_flag=True, help="DEPRECATED", hidden=True)
@click.option("--caller", "-c", help="Caller ID (service)")
@click.option("--no-ansi", is_flag=True, help="Do not print ANSI control characters")
@click.pass_context
def cli(ctx, force, caller, no_ansi): # pylint: disable=unused-argument
try:
if (
no_ansi
or str(
os.getenv("PLATFORMIO_NO_ANSI", os.getenv("PLATFORMIO_DISABLE_COLOR"))
).lower()
== "true"
):
# pylint: disable=protected-access
click._compat.isatty = lambda stream: False
elif (
str(
os.getenv("PLATFORMIO_FORCE_ANSI", os.getenv("PLATFORMIO_FORCE_COLOR"))
).lower()
== "true"
):
# pylint: disable=protected-access
click._compat.isatty = lambda stream: True
except: # pylint: disable=bare-except
pass
maintenance.on_cmd_start(ctx, caller)
@cli.result_callback()
@click.pass_context
def process_result(*_, **__):
maintenance.on_cmd_end()
def configure():
if IS_CYGWIN:
raise exception.CygwinEnvDetected()
# https://urllib3.readthedocs.org
# /en/latest/security.html#insecureplatformwarning
try:
import urllib3 # pylint: disable=import-outside-toplevel
urllib3.disable_warnings()
except (AttributeError, ImportError):
pass
# Handle IOError issue with VSCode's Terminal (Windows)
click_echo_origin = [click.echo, click.secho]
def _safe_echo(origin, *args, **kwargs):
try:
click_echo_origin[origin](*args, **kwargs)
except IOError:
(sys.stderr.write if kwargs.get("err") else sys.stdout.write)(
"%s\n" % (args[0] if args else "")
)
click.echo = lambda *args, **kwargs: _safe_echo(0, *args, **kwargs)
click.secho = lambda *args, **kwargs: _safe_echo(1, *args, **kwargs)
def main(argv=None):
exit_code = 0
prev_sys_argv = sys.argv[:]
if argv:
assert isinstance(argv, list)
sys.argv = argv
try:
ensure_python3(raise_exception=True)
configure()
cli() # pylint: disable=no-value-for-parameter
except SystemExit as exc:
if exc.code and str(exc.code).isdigit():
exit_code = int(exc.code)
except Exception as exc: # pylint: disable=broad-except
if not isinstance(exc, exception.ReturnErrorCode):
maintenance.on_platformio_exception(exc)
error_str = f"{exc.__class__.__name__}: "
if isinstance(exc, exception.PlatformioException):
error_str += str(exc)
else:
error_str += traceback.format_exc()
error_str += """
============================================================
An unexpected error occurred. Further steps:
* Verify that you have the latest version of PlatformIO using
`python -m pip install -U platformio` command
* Try to find answer in FAQ Troubleshooting section
https://docs.platformio.org/page/faq/index.html
* Report this problem to the developers
https://github.com/platformio/platformio-core/issues
============================================================
"""
click.secho(error_str, fg="red", err=True)
exit_code = int(str(exc)) if str(exc).isdigit() else 1
maintenance.on_platformio_exit()
sys.argv = prev_sys_argv
return exit_code
def debug_gdb_main():
return main([sys.argv[0], "debug", "--interface", "gdb"] + sys.argv[1:])
if __name__ == "__main__":
sys.exit(main())
================================================
FILE: platformio/account/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
================================================
FILE: platformio/account/cli.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.commands.destroy import account_destroy_cmd
from platformio.account.commands.forgot import account_forgot_cmd
from platformio.account.commands.login import account_login_cmd
from platformio.account.commands.logout import account_logout_cmd
from platformio.account.commands.password import account_password_cmd
from platformio.account.commands.register import account_register_cmd
from platformio.account.commands.show import account_show_cmd
from platformio.account.commands.token import account_token_cmd
from platformio.account.commands.update import account_update_cmd
@click.group(
"account",
commands=[
account_destroy_cmd,
account_forgot_cmd,
account_login_cmd,
account_logout_cmd,
account_password_cmd,
account_register_cmd,
account_show_cmd,
account_token_cmd,
account_update_cmd,
],
short_help="Manage PlatformIO account",
)
def cli():
pass
================================================
FILE: platformio/account/client.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import time
from platformio import __accounts_api__, app
from platformio.exception import PlatformioException, UserSideException
from platformio.http import HTTPClient, HTTPClientError
class AccountError(PlatformioException):
MESSAGE = "{0}"
class AccountNotAuthorized(AccountError, UserSideException):
MESSAGE = "You are not authorized! Please log in to PlatformIO Account."
class AccountAlreadyAuthorized(AccountError, UserSideException):
MESSAGE = "You are already authorized with {0} account."
class AccountClient(HTTPClient): # pylint:disable=too-many-public-methods
SUMMARY_CACHE_TTL = 60 * 60 * 24 * 7
def __init__(self):
super().__init__(__accounts_api__)
@staticmethod
def get_refresh_token():
try:
return app.get_state_item("account").get("auth").get("refresh_token")
except Exception as exc:
raise AccountNotAuthorized() from exc
@staticmethod
def delete_local_session():
app.delete_state_item("account")
@staticmethod
def delete_local_state(key):
account = app.get_state_item("account")
if not account or key not in account:
return
del account[key]
app.set_state_item("account", account)
def fetch_json_data(self, *args, **kwargs):
try:
return super().fetch_json_data(*args, **kwargs)
except HTTPClientError as exc:
raise AccountError(exc) from exc
def fetch_authentication_token(self):
if os.environ.get("PLATFORMIO_AUTH_TOKEN"):
return os.environ.get("PLATFORMIO_AUTH_TOKEN")
auth = app.get_state_item("account", {}).get("auth", {})
if auth.get("access_token") and auth.get("access_token_expire"):
if auth.get("access_token_expire") > time.time():
return auth.get("access_token")
if auth.get("refresh_token"):
try:
data = self.fetch_json_data(
"post",
"/v1/login",
headers={
"Authorization": "Bearer %s" % auth.get("refresh_token")
},
)
app.set_state_item("account", data)
return data.get("auth").get("access_token")
except AccountError:
self.delete_local_session()
raise AccountNotAuthorized()
def login(self, username, password):
try:
self.fetch_authentication_token()
except: # pylint:disable=bare-except
pass
else:
raise AccountAlreadyAuthorized(
app.get_state_item("account", {}).get("email", "")
)
data = self.fetch_json_data(
"post",
"/v1/login",
data={"username": username, "password": password},
)
app.set_state_item("account", data)
return data
def login_with_code(self, client_id, code, redirect_uri):
try:
self.fetch_authentication_token()
except: # pylint:disable=bare-except
pass
else:
raise AccountAlreadyAuthorized(
app.get_state_item("account", {}).get("email", "")
)
result = self.fetch_json_data(
"post",
"/v1/login/code",
data={"client_id": client_id, "code": code, "redirect_uri": redirect_uri},
)
app.set_state_item("account", result)
return result
def logout(self):
refresh_token = self.get_refresh_token()
self.delete_local_session()
try:
self.fetch_json_data(
"post",
"/v1/logout",
data={"refresh_token": refresh_token},
)
except AccountError:
pass
return True
def change_password(self, old_password, new_password):
return self.fetch_json_data(
"post",
"/v1/password",
data={"old_password": old_password, "new_password": new_password},
x_with_authorization=True,
)
def registration(
self, username, email, password, firstname, lastname
): # pylint: disable=too-many-arguments,too-many-positional-arguments
try:
self.fetch_authentication_token()
except: # pylint:disable=bare-except
pass
else:
raise AccountAlreadyAuthorized(
app.get_state_item("account", {}).get("email", "")
)
return self.fetch_json_data(
"post",
"/v1/registration",
data={
"username": username,
"email": email,
"password": password,
"firstname": firstname,
"lastname": lastname,
},
)
def auth_token(self, password, regenerate):
return self.fetch_json_data(
"post",
"/v1/token",
data={"password": password, "regenerate": 1 if regenerate else 0},
x_with_authorization=True,
).get("auth_token")
def forgot_password(self, username):
return self.fetch_json_data(
"post",
"/v1/forgot",
data={"username": username},
)
def get_profile(self):
return self.fetch_json_data(
"get",
"/v1/profile",
x_with_authorization=True,
)
def update_profile(self, profile, current_password):
profile["current_password"] = current_password
self.delete_local_state("summary")
response = self.fetch_json_data(
"put",
"/v1/profile",
data=profile,
x_with_authorization=True,
)
return response
def get_account_info(self, offline=False):
account = app.get_state_item("account") or {}
if (
account.get("summary")
and account["summary"].get("expire_at", 0) > time.time()
):
return account["summary"]
if offline and account.get("email"):
return {
"profile": {
"email": account.get("email"),
"username": account.get("username"),
}
}
result = self.fetch_json_data(
"get",
"/v1/summary",
x_with_authorization=True,
)
account["summary"] = dict(
profile=result.get("profile"),
packages=result.get("packages"),
subscriptions=result.get("subscriptions"),
user_id=result.get("user_id"),
expire_at=int(time.time()) + self.SUMMARY_CACHE_TTL,
)
app.set_state_item("account", account)
return result
def get_logged_username(self):
return self.get_account_info(offline=True).get("profile").get("username")
def destroy_account(self):
return self.fetch_json_data(
"delete",
"/v1/account",
x_with_authorization=True,
)
def create_org(self, orgname, email, displayname):
return self.fetch_json_data(
"post",
"/v1/orgs",
data={"orgname": orgname, "email": email, "displayname": displayname},
x_with_authorization=True,
)
def get_org(self, orgname):
return self.fetch_json_data(
"get",
"/v1/orgs/%s" % orgname,
x_with_authorization=True,
)
def list_orgs(self):
return self.fetch_json_data(
"get",
"/v1/orgs",
x_with_authorization=True,
)
def update_org(self, orgname, data):
return self.fetch_json_data(
"put",
"/v1/orgs/%s" % orgname,
data={k: v for k, v in data.items() if v},
x_with_authorization=True,
)
def destroy_org(self, orgname):
return self.fetch_json_data(
"delete",
"/v1/orgs/%s" % orgname,
x_with_authorization=True,
)
def add_org_owner(self, orgname, username):
return self.fetch_json_data(
"post",
"/v1/orgs/%s/owners" % orgname,
data={"username": username},
x_with_authorization=True,
)
def list_org_owners(self, orgname):
return self.fetch_json_data(
"get",
"/v1/orgs/%s/owners" % orgname,
x_with_authorization=True,
)
def remove_org_owner(self, orgname, username):
return self.fetch_json_data(
"delete",
"/v1/orgs/%s/owners" % orgname,
params={"username": username},
x_with_authorization=True,
)
def create_team(self, orgname, teamname, description):
return self.fetch_json_data(
"post",
"/v1/orgs/%s/teams" % orgname,
data={"name": teamname, "description": description},
x_with_authorization=True,
)
def destroy_team(self, orgname, teamname):
return self.fetch_json_data(
"delete",
"/v1/orgs/%s/teams/%s" % (orgname, teamname),
x_with_authorization=True,
)
def get_team(self, orgname, teamname):
return self.fetch_json_data(
"get",
"/v1/orgs/%s/teams/%s" % (orgname, teamname),
x_with_authorization=True,
)
def list_teams(self, orgname):
return self.fetch_json_data(
"get",
"/v1/orgs/%s/teams" % orgname,
x_with_authorization=True,
)
def update_team(self, orgname, teamname, data):
return self.fetch_json_data(
"put",
"/v1/orgs/%s/teams/%s" % (orgname, teamname),
data={k: v for k, v in data.items() if v},
x_with_authorization=True,
)
def add_team_member(self, orgname, teamname, username):
return self.fetch_json_data(
"post",
"/v1/orgs/%s/teams/%s/members" % (orgname, teamname),
data={"username": username},
x_with_authorization=True,
)
def remove_team_member(self, orgname, teamname, username):
return self.fetch_json_data(
"delete",
"/v1/orgs/%s/teams/%s/members" % (orgname, teamname),
params={"username": username},
x_with_authorization=True,
)
================================================
FILE: platformio/account/commands/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
================================================
FILE: platformio/account/commands/destroy.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient, AccountNotAuthorized
@click.command("destroy", short_help="Destroy account")
def account_destroy_cmd():
client = AccountClient()
click.confirm(
"Are you sure you want to delete the %s user account?\n"
"Warning! All linked data will be permanently removed and can not be restored."
% client.get_logged_username(),
abort=True,
)
client.destroy_account()
try:
client.logout()
except AccountNotAuthorized:
pass
click.secho(
"User account has been destroyed.",
fg="green",
)
================================================
FILE: platformio/account/commands/forgot.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
@click.command("forgot", short_help="Forgot password")
@click.option("--username", prompt="Username or email")
def account_forgot_cmd(username):
client = AccountClient()
client.forgot_password(username)
click.secho(
"If this account is registered, we will send the "
"further instructions to your email.",
fg="green",
)
================================================
FILE: platformio/account/commands/login.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
@click.command("login", short_help="Log in to PlatformIO Account")
@click.option("-u", "--username", prompt="Username or email")
@click.option("-p", "--password", prompt=True, hide_input=True)
def account_login_cmd(username, password):
client = AccountClient()
client.login(username, password)
click.secho("Successfully logged in!", fg="green")
================================================
FILE: platformio/account/commands/logout.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
@click.command("logout", short_help="Log out of PlatformIO Account")
def account_logout_cmd():
client = AccountClient()
client.logout()
click.secho("Successfully logged out!", fg="green")
================================================
FILE: platformio/account/commands/password.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
@click.command("password", short_help="Change password")
@click.option("--old-password", prompt=True, hide_input=True)
@click.option("--new-password", prompt=True, hide_input=True, confirmation_prompt=True)
def account_password_cmd(old_password, new_password):
client = AccountClient()
client.change_password(old_password, new_password)
click.secho("Password successfully changed!", fg="green")
================================================
FILE: platformio/account/commands/register.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
from platformio.account.validate import (
validate_email,
validate_password,
validate_username,
)
@click.command("register", short_help="Create new PlatformIO Account")
@click.option(
"-u",
"--username",
prompt=True,
callback=lambda _, __, value: validate_username(value),
)
@click.option(
"-e", "--email", prompt=True, callback=lambda _, __, value: validate_email(value)
)
@click.option(
"-p",
"--password",
prompt=True,
hide_input=True,
confirmation_prompt=True,
callback=lambda _, __, value: validate_password(value),
)
@click.option("--firstname", prompt=True)
@click.option("--lastname", prompt=True)
def account_register_cmd(username, email, password, firstname, lastname):
client = AccountClient()
client.registration(username, email, password, firstname, lastname)
click.secho(
"An account has been successfully created. "
"Please check your mail to activate your account and verify your email address.",
fg="green",
)
================================================
FILE: platformio/account/commands/show.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import click
from tabulate import tabulate
from platformio import util
from platformio.account.client import AccountClient
@click.command("show", short_help="PlatformIO Account information")
@click.option("--offline", is_flag=True)
@click.option("--json-output", is_flag=True)
def account_show_cmd(offline, json_output):
client = AccountClient()
info = client.get_account_info(offline)
if json_output:
click.echo(json.dumps(info))
return
click.echo()
if info.get("profile"):
print_profile(info["profile"])
if info.get("packages"):
print_packages(info["packages"])
if info.get("subscriptions"):
print_subscriptions(info["subscriptions"])
click.echo()
def print_profile(profile):
click.secho("Profile", fg="cyan", bold=True)
click.echo("=" * len("Profile"))
data = []
if profile.get("username"):
data.append(("Username:", profile["username"]))
if profile.get("email"):
data.append(("Email:", profile["email"]))
if profile.get("firstname"):
data.append(("First name:", profile["firstname"]))
if profile.get("lastname"):
data.append(("Last name:", profile["lastname"]))
click.echo(tabulate(data, tablefmt="plain"))
def print_packages(packages):
click.echo()
click.secho("Packages", fg="cyan")
click.echo("=" * len("Packages"))
for package in packages:
click.echo()
click.secho(package.get("name"), bold=True)
click.echo("-" * len(package.get("name")))
if package.get("description"):
click.echo(package.get("description"))
data = []
expire = "-"
if "subscription" in package:
expire = util.parse_datetime(
package["subscription"].get("end_at")
or package["subscription"].get("next_bill_at")
).strftime("%Y-%m-%d")
data.append(("Expire:", expire))
services = []
for key in package:
if not key.startswith("service."):
continue
if isinstance(package[key], dict):
services.append(package[key].get("title"))
else:
services.append(package[key])
if services:
data.append(("Services:", ", ".join(services)))
click.echo(tabulate(data, tablefmt="plain"))
def print_subscriptions(subscriptions):
click.echo()
click.secho("Subscriptions", fg="cyan")
click.echo("=" * len("Subscriptions"))
for subscription in subscriptions:
click.echo()
click.secho(subscription.get("product_name"), bold=True)
click.echo("-" * len(subscription.get("product_name")))
data = [("State:", subscription.get("status"))]
begin_at = util.parse_datetime(subscription.get("begin_at")).strftime("%c")
data.append(("Start date:", begin_at or "-"))
end_at = subscription.get("end_at")
if end_at:
end_at = util.parse_datetime(subscription.get("end_at")).strftime("%c")
data.append(("End date:", end_at or "-"))
next_bill_at = subscription.get("next_bill_at")
if next_bill_at:
next_bill_at = util.parse_datetime(
subscription.get("next_bill_at")
).strftime("%c")
data.append(("Next payment:", next_bill_at or "-"))
data.append(
("Edit:", click.style(subscription.get("update_url"), fg="blue") or "-")
)
data.append(
("Cancel:", click.style(subscription.get("cancel_url"), fg="blue") or "-")
)
click.echo(tabulate(data, tablefmt="plain"))
================================================
FILE: platformio/account/commands/token.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import click
from platformio.account.client import AccountClient
@click.command("token", short_help="Get or regenerate Authentication Token")
@click.option("-p", "--password", prompt=True, hide_input=True)
@click.option("--regenerate", is_flag=True)
@click.option("--json-output", is_flag=True)
def account_token_cmd(password, regenerate, json_output):
client = AccountClient()
auth_token = client.auth_token(password, regenerate)
if json_output:
click.echo(json.dumps({"status": "success", "result": auth_token}))
return
click.secho("Personal Authentication Token: %s" % auth_token, fg="green")
================================================
FILE: platformio/account/commands/update.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient, AccountNotAuthorized
from platformio.account.validate import validate_email, validate_username
@click.command("update", short_help="Update profile information")
@click.option("--current-password", prompt=True, hide_input=True)
@click.option("--username")
@click.option("--email")
@click.option("--firstname")
@click.option("--lastname")
def account_update_cmd(current_password, **kwargs):
client = AccountClient()
profile = client.get_profile()
new_profile = profile.copy()
if not any(kwargs.values()):
for field in profile:
new_profile[field] = click.prompt(
field.replace("_", " ").capitalize(), default=profile[field]
)
if field == "email":
validate_email(new_profile[field])
if field == "username":
validate_username(new_profile[field])
else:
new_profile.update({key: value for key, value in kwargs.items() if value})
client.update_profile(new_profile, current_password)
click.secho("Profile successfully updated!", fg="green")
username_changed = new_profile["username"] != profile["username"]
email_changed = new_profile["email"] != profile["email"]
if not username_changed and not email_changed:
return None
try:
client.logout()
except AccountNotAuthorized:
pass
if email_changed:
click.secho(
"Please check your mail to verify your new email address and re-login. ",
fg="yellow",
)
return None
click.secho("Please re-login.", fg="yellow")
return None
================================================
FILE: platformio/account/org/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
================================================
FILE: platformio/account/org/cli.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.org.commands.add import org_add_cmd
from platformio.account.org.commands.create import org_create_cmd
from platformio.account.org.commands.destroy import org_destroy_cmd
from platformio.account.org.commands.list import org_list_cmd
from platformio.account.org.commands.remove import org_remove_cmd
from platformio.account.org.commands.update import org_update_cmd
@click.group(
"account",
commands=[
org_add_cmd,
org_create_cmd,
org_destroy_cmd,
org_list_cmd,
org_remove_cmd,
org_update_cmd,
],
short_help="Manage organizations",
)
def cli():
pass
================================================
FILE: platformio/account/org/commands/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
================================================
FILE: platformio/account/org/commands/add.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
@click.command("add", short_help="Add a new owner to organization")
@click.argument(
"orgname",
)
@click.argument(
"username",
)
def org_add_cmd(orgname, username):
client = AccountClient()
client.add_org_owner(orgname, username)
return click.secho(
"The new owner `%s` has been successfully added to the `%s` organization."
% (username, orgname),
fg="green",
)
================================================
FILE: platformio/account/org/commands/create.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
from platformio.account.validate import validate_email, validate_orgname
@click.command("create", short_help="Create a new organization")
@click.argument(
"orgname",
callback=lambda _, __, value: validate_orgname(value),
)
@click.option(
"--email", callback=lambda _, __, value: validate_email(value) if value else value
)
@click.option(
"--displayname",
)
def org_create_cmd(orgname, email, displayname):
client = AccountClient()
client.create_org(orgname, email, displayname)
return click.secho(
"The organization `%s` has been successfully created." % orgname,
fg="green",
)
================================================
FILE: platformio/account/org/commands/destroy.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
@click.command("destroy", short_help="Destroy organization")
@click.argument("orgname")
def org_destroy_cmd(orgname):
client = AccountClient()
click.confirm(
"Are you sure you want to delete the `%s` organization account?\n"
"Warning! All linked data will be permanently removed and can not be restored."
% orgname,
abort=True,
)
client.destroy_org(orgname)
return click.secho(
"Organization `%s` has been destroyed." % orgname,
fg="green",
)
================================================
FILE: platformio/account/org/commands/list.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import click
from tabulate import tabulate
from platformio.account.client import AccountClient
@click.command("list", short_help="List organizations and their members")
@click.option("--json-output", is_flag=True)
def org_list_cmd(json_output):
client = AccountClient()
orgs = client.list_orgs()
if json_output:
return click.echo(json.dumps(orgs))
if not orgs:
return click.echo("You do not have any organization")
for org in orgs:
click.echo()
click.secho(org.get("orgname"), fg="cyan")
click.echo("-" * len(org.get("orgname")))
data = []
if org.get("displayname"):
data.append(("Display Name:", org.get("displayname")))
if org.get("email"):
data.append(("Email:", org.get("email")))
data.append(
(
"Owners:",
", ".join((owner.get("username") for owner in org.get("owners"))),
)
)
click.echo(tabulate(data, tablefmt="plain"))
return click.echo()
================================================
FILE: platformio/account/org/commands/remove.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
@click.command("remove", short_help="Remove an owner from organization")
@click.argument(
"orgname",
)
@click.argument(
"username",
)
def org_remove_cmd(orgname, username):
client = AccountClient()
client.remove_org_owner(orgname, username)
return click.secho(
"The `%s` owner has been successfully removed from the `%s` organization."
% (username, orgname),
fg="green",
)
================================================
FILE: platformio/account/org/commands/update.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
from platformio.account.validate import validate_email, validate_orgname
@click.command("update", short_help="Update organization")
@click.argument("cur_orgname")
@click.option(
"--orgname",
callback=lambda _, __, value: validate_orgname(value) if value else value,
help="A new orgname",
)
@click.option(
"--email",
callback=lambda _, __, value: validate_email(value) if value else value,
)
@click.option("--displayname")
def org_update_cmd(cur_orgname, **kwargs):
client = AccountClient()
org = client.get_org(cur_orgname)
new_org = {
key: value if value is not None else org[key] for key, value in kwargs.items()
}
if not any(kwargs.values()):
for key in kwargs:
new_org[key] = click.prompt(key.capitalize(), default=org[key])
if key == "email":
validate_email(new_org[key])
if key == "orgname":
validate_orgname(new_org[key])
client.update_org(cur_orgname, new_org)
return click.secho(
"The organization `%s` has been successfully updated." % cur_orgname,
fg="green",
)
================================================
FILE: platformio/account/team/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
================================================
FILE: platformio/account/team/cli.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.team.commands.add import team_add_cmd
from platformio.account.team.commands.create import team_create_cmd
from platformio.account.team.commands.destroy import team_destroy_cmd
from platformio.account.team.commands.list import team_list_cmd
from platformio.account.team.commands.remove import team_remove_cmd
from platformio.account.team.commands.update import team_update_cmd
@click.group(
"team",
commands=[
team_add_cmd,
team_create_cmd,
team_destroy_cmd,
team_list_cmd,
team_remove_cmd,
team_update_cmd,
],
short_help="Manage organization teams",
)
def cli():
pass
================================================
FILE: platformio/account/team/commands/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
================================================
FILE: platformio/account/team/commands/add.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
from platformio.account.validate import validate_orgname_teamname
@click.command("add", short_help="Add a new member to team")
@click.argument(
"orgname_teamname",
metavar="ORGNAME:TEAMNAME",
callback=lambda _, __, value: validate_orgname_teamname(value),
)
@click.argument(
"username",
)
def team_add_cmd(orgname_teamname, username):
orgname, teamname = orgname_teamname.split(":", 1)
client = AccountClient()
client.add_team_member(orgname, teamname, username)
return click.secho(
"The new member %s has been successfully added to the %s team."
% (username, teamname),
fg="green",
)
================================================
FILE: platformio/account/team/commands/create.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
from platformio.account.validate import validate_orgname_teamname
@click.command("create", short_help="Create a new team")
@click.argument(
"orgname_teamname",
metavar="ORGNAME:TEAMNAME",
callback=lambda _, __, value: validate_orgname_teamname(value),
)
@click.option(
"--description",
)
def team_create_cmd(orgname_teamname, description):
orgname, teamname = orgname_teamname.split(":", 1)
client = AccountClient()
client.create_team(orgname, teamname, description)
return click.secho(
"The team %s has been successfully created." % teamname,
fg="green",
)
================================================
FILE: platformio/account/team/commands/destroy.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
from platformio.account.validate import validate_orgname_teamname
@click.command("destroy", short_help="Destroy a team")
@click.argument(
"orgname_teamname",
metavar="ORGNAME:TEAMNAME",
callback=lambda _, __, value: validate_orgname_teamname(value),
)
def team_destroy_cmd(orgname_teamname):
orgname, teamname = orgname_teamname.split(":", 1)
click.confirm(
click.style(
"Are you sure you want to destroy the %s team?" % teamname, fg="yellow"
),
abort=True,
)
client = AccountClient()
client.destroy_team(orgname, teamname)
return click.secho(
"The team %s has been successfully destroyed." % teamname,
fg="green",
)
================================================
FILE: platformio/account/team/commands/list.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import click
from tabulate import tabulate
from platformio.account.client import AccountClient
@click.command("list", short_help="List teams")
@click.argument("orgname", required=False)
@click.option("--json-output", is_flag=True)
def team_list_cmd(orgname, json_output):
client = AccountClient()
data = {}
if not orgname:
for item in client.list_orgs():
teams = client.list_teams(item.get("orgname"))
data[item.get("orgname")] = teams
else:
teams = client.list_teams(orgname)
data[orgname] = teams
if json_output:
return click.echo(json.dumps(data[orgname] if orgname else data))
if not any(data.values()):
return click.secho("You do not have any teams.", fg="yellow")
for org_name, teams in data.items():
for team in teams:
click.echo()
click.secho("%s:%s" % (org_name, team.get("name")), fg="cyan")
click.echo("-" * len("%s:%s" % (org_name, team.get("name"))))
table_data = []
if team.get("description"):
table_data.append(("Description:", team.get("description")))
table_data.append(
(
"Members:",
(
", ".join(
(member.get("username") for member in team.get("members"))
)
if team.get("members")
else "-"
),
)
)
click.echo(tabulate(table_data, tablefmt="plain"))
return click.echo()
================================================
FILE: platformio/account/team/commands/remove.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
from platformio.account.validate import validate_orgname_teamname
@click.command("remove", short_help="Remove a member from team")
@click.argument(
"orgname_teamname",
metavar="ORGNAME:TEAMNAME",
callback=lambda _, __, value: validate_orgname_teamname(value),
)
@click.argument("username")
def team_remove_cmd(orgname_teamname, username):
orgname, teamname = orgname_teamname.split(":", 1)
client = AccountClient()
client.remove_team_member(orgname, teamname, username)
return click.secho(
"The %s member has been successfully removed from the %s team."
% (username, teamname),
fg="green",
)
================================================
FILE: platformio/account/team/commands/update.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
from platformio.account.client import AccountClient
from platformio.account.validate import validate_orgname_teamname, validate_teamname
@click.command("update", short_help="Update team")
@click.argument(
"orgname_teamname",
metavar="ORGNAME:TEAMNAME",
callback=lambda _, __, value: validate_orgname_teamname(value),
)
@click.option(
"--name",
callback=lambda _, __, value: validate_teamname(value) if value else value,
help="A new team name",
)
@click.option(
"--description",
)
def team_update_cmd(orgname_teamname, **kwargs):
orgname, teamname = orgname_teamname.split(":", 1)
client = AccountClient()
team = client.get_team(orgname, teamname)
new_team = {
key: value if value is not None else team[key] for key, value in kwargs.items()
}
if not any(kwargs.values()):
for key in kwargs:
new_team[key] = click.prompt(key.capitalize(), default=team[key])
if key == "name":
validate_teamname(new_team[key])
client.update_team(orgname, teamname, new_team)
return click.secho(
"The team %s has been successfully updated." % teamname,
fg="green",
)
================================================
FILE: platformio/account/validate.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import re
import click
def validate_username(value, field="username"):
value = str(value).strip() if value else None
if not value or not re.match(
r"^[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,37}$", value, flags=re.I
):
raise click.BadParameter(
"Invalid %s format. "
"%s must contain only alphanumeric characters "
"or single hyphens, cannot begin or end with a hyphen, "
"and must not be longer than 38 characters."
% (field.lower(), field.capitalize())
)
return value
def validate_orgname(value):
return validate_username(value, "Organization name")
def validate_email(value):
value = str(value).strip() if value else None
if not value or not re.match(
r"^[a-z\d_\.\+\-]+@[a-z\d\-]+\.[a-z\d\-\.]+$", value, flags=re.I
):
raise click.BadParameter("Invalid email address")
return value
def validate_password(value):
value = str(value).strip() if value else None
if not value or not re.match(r"^(?=.*[a-z])(?=.*\d).{8,}$", value):
raise click.BadParameter(
"Invalid password format. "
"Password must contain at least 8 characters"
" including a number and a lowercase letter"
)
return value
def validate_teamname(value):
value = str(value).strip() if value else None
if not value or not re.match(
r"^[a-z\d](?:[a-z\d]|[\-_ ](?=[a-z\d])){0,19}$", value, flags=re.I
):
raise click.BadParameter(
"Invalid team name format. "
"Team name must only contain alphanumeric characters, "
"single hyphens, underscores, spaces. It can not "
"begin or end with a hyphen or a underscore and must"
" not be longer than 20 characters."
)
return value
def validate_orgname_teamname(value):
value = str(value).strip() if value else None
if not value or ":" not in value:
raise click.BadParameter(
"Please specify organization and team name using the following"
" format - orgname:teamname. For example, mycompany:DreamTeam"
)
orgname, teamname = value.split(":", 1)
validate_orgname(orgname)
validate_teamname(teamname)
return value
================================================
FILE: platformio/app.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import getpass
import hashlib
import json
import os
import platform
import socket
import time
import uuid
from platformio import __version__, exception, fs, proc
from platformio.compat import IS_WINDOWS, hashlib_encode_data
from platformio.package.lockfile import LockFile
from platformio.project.config import ProjectConfig
from platformio.project.helpers import get_default_projects_dir
def projects_dir_validate(projects_dir):
assert os.path.isdir(projects_dir)
return os.path.abspath(projects_dir)
DEFAULT_SETTINGS = {
"check_platformio_interval": {
"description": "Check for the new PlatformIO Core interval (days)",
"value": 7,
},
"check_prune_system_threshold": {
"description": "Check for pruning unnecessary data threshold (megabytes)",
"value": 1024,
},
"enable_cache": {
"description": "Enable caching for HTTP API requests",
"value": True,
},
"enable_telemetry": {
"description": ("Telemetry service <https://bit.ly/pio-telemetry> (Yes/No)"),
"value": True,
},
"force_verbose": {
"description": "Force verbose output when processing environments",
"value": False,
},
"projects_dir": {
"description": "Default location for PlatformIO projects (PlatformIO Home)",
"value": get_default_projects_dir(),
"validator": projects_dir_validate,
},
"enable_proxy_strict_ssl": {
"description": "Verify the proxy server certificate against the list of supplied CAs",
"value": True,
},
}
SESSION_VARS = {
"command_ctx": None,
"caller_id": None,
"custom_project_conf": None,
"pause_telemetry": False,
}
def resolve_state_path(conf_option_dir, file_name, ensure_dir_exists=True):
state_dir = ProjectConfig.get_instance().get("platformio", conf_option_dir)
if ensure_dir_exists and not os.path.isdir(state_dir):
os.makedirs(state_dir)
return os.path.join(state_dir, file_name)
class State:
def __init__(self, path=None, lock=False):
self.path = path
self.lock = lock
if not self.path:
self.path = resolve_state_path("core_dir", "appstate.json")
self._storage = {}
self._lockfile = None
self.modified = False
def __enter__(self):
try:
self._lock_state_file()
if os.path.isfile(self.path):
self._storage = fs.load_json(self.path)
assert isinstance(self._storage, dict)
except (
AssertionError,
ValueError,
UnicodeDecodeError,
exception.InvalidJSONFile,
):
self._storage = {}
return self
def __exit__(self, type_, value, traceback):
if self.modified:
try:
with open(self.path, mode="w", encoding="utf8") as fp:
fp.write(json.dumps(self._storage))
except IOError as exc:
raise exception.HomeDirPermissionsError(
os.path.dirname(self.path)
) from exc
self._unlock_state_file()
def _lock_state_file(self):
if not self.lock:
return
self._lockfile = LockFile(self.path)
try:
self._lockfile.acquire()
except IOError as exc:
raise exception.HomeDirPermissionsError(os.path.dirname(self.path)) from exc
def _unlock_state_file(self):
if hasattr(self, "_lockfile") and self._lockfile:
self._lockfile.release()
def __del__(self):
self._unlock_state_file()
# Dictionary Proxy
def as_dict(self):
return self._storage
def keys(self):
return self._storage.keys()
def get(self, key, default=True):
return self._storage.get(key, default)
def update(self, *args, **kwargs):
self.modified = True
return self._storage.update(*args, **kwargs)
def clear(self):
return self._storage.clear()
def __getitem__(self, key):
return self._storage[key]
def __setitem__(self, key, value):
self.modified = True
self._storage[key] = value
def __delitem__(self, key):
self.modified = True
del self._storage[key]
def __contains__(self, item):
return item in self._storage
def sanitize_setting(name, value):
if name not in DEFAULT_SETTINGS:
raise exception.InvalidSettingName(name)
defdata = DEFAULT_SETTINGS[name]
try:
if "validator" in defdata:
value = defdata["validator"](value)
elif isinstance(defdata["value"], bool):
if not isinstance(value, bool):
value = str(value).lower() in ("true", "yes", "y", "1")
elif isinstance(defdata["value"], int):
value = int(value)
except Exception as exc:
raise exception.InvalidSettingValue(value, name) from exc
return value
def get_state_item(name, default=None):
with State() as state:
return state.get(name, default)
def set_state_item(name, value):
with State(lock=True) as state:
state[name] = value
state.modified = True
def delete_state_item(name):
with State(lock=True) as state:
if name in state:
del state[name]
def get_setting(name):
_env_name = "PLATFORMIO_SETTING_%s" % name.upper()
if _env_name in os.environ:
return sanitize_setting(name, os.getenv(_env_name))
with State() as state:
if "settings" in state and name in state["settings"]:
return state["settings"][name]
return DEFAULT_SETTINGS[name]["value"]
def set_setting(name, value):
with State(lock=True) as state:
if "settings" not in state:
state["settings"] = {}
state["settings"][name] = sanitize_setting(name, value)
state.modified = True
def reset_settings():
with State(lock=True) as state:
if "settings" in state:
del state["settings"]
def get_session_var(name, default=None):
return SESSION_VARS.get(name, default)
def set_session_var(name, value):
assert name in SESSION_VARS
SESSION_VARS[name] = value
def is_disabled_progressbar():
return os.getenv("PLATFORMIO_DISABLE_PROGRESSBAR") == "true"
def get_cid():
cid = get_state_item("cid")
if cid:
return cid
uid = None
if os.getenv("GITHUB_USER"):
uid = os.getenv("GITHUB_USER")
elif os.getenv("GITPOD_GIT_USER_NAME"):
uid = os.getenv("GITPOD_GIT_USER_NAME")
if not uid:
uid = uuid.getnode()
cid = uuid.UUID(bytes=hashlib.md5(hashlib_encode_data(uid)).digest())
cid = str(cid)
if IS_WINDOWS or os.getuid() > 0: # pylint: disable=no-member
set_state_item("cid", cid)
set_state_item("created_at", int(time.time()))
return cid
def get_project_id(project_dir):
return hashlib.sha1(hashlib_encode_data(project_dir)).hexdigest()
def get_user_agent():
data = [
"PlatformIO/%s" % __version__,
"CI/%d" % int(proc.is_ci()),
"Container/%d" % int(proc.is_container()),
]
if get_session_var("caller_id"):
data.append("Caller/%s" % get_session_var("caller_id"))
if os.getenv("PLATFORMIO_IDE"):
data.append("IDE/%s" % os.getenv("PLATFORMIO_IDE"))
data.append("Python/%s" % platform.python_version())
data.append("Platform/%s" % platform.platform())
if not get_setting("enable_telemetry"):
data.append("Telemetry/0")
return " ".join(data)
def get_host_id():
h = hashlib.sha1(hashlib_encode_data(get_cid()))
try:
username = getpass.getuser()
h.update(hashlib_encode_data(username))
except: # pylint: disable=bare-except
pass
return h.hexdigest()
def get_host_name():
return str(socket.gethostname())[:255]
================================================
FILE: platformio/assets/schema/library.json
================================================
{
"$id": "https://example.com/library.json",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "library.json schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 50,
"description": "A name of a library.\nMust be unique in the PlatformIO Registry\nShould be slug style for simplicity, consistency, and compatibility. Example: HelloWorld\nCan contain a-z, digits, and dashes (but not start/end with them)\nConsecutive dashes and [:;/,@<>] chars are not allowed.",
"required": true
},
"version": {
"type": "string",
"maxLength": 20,
"description": "A version of a current library source code. Can contain a-z, digits, dots or dash and should be Semantic Versioning compatible.",
"required": true
},
"description": {
"type": "string",
"maxLength": 255,
"description": "The field helps users to identify and search for your library with a brief description. Describe the hardware devices (sensors, boards and etc.) which are suitable with it.",
"required": true
},
"keywords": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "array",
"items": {
"type": "string",
"maxLength": 255
}
}
],
"description": "Used for search by keyword. Helps to make your library easier to discover without people needing to know its name.\nThe keyword should be lowercased, can contain a-z, digits and dash (but not start/end with them). A list from the keywords can be specified with separator , or declared as Array.",
"required": true
},
"homepage": {
"type": "string",
"maxLength": 255,
"description": "Home page of a library (if is different from repository url).",
"required": false
},
"repository": {
"type": "object",
"properties": {
"type": {
"enum": [
"git",
"hg",
"svn"
],
"description": "only “git”, “hg” or “svn” are supported"
},
"url": {
"type": "string"
},
"branch": {
"type": "string",
"description": "if is not specified, default branch will be used. This field will be ignored if tag/release exists with the value of version."
}
},
"description": "The repository in which the source code can be found.",
"required": false
},
"authors": {
"anyOf": [
{
"type": "object",
"properties": {
"name": {
"type": "string",
"required": true,
"description": "Full name"
},
"email": {
"type": "string"
},
"url": {
"type": "string",
"description": "An author’s contact page"
},
"maintainer": {
"type": "boolean",
"description": "Specify “maintainer” status"
}
}
},
{
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"required": true,
"description": "Full name"
},
"email": {
"type": "string"
},
"url": {
"type": "string",
"description": "An author’s contact page"
},
"maintainer": {
"type": "boolean",
"description": "Specify “maintainer” status"
}
}
}
}
],
"description": "An author contact information\nIf authors field is not defined, PlatformIO will try to fetch data from VCS provider (Github, Gitlab, etc) if repository is declared.",
"required": false
},
"license": {
"type": "string",
"description": "A SPDX license ID or SPDX Expression. You can check the full list of SPDX license IDs (see “Identifier” column).",
"required": false
},
"frameworks": {
"anyOf": [
{
"type": "string",
"description": "espidf, freertos, *, etc'"
},
{
"type": "array",
"items": {
"type": "string",
"description": "espidf, freertos, *, etc'"
}
}
],
"description": "A list with compatible frameworks. The available framework names are defined in the Frameworks section.\nIf the library is compatible with the all frameworks, then do not declare this field or you use *",
"required": false
},
"platforms": {
"anyOf": [
{
"type": "string",
"description": "atmelavr, espressif8266, *, etc'"
},
{
"type": "array",
"items": {
"type": "string",
"description": "atmelavr, espressif8266, *, etc'"
}
}
],
"description": "A list with compatible development platforms. The available platform name are defined in Development Platforms section.\nIf the library is compatible with the all platforms, then do not declare this field or use *.\nPlatformIO does not check platforms for compatibility in default mode. See Compatibility Mode for details. If you need a strict checking for compatible platforms for a library, please set libCompatMode to strict.",
"required": false
},
"headers": {
"anyOf": [
{
"type": "string",
"description": "MyLibrary.h"
},
{
"type": "array",
"items": {
"type": "string",
"description": "FooCore.h, FooFeature.h"
}
}
],
"description": "A list of header files that can be included in a project source files using #include <...> directive.",
"required": false
},
"examples": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"base": {
"type": "string"
},
"files": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"description": "A list of example patterns.",
"required": "false"
},
"dependencies": {
"anyOf": [
{
"type": "object",
"properties": {
"owner": {
"type": "string",
"description": "an owner name (username) from the PlatformIO Registry"
},
"name": {
"type": "string",
"description": "library name"
},
"version": {
"type": "string",
"description": "Version Requirements or Package Specifications"
},
"frameworks": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "project compatible Frameworks"
},
"platforms": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": " project compatible Development Platforms"
}
}
},
{
"type": "array",
"items": {
"type": "object",
"properties": {
"owner": {
"type": "string",
"description": "an owner name (username) from the PlatformIO Registry"
},
"name": {
"type": "string",
"description": "library name"
},
"version": {
"type": "string",
"description": "Version Requirements or Package Specifications"
},
"frameworks": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "project compatible Frameworks"
},
"platforms": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": " project compatible Development Platforms"
}
}
}
}
],
"description": "A list of dependent libraries that will be automatically installed.",
"required": false
},
"export": {
"type": "object",
"properties": {
"include": {
"type": "array",
"items": {
"type": "string"
},
"description": "Export only files that matched declared patterns.\n* - matches everything\n? - matches any single character\n[seq] - matches any character in seq\n[!seq] - matches any character not in seq"
},
"exclude": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exclude the directories and files which match with exclude patterns."
}
},
"description": "This option is useful if you need to exclude extra data (test code, docs, images, PDFs, etc). It allows one to reduce the size of the final archive.\nTo check which files will be included in the final packages, please use pio pkg pack command.",
"required": false
},
"scripts": {
"type": "object",
"properties": {
"postinstall": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "runs a script AFTER the package has been installed.\nRun a custom Python script located in the package “scripts” folder AFTER the package is installed. Please note that you don’t need to specify a Python interpreter for Python scripts"
},
"preuninstall": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "runs a script BEFORE the package is removed.\nRun a custom Bash script BEFORE the package is uninstalled. The script is declared as a list of command arguments and is located at the root of a package"
}
},
"description": "Execute custom scripts during the special Package Management CLI life cycle events",
"required": false
},
"build": {
"type": "object",
"properties": {
"flags": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Extra flags to control preprocessing, compilation, assembly, and linking processes. More details build_flags.\nKeep in mind when operating with the -I flag (directories to be searched for header files). The path should be relative to the root directory where the library.json manifest is located."
},
"unflags": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Remove base/initial flags which were set by development platform. More details build_unflags."
},
"includeDir": {
"type": "string",
"description": "Custom directory to be searched for header files. A default value is include and means that folder is located at the root of a library.\nThe Library Dependency Finder (LDF) will pick a library automatically only when a project or other dependent libraries include any header file located in includeDir or srcDir.",
"required": false
},
"srcDir": {
"type": "string",
"description": "Custom location of library source code. A default value is src and means that folder is located in the root of a library.",
"required": "false"
},
"srcFilter": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Specify which source files should be included/excluded from build process. The path in filter should be relative to the srcDir option of a library.\nSee syntax for build_src_filter.\nPlease note that you can generate source filter “on-the-fly” using extraScript",
"required": false
},
"extraScript": {
"type": "string",
"description": "Launch extra script before a build process.",
"required": "false"
},
"libArchive": {
"type": "boolean",
"description": "Create an archive (*.a, static library) from the object files and link it into a firmware (program). This is default behavior of PlatformIO Build System (\"libArchive\": true).\nSetting \"libArchive\": false will instruct PlatformIO Build System to link object files directly (in-line). This could be useful if you need to override weak symbols defined in framework or other libraries.\nYou can disable library archiving globally using lib_archive option in “platformio.ini” (Project Configuration File).",
"required": "false"
},
"libLDFMode": {
"anyOf": [
{
"enum": [
"off"
],
"description": "“Manual mode”, does not process source files of a project and dependencies. Builds only the libraries that are specified in manifests (library.json, module.json) or using lib_deps option."
},
{
"enum": [
"chain"
],
"description": "[DEFAULT] Parses ALL C/C++ source files of the project and follows only by nested includes (#include ..., chain...) from the libraries. It also parses C, CC, CPP files from libraries which have the same name as included header file. Does not evaluate C/C++ Preprocessor conditional syntax."
},
{
"enum": [
"deep"
],
"description": "Parses ALL C/C++ source files of the project and parses ALL C/C++ source files of the each found dependency (recursively). Does not evaluate C/C++ Preprocessor conditional syntax."
},
{
"enum": [
"chain+"
],
"description": "The same behavior as for the chain but evaluates C/C++ Preprocessor conditional syntax."
},
{
"enum": [
"deep+"
],
"description": "The same behavior as for the deep but evaluates C/C++ Preprocessor conditional syntax."
}
],
"description": "Specify Library Dependency Finder Mode. See Dependency Finder Mode for details.",
"required": false
},
"libCompatMode": {
"type": "string",
"description": "Specify Library Compatibility Mode. See Compatibility Mode for details.",
"required": false
},
"builder": {
"anyOf": [
{
"enum": [
"PlatformIOLibBuilder"
],
"description": "Default Builder"
},
{
"enum": [
"ArduinoLibBuilder"
]
},
{
"enum": [
"MbedLibBuilder"
]
}
],
"description": "Override default PlatformIOLibBuilder with another builder.",
"required": false
}
},
"required": false
}
}
}
================================================
FILE: platformio/assets/system/99-platformio-udev.rules
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#####################################################################################
#
# INSTALLATION
#
# Please visit > https://docs.platformio.org/en/latest/core/installation/udev-rules.html
#
#####################################################################################
#
# Boards
#
# CP210X USB UART
ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea[67][013]", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="80a9", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# FT231XS USB UART
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# FX2348N USB UART
ATTRS{idVendor}=="0843", ATTRS{idProduct}=="5740", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Prolific Technology, Inc. PL2303 Serial Port
ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# QinHeng Electronics HL-340 USB-Serial adapter
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# QinHeng Electronics CH343 USB-Serial adapter
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d3", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# QinHeng Electronics CH9102 USB-Serial adapter
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Arduino boards
ATTRS{idVendor}=="2341", ATTRS{idProduct}=="[08][023]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="[08][02]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Arduino SAM-BA
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{MTP_NO_PROBE}="1"
# Digistump boards
ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Maple with DFU
ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="000[34]", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# USBtiny
ATTRS{idProduct}=="0c9f", ATTRS{idVendor}=="1781", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# USBasp V2.0
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Teensy boards
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789A]?", ENV{MTP_NO_PROBE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789ABCD]?", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", MODE:="0666"
# TI Stellaris Launchpad
ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TI MSP430 Launchpad
ATTRS{idVendor}=="0451", ATTRS{idProduct}=="f432", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# GD32V DFU Bootloader
ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# FireBeetle-ESP32
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7522", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Wio Terminal
ATTRS{idVendor}=="2886", ATTRS{idProduct}=="[08]02d", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Raspberry Pi Pico
ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="[01]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# AIR32F103
ATTRS{idVendor}=="0d28", ATTRS{idProduct}=="0204", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# STM32 virtual COM port
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
#
# Debuggers
#
# Black Magic Probe
SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic GDB Server", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic UART Port", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# opendous and estick
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Original FT232/FT245/FT2232/FT232H/FT4232
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="60[01][104]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# DISTORTEC JTAG-lock-pick Tiny 2
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TUMPA, TUMPA Lite
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a9[89]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# XDS100v2
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Xverve Signalyzer Tool (DT-USB-ST), Signalyzer LITE (DT-USB-SLITE)
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca[01]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TI/Luminary Stellaris Evaluation Board FTDI (several)
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcd[9a]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# egnite Turtelizer 2
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bdc8", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Section5 ICEbear
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c14[01]", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Amontec JTAGkey and JTAGkey-tiny
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="cff8", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TI ICDI
ATTRS{idVendor}=="0451", ATTRS{idProduct}=="c32a", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# STLink probes
ATTRS{idVendor}=="0483", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Hilscher NXHX Boards
ATTRS{idVendor}=="0640", ATTRS{idProduct}=="0028", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Hitex probes
ATTRS{idVendor}=="0640", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Altera USB Blaster
ATTRS{idVendor}=="09fb", ATTRS{idProduct}=="6001", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Amontec JTAGkey-HiSpeed
ATTRS{idVendor}=="0fbb", ATTRS{idProduct}=="1000", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# SEGGER J-Link
ATTRS{idVendor}=="1366", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Raisonance RLink
ATTRS{idVendor}=="138e", ATTRS{idProduct}=="9000", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Debug Board for Neo1973
ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5118", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Olimex probes
ATTRS{idVendor}=="15ba", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# USBprog with OpenOCD firmware
ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c63", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# TI/Luminary Stellaris In-Circuit Debug Interface (ICDI) Board
ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Marvell Sheevaplug
ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Keil Software, Inc. ULink
ATTRS{idVendor}=="c251", ATTRS{idProduct}=="2710", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# CMSIS-DAP compatible adapters
ATTRS{product}=="*CMSIS-DAP*", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Atmel AVR Dragon
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2107", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Espressif USB JTAG/serial debug unit
ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
# Zephyr framework USB CDC-ACM
ATTRS{idVendor}=="2fe3", ATTRS{idProduct}=="0100", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
================================================
FILE: platformio/builder/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
================================================
FILE: platformio/builder/main.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import os
import sys
from time import time
import click
from SCons.Script import ARGUMENTS # pylint: disable=import-error
from SCons.Script import COMMAND_LINE_TARGETS # pylint: disable=import-error
from SCons.Script import DEFAULT_TARGETS # pylint: disable=import-error
from SCons.Script import AllowSubstExceptions # pylint: disable=import-error
from SCons.Script import AlwaysBuild # pylint: disable=import-error
from SCons.Script import Default # pylint: disable=import-error
from SCons.Script import DefaultEnvironment # pylint: disable=import-error
from SCons.Script import Import # pylint: disable=import-error
from SCons.Script import Variables # pylint: disable=import-error
from platformio import app, fs
from platformio.platform.base import PlatformBase
from platformio.proc import get_pythonexe_path
from platformio.project.helpers import get_project_dir
AllowSubstExceptions(NameError)
# append CLI arguments to build environment
clivars = Variables(None)
clivars.AddVariables(
("BUILD_SCRIPT",),
("PROJECT_CONFIG",),
("PIOENV",),
("PIOTEST_RUNNING_NAME",),
("UPLOAD_PORT",),
("PROGRAM_ARGS",),
)
DEFAULT_ENV_OPTIONS = dict(
tools=[
"ar",
"cc",
"c++",
"link",
"piohooks",
"pioasm",
"piobuild",
"pioproject",
"pioplatform",
"piotest",
"piotarget",
"piolib",
"pioupload",
"piosize",
"pioino",
"piomisc",
"piointegration",
"piomaxlen",
],
toolpath=[os.path.join(fs.get_source_dir(), "builder", "tools")],
variables=clivars,
# Propagating External Environment
ENV=os.environ,
UNIX_TIME=int(time()),
BUILD_DIR=os.path.join("$PROJECT_BUILD_DIR", "$PIOENV"),
BUILD_SRC_DIR=os.path.join("$BUILD_DIR", "src"),
BUILD_TEST_DIR=os.path.join("$BUILD_DIR", "test"),
COMPILATIONDB_PATH=os.path.join("$PROJECT_DIR", "compile_commands.json"),
LIBPATH=["$BUILD_DIR"],
PROGNAME="program",
PROGPATH=os.path.join("$BUILD_DIR", "$PROGNAME$PROGSUFFIX"),
PROG_PATH="$PROGPATH", # deprecated
PYTHONEXE=get_pythonexe_path(),
)
# Declare command verbose messages
command_strings = dict(
ARCOM="Archiving",
LINKCOM="Linking",
RANLIBCOM="Indexing",
ASCOM="Compiling",
ASPPCOM="Compiling",
CCCOM="Compiling",
CXXCOM="Compiling",
)
if not int(ARGUMENTS.get("PIOVERBOSE", 0)):
for name, value in command_strings.items():
DEFAULT_ENV_OPTIONS["%sSTR" % name] = "%s $TARGET" % (value)
env = DefaultEnvironment(**DEFAULT_ENV_OPTIONS)
env.SConscriptChdir(False)
# Load variables from CLI
env.Replace(
**{
key: PlatformBase.decode_scons_arg(env[key])
for key in list(clivars.keys())
if key in env
}
)
# Setup project optional directories
config = env.GetProjectConfig()
app.set_session_var("custom_project_conf", config.path)
env.Replace(
PROJECT_DIR=get_project_dir(),
PROJECT_CORE_DIR=config.get("platformio", "core_dir"),
PROJECT_PACKAGES_DIR=config.get("platformio", "packages_dir"),
PROJECT_WORKSPACE_DIR=config.get("platformio", "workspace_dir"),
PROJECT_LIBDEPS_DIR=config.get("platformio", "libdeps_dir"),
PROJECT_INCLUDE_DIR=config.get("platformio", "include_dir"),
PROJECT_SRC_DIR=config.get("platformio", "src_dir"),
PROJECTSRC_DIR="$PROJECT_SRC_DIR", # legacy for dev/platform
PROJECT_TEST_DIR=config.get("platformio", "test_dir"),
PROJECT_DATA_DIR=config.get("platformio", "data_dir"),
PROJECTDATA_DIR="$PROJECT_DATA_DIR", # legacy for dev/platform
PROJECT_BUILD_DIR=config.get("platformio", "build_dir"),
BUILD_TYPE=env.GetBuildType(),
BUILD_CACHE_DIR=config.get("platformio", "build_cache_dir"),
LIBSOURCE_DIRS=[
config.get("platformio", "lib_dir"),
os.path.join("$PROJECT_LIBDEPS_DIR", "$PIOENV"),
config.get("platformio", "globallib_dir"),
],
)
if int(ARGUMENTS.get("ISATTY", 0)):
# pylint: disable=protected-access
click._compat.isatty = lambda stream: True
if env.subst("$BUILD_CACHE_DIR"):
if not os.path.isdir(env.subst("$BUILD_CACHE_DIR")):
os.makedirs(env.subst("$BUILD_CACHE_DIR"))
env.CacheDir("$BUILD_CACHE_DIR")
if not int(ARGUMENTS.get("PIOVERBOSE", 0)):
click.echo("Verbose mode can be enabled via `-v, --verbose` option")
if not os.path.isdir(env.subst("$BUILD_DIR")):
os.makedirs(env.subst("$BUILD_DIR"))
# Dynamically load dependent tools
if "compiledb" in COMMAND_LINE_TARGETS:
env.Tool("compilation_db")
env.LoadProjectOptions()
env.LoadPioPlatform()
env.SConsignFile(
os.path.join(
"$BUILD_CACHE_DIR" if env.subst("$BUILD_CACHE_DIR") else "$BUILD_DIR",
".sconsign%d%d" % (sys.version_info[0], sys.version_info[1]),
)
)
env.SConscript(env.GetExtraScripts("pre"), exports="env")
if env.IsCleanTarget():
env.CleanProject(fullclean=int(ARGUMENTS.get("FULLCLEAN", 0)))
env.Exit(0)
env.SConscript("$BUILD_SCRIPT")
if "UPLOAD_FLAGS" in env:
env.Prepend(UPLOADERFLAGS=["$UPLOAD_FLAGS"])
if env.GetProjectOption("upload_command"):
env.Replace(UPLOADCMD=env.GetProjectOption("upload_command"))
env.SConscript(env.GetExtraScripts("post"), exports="env")
##############################################################################
# Checking program size
if env.get("SIZETOOL") and not (
set(["nobuild", "sizedata"]) & set(COMMAND_LINE_TARGETS)
):
env.Depends("upload", "checkprogsize")
# Replace platform's "size" target with our
_new_targets = [t for t in DEFAULT_TARGETS if str(t) != "size"]
Default(None)
Default(_new_targets)
Default("checkprogsize")
if "compiledb" in COMMAND_LINE_TARGETS:
env.Alias("compiledb", env.CompilationDatabase("$COMPILATIONDB_PATH"))
# Print configured protocols
env.AddPreAction(
"upload",
env.VerboseAction(
lambda source, target, env: env.PrintUploadInfo(),
"Configuring upload protocol...",
),
)
AlwaysBuild(env.Alias("__debug", DEFAULT_TARGETS))
AlwaysBuild(env.Alias("__test", DEFAULT_TARGETS))
env.ProcessDelayedActions()
##############################################################################
if "envdump" in COMMAND_LINE_TARGETS:
click.echo(env.Dump())
env.Exit(0)
if env.IsIntegrationDump():
projenv = None
try:
Import("projenv")
except: # pylint: disable=bare-except
projenv = env
data = projenv.DumpIntegrationData(env)
# dump to file for the further reading by project.helpers.load_build_metadata
with open(
projenv.subst(os.path.join("$BUILD_DIR", "idedata.json")),
mode="w",
encoding="utf8",
) as fp:
json.dump(data, fp)
click.echo("\n%s\n" % json.dumps(data)) # pylint: disable=undefined-variable
env.Exit(0)
if "sizedata" in COMMAND_LINE_TARGETS:
AlwaysBuild(
env.Alias(
"sizedata",
DEFAULT_TARGETS,
env.VerboseAction(env.DumpSizeData, "Generating memory usage report..."),
)
)
Default("sizedata")
# issue #4604: process targets sequentially
for index, target in enumerate(
[t for t in COMMAND_LINE_TARGETS if not t.startswith("__")][1:]
):
env.Depends(target, COMMAND_LINE_TARGETS[index])
================================================
FILE: platformio/builder/tools/__init__.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
================================================
FILE: platformio/builder/tools/pioasm.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import SCons.Tool.asm # pylint: disable=import-error
#
# Resolve https://github.com/platformio/platformio-core/issues/3917
# Avoid forcing .S to bare assembly on Windows OS
#
if ".S" in SCons.Tool.asm.ASSuffixes:
SCons.Tool.asm.ASSuffixes.remove(".S")
if ".S" not in SCons.Tool.asm.ASPPSuffixes:
SCons.Tool.asm.ASPPSuffixes.append(".S")
generate = SCons.Tool.asm.generate
exists = SCons.Tool.asm.exists
================================================
FILE: platformio/builder/tools/piobuild.py
================================================
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import fnmatch
import os
import sys
from SCons import Builder, Util # pylint: disable=import-error
from SCons.Node import FS # pylint: disable=import-error
from SCons.Script import COMMAND_LINE_TARGETS # pylint: disable=import-error
from SCons.Script import AlwaysBuild # pylint: disable=import-error
from SCons.Script import DefaultEnvironment # pylint: disable=import-error
from SCons.Script import SConscript # pylint: disable=import-error
from platformio import __version__, fs
from platformio.compat import IS_MACOS, string_types
from platformio.package.version import pepver_to_semver
from platformio.proc import where_is_program
SRC_HEADER_EXT = ["h", "hpp"]
SRC_ASM_EXT = ["S", "spp", "SPP", "sx", "s", "asm", "ASM"]
SRC_C_EXT = ["c"]
SRC_CXX_EXT = ["cc", "cpp", "cxx", "c++"]
SRC_BUILD_EXT = SRC_C_EXT + SRC_CXX_EXT + SRC_ASM_EXT
SRC_FILTER_DEFAULT = ["+<*>", "-<.git%s>" % os.sep, "-<.svn%s>" % os.sep]
def scons_patched_match_splitext(path, suffixes=None):
"""Patch SCons Builder, append $OBJSUFFIX to the end of each target"""
tokens = Util.splitext(path)
if suffixes and tokens[1] and tokens[1] in suffixes:
return (path, tokens[1])
return tokens
def GetBuildType(env):
modes = []
if (
set(["__debug", "sizedata"]) # sizedata = for memory inspection
& set(COMMAND_LINE_TARGETS)
or env.GetProjectOption("build_type") == "debug"
):
modes.append("debug")
if "__test" in COMMAND_LINE_TARGETS or env.GetProjectOption("build_type") == "test":
modes.append("test")
return ", ".join(modes or ["release"])
def BuildProgram(env):
env.ProcessProgramDeps()
env.ProcessCompileDbToolchainOption()
env.ProcessProjectDeps()
# append into the beginning a main LD script
if env.get("LDSCRIPT_PATH") and not any("-Wl,-T" in f for f in env["LINKFLAGS"]):
env.Prepend(LINKFLAGS=["-T", env.subst("$LDSCRIPT_PATH")])
# enable "cyclic reference" for linker
if (
env.get("LIBS")
and env.GetCompilerType() == "gcc"
and (env.PioPlatform().is_embedded() or not IS_MACOS)
):
env.Prepend(_LIBFLAGS="-Wl,--start-group ")
env.Append(_LIBFLAGS=" -Wl,--end-group")
program = env.Program(env.subst("$PROGPATH"), env["PIOBUILDFILES"])
env.Replace(PIOMAINPROG=program)
AlwaysBuild(
env.Alias(
"checkprogsize",
program,
env.VerboseAction(env.CheckUploadSize, "Checking size $PIOMAINPROG"),
)
)
print("Building in %s mode" % env["BUILD_TYPE"])
return program
def ProcessProgramDeps(env):
def _append_pio_macros():
core_version = pepver_to_semver(__version__)
env.AppendUnique(
CPPDEFINES=[
(
"PLATFORMIO",
int(
"{0:02d}{1:02d}{2:02d}".format(
core_version.major, core_version.minor, core_version.patch
)
),
)
]
)
_append_pio_macros()
env.PrintConfiguration()
# process extra flags from board
if "BOARD" in env and "build.extra_flags" in env.BoardConfig():
env.ProcessFlags(env.BoardConfig().get("build.extra_flags"))
# apply user flags
env.ProcessFlags(env.get("BUILD_FLAGS"))
# process framework scripts
env.BuildFrameworks(env.get("PIOFRAMEWORK"))
if "debug" in env["BUILD_TYPE"]:
env.ConfigureDebugTarget()
# remove specified flags
env.ProcessUnFlags(env.get("BUILD_UNFLAGS"))
def ProcessCompileDbToolchainOption(env):
if "compiledb" not in COMMAND_LINE_TARGETS:
return
# Resolve absolute path of toolchain
for cmd in ("CC", "CXX", "AS"):
if cmd not in env:
continue
if os.path.isabs(env[cmd]) or '"' in env[cmd]:
continue
env[cmd] = where_is_program(env.subst("$%s" % cmd), env.subst("${ENV['PATH']}"))
if " " in env[cmd]: # issue #4998: Space in compilator path
env[cmd] = f'"{env[cmd]}"'
if env.get("COMPILATIONDB_INCLUDE_TOOLCHAIN"):
print("Warning! `COMPILATIONDB_INCLUDE_TOOLCHAIN` is scoping")
for scope, includes in env.DumpIntegrationIncludes().items():
if scope in ("toolchain",):
env.Append(CPPPATH=includes)
def ProcessProjectDeps(env):
plb = env.ConfigureProjectLibBuilder()
# prepend project libs to the beginning of list
env.Prepend(LIBS=plb.build())
# prepend extra linker related options from libs
env.PrependUnique(
**{
key: plb.env.get(key)
for key in ("LIBS", "LIBPATH", "LINKFLAGS")
if plb.env.get(key)
}
)
if "test" in env["BUILD_TYPE"]:
build_files_before_nums = len(env.get("PIOBUILDFILES", []))
plb.env.BuildSources(
"$BUILD_TEST_DIR", "$PROJECT_TEST_DIR", "$PIOTEST_SRC_FILTER"
)
if len(env.get("PIOBUILDFILES", [])) - build_files_before_nums < 1:
sys.stderr.write(
"Error: Nothing to build. Please put your test suites "
"to the '%s' folder\n" % env.subst("$PROJECT_TEST_DIR")
)
env.Exit(1)
if "test" not in env["BUILD_TYPE"] or env.GetProjectOption("test_build_src"):
plb.env.BuildSources(
"$BUILD_SRC_DIR", "$PROJECT_SRC_DIR", env.get("SRC_FILTER")
)
if not env.get("PIOBUILDFILES") and not COMMAND_LINE_TARGETS:
sys.stderr.write(
"Error: Nothing to build. Please put your source code files "
"to the '%s' folder\n" % env.subst("$PROJECT_SRC_DIR")
)
env.Exit(1)
def ParseFlagsExtended(env, flags): # pylint: disable=too-many-branches
if not isinstance(flags, list):
flags = [flags]
result = {}
for raw in flags:
for key, value in env.ParseFlags(str(raw)).items():
if key not in result:
result[key] = []
result[key].extend(value)
cppdefines = []
for item in result["CPPDEFINES"]:
if not Util.is_Sequence(item):
cppdefines.append(item)
continue
name, value = item[:2]
if '"' in value:
value = value.replace('"', '\\"')
elif value.isdigit():
value = int(value)
elif value.replace(".", "", 1).isdigit():
value = float(value)
cppdefines.append((name, value))
result["CPPDEFINES"] = cppdefines
# fix relative CPPPATH & LIBPATH
for k in ("CPPPATH", "LIBPATH"):
for i, p in enumerate(result.get(k, [])):
p = env.subst(p)
if os.path.isdir(p):
result[k][i] = os.path.abspath(p)
# fix relative LIBs
for i, l in enumerate(result.get("LIBS", [])):
if isinstance(l, FS.File):
result["LIBS"][i] = os.path.abspath(l.get_path())
# fix relative path for "-include"
for i, f in enumerate(result.get("CCFLAGS", [])):
if isinstance(f, tuple) and f[0] == "-include":
result["CCFLAGS"][i] = (f[0], env.subst(f[1].get_path()))
return result
def ProcessFlags(env, flags): # pylint: disable=too-many-branches
if not flags:
return
env.Append(**env.ParseFlagsExtended(flags))
# Cancel any previous definition of name, either built in or
# provided with a -U option // Issue #191
undefines = [
u
for u in env.get("CCFLAGS", [])
if isinstance(u, string_types) and u.startswith("-U")
]
if undefines:
for undef in undefines:
env["CCFLAGS"].remove(undef)
if undef[2:] in env["CPPDEFINES"]:
env["CPPDEFINES"].remove(undef[2:])
env.Append(_CPPDEFFLAGS=" %s" % " ".join(undefines))
def ProcessUnFlags(env, flags):
if not flags:
return
parsed = env.ParseFlagsExtended(flags)
unflag_scopes = tuple(set(["ASPPFLAGS"] + list(parsed.keys())))
for scope in unflag_scopes:
for unflags in parsed.values():
for unflag in unflags:
for current in list(env.get(scope, [])):
conditions = [
unflag == current,
not isinstance(unflag, (tuple, list))
and isinstance(current, (tuple, list))
and unflag == current[0],
]
if any(conditions):
env[scope].remove(current)
def StringifyMacro(env, value): # pylint: disable=unused-argument
return '\\"%s\\"' % value.replace('"', '\\\\\\"')
def MatchSourceFiles(env, src_dir, src_filter=None, src_exts=None):
src_filter = env.subst(src_filter) if src_filter else None
src_filter = src_filter or SRC_FILTER_DEFAULT
src_exts = src_exts or (SRC_BUILD_EXT + SRC_HEADER_EXT)
return fs.match_src_files(env.subst(src_dir), src_filter, src_exts)
def CollectBuildFiles(
env, variant_dir, src_dir, src_filter=None, duplicate=False
): # pylint: disable=too-many-locals
sources = []
variants = []
src_dir = env.subst(src_dir)
if src_dir.endswith(os.sep):
src_dir = src_dir[:-1]
for item in env.MatchSourceFiles(src_dir, src_filter, SRC_BUILD_EXT):
_reldir = os.path.dirname(item)
_src_dir = os.path.join(src_dir, _reldir) if _reldir else src_dir
_var_dir = os.path.join(variant_dir, _reldir) if _reldir else variant_dir
if _var_dir not in variants:
variants.append(_var_dir)
env.VariantDir(_var_dir, _src_dir, duplicate)
sources.append(env.File(os.path.join(_var_dir, os.path.basename(item))))
middlewares = env.get("__PIO_BUILD_MIDDLEWARES")
if not middlewares:
return sources
new_sources = []
for node in sources:
new_node = node
for callback, pattern in middlewares:
if pattern and not fnmatch.fnmatch(node.srcnode().get_path(), pattern):
continue
if callback.__code__.co_argcount == 2:
gitextract_4sox4ymo/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE.md │ └── workflows/ │ ├── core.yml │ ├── deployment.yml │ ├── docs.yml │ ├── examples.yml │ └── projects.yml ├── .gitignore ├── .gitmodules ├── .pylintrc ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── HISTORY.rst ├── LICENSE ├── Makefile ├── README.rst ├── SECURITY.md ├── platformio/ │ ├── __init__.py │ ├── __main__.py │ ├── account/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── client.py │ │ ├── commands/ │ │ │ ├── __init__.py │ │ │ ├── destroy.py │ │ │ ├── forgot.py │ │ │ ├── login.py │ │ │ ├── logout.py │ │ │ ├── password.py │ │ │ ├── register.py │ │ │ ├── show.py │ │ │ ├── token.py │ │ │ └── update.py │ │ ├── org/ │ │ │ ├── __init__.py │ │ │ ├── cli.py │ │ │ └── commands/ │ │ │ ├── __init__.py │ │ │ ├── add.py │ │ │ ├── create.py │ │ │ ├── destroy.py │ │ │ ├── list.py │ │ │ ├── remove.py │ │ │ └── update.py │ │ ├── team/ │ │ │ ├── __init__.py │ │ │ ├── cli.py │ │ │ └── commands/ │ │ │ ├── __init__.py │ │ │ ├── add.py │ │ │ ├── create.py │ │ │ ├── destroy.py │ │ │ ├── list.py │ │ │ ├── remove.py │ │ │ └── update.py │ │ └── validate.py │ ├── app.py │ ├── assets/ │ │ ├── schema/ │ │ │ └── library.json │ │ └── system/ │ │ └── 99-platformio-udev.rules │ ├── builder/ │ │ ├── __init__.py │ │ ├── main.py │ │ └── tools/ │ │ ├── __init__.py │ │ ├── pioasm.py │ │ ├── piobuild.py │ │ ├── piohooks.py │ │ ├── pioino.py │ │ ├── piointegration.py │ │ ├── piolib.py │ │ ├── piomaxlen.py │ │ ├── piomisc.py │ │ ├── pioplatform.py │ │ ├── pioproject.py │ │ ├── piosize.py │ │ ├── piotarget.py │ │ ├── piotest.py │ │ └── pioupload.py │ ├── cache.py │ ├── check/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── defect.py │ │ └── tools/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── clangtidy.py │ │ ├── cppcheck.py │ │ └── pvsstudio.py │ ├── cli.py │ ├── commands/ │ │ ├── __init__.py │ │ ├── boards.py │ │ ├── ci.py │ │ ├── device/ │ │ │ └── __init__.py │ │ ├── lib.py │ │ ├── platform.py │ │ ├── settings.py │ │ ├── update.py │ │ └── upgrade.py │ ├── compat.py │ ├── debug/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── config/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── blackmagic.py │ │ │ ├── factory.py │ │ │ ├── generic.py │ │ │ ├── jlink.py │ │ │ ├── mspdebug.py │ │ │ ├── native.py │ │ │ ├── qemu.py │ │ │ └── renode.py │ │ ├── exception.py │ │ ├── helpers.py │ │ └── process/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── client.py │ │ ├── gdb.py │ │ └── server.py │ ├── dependencies.py │ ├── device/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── finder.py │ │ ├── list/ │ │ │ ├── __init__.py │ │ │ ├── command.py │ │ │ └── util.py │ │ └── monitor/ │ │ ├── __init__.py │ │ ├── command.py │ │ ├── filters/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── hexlify.py │ │ │ ├── log2file.py │ │ │ ├── send_on_enter.py │ │ │ └── time.py │ │ └── terminal.py │ ├── exception.py │ ├── fs.py │ ├── home/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── rpc/ │ │ │ ├── __init__.py │ │ │ ├── handlers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── account.py │ │ │ │ ├── app.py │ │ │ │ ├── base.py │ │ │ │ ├── ide.py │ │ │ │ ├── misc.py │ │ │ │ ├── os.py │ │ │ │ ├── piocore.py │ │ │ │ ├── platform.py │ │ │ │ ├── project.py │ │ │ │ └── registry.py │ │ │ └── server.py │ │ └── run.py │ ├── http.py │ ├── maintenance.py │ ├── package/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── commands/ │ │ │ ├── __init__.py │ │ │ ├── exec.py │ │ │ ├── install.py │ │ │ ├── list.py │ │ │ ├── outdated.py │ │ │ ├── pack.py │ │ │ ├── publish.py │ │ │ ├── search.py │ │ │ ├── show.py │ │ │ ├── uninstall.py │ │ │ ├── unpublish.py │ │ │ └── update.py │ │ ├── download.py │ │ ├── exception.py │ │ ├── lockfile.py │ │ ├── manager/ │ │ │ ├── __init__.py │ │ │ ├── _download.py │ │ │ ├── _install.py │ │ │ ├── _legacy.py │ │ │ ├── _registry.py │ │ │ ├── _symlink.py │ │ │ ├── _uninstall.py │ │ │ ├── _update.py │ │ │ ├── base.py │ │ │ ├── core.py │ │ │ ├── library.py │ │ │ ├── platform.py │ │ │ └── tool.py │ │ ├── manifest/ │ │ │ ├── __init__.py │ │ │ ├── parser.py │ │ │ └── schema.py │ │ ├── meta.py │ │ ├── pack.py │ │ ├── unpack.py │ │ ├── vcsclient.py │ │ └── version.py │ ├── platform/ │ │ ├── __init__.py │ │ ├── _packages.py │ │ ├── _run.py │ │ ├── base.py │ │ ├── board.py │ │ ├── exception.py │ │ └── factory.py │ ├── proc.py │ ├── project/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── commands/ │ │ │ ├── __init__.py │ │ │ ├── config.py │ │ │ ├── init.py │ │ │ └── metadata.py │ │ ├── config.py │ │ ├── exception.py │ │ ├── helpers.py │ │ ├── integration/ │ │ │ ├── __init__.py │ │ │ ├── generator.py │ │ │ └── tpls/ │ │ │ ├── clion/ │ │ │ │ └── .gitignore.tpl │ │ │ ├── codeblocks/ │ │ │ │ └── platformio.cbp.tpl │ │ │ ├── eclipse/ │ │ │ │ ├── .cproject.tpl │ │ │ │ ├── .project.tpl │ │ │ │ └── .settings/ │ │ │ │ ├── PlatformIO Debugger.launch.tpl │ │ │ │ ├── language.settings.xml.tpl │ │ │ │ └── org.eclipse.cdt.core.prefs.tpl │ │ │ ├── emacs/ │ │ │ │ ├── .ccls.tpl │ │ │ │ └── .gitignore.tpl │ │ │ ├── netbeans/ │ │ │ │ └── nbproject/ │ │ │ │ ├── configurations.xml.tpl │ │ │ │ ├── private/ │ │ │ │ │ ├── configurations.xml.tpl │ │ │ │ │ ├── launcher.properties.tpl │ │ │ │ │ └── private.xml.tpl │ │ │ │ └── project.xml.tpl │ │ │ ├── qtcreator/ │ │ │ │ ├── .gitignore.tpl │ │ │ │ ├── Makefile.tpl │ │ │ │ ├── platformio.cflags.tpl │ │ │ │ ├── platformio.config.tpl │ │ │ │ ├── platformio.creator.tpl │ │ │ │ ├── platformio.cxxflags.tpl │ │ │ │ ├── platformio.files.tpl │ │ │ │ └── platformio.includes.tpl │ │ │ ├── sublimetext/ │ │ │ │ ├── .ccls.tpl │ │ │ │ └── platformio.sublime-project.tpl │ │ │ ├── vim/ │ │ │ │ ├── .ccls.tpl │ │ │ │ └── .gitignore.tpl │ │ │ ├── visualstudio/ │ │ │ │ ├── platformio.vcxproj.filters.tpl │ │ │ │ └── platformio.vcxproj.tpl │ │ │ └── vscode/ │ │ │ ├── .gitignore.tpl │ │ │ └── .vscode/ │ │ │ ├── c_cpp_properties.json.tpl │ │ │ ├── extensions.json.tpl │ │ │ └── launch.json.tpl │ │ ├── options.py │ │ └── savedeps.py │ ├── public.py │ ├── registry/ │ │ ├── __init__.py │ │ ├── access/ │ │ │ ├── __init__.py │ │ │ ├── cli.py │ │ │ ├── commands/ │ │ │ │ ├── __init__.py │ │ │ │ ├── grant.py │ │ │ │ ├── list.py │ │ │ │ ├── private.py │ │ │ │ ├── public.py │ │ │ │ └── revoke.py │ │ │ └── validate.py │ │ ├── client.py │ │ └── mirror.py │ ├── remote/ │ │ ├── __init__.py │ │ ├── ac/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── process.py │ │ │ ├── psync.py │ │ │ └── serial.py │ │ ├── cli.py │ │ ├── client/ │ │ │ ├── __init__.py │ │ │ ├── agent_list.py │ │ │ ├── agent_service.py │ │ │ ├── async_base.py │ │ │ ├── base.py │ │ │ ├── device_list.py │ │ │ ├── device_monitor.py │ │ │ ├── run_or_test.py │ │ │ └── update_core.py │ │ ├── factory/ │ │ │ ├── __init__.py │ │ │ ├── client.py │ │ │ └── ssl.py │ │ └── projectsync.py │ ├── run/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── helpers.py │ │ └── processor.py │ ├── system/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── commands/ │ │ │ ├── __init__.py │ │ │ ├── completion.py │ │ │ ├── info.py │ │ │ └── prune.py │ │ ├── completion.py │ │ └── prune.py │ ├── telemetry.py │ ├── test/ │ │ ├── __init__.py │ │ ├── cli.py │ │ ├── exception.py │ │ ├── helpers.py │ │ ├── reports/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── json.py │ │ │ ├── junit.py │ │ │ └── stdout.py │ │ ├── result.py │ │ └── runners/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── doctest.py │ │ ├── factory.py │ │ ├── googletest.py │ │ ├── readers/ │ │ │ ├── __init__.py │ │ │ ├── native.py │ │ │ └── serial.py │ │ └── unity.py │ └── util.py ├── scripts/ │ ├── docspregen.py │ ├── fixsymlink.py │ └── install_devplatforms.py ├── setup.py ├── tests/ │ ├── __init__.py │ ├── commands/ │ │ ├── __init__.py │ │ ├── pkg/ │ │ │ ├── __init__.py │ │ │ ├── test_exec.py │ │ │ ├── test_install.py │ │ │ ├── test_list.py │ │ │ ├── test_outdated.py │ │ │ ├── test_search.py │ │ │ ├── test_show.py │ │ │ ├── test_uninstall.py │ │ │ └── test_update.py │ │ ├── test_account_org_team.py │ │ ├── test_boards.py │ │ ├── test_check.py │ │ ├── test_ci.py │ │ ├── test_init.py │ │ ├── test_lib.py │ │ ├── test_lib_complex.py │ │ ├── test_platform.py │ │ ├── test_run.py │ │ ├── test_settings.py │ │ └── test_test.py │ ├── conftest.py │ ├── misc/ │ │ ├── __init__.py │ │ ├── ino2cpp/ │ │ │ ├── __init__.py │ │ │ ├── examples/ │ │ │ │ ├── basic/ │ │ │ │ │ └── basic.ino │ │ │ │ ├── multifiles/ │ │ │ │ │ ├── bar.ino │ │ │ │ │ └── foo.pde │ │ │ │ └── strmultilines/ │ │ │ │ └── main.ino │ │ │ └── test_ino2cpp.py │ │ ├── test_maintenance.py │ │ └── test_misc.py │ ├── package/ │ │ ├── __init__.py │ │ ├── test_manager.py │ │ ├── test_manifest.py │ │ ├── test_meta.py │ │ └── test_pack.py │ ├── project/ │ │ ├── __init__.py │ │ ├── test_config.py │ │ ├── test_metadata.py │ │ └── test_savedeps.py │ └── test_examples.py └── tox.ini
SYMBOL INDEX (2014 symbols across 239 files)
FILE: platformio/__main__.py
function cli (line 34) | def cli(ctx, force, caller, no_ansi): # pylint: disable=unused-argument
function process_result (line 61) | def process_result(*_, **__):
function configure (line 65) | def configure():
function main (line 93) | def main(argv=None):
function debug_gdb_main (line 139) | def debug_gdb_main():
FILE: platformio/account/cli.py
function cli (line 43) | def cli():
FILE: platformio/account/client.py
class AccountError (line 23) | class AccountError(PlatformioException):
class AccountNotAuthorized (line 27) | class AccountNotAuthorized(AccountError, UserSideException):
class AccountAlreadyAuthorized (line 31) | class AccountAlreadyAuthorized(AccountError, UserSideException):
class AccountClient (line 35) | class AccountClient(HTTPClient): # pylint:disable=too-many-public-methods
method __init__ (line 38) | def __init__(self):
method get_refresh_token (line 42) | def get_refresh_token():
method delete_local_session (line 49) | def delete_local_session():
method delete_local_state (line 53) | def delete_local_state(key):
method fetch_json_data (line 60) | def fetch_json_data(self, *args, **kwargs):
method fetch_authentication_token (line 66) | def fetch_authentication_token(self):
method login (line 88) | def login(self, username, password):
method login_with_code (line 106) | def login_with_code(self, client_id, code, redirect_uri):
method logout (line 124) | def logout(self):
method change_password (line 137) | def change_password(self, old_password, new_password):
method registration (line 145) | def registration(
method auth_token (line 169) | def auth_token(self, password, regenerate):
method forgot_password (line 177) | def forgot_password(self, username):
method get_profile (line 184) | def get_profile(self):
method update_profile (line 191) | def update_profile(self, profile, current_password):
method get_account_info (line 202) | def get_account_info(self, offline=False):
method get_logged_username (line 231) | def get_logged_username(self):
method destroy_account (line 234) | def destroy_account(self):
method create_org (line 241) | def create_org(self, orgname, email, displayname):
method get_org (line 249) | def get_org(self, orgname):
method list_orgs (line 256) | def list_orgs(self):
method update_org (line 263) | def update_org(self, orgname, data):
method destroy_org (line 271) | def destroy_org(self, orgname):
method add_org_owner (line 278) | def add_org_owner(self, orgname, username):
method list_org_owners (line 286) | def list_org_owners(self, orgname):
method remove_org_owner (line 293) | def remove_org_owner(self, orgname, username):
method create_team (line 301) | def create_team(self, orgname, teamname, description):
method destroy_team (line 309) | def destroy_team(self, orgname, teamname):
method get_team (line 316) | def get_team(self, orgname, teamname):
method list_teams (line 323) | def list_teams(self, orgname):
method update_team (line 330) | def update_team(self, orgname, teamname, data):
method add_team_member (line 338) | def add_team_member(self, orgname, teamname, username):
method remove_team_member (line 346) | def remove_team_member(self, orgname, teamname, username):
FILE: platformio/account/commands/destroy.py
function account_destroy_cmd (line 21) | def account_destroy_cmd():
FILE: platformio/account/commands/forgot.py
function account_forgot_cmd (line 22) | def account_forgot_cmd(username):
FILE: platformio/account/commands/login.py
function account_login_cmd (line 23) | def account_login_cmd(username, password):
FILE: platformio/account/commands/logout.py
function account_logout_cmd (line 21) | def account_logout_cmd():
FILE: platformio/account/commands/password.py
function account_password_cmd (line 23) | def account_password_cmd(old_password, new_password):
FILE: platformio/account/commands/register.py
function account_register_cmd (line 45) | def account_register_cmd(username, email, password, firstname, lastname):
FILE: platformio/account/commands/show.py
function account_show_cmd (line 27) | def account_show_cmd(offline, json_output):
function print_profile (line 43) | def print_profile(profile):
function print_packages (line 58) | def print_packages(packages):
function print_subscriptions (line 89) | def print_subscriptions(subscriptions):
FILE: platformio/account/commands/token.py
function account_token_cmd (line 26) | def account_token_cmd(password, regenerate, json_output):
FILE: platformio/account/commands/update.py
function account_update_cmd (line 27) | def account_update_cmd(current_password, **kwargs):
FILE: platformio/account/org/cli.py
function cli (line 37) | def cli():
FILE: platformio/account/org/commands/add.py
function org_add_cmd (line 27) | def org_add_cmd(orgname, username):
FILE: platformio/account/org/commands/create.py
function org_create_cmd (line 32) | def org_create_cmd(orgname, email, displayname):
FILE: platformio/account/org/commands/destroy.py
function org_destroy_cmd (line 22) | def org_destroy_cmd(orgname):
FILE: platformio/account/org/commands/list.py
function org_list_cmd (line 25) | def org_list_cmd(json_output):
FILE: platformio/account/org/commands/remove.py
function org_remove_cmd (line 27) | def org_remove_cmd(orgname, username):
FILE: platformio/account/org/commands/update.py
function org_update_cmd (line 33) | def org_update_cmd(cur_orgname, **kwargs):
FILE: platformio/account/team/cli.py
function cli (line 37) | def cli():
FILE: platformio/account/team/commands/add.py
function team_add_cmd (line 30) | def team_add_cmd(orgname_teamname, username):
FILE: platformio/account/team/commands/create.py
function team_create_cmd (line 30) | def team_create_cmd(orgname_teamname, description):
FILE: platformio/account/team/commands/destroy.py
function team_destroy_cmd (line 27) | def team_destroy_cmd(orgname_teamname):
FILE: platformio/account/team/commands/list.py
function team_list_cmd (line 26) | def team_list_cmd(orgname, json_output):
FILE: platformio/account/team/commands/remove.py
function team_remove_cmd (line 28) | def team_remove_cmd(orgname_teamname, username):
FILE: platformio/account/team/commands/update.py
function team_update_cmd (line 35) | def team_update_cmd(orgname_teamname, **kwargs):
FILE: platformio/account/validate.py
function validate_username (line 20) | def validate_username(value, field="username"):
function validate_orgname (line 35) | def validate_orgname(value):
function validate_email (line 39) | def validate_email(value):
function validate_password (line 48) | def validate_password(value):
function validate_teamname (line 59) | def validate_teamname(value):
function validate_orgname_teamname (line 74) | def validate_orgname_teamname(value):
FILE: platformio/app.py
function projects_dir_validate (line 31) | def projects_dir_validate(projects_dir):
function resolve_state_path (line 76) | def resolve_state_path(conf_option_dir, file_name, ensure_dir_exists=True):
class State (line 83) | class State:
method __init__ (line 84) | def __init__(self, path=None, lock=False):
method __enter__ (line 93) | def __enter__(self):
method __exit__ (line 108) | def __exit__(self, type_, value, traceback):
method _lock_state_file (line 119) | def _lock_state_file(self):
method _unlock_state_file (line 128) | def _unlock_state_file(self):
method __del__ (line 132) | def __del__(self):
method as_dict (line 137) | def as_dict(self):
method keys (line 140) | def keys(self):
method get (line 143) | def get(self, key, default=True):
method update (line 146) | def update(self, *args, **kwargs):
method clear (line 150) | def clear(self):
method __getitem__ (line 153) | def __getitem__(self, key):
method __setitem__ (line 156) | def __setitem__(self, key, value):
method __delitem__ (line 160) | def __delitem__(self, key):
method __contains__ (line 164) | def __contains__(self, item):
function sanitize_setting (line 168) | def sanitize_setting(name, value):
function get_state_item (line 186) | def get_state_item(name, default=None):
function set_state_item (line 191) | def set_state_item(name, value):
function delete_state_item (line 197) | def delete_state_item(name):
function get_setting (line 203) | def get_setting(name):
function set_setting (line 215) | def set_setting(name, value):
function reset_settings (line 223) | def reset_settings():
function get_session_var (line 229) | def get_session_var(name, default=None):
function set_session_var (line 233) | def set_session_var(name, value):
function is_disabled_progressbar (line 238) | def is_disabled_progressbar():
function get_cid (line 242) | def get_cid():
function get_project_id (line 261) | def get_project_id(project_dir):
function get_user_agent (line 265) | def get_user_agent():
function get_host_id (line 282) | def get_host_id():
function get_host_name (line 292) | def get_host_name():
FILE: platformio/builder/tools/piobuild.py
function scons_patched_match_splitext (line 39) | def scons_patched_match_splitext(path, suffixes=None):
function GetBuildType (line 47) | def GetBuildType(env):
function BuildProgram (line 60) | def BuildProgram(env):
function ProcessProgramDeps (line 94) | def ProcessProgramDeps(env):
function ProcessCompileDbToolchainOption (line 131) | def ProcessCompileDbToolchainOption(env):
function ProcessProjectDeps (line 152) | def ProcessProjectDeps(env):
function ParseFlagsExtended (line 191) | def ParseFlagsExtended(env, flags): # pylint: disable=too-many-branches
function ProcessFlags (line 236) | def ProcessFlags(env, flags): # pylint: disable=too-many-branches
function ProcessUnFlags (line 256) | def ProcessUnFlags(env, flags):
function StringifyMacro (line 275) | def StringifyMacro(env, value): # pylint: disable=unused-argument
function MatchSourceFiles (line 279) | def MatchSourceFiles(env, src_dir, src_filter=None, src_exts=None):
function CollectBuildFiles (line 286) | def CollectBuildFiles(
function AddBuildMiddleware (line 329) | def AddBuildMiddleware(env, callback, pattern=None):
function BuildFrameworks (line 333) | def BuildFrameworks(env, frameworks):
function BuildLibrary (line 359) | def BuildLibrary(env, variant_dir, src_dir, src_filter=None, nodes=None):
function BuildSources (line 365) | def BuildSources(env, variant_dir, src_dir, src_filter=None):
function exists (line 382) | def exists(_):
function generate (line 386) | def generate(env):
FILE: platformio/builder/tools/piohooks.py
function AddActionWrapper (line 16) | def AddActionWrapper(handler):
function ProcessDelayedActions (line 37) | def ProcessDelayedActions(env):
function generate (line 42) | def generate(env):
function exists (line 49) | def exists(_):
FILE: platformio/builder/tools/pioino.py
class InoToCPPConverter (line 27) | class InoToCPPConverter:
method __init__ (line 41) | def __init__(self, env):
method read_safe_contents (line 46) | def read_safe_contents(self, path):
method write_safe_contents (line 72) | def write_safe_contents(self, path, contents):
method is_main_node (line 78) | def is_main_node(self, contents):
method convert (line 81) | def convert(self, nodes):
method merge (line 87) | def merge(self, nodes):
method process (line 104) | def process(self, contents):
method _gcc_preprocess (line 112) | def _gcc_preprocess(self, contents, out_file):
method _join_multiline_strings (line 126) | def _join_multiline_strings(self, contents):
method _parse_preproc_line_num (line 160) | def _parse_preproc_line_num(line):
method _parse_prototypes (line 168) | def _parse_prototypes(self, contents):
method _get_total_lines (line 180) | def _get_total_lines(self, contents):
method append_prototypes (line 191) | def append_prototypes(self, contents):
function FindInoNodes (line 225) | def FindInoNodes(env):
function ConvertInoToCpp (line 232) | def ConvertInoToCpp(env):
function _delete_file (line 242) | def _delete_file(path):
function generate (line 250) | def generate(env):
function exists (line 255) | def exists(_):
FILE: platformio/builder/tools/piointegration.py
function IsIntegrationDump (line 25) | def IsIntegrationDump(_):
function DumpIntegrationIncludes (line 29) | def DumpIntegrationIncludes(env):
function get_gcc_defines (line 61) | def get_gcc_defines(env):
function dump_defines (line 84) | def dump_defines(env):
function dump_svd_path (line 114) | def dump_svd_path(env):
function _split_flags_string (line 136) | def _split_flags_string(env, s):
function DumpIntegrationData (line 141) | def DumpIntegrationData(*args):
function exists (line 178) | def exists(_):
function generate (line 182) | def generate(env):
FILE: platformio/builder/tools/piolib.py
class LibBuilderFactory (line 46) | class LibBuilderFactory:
method new (line 48) | def new(env, path, verbose=int(ARGUMENTS.get("PIOVERBOSE", 0))):
method get_used_frameworks (line 75) | def get_used_frameworks(env, path):
class LibBuilderBase (line 111) | class LibBuilderBase:
method __init__ (line 123) | def __init__(self, env, path, manifest=None, verbose=False):
method __repr__ (line 155) | def __repr__(self):
method __contains__ (line 158) | def __contains__(self, child_path):
method is_common_builder (line 161) | def is_common_builder(self, root_path, child_path):
method name (line 181) | def name(self):
method version (line 185) | def version(self):
method dependent (line 189) | def dependent(self):
method dependencies (line 194) | def dependencies(self):
method src_filter (line 198) | def src_filter(self):
method include_dir (line 207) | def include_dir(self):
method src_dir (line 215) | def src_dir(self):
method get_include_dirs (line 222) | def get_include_dirs(self):
method build_dir (line 231) | def build_dir(self):
method build_flags (line 238) | def build_flags(self):
method build_unflags (line 242) | def build_unflags(self):
method extra_script (line 246) | def extra_script(self):
method lib_archive (line 250) | def lib_archive(self):
method lib_ldf_mode (line 254) | def lib_ldf_mode(self):
method validate_ldf_mode (line 258) | def validate_ldf_mode(mode):
method lib_compat_mode (line 271) | def lib_compat_mode(self):
method validate_compat_mode (line 275) | def validate_compat_mode(mode):
method is_platforms_compatible (line 287) | def is_platforms_compatible(self, platforms):
method is_frameworks_compatible (line 290) | def is_frameworks_compatible(self, frameworks):
method load_manifest (line 293) | def load_manifest(self):
method process_extra_options (line 296) | def process_extra_options(self):
method process_dependencies (line 308) | def process_dependencies(self):
method is_dependency_compatible (line 328) | def is_dependency_compatible(self, dependency):
method get_search_files (line 347) | def get_search_files(self):
method get_implicit_includes (line 355) | def get_implicit_includes( # pylint: disable=too-many-branches
method search_deps_recursive (line 428) | def search_deps_recursive(self, search_files=None):
method depend_on (line 451) | def depend_on(self, lb, search_files=None, recursive=True):
method build (line 477) | def build(self):
class UnknownLibBuilder (line 532) | class UnknownLibBuilder(LibBuilderBase):
class ArduinoLibBuilder (line 536) | class ArduinoLibBuilder(LibBuilderBase):
method load_manifest (line 537) | def load_manifest(self):
method include_dir (line 544) | def include_dir(self):
method get_include_dirs (line 551) | def get_include_dirs(self):
method src_filter (line 560) | def src_filter(self):
method dependencies (line 591) | def dependencies(self):
method lib_ldf_mode (line 597) | def lib_ldf_mode(self):
method is_frameworks_compatible (line 611) | def is_frameworks_compatible(self, frameworks):
method is_platforms_compatible (line 616) | def is_platforms_compatible(self, platforms):
method build_flags (line 622) | def build_flags(self):
class MbedLibBuilder (line 640) | class MbedLibBuilder(LibBuilderBase):
method load_manifest (line 641) | def load_manifest(self):
method src_dir (line 648) | def src_dir(self):
method get_include_dirs (line 653) | def get_include_dirs(self):
method is_frameworks_compatible (line 673) | def is_frameworks_compatible(self, frameworks):
method process_extra_options (line 678) | def process_extra_options(self):
method _process_mbed_lib_confs (line 682) | def _process_mbed_lib_confs(self):
method _mbed_normalize_macro (line 708) | def _mbed_normalize_macro(macro):
method _mbed_lib_conf_parse_macros (line 715) | def _mbed_lib_conf_parse_macros(self, mbed_lib_path):
method _mbed_conf_append_macros (line 759) | def _mbed_conf_append_macros(self, mbed_config_path, macros):
class PlatformIOLibBuilder (line 784) | class PlatformIOLibBuilder(LibBuilderBase):
method load_manifest (line 785) | def load_manifest(self):
method _has_arduino_manifest (line 791) | def _has_arduino_manifest(self):
method include_dir (line 795) | def include_dir(self):
method get_include_dirs (line 801) | def get_include_dirs(self):
method src_dir (line 822) | def src_dir(self):
method src_filter (line 829) | def src_filter(self):
method build_flags (line 840) | def build_flags(self):
method build_unflags (line 846) | def build_unflags(self):
method extra_script (line 852) | def extra_script(self):
method lib_archive (line 858) | def lib_archive(self):
method lib_ldf_mode (line 873) | def lib_ldf_mode(self):
method lib_compat_mode (line 882) | def lib_compat_mode(self):
method is_platforms_compatible (line 890) | def is_platforms_compatible(self, platforms):
method is_frameworks_compatible (line 895) | def is_frameworks_compatible(self, frameworks):
class ProjectAsLibBuilder (line 901) | class ProjectAsLibBuilder(LibBuilderBase):
method __init__ (line 902) | def __init__(self, env, *args, **kwargs):
method __contains__ (line 913) | def __contains__(self, child_path):
method include_dir (line 920) | def include_dir(self):
method src_dir (line 925) | def src_dir(self):
method test_dir (line 929) | def test_dir(self):
method get_search_files (line 932) | def get_search_files(self):
method lib_ldf_mode (line 951) | def lib_ldf_mode(self):
method src_filter (line 959) | def src_filter(self):
method build_flags (line 964) | def build_flags(self):
method dependencies (line 969) | def dependencies(self):
method process_extra_options (line 972) | def process_extra_options(self):
method install_dependencies (line 977) | def install_dependencies(self):
method process_dependencies (line 1018) | def process_dependencies(self): # pylint: disable=too-many-branches
method build (line 1054) | def build(self):
function GetLibSourceDirs (line 1061) | def GetLibSourceDirs(env):
function IsCompatibleLibBuilder (line 1070) | def IsCompatibleLibBuilder(env, lb, verbose=int(ARGUMENTS.get("PIOVERBOS...
function GetLibBuilders (line 1089) | def GetLibBuilders(_): # pylint: disable=too-many-branches
function ConfigureProjectLibBuilder (line 1143) | def ConfigureProjectLibBuilder(env):
function exists (line 1224) | def exists(_):
function generate (line 1228) | def generate(env):
FILE: platformio/builder/tools/piomaxlen.py
function tempfile_arg_esc_func (line 34) | def tempfile_arg_esc_func(arg):
function long_sources_hook (line 42) | def long_sources_hook(env, sources):
function _file_long_data (line 58) | def _file_long_data(env, data):
function exists (line 72) | def exists(env):
function generate (line 76) | def generate(env):
FILE: platformio/builder/tools/piomisc.py
function GetCompilerType (line 23) | def GetCompilerType(env): # pylint: disable=too-many-return-statements
function GetActualLDScript (line 46) | def GetActualLDScript(env):
function ConfigureDebugTarget (line 91) | def ConfigureDebugTarget(env):
function GetExtraScripts (line 130) | def GetExtraScripts(env, scope):
function generate (line 143) | def generate(env):
function exists (line 152) | def exists(_):
FILE: platformio/builder/tools/pioplatform.py
function _PioPlatform (line 34) | def _PioPlatform():
function PioPlatform (line 39) | def PioPlatform(_):
function BoardConfig (line 43) | def BoardConfig(env, board=None):
function GetFrameworkScript (line 56) | def GetFrameworkScript(env, framework):
function LoadPioPlatform (line 65) | def LoadPioPlatform(env):
function PrintConfiguration (line 134) | def PrintConfiguration(env): # pylint: disable=too-many-statements
function exists (line 240) | def exists(_):
function generate (line 244) | def generate(env):
FILE: platformio/builder/tools/pioproject.py
function GetProjectConfig (line 19) | def GetProjectConfig(env):
function GetProjectOptions (line 23) | def GetProjectOptions(env, as_dict=False):
function GetProjectOption (line 27) | def GetProjectOption(env, option, default=MISSING):
function LoadProjectOptions (line 31) | def LoadProjectOptions(env):
function exists (line 45) | def exists(_):
function generate (line 49) | def generate(env):
FILE: platformio/builder/tools/piosize.py
function _run_tool (line 29) | def _run_tool(cmd, env, tool_args):
function _get_symbol_locations (line 48) | def _get_symbol_locations(env, elf_path, addrs):
function _get_demangled_names (line 59) | def _get_demangled_names(env, mangled_names):
function _collect_sections_info (line 76) | def _collect_sections_info(env, elffile):
function _collect_symbols_info (line 101) | def _collect_symbols_info(env, elffile, elf_path, sections):
function pioSizeDetermineSection (line 159) | def pioSizeDetermineSection(_, sections, symbol_addr):
function pioSizeIsValidSymbol (line 168) | def pioSizeIsValidSymbol(_, symbol_name, symbol_type, symbol_address):
function pioSizeIsRamSection (line 172) | def pioSizeIsRamSection(_, section):
function pioSizeIsFlashSection (line 179) | def pioSizeIsFlashSection(_, section):
function pioSizeCalculateFirmwareSize (line 183) | def pioSizeCalculateFirmwareSize(_, sections):
function DumpSizeData (line 194) | def DumpSizeData(_, target, source, env): # pylint: disable=unused-argu...
function exists (line 255) | def exists(_):
function generate (line 259) | def generate(env):
FILE: platformio/builder/tools/piotarget.py
function VerboseAction (line 24) | def VerboseAction(_, act, actstr):
function IsCleanTarget (line 30) | def IsCleanTarget(env):
function CleanProject (line 34) | def CleanProject(env, fullclean=False):
function AddTarget (line 64) | def AddTarget( # pylint: disable=too-many-arguments,too-many-positional...
function AddPlatformTarget (line 86) | def AddPlatformTarget(env, *args, **kwargs):
function AddCustomTarget (line 90) | def AddCustomTarget(env, *args, **kwargs):
function DumpTargets (line 94) | def DumpTargets(env):
function exists (line 104) | def exists(_):
function generate (line 108) | def generate(env):
FILE: platformio/builder/tools/piotest.py
function ConfigureTestTarget (line 22) | def ConfigureTestTarget(env):
function generate (line 56) | def generate(env):
function exists (line 60) | def exists(_):
FILE: platformio/builder/tools/pioupload.py
function FlushSerialBuffer (line 32) | def FlushSerialBuffer(env, port):
function TouchSerialPort (line 43) | def TouchSerialPort(env, port, baudrate):
function WaitForNewSerialPort (line 55) | def WaitForNewSerialPort(env, before):
function AutodetectUploadPort (line 95) | def AutodetectUploadPort(*args, **kwargs):
function UploadToDisk (line 133) | def UploadToDisk(_, target, source, env):
function CheckUploadSize (line 149) | def CheckUploadSize(_, target, source, env):
function PrintUploadInfo (line 234) | def PrintUploadInfo(env):
function exists (line 245) | def exists(_):
function generate (line 249) | def generate(env):
FILE: platformio/cache.py
class ContentCache (line 25) | class ContentCache:
method __init__ (line 26) | def __init__(self, namespace=None):
method __enter__ (line 33) | def __enter__(self):
method __exit__ (line 38) | def __exit__(self, type_, value, traceback):
method key_from_args (line 42) | def key_from_args(*args):
method get_cache_path (line 49) | def get_cache_path(self, key):
method get (line 55) | def get(self, key):
method set (line 62) | def set(self, key, data, valid):
method delete (line 93) | def delete(self, keys=None):
method clean (line 137) | def clean(self):
method _lock_dbindex (line 142) | def _lock_dbindex(self):
method _unlock_dbindex (line 151) | def _unlock_dbindex(self):
function cleanup_content_cache (line 162) | def cleanup_content_cache(namespace=None):
FILE: platformio/check/cli.py
function cli (line 62) | def cli( # pylint: disable=too-many-positional-arguments
function results_to_json (line 202) | def results_to_json(raw):
function print_processing_header (line 218) | def print_processing_header(tool, envname, envdump):
function print_processing_footer (line 227) | def print_processing_footer(result):
function collect_component_stats (line 243) | def collect_component_stats(result):
function print_defects_stats (line 263) | def print_defects_stats(results):
function print_check_summary (line 296) | def print_check_summary(results, verbose=False):
FILE: platformio/check/defect.py
class DefectItem (line 26) | class DefectItem:
method __init__ (line 32) | def __init__( # pylint: disable=too-many-positional-arguments
method __repr__ (line 57) | def __repr__(self):
method __or__ (line 74) | def __or__(self, defect):
method severity_to_int (line 78) | def severity_to_int(label):
method as_dict (line 84) | def as_dict(self):
FILE: platformio/check/tools/__init__.py
class CheckToolFactory (line 21) | class CheckToolFactory:
method new (line 23) | def new(tool, project_dir, config, envname, options):
FILE: platformio/check/tools/base.py
class CheckToolBase (line 27) | class CheckToolBase: # pylint: disable=too-many-instance-attributes
method __init__ (line 28) | def __init__(self, project_dir, config, envname, options):
method _load_cpp_data (line 59) | def _load_cpp_data(self):
method get_tool_dir (line 71) | def get_tool_dir(self, pkg_name):
method get_flags (line 78) | def get_flags(self, tool):
method _get_toolchain_defines (line 89) | def _get_toolchain_defines(self):
method _create_tmp_file (line 123) | def _create_tmp_file(self, data):
method _long_includes_hook (line 129) | def _long_includes_hook(self, includes):
method _dump_includes (line 137) | def _dump_includes(includes_map):
method is_flag_set (line 146) | def is_flag_set(flag, flags):
method get_defects (line 149) | def get_defects(self):
method configure_command (line 152) | def configure_command(self):
method on_tool_output (line 155) | def on_tool_output(self, line):
method tool_output_filter (line 175) | def tool_output_filter(line):
method parse_defect (line 179) | def parse_defect(raw_line):
method clean_up (line 182) | def clean_up(self):
method is_check_successful (line 188) | def is_check_successful(cmd_result):
method execute_check_cmd (line 191) | def execute_check_cmd(self, cmd):
method get_project_target_files (line 211) | def get_project_target_files(project_dir, src_filters):
method check (line 232) | def check(self, on_defect_callback=None):
function normalize_src_filters (line 256) | def normalize_src_filters(src_filters):
FILE: platformio/check/tools/clangtidy.py
class ClangtidyCheckTool (line 22) | class ClangtidyCheckTool(CheckToolBase):
method tool_output_filter (line 23) | def tool_output_filter(self, line): # pylint: disable=arguments-differ
method parse_defect (line 36) | def parse_defect(self, raw_line): # pylint: disable=arguments-differ
method is_check_successful (line 52) | def is_check_successful(cmd_result):
method configure_command (line 57) | def configure_command(self):
FILE: platformio/check/tools/cppcheck.py
class CppcheckCheckTool (line 24) | class CppcheckCheckTool(CheckToolBase):
method __init__ (line 25) | def __init__(self, *args, **kwargs):
method tool_output_filter (line 40) | def tool_output_filter(self, line): # pylint: disable=arguments-differ
method parse_defect (line 59) | def parse_defect(self, raw_line): # pylint: disable=arguments-differ
method configure_command (line 105) | def configure_command(self, language, src_file): # pylint: disable=ar...
method get_forced_includes (line 166) | def get_forced_includes(build_flags, includes):
method _generate_src_file (line 197) | def _generate_src_file(self, src_files):
method _generate_inc_file (line 200) | def _generate_inc_file(self):
method clean_up (line 210) | def clean_up(self):
method is_check_successful (line 226) | def is_check_successful(cmd_result):
method convert_language_standard (line 231) | def convert_language_standard(flag):
method check (line 245) | def check(self, on_defect_callback=None):
FILE: platformio/check/tools/pvsstudio.py
class PvsStudioCheckTool (line 28) | class PvsStudioCheckTool(CheckToolBase): # pylint: disable=too-many-ins...
method __init__ (line 29) | def __init__(self, *args, **kwargs):
method tool_output_filter (line 55) | def tool_output_filter(self, line): # pylint: disable=arguments-differ
method _process_defects (line 66) | def _process_defects(self, defects):
method _demangle_report (line 76) | def _demangle_report(self, output_file):
method parse_defects (line 104) | def parse_defects(self, output_file):
method configure_command (line 147) | def configure_command(self, src_file): # pylint: disable=arguments-di...
method _generate_tmp_file_path (line 180) | def _generate_tmp_file_path(self):
method _prepare_preprocessed_file (line 184) | def _prepare_preprocessed_file(self, src_file):
method clean_up (line 216) | def clean_up(self):
method is_check_successful (line 222) | def is_check_successful(cmd_result):
method check (line 227) | def check(self, on_defect_callback=None):
FILE: platformio/cli.py
class PlatformioCLI (line 21) | class PlatformioCLI(click.Group):
method __init__ (line 24) | def __init__(self, *args, **kwargs):
method _find_pio_commands (line 29) | def _find_pio_commands(self):
method in_silence (line 55) | def in_silence():
method reveal_cmd_path_args (line 67) | def reveal_cmd_path_args(cls, ctx):
method invoke (line 81) | def invoke(self, ctx):
method list_commands (line 87) | def list_commands(self, ctx): # pylint: disable=unused-argument
method get_command (line 90) | def get_command(self, ctx, cmd_name):
method _handle_obsolate_command (line 98) | def _handle_obsolate_command(ctx, cmd_name):
FILE: platformio/commands/boards.py
function cli (line 29) | def cli(query, installed, json_output): # pylint: disable=R0912
function print_boards (line 54) | def print_boards(boards):
function _get_boards (line 73) | def _get_boards(installed=False):
function _print_boards_json (line 78) | def _print_boards_json(query, installed=False):
FILE: platformio/commands/ci.py
function validate_path (line 29) | def validate_path(ctx, param, value): # pylint: disable=unused-argument
function cli (line 66) | def cli( # pylint: disable=too-many-arguments,too-many-positional-argum...
function _copy_contents (line 123) | def _copy_contents(dst_dir, contents): # pylint: disable=too-many-branches
function _exclude_contents (line 158) | def _exclude_contents(dst_dir, patterns):
function _copy_project_conf (line 170) | def _copy_project_conf(build_dir, project_conf):
FILE: platformio/commands/lib.py
function get_project_global_lib_dir (line 44) | def get_project_global_lib_dir():
function invoke_command (line 48) | def invoke_command(ctx, cmd, **kwargs):
function cli (line 84) | def cli(ctx, **options):
function lib_install (line 155) | def lib_install( # pylint: disable=too-many-arguments,too-many-position...
function lib_uninstall (line 184) | def lib_uninstall(ctx, libraries, save, silent):
function lib_update (line 213) | def lib_update( # pylint: disable=too-many-arguments,too-many-positiona...
function lib_list (line 278) | def lib_list(ctx, json_output):
function lib_search (line 317) | def lib_search( # pylint: disable=unused-argument
function lib_builtin (line 351) | def lib_builtin(storage, json_output):
function lib_show (line 373) | def lib_show(ctx, library, json_output):
function lib_register (line 394) | def lib_register(config_url): # pylint: disable=unused-argument
function lib_stats (line 402) | def lib_stats(json_output):
function print_lib_item (line 417) | def print_lib_item(item):
FILE: platformio/commands/platform.py
function cli (line 36) | def cli():
function platform_search (line 44) | def platform_search(ctx, query, json_output):
function platform_frameworks (line 73) | def platform_frameworks(query, json_output):
function platform_list (line 108) | def platform_list(ctx, json_output):
function platform_show (line 133) | def platform_show(ctx, platform, json_output): # pylint: disable=too-ma...
function platform_install (line 162) | def platform_install( # pylint: disable=too-many-arguments,too-many-pos...
function platform_uninstall (line 195) | def platform_uninstall(ctx, platforms):
function platform_update (line 227) | def platform_update( # pylint: disable=too-many-locals,too-many-argumen...
function _get_registry_platforms (line 287) | def _get_registry_platforms():
function _get_platform_data (line 292) | def _get_platform_data(*args, **kwargs):
function _get_installed_platform_data (line 299) | def _get_installed_platform_data(platform, with_boards=True, expose_pack...
function _get_registry_platform_data (line 357) | def _get_registry_platform_data( # pylint: disable=unused-argument
FILE: platformio/commands/settings.py
function format_value (line 22) | def format_value(raw):
function cli (line 31) | def cli():
function settings_get (line 37) | def settings_get(name):
function settings_set (line 69) | def settings_set(ctx, name, value):
function settings_reset (line 77) | def settings_reset(ctx):
FILE: platformio/commands/update.py
function cli (line 33) | def cli(*_, **__):
FILE: platformio/commands/upgrade.py
function cli (line 39) | def cli(dev, only_dependencies, verbose):
function upgrade_pip_dependencies (line 106) | def upgrade_pip_dependencies(verbose):
function get_latest_version (line 122) | def get_latest_version():
function get_develop_latest_version (line 134) | def get_develop_latest_version():
function get_pypi_latest_version (line 152) | def get_pypi_latest_version():
FILE: platformio/compat.py
function shlex_join (line 38) | def shlex_join(split_command):
function is_bytes (line 60) | def is_bytes(x):
function isascii (line 64) | def isascii(text):
function is_terminal (line 73) | def is_terminal():
function ci_strings_are_equal (line 80) | def ci_strings_are_equal(a, b):
function hashlib_encode_data (line 88) | def hashlib_encode_data(data):
function load_python_module (line 96) | def load_python_module(name, pathname):
function get_filesystem_encoding (line 103) | def get_filesystem_encoding():
function get_locale_encoding (line 107) | def get_locale_encoding():
function get_object_members (line 111) | def get_object_members(obj, ignore_private=True):
function ensure_python3 (line 122) | def ensure_python3(raise_exception=True):
function path_to_unicode (line 134) | def path_to_unicode(path):
function is_proxy_set (line 142) | def is_proxy_set(socks=False):
function click_launch (line 151) | def click_launch(url, wait=False, locate=False) -> int:
function _click_open_url (line 155) | def _click_open_url( # pylint: disable=too-many-branches, too-many-retu...
FILE: platformio/debug/cli.py
function cli (line 60) | def cli( # pylint: disable=too-many-positional-arguments
function _configure (line 114) | def _configure(
function _run (line 169) | def _run(project_dir, debug_config, client_extra_args):
FILE: platformio/debug/config/base.py
class DebugConfigBase (line 26) | class DebugConfigBase: # pylint: disable=too-many-instance-attributes
method __init__ (line 29) | def __init__(self, platform, project_config, env_name):
method cleanup_cmds (line 61) | def cleanup_cmds(items):
method program_path (line 66) | def program_path(self):
method client_executable_path (line 70) | def client_executable_path(self):
method load_cmds (line 74) | def load_cmds(self):
method load_cmds (line 88) | def load_cmds(self, cmds):
method load_mode (line 92) | def load_mode(self):
method init_break (line 99) | def init_break(self):
method init_cmds (line 110) | def init_cmds(self):
method extra_cmds (line 116) | def extra_cmds(self):
method port (line 122) | def port(self):
method port (line 131) | def port(self, value):
method upload_protocol (line 135) | def upload_protocol(self):
method speed (line 141) | def speed(self):
method server_ready_pattern (line 145) | def server_ready_pattern(self):
method _load_build_data (line 150) | def _load_build_data(self):
method _configure_server (line 158) | def _configure_server(self):
method get_init_script (line 210) | def get_init_script(self, debugger):
method reveal_patterns (line 216) | def reveal_patterns(self, source, recursive=True):
FILE: platformio/debug/config/blackmagic.py
class BlackmagicDebugConfig (line 20) | class BlackmagicDebugConfig(DebugConfigBase):
method port (line 53) | def port(self):
method port (line 70) | def port(self, value):
FILE: platformio/debug/config/factory.py
class DebugConfigFactory (line 22) | class DebugConfigFactory:
method get_clsname (line 24) | def get_clsname(name):
method new (line 29) | def new(cls, platform, project_config, env_name):
FILE: platformio/debug/config/generic.py
class GenericDebugConfig (line 18) | class GenericDebugConfig(DebugConfigBase):
FILE: platformio/debug/config/jlink.py
class JlinkDebugConfig (line 18) | class JlinkDebugConfig(DebugConfigBase):
method server_ready_pattern (line 41) | def server_ready_pattern(self):
FILE: platformio/debug/config/mspdebug.py
class MspdebugDebugConfig (line 18) | class MspdebugDebugConfig(DebugConfigBase):
FILE: platformio/debug/config/native.py
class NativeDebugConfig (line 19) | class NativeDebugConfig(DebugConfigBase):
FILE: platformio/debug/config/qemu.py
class QemuDebugConfig (line 18) | class QemuDebugConfig(DebugConfigBase):
FILE: platformio/debug/config/renode.py
class RenodeDebugConfig (line 18) | class RenodeDebugConfig(DebugConfigBase):
method server_ready_pattern (line 38) | def server_ready_pattern(self):
FILE: platformio/debug/exception.py
class DebugError (line 18) | class DebugError(PlatformioException):
class DebugSupportError (line 22) | class DebugSupportError(DebugError, UserSideException):
class DebugInvalidOptionsError (line 31) | class DebugInvalidOptionsError(DebugError, UserSideException):
class DebugInitError (line 35) | class DebugInitError(DebugError, UserSideException):
FILE: platformio/debug/helpers.py
class GDBMIConsoleStream (line 33) | class GDBMIConsoleStream(BytesIO): # pylint: disable=too-few-public-met...
method write (line 36) | def write(self, text):
function is_gdbmi_mode (line 41) | def is_gdbmi_mode():
function escape_gdbmi_stream (line 45) | def escape_gdbmi_stream(prefix, stream):
function get_default_debug_env (line 65) | def get_default_debug_env(config):
function predebug_project (line 77) | def predebug_project(
function has_debug_symbols (line 115) | def has_debug_symbols(prog_path):
function is_prog_obsolete (line 140) | def is_prog_obsolete(prog_path):
FILE: platformio/debug/process/base.py
class DebugSubprocessProtocol (line 29) | class DebugSubprocessProtocol(asyncio.SubprocessProtocol):
method __init__ (line 30) | def __init__(self, factory):
method connection_made (line 34) | def connection_made(self, transport):
method pipe_data_received (line 37) | def pipe_data_received(self, fd, data):
method connection_lost (line 45) | def connection_lost(self, exc):
method process_exited (line 48) | def process_exited(self):
class DebugBaseProcess (line 55) | class DebugBaseProcess:
method __init__ (line 59) | def __init__(self):
method spawn (line 67) | async def spawn(self, *args, **kwargs):
method is_running (line 83) | def is_running(self):
method connection_made (line 86) | def connection_made(self, transport):
method connect_stdin_pipe (line 90) | def connect_stdin_pipe(self):
method _read_stdin_pipe (line 93) | async def _read_stdin_pipe(self):
method stdin_data_received (line 107) | def stdin_data_received(self, data):
method stdout_data_received (line 113) | def stdout_data_received(self, data):
method stderr_data_received (line 123) | def stderr_data_received(self, data):
method process_exited (line 135) | def process_exited(self):
method terminate (line 147) | def terminate(self):
FILE: platformio/debug/process/client.py
class DebugClientProcess (line 28) | class DebugClientProcess(DebugBaseProcess):
method __init__ (line 29) | def __init__(self, project_dir, debug_config):
method run (line 46) | async def run(self):
method connection_made (line 57) | def connection_made(self, transport):
method process_exited (line 64) | def process_exited(self):
method close (line 69) | def close(self):
method __del__ (line 74) | def __del__(self):
method _kill_previous_session (line 77) | def _kill_previous_session(self):
method _lock_session (line 94) | def _lock_session(self, pid):
method _unlock_session (line 100) | def _unlock_session(self):
FILE: platformio/debug/process/gdb.py
class GDBClientProcess (line 26) | class GDBClientProcess(DebugClientProcess):
method __init__ (line 30) | def __init__(self, *args, **kwargs):
method run (line 35) | async def run(self, extra_args): # pylint: disable=arguments-differ
method _get_data_dir (line 60) | def _get_data_dir(gdb_path):
method generate_init_script (line 68) | def generate_init_script(self, dst):
method stdin_data_received (line 110) | def stdin_data_received(self, data):
method stdout_data_received (line 128) | def stdout_data_received(self, data):
method console_log (line 136) | def console_log(self, msg):
method _auto_exec_continue (line 141) | def _auto_exec_continue(self):
method stderr_data_received (line 167) | def stderr_data_received(self, data):
method _handle_error (line 171) | def _handle_error(self, data):
FILE: platformio/debug/process/server.py
class DebugServerProcess (line 28) | class DebugServerProcess(DebugBaseProcess):
method __init__ (line 31) | def __init__(self, debug_config):
method run (line 37) | async def run(self): # pylint: disable=too-many-branches
method _wait_until_ready (line 111) | async def _wait_until_ready(self):
method _check_ready_by_pattern (line 123) | def _check_ready_by_pattern(self, data):
method stdout_data_received (line 137) | def stdout_data_received(self, data):
method stderr_data_received (line 145) | def stderr_data_received(self, data):
FILE: platformio/dependencies.py
function get_core_dependencies (line 18) | def get_core_dependencies():
function get_pip_dependencies (line 29) | def get_pip_dependencies():
FILE: platformio/device/cli.py
function cli (line 29) | def cli():
FILE: platformio/device/finder.py
function parse_udev_rules_hwids (line 34) | def parse_udev_rules_hwids(path):
function is_pattern_port (line 57) | def is_pattern_port(port):
function find_mbed_disk (line 63) | def find_mbed_disk(initial_port):
function is_serial_port_ready (line 82) | def is_serial_port_ready(port, timeout=1):
class SerialPortFinder (line 91) | class SerialPortFinder:
method __init__ (line 92) | def __init__( # pylint: disable=too-many-arguments,too-many-positiona...
method normalize_board_hwid (line 109) | def normalize_board_hwid(value):
method match_serial_port (line 115) | def match_serial_port(pattern):
method match_device_hwid (line 122) | def match_device_hwid(patterns):
method find (line 134) | def find(self, initial_port=None):
method _reveal_device_port (line 165) | def _reveal_device_port(self, device):
method _find_blackmagic_port (line 179) | def _find_blackmagic_port(self):
method _find_board_device (line 188) | def _find_board_device(self):
method _find_known_device (line 217) | def _find_known_device(self):
FILE: platformio/device/list/command.py
function device_list_cmd (line 31) | def device_list_cmd( # pylint: disable=too-many-branches
FILE: platformio/device/list/util.py
function list_serial_ports (line 25) | def list_serial_ports(filter_hwid=False, as_objects=False):
function list_logical_devices (line 52) | def list_logical_devices():
function list_mdns_services (line 84) | def list_mdns_services():
FILE: platformio/device/monitor/command.py
function device_monitor_cmd (line 114) | def device_monitor_cmd(**options):
function get_project_options (line 157) | def get_project_options(environment=None):
function apply_project_monitor_options (line 164) | def apply_project_monitor_options(initial_options, project_options):
FILE: platformio/device/monitor/filters/base.py
class DeviceMonitorFilterBase (line 25) | class DeviceMonitorFilterBase(miniterm.Transform):
method __init__ (line 26) | def __init__(self, options=None):
method __call__ (line 43) | def __call__(self):
method NAME (line 48) | def NAME(self):
method set_running_terminal (line 51) | def set_running_terminal(self, terminal):
method get_running_terminal (line 54) | def get_running_terminal(self):
function register_filters (line 58) | def register_filters(platform=None, options=None):
function load_monitor_filters (line 85) | def load_monitor_filters(monitor_dir, prefix=None, options=None):
function load_monitor_filter (line 97) | def load_monitor_filter(path, options=None):
FILE: platformio/device/monitor/filters/hexlify.py
class Hexlify (line 20) | class Hexlify(DeviceMonitorFilterBase):
method __init__ (line 23) | def __init__(self, *args, **kwargs):
method set_running_terminal (line 27) | def set_running_terminal(self, terminal):
method rx (line 33) | def rx(self, text):
FILE: platformio/device/monitor/filters/log2file.py
class LogToFile (line 22) | class LogToFile(DeviceMonitorFilterBase):
method __init__ (line 25) | def __init__(self, *args, **kwargs):
method __call__ (line 29) | def __call__(self):
method __del__ (line 40) | def __del__(self):
method rx (line 44) | def rx(self, text):
FILE: platformio/device/monitor/filters/send_on_enter.py
class SendOnEnter (line 18) | class SendOnEnter(DeviceMonitorFilterBase):
method __init__ (line 21) | def __init__(self, *args, **kwargs):
method tx (line 32) | def tx(self, text):
FILE: platformio/device/monitor/filters/time.py
class Timestamp (line 20) | class Timestamp(DeviceMonitorFilterBase):
method __init__ (line 23) | def __init__(self, *args, **kwargs):
method rx (line 27) | def rx(self, text):
FILE: platformio/device/monitor/terminal.py
class Terminal (line 26) | class Terminal(miniterm.Miniterm):
method __init__ (line 27) | def __init__(self, *args, **kwargs):
method reader (line 31) | def reader(self):
method writer (line 37) | def writer(self):
function get_available_filters (line 44) | def get_available_filters():
function start_terminal (line 48) | def start_terminal(options):
function new_terminal (line 101) | def new_terminal(options):
function print_terminal_settings (line 122) | def print_terminal_settings(terminal):
function new_serial_instance (line 142) | def new_serial_instance(options): # pylint: disable=too-many-branches
FILE: platformio/exception.py
class PlatformioException (line 16) | class PlatformioException(Exception):
method __str__ (line 19) | def __str__(self): # pragma: no cover
class ReturnErrorCode (line 27) | class ReturnErrorCode(PlatformioException):
class UserSideException (line 31) | class UserSideException(PlatformioException):
class AbortedByUser (line 35) | class AbortedByUser(UserSideException):
class InvalidUdevRules (line 44) | class InvalidUdevRules(UserSideException):
class MissedUdevRules (line 48) | class MissedUdevRules(InvalidUdevRules):
class OutdatedUdevRules (line 55) | class OutdatedUdevRules(InvalidUdevRules):
class GetSerialPortsError (line 68) | class GetSerialPortsError(PlatformioException):
class GetLatestVersionError (line 72) | class GetLatestVersionError(PlatformioException):
class InvalidSettingName (line 76) | class InvalidSettingName(UserSideException):
class InvalidSettingValue (line 80) | class InvalidSettingValue(UserSideException):
class InvalidJSONFile (line 84) | class InvalidJSONFile(ValueError, UserSideException):
class CIBuildEnvsEmpty (line 88) | class CIBuildEnvsEmpty(UserSideException):
class HomeDirPermissionsError (line 96) | class HomeDirPermissionsError(UserSideException):
class CygwinEnvDetected (line 106) | class CygwinEnvDetected(PlatformioException):
FILE: platformio/fs.py
class cd (line 31) | class cd:
method __init__ (line 32) | def __init__(self, new_path):
method __enter__ (line 36) | def __enter__(self):
method __exit__ (line 39) | def __exit__(self, etype, value, traceback):
function get_source_dir (line 43) | def get_source_dir():
function get_assets_dir (line 53) | def get_assets_dir():
function load_json (line 57) | def load_json(file_path):
function humanize_file_size (line 65) | def humanize_file_size(filesize):
function calculate_file_hashsum (line 82) | def calculate_file_hashsum(algorithm, path):
function calculate_folder_size (line 93) | def calculate_folder_size(path):
function get_platformio_udev_rules_path (line 104) | def get_platformio_udev_rules_path():
function ensure_udev_rules (line 110) | def ensure_udev_rules():
function path_endswith_ext (line 147) | def path_endswith_ext(path, extensions):
function match_src_files (line 156) | def match_src_files(src_dir, src_filter=None, src_exts=None, followlinks...
function to_unix_path (line 193) | def to_unix_path(path):
function expanduser (line 199) | def expanduser(path):
function change_filemtime (line 208) | def change_filemtime(path, mtime):
function rmtree (line 212) | def rmtree(path):
FILE: platformio/home/cli.py
function cli (line 52) | def cli(port, host, no_open, shutdown_timeout, session_id):
function is_port_used (line 101) | def is_port_used(host, port):
FILE: platformio/home/rpc/handlers/account.py
class AccountRPC (line 21) | class AccountRPC(BaseRPCHandler):
method call_client (line 23) | def call_client(method, *args, **kwargs):
FILE: platformio/home/rpc/handlers/app.py
class AppRPC (line 22) | class AppRPC(BaseRPCHandler):
method load_state (line 34) | def load_state():
method get_state (line 72) | def get_state():
method save_state (line 76) | def save_state(state):
FILE: platformio/home/rpc/handlers/base.py
class BaseRPCHandler (line 16) | class BaseRPCHandler:
FILE: platformio/home/rpc/handlers/ide.py
class IDERPC (line 24) | class IDERPC(BaseRPCHandler):
method __init__ (line 27) | def __init__(self):
method listen_commands (line 31) | async def listen_commands(self):
method send_command (line 37) | async def send_command(self, command, params=None):
method on_command_result (line 52) | def on_command_result(self, cmd_id, value):
method _process_commands (line 61) | def _process_commands(self):
FILE: platformio/home/rpc/handlers/misc.py
class MiscRPC (line 24) | class MiscRPC(BaseRPCHandler):
method load_latest_tweets (line 25) | async def load_latest_tweets(self, data_url):
method _preload_latest_tweets (line 42) | async def _preload_latest_tweets(data_url, cache_key, cache_valid):
FILE: platformio/home/rpc/handlers/os.py
class HTTPAsyncSession (line 29) | class HTTPAsyncSession(HTTPSession):
method request (line 30) | async def request( # pylint: disable=signature-differs,invalid-overri...
class OSRPC (line 37) | class OSRPC(BaseRPCHandler):
method fetch_content (line 41) | async def fetch_content(cls, url, data=None, headers=None, cache_valid...
method request_content (line 75) | async def request_content(self, uri, data=None, headers=None, cache_va...
method open_url (line 84) | def open_url(url):
method reveal_file (line 88) | def reveal_file(path):
method open_file (line 92) | def open_file(path):
method call_path_module_func (line 96) | def call_path_module_func(name, args, **kwargs):
method get_path_separator (line 100) | def get_path_separator():
method is_file (line 104) | def is_file(path):
method is_dir (line 108) | def is_dir(path):
method make_dirs (line 112) | def make_dirs(path):
method get_file_mtime (line 116) | def get_file_mtime(path):
method rename (line 120) | def rename(src, dst):
method copy (line 124) | def copy(src, dst):
method glob (line 128) | def glob(pathnames, root=None):
method list_dir (line 141) | def list_dir(path):
method get_logical_devices (line 169) | def get_logical_devices():
FILE: platformio/home/rpc/handlers/piocore.py
class PIOCoreProtocol (line 39) | class PIOCoreProtocol(asyncio.SubprocessProtocol):
method __init__ (line 40) | def __init__(self, exit_future, on_data_callback=None):
method pipe_data_received (line 48) | def pipe_data_received(self, fd, data):
method connection_lost (line 58) | def connection_lost(self, exc):
method process_exited (line 61) | def process_exited(self):
class MultiThreadingStdStream (line 68) | class MultiThreadingStdStream:
method __init__ (line 69) | def __init__(self, parent_stream):
method __getattr__ (line 72) | def __getattr__(self, name):
method _ensure_thread_buffer (line 77) | def _ensure_thread_buffer(self, thread_id):
method write (line 81) | def write(self, value):
method get_value_and_reset (line 88) | def get_value_and_reset(self):
function get_core_fullpath (line 100) | def get_core_fullpath():
class PIOCoreRPC (line 104) | class PIOCoreRPC(BaseRPCHandler):
method version (line 106) | def version():
method exec (line 109) | async def exec(self, args, options=None):
method _on_exec_data_received (line 132) | def _on_exec_data_received(self, exec_options, pipe, data):
method setup_multithreading_std_streams (line 145) | def setup_multithreading_std_streams():
method call (line 154) | async def call(args, options=None):
method _call_subprocess (line 179) | async def _call_subprocess(args, options):
method _call_inline (line 188) | async def _call_inline(args, options):
method _process_result (line 205) | def _process_result(result, to_json=False):
FILE: platformio/home/rpc/handlers/platform.py
class PlatformRPC (line 25) | class PlatformRPC(BaseRPCHandler):
method fetch_platforms (line 26) | async def fetch_platforms(self, search_query=None, page=0, force_insta...
method _load_installed_platforms (line 60) | def _load_installed_platforms(search_query=None):
method fetch_boards (line 91) | async def fetch_boards(self, platform_spec):
method _load_installed_boards (line 104) | def _load_installed_boards(platform_spec):
method fetch_examples (line 111) | async def fetch_examples(self, platform_spec):
method _load_installed_examples (line 124) | def _load_installed_examples(platform_spec):
FILE: platformio/home/rpc/handlers/project.py
class ProjectRPC (line 36) | class ProjectRPC(BaseRPCHandler):
method config_call (line 38) | def config_call(init_kwargs, method, *args):
method config_load (line 52) | def config_load(path):
method config_dump (line 58) | def config_dump(path, data):
method config_update_description (line 64) | def config_update_description(path, text):
method get_config_schema (line 78) | def get_config_schema():
method get_projects (line 82) | def get_projects():
method get_project_examples (line 154) | def get_project_examples():
method init (line 193) | async def init(self, board, framework, project_dir):
method import_arduino (line 209) | async def import_arduino(board, use_arduino_libs, arduino_project_dir):
method import_pio (line 256) | async def import_pio(project_dir):
method init_v2 (line 276) | async def init_v2(self, configuration, options=None):
method _pre_init_empty (line 304) | def _pre_init_empty(configuration):
method _pre_init_example (line 331) | async def _pre_init_example(self, configuration, project_dir):
method configuration (line 345) | def configuration(project_dir, env):
FILE: platformio/home/rpc/handlers/registry.py
class RegistryRPC (line 22) | class RegistryRPC(BaseRPCHandler):
method call_client (line 24) | async def call_client(method, *args, **kwargs):
FILE: platformio/home/rpc/server.py
class JSONRPCServerFactoryBase (line 33) | class JSONRPCServerFactoryBase:
method __init__ (line 37) | def __init__(self, shutdown_timeout=0):
method __call__ (line 44) | def __call__(self, *args, **kwargs):
method add_object_handler (line 47) | def add_object_handler(self, handler, namespace):
method on_client_connect (line 51) | def on_client_connect(self, connection, actor=None):
method on_client_disconnect (line 58) | def on_client_disconnect(self, connection):
method on_shutdown (line 68) | async def on_shutdown(self):
method shutdown_by_timeout (line 71) | def shutdown_by_timeout(self):
method notify_clients (line 83) | async def notify_clients(self, method, params=None, actor=None):
class WebSocketJSONRPCServerFactory (line 92) | class WebSocketJSONRPCServerFactory(JSONRPCServerFactoryBase):
method __call__ (line 93) | def __call__(self, *args, **kwargs):
class WebSocketJSONRPCServer (line 99) | class WebSocketJSONRPCServer(WebSocketEndpoint):
method on_connect (line 103) | async def on_connect(self, websocket):
method on_receive (line 111) | async def on_receive(self, websocket, data):
method on_disconnect (line 114) | async def on_disconnect(self, websocket, close_code):
method _handle_rpc (line 117) | async def _handle_rpc(self, websocket, data):
FILE: platformio/home/run.py
class ShutdownMiddleware (line 43) | class ShutdownMiddleware:
method __init__ (line 44) | def __init__(self, app):
method __call__ (line 47) | async def __call__(self, scope, receive, send):
function shutdown_server (line 53) | async def shutdown_server(_=None):
function protected_page (line 58) | async def protected_page(_):
function run_server (line 64) | def run_server(host, port, no_open, shutdown_timeout, home_url):
FILE: platformio/http.py
class HTTPClientError (line 30) | class HTTPClientError(UserSideException):
method __init__ (line 31) | def __init__(self, message, response=None):
method __str__ (line 36) | def __str__(self): # pragma: no cover
class InternetConnectionError (line 40) | class InternetConnectionError(UserSideException):
class HTTPSession (line 48) | class HTTPSession(requests.Session):
method __init__ (line 49) | def __init__(self, *args, **kwargs):
method request (line 58) | def request( # pylint: disable=signature-differs,arguments-differ
class HTTPSessionIterator (line 76) | class HTTPSessionIterator:
method __init__ (line 77) | def __init__(self, endpoints):
method __iter__ (line 90) | def __iter__(self): # pylint: disable=non-iterator-returned
method __next__ (line 93) | def __next__(self):
class HTTPClient (line 101) | class HTTPClient:
method __init__ (line 102) | def __init__(self, endpoints):
method __del__ (line 107) | def __del__(self):
method _next_session (line 116) | def _next_session(self):
method send_request (line 122) | def send_request(self, method, path, **kwargs):
method fetch_json_data (line 150) | def fetch_json_data(self, method, path, **kwargs):
method _parse_json_response (line 172) | def _parse_json_response(response, expected_codes=(200, 201, 202)):
function _internet_on (line 191) | def _internet_on():
function ensure_internet_on (line 219) | def ensure_internet_on(raise_exception=False):
function fetch_remote_content (line 226) | def fetch_remote_content(*args, **kwargs):
FILE: platformio/maintenance.py
function on_cmd_start (line 32) | def on_cmd_start(ctx, caller):
function on_cmd_end (line 41) | def on_cmd_end():
function on_platformio_exception (line 60) | def on_platformio_exception(exc):
function on_platformio_exit (line 64) | def on_platformio_exit():
function set_caller (line 68) | def set_caller(caller=None):
class Upgrader (line 81) | class Upgrader:
method __init__ (line 82) | def __init__(self, from_version, to_version):
method run (line 89) | def run(self, ctx):
method _appstate_migration (line 102) | def _appstate_migration(_):
function after_upgrade (line 121) | def after_upgrade(ctx):
function print_welcome_banner (line 175) | def print_welcome_banner():
function check_platformio_upgrade (line 207) | def check_platformio_upgrade():
function check_prune_system (line 252) | def check_prune_system():
FILE: platformio/package/cli.py
function cli (line 47) | def cli():
FILE: platformio/package/commands/exec.py
function package_exec_cmd (line 31) | def package_exec_cmd(obj, package, call, args):
function find_pkg_by_executable (line 80) | def find_pkg_by_executable(executable):
function inject_pkg_to_environ (line 93) | def inject_pkg_to_environ(pkg):
FILE: platformio/package/commands/install.py
function package_install_cmd (line 64) | def package_install_cmd(**options):
function install_global_dependencies (line 71) | def install_global_dependencies(options):
function install_project_dependencies (line 97) | def install_project_dependencies(options):
function install_project_env_dependencies (line 112) | def install_project_env_dependencies(project_env, options=None):
function _install_project_env_platform (line 138) | def _install_project_env_platform(project_env, options):
function _install_project_env_custom_platforms (line 161) | def _install_project_env_custom_platforms(project_env, options):
function _install_project_env_custom_tools (line 179) | def _install_project_env_custom_tools(project_env, options):
function _install_project_env_libraries (line 206) | def _install_project_env_libraries(project_env, options):
function _uninstall_project_unused_libdeps (line 266) | def _uninstall_project_unused_libdeps(lm, lib_deps):
function _install_project_private_library_deps (line 292) | def _install_project_private_library_deps(private_pkg, private_lm, env_l...
function _install_project_env_custom_libraries (line 314) | def _install_project_env_custom_libraries(project_env, options):
FILE: platformio/package/commands/list.py
function package_list_cmd (line 52) | def package_list_cmd(**options):
function humanize_package (line 59) | def humanize_package(pkg, spec=None, verbose=False):
function print_dependency_tree (line 73) | def print_dependency_tree(pm, specs=None, filter_specs=None, level=0, ve...
function _pkg_tree_contains (line 123) | def _pkg_tree_contains(pm, root: PackageItem, children: List[PackageItem]):
function list_global_packages (line 133) | def list_global_packages(options):
function list_project_packages (line 158) | def list_project_packages(options):
function print_project_env_platform_packages (line 190) | def print_project_env_platform_packages(project_env, options):
function print_project_env_library_packages (line 214) | def print_project_env_library_packages(project_env, options):
FILE: platformio/package/commands/outdated.py
class OutdatedCandidate (line 28) | class OutdatedCandidate:
method __init__ (line 29) | def __init__(self, pm, pkg, spec, envs=None):
method __eq__ (line 38) | def __eq__(self, other):
method check (line 47) | def check(self):
method is_outdated (line 50) | def is_outdated(self):
function package_outdated_cmd (line 64) | def package_outdated_cmd(project_dir, environments):
function print_outdated_candidates (line 70) | def print_outdated_candidates(candidates):
function get_candidate_update_color (line 118) | def get_candidate_update_color(outdated):
function fetch_outdated_candidates (line 128) | def fetch_outdated_candidates(environments, with_progress=False):
function find_platform_candidates (line 168) | def find_platform_candidates(config, environments):
function find_platform_dependency_candidates (line 183) | def find_platform_dependency_candidates(env):
function find_library_candidates (line 198) | def find_library_candidates(config, environments):
FILE: platformio/package/commands/pack.py
function package_pack_cmd (line 34) | def package_pack_cmd(package, output):
FILE: platformio/package/commands/publish.py
function validate_datetime (line 35) | def validate_datetime(ctx, param, value): # pylint: disable=unused-argu...
function package_publish_cmd (line 85) | def package_publish_cmd( # pylint: disable=too-many-arguments,too-many-...
function check_archive_file_names (line 157) | def check_archive_file_names(archive_path):
function check_package_duplicates (line 168) | def check_package_duplicates(
FILE: platformio/package/commands/search.py
function package_search_cmd (line 31) | def package_search_cmd(query, page, sort):
function print_search_result (line 43) | def print_search_result(result):
function print_search_item (line 57) | def print_search_item(item):
FILE: platformio/package/commands/show.py
function package_show_cmd (line 36) | def package_show_cmd(spec, pkg_type):
function fetch_package_data (line 125) | def fetch_package_data(spec, pkg_type=None):
FILE: platformio/package/commands/uninstall.py
function package_uninstall_cmd (line 56) | def package_uninstall_cmd(**options):
function uninstall_global_dependencies (line 63) | def uninstall_global_dependencies(options):
function uninstall_project_dependencies (line 86) | def uninstall_project_dependencies(options):
function uninstall_project_env_dependencies (line 101) | def uninstall_project_env_dependencies(project_env, options=None):
function _uninstall_project_env_platform (line 128) | def _uninstall_project_env_platform(project_env, options):
function _uninstall_project_env_custom_platforms (line 147) | def _uninstall_project_env_custom_platforms(project_env, options):
function _uninstall_project_env_custom_tools (line 163) | def _uninstall_project_env_custom_tools(project_env, options):
function _uninstall_project_env_libraries (line 189) | def _uninstall_project_env_libraries(project_env, options):
function _uninstall_project_env_custom_libraries (line 211) | def _uninstall_project_env_custom_libraries(project_env, options):
FILE: platformio/package/commands/unpublish.py
function package_unpublish_cmd (line 37) | def package_unpublish_cmd(package, type, undo): # pylint: disable=redef...
FILE: platformio/package/commands/update.py
function package_update_cmd (line 56) | def package_update_cmd(**options):
function update_global_dependencies (line 63) | def update_global_dependencies(options):
function update_project_dependencies (line 89) | def update_project_dependencies(options):
function update_project_env_dependencies (line 104) | def update_project_env_dependencies(project_env, options=None):
function _update_project_env_platform (line 125) | def _update_project_env_platform(project_env, options):
function _update_project_env_custom_platforms (line 145) | def _update_project_env_custom_platforms(project_env, options):
function _update_project_env_custom_tools (line 163) | def _update_project_env_custom_tools(project_env, options):
function _update_project_env_libraries (line 194) | def _update_project_env_libraries(project_env, options):
function _update_project_env_custom_libraries (line 219) | def _update_project_env_custom_libraries(project_env, options):
FILE: platformio/package/download.py
class FileDownloader (line 28) | class FileDownloader:
method __init__ (line 29) | def __init__(self, url, dest_dir=None):
method set_destination (line 58) | def set_destination(self, destination):
method get_filepath (line 61) | def get_filepath(self):
method get_lmtime (line 64) | def get_lmtime(self):
method get_size (line 67) | def get_size(self):
method start (line 72) | def start(self, with_progress=True, silent=False):
method verify (line 122) | def verify(self, checksum=None):
method _preserve_filemtime (line 158) | def _preserve_filemtime(self, lmdate):
method __del__ (line 162) | def __del__(self):
FILE: platformio/package/exception.py
class PackageException (line 18) | class PackageException(UserSideException):
class ManifestException (line 22) | class ManifestException(PackageException):
class UnknownManifestError (line 26) | class UnknownManifestError(ManifestException):
class ManifestParserError (line 30) | class ManifestParserError(ManifestException):
class ManifestValidationError (line 34) | class ManifestValidationError(ManifestException):
method __init__ (line 35) | def __init__(self, messages, data, valid_data):
method __str__ (line 41) | def __str__(self):
class MissingPackageManifestError (line 49) | class MissingPackageManifestError(ManifestException):
class UnknownPackageError (line 53) | class UnknownPackageError(PackageException):
class IncompatiblePackageError (line 57) | class IncompatiblePackageError(UnknownPackageError):
class NotGlobalLibDir (line 64) | class NotGlobalLibDir(PackageException):
FILE: platformio/package/lockfile.py
class LockFileExists (line 39) | class LockFileExists(UserSideException):
class LockFileTimeoutError (line 43) | class LockFileTimeoutError(UserSideException):
class LockFile (line 47) | class LockFile:
method __init__ (line 48) | def __init__(self, path, timeout=LOCKFILE_TIMEOUT, delay=LOCKFILE_DELAY):
method _lock (line 54) | def _lock(self):
method _unlock (line 81) | def _unlock(self):
method acquire (line 91) | def acquire(self):
method release (line 102) | def release(self):
method __enter__ (line 110) | def __enter__(self):
method __exit__ (line 113) | def __exit__(self, type_, value, traceback):
method __del__ (line 116) | def __del__(self):
FILE: platformio/package/manager/_download.py
class PackageManagerDownloadMixin (line 28) | class PackageManagerDownloadMixin:
method compute_download_path (line 31) | def compute_download_path(self, *args):
method get_download_usagedb_path (line 38) | def get_download_usagedb_path(self):
method set_download_utime (line 41) | def set_download_utime(self, path, utime=None):
method cleanup_expired_downloads (line 46) | def cleanup_expired_downloads(self, _=None):
method download (line 57) | def download(self, url, checksum=None):
FILE: platformio/package/manager/_install.py
class PackageManagerInstallMixin (line 29) | class PackageManagerInstallMixin:
method unpack (line 33) | def unpack(src, dst):
method install (line 44) | def install(self, spec, skip_dependencies=False, force=False):
method _install (line 54) | def _install(
method install_dependencies (line 134) | def install_dependencies(self, pkg, print_header=True):
method install_dependency (line 154) | def install_dependency(self, dependency):
method install_from_uri (line 172) | def install_from_uri(self, uri, spec, checksum=None):
method _install_tmp_pkg (line 212) | def _install_tmp_pkg(self, tmp_pkg):
FILE: platformio/package/manager/_legacy.py
class PackageManagerLegacyMixin (line 21) | class PackageManagerLegacyMixin:
method build_legacy_spec (line 22) | def build_legacy_spec(self, pkg_dir):
method legacy_load_manifest (line 44) | def legacy_load_manifest(self, pkg):
method legacy_get_installed (line 60) | def legacy_get_installed(self):
FILE: platformio/package/manager/_registry.py
class PackageManagerRegistryMixin (line 27) | class PackageManagerRegistryMixin:
method install_from_registry (line 28) | def install_from_registry(self, spec, search_qualifiers=None):
method get_registry_client_instance (line 73) | def get_registry_client_instance(self):
method search_registry_packages (line 78) | def search_registry_packages(self, spec, qualifiers=None):
method fetch_registry_package (line 92) | def fetch_registry_package(self, spec):
method reveal_registry_package_id (line 108) | def reveal_registry_package_id(self, spec):
method print_multi_package_issue (line 121) | def print_multi_package_issue(print_func, packages, spec):
method find_best_registry_version (line 146) | def find_best_registry_version(self, packages, spec):
method get_compatible_registry_versions (line 169) | def get_compatible_registry_versions(self, versions, spec=None, custom...
method pick_best_registry_version (line 184) | def pick_best_registry_version(self, versions, spec=None, custom_syste...
method pick_compatible_pkg_file (line 194) | def pick_compatible_pkg_file(self, version_files, custom_system=None):
FILE: platformio/package/manager/_symlink.py
class PackageManagerSymlinkMixin (line 23) | class PackageManagerSymlinkMixin:
method is_symlink (line 25) | def is_symlink(path):
method resolve_symlink (line 29) | def resolve_symlink(cls, path):
method get_symlinked_package (line 39) | def get_symlinked_package(self, path):
method install_symlink (line 48) | def install_symlink(self, spec):
method uninstall_symlink (line 63) | def uninstall_symlink(self, spec):
FILE: platformio/package/manager/_uninstall.py
class PackageManagerUninstallMixin (line 25) | class PackageManagerUninstallMixin:
method uninstall (line 26) | def uninstall(self, spec, skip_dependencies=False):
method _uninstall (line 33) | def _uninstall(self, spec, skip_dependencies=False):
method uninstall_dependencies (line 87) | def uninstall_dependencies(self, pkg):
FILE: platformio/package/manager/_update.py
class PackageManagerUpdateMixin (line 24) | class PackageManagerUpdateMixin:
method outdated (line 25) | def outdated(self, pkg, spec=None):
method _fetch_vcs_latest_version (line 67) | def _fetch_vcs_latest_version(self, pkg):
method update (line 86) | def update(
method _update (line 118) | def _update(self, pkg, outdated, skip_dependencies=False):
FILE: platformio/package/manager/base.py
class ClickLoggingHandler (line 46) | class ClickLoggingHandler(logging.Handler):
method emit (line 47) | def emit(self, record):
class BasePackageManager (line 51) | class BasePackageManager( # pylint: disable=too-many-public-methods,too...
method __init__ (line 62) | def __init__(self, pkg_type, package_dir, compatibility=None):
method __repr__ (line 74) | def __repr__(self):
method _setup_logger (line 80) | def _setup_logger(self):
method set_log_level (line 90) | def set_log_level(self, level):
method lock (line 93) | def lock(self):
method unlock (line 101) | def unlock(self):
method __del__ (line 106) | def __del__(self):
method memcache_get (line 109) | def memcache_get(self, key, default=None):
method memcache_set (line 112) | def memcache_set(self, key, value):
method memcache_reset (line 115) | def memcache_reset(self):
method is_system_compatible (line 119) | def is_system_compatible(value, custom_system=None):
method ensure_dir_exists (line 125) | def ensure_dir_exists(path):
method ensure_spec (line 132) | def ensure_spec(spec):
method manifest_names (line 136) | def manifest_names(self):
method get_download_dir (line 139) | def get_download_dir(self):
method get_tmp_dir (line 146) | def get_tmp_dir(self):
method find_pkg_root (line 153) | def find_pkg_root(self, path, spec): # pylint: disable=unused-argument
method get_manifest_path (line 161) | def get_manifest_path(self, pkg_dir):
method manifest_exists (line 170) | def manifest_exists(self, pkg_dir):
method load_manifest (line 173) | def load_manifest(self, src):
method generate_rand_version (line 197) | def generate_rand_version():
method build_metadata (line 200) | def build_metadata(self, pkg_dir, spec, vcs_revision=None):
method get_installed (line 219) | def get_installed(self): # pylint: disable=too-many-branches
method get_package (line 260) | def get_package(self, spec):
method test_pkg_spec (line 276) | def test_pkg_spec(pkg, spec):
method get_pkg_dependencies (line 308) | def get_pkg_dependencies(self, pkg):
method dependency_to_spec (line 312) | def dependency_to_spec(dependency):
method call_pkg_script (line 319) | def call_pkg_script(self, pkg, event):
FILE: platformio/package/manager/core.py
function get_installed_core_packages (line 24) | def get_installed_core_packages():
function get_core_package_dir (line 35) | def get_core_package_dir(name, spec=None, auto_install=True):
function update_core_packages (line 52) | def update_core_packages():
function remove_unnecessary_core_packages (line 64) | def remove_unnecessary_core_packages(dry_run=False):
FILE: platformio/package/manager/library.py
class LibraryPackageManager (line 26) | class LibraryPackageManager(BasePackageManager): # pylint: disable=too-...
method __init__ (line 27) | def __init__(self, package_dir=None, **kwargs):
method manifest_names (line 36) | def manifest_names(self):
method find_pkg_root (line 39) | def find_pkg_root(self, path, spec):
method find_library_root (line 64) | def find_library_root(path):
method install_dependency (line 84) | def install_dependency(self, dependency):
method get_builtin_libs (line 96) | def get_builtin_libs(storage_names=None):
method is_builtin_lib (line 119) | def is_builtin_lib(cls, name):
FILE: platformio/package/manager/platform.py
class PlatformPackageManager (line 29) | class PlatformPackageManager(BasePackageManager): # pylint: disable=too...
method __init__ (line 30) | def __init__(self, package_dir=None):
method manifest_names (line 38) | def manifest_names(self):
method install (line 41) | def install( # pylint: disable=arguments-differ,too-many-arguments,to...
method uninstall (line 67) | def uninstall( # pylint: disable=arguments-differ
method update (line 84) | def update( # pylint: disable=arguments-differ
method get_installed_boards (line 108) | def get_installed_boards(self):
method get_registered_boards (line 118) | def get_registered_boards(self):
method get_all_boards (line 123) | def get_all_boards(self):
method board_config (line 135) | def board_config(self, id_, platform=None):
function remove_unnecessary_platform_packages (line 154) | def remove_unnecessary_platform_packages(dry_run=False):
FILE: platformio/package/manager/tool.py
class ToolPackageManager (line 20) | class ToolPackageManager(BasePackageManager): # pylint: disable=too-man...
method __init__ (line 21) | def __init__(self, package_dir=None):
method manifest_names (line 29) | def manifest_names(self):
FILE: platformio/package/manifest/parser.py
class ManifestFileType (line 30) | class ManifestFileType:
method items (line 38) | def items(cls):
method from_uri (line 42) | def from_uri(cls, uri):
method from_dir (line 49) | def from_dir(cls, path):
class ManifestParserFactory (line 56) | class ManifestParserFactory:
method read_manifest_contents (line 58) | def read_manifest_contents(path):
method new_from_file (line 69) | def new_from_file(cls, path, remote_url=False):
method new_from_dir (line 80) | def new_from_dir(cls, path, remote_url=None):
method new_from_url (line 105) | def new_from_url(remote_url):
method new_from_archive (line 114) | def new_from_archive(path):
method new (line 128) | def new( # pylint: disable=redefined-builtin
class BaseManifestParser (line 142) | class BaseManifestParser:
method __init__ (line 143) | def __init__(self, contents, remote_url=None, package_dir=None):
method parse (line 159) | def parse(self, contents):
method as_dict (line 162) | def as_dict(self):
method str_to_list (line 166) | def str_to_list(value, sep=",", lowercase=False, unique=False):
method cleanup_author (line 183) | def cleanup_author(author):
method parse_author_name_and_email (line 195) | def parse_author_name_and_email(raw):
method normalize_repository (line 210) | def normalize_repository(data):
method parse_examples (line 225) | def parse_examples(self, data):
method parse_examples_from_dir (line 240) | def parse_examples_from_dir(package_dir):
class LibraryJsonManifestParser (line 316) | class LibraryJsonManifestParser(BaseManifestParser):
method parse (line 319) | def parse(self, contents):
method _process_renamed_fields (line 344) | def _process_renamed_fields(data):
method _parse_authors (line 359) | def _parse_authors(self, raw):
method _fix_platforms (line 368) | def _fix_platforms(items):
method _parse_export (line 375) | def _parse_export(raw):
method _parse_dependencies (line 386) | def _parse_dependencies(raw):
class ModuleJsonManifestParser (line 416) | class ModuleJsonManifestParser(BaseManifestParser):
method parse (line 419) | def parse(self, contents):
method _parse_authors (line 438) | def _parse_authors(self, raw):
method _parse_license (line 450) | def _parse_license(raw):
method _parse_dependencies (line 456) | def _parse_dependencies(raw):
class LibraryPropertiesManifestParser (line 465) | class LibraryPropertiesManifestParser(BaseManifestParser):
method parse (line 468) | def parse(self, contents):
method _parse_properties (line 497) | def _parse_properties(contents):
method _parse_description (line 513) | def _parse_description(properties):
method _parse_keywords (line 525) | def _parse_keywords(self, properties):
method _parse_platforms (line 535) | def _parse_platforms(self, properties):
method _parse_authors (line 560) | def _parse_authors(self, properties):
method _parse_repository (line 588) | def _parse_repository(self, properties):
method _parse_export (line 610) | def _parse_export(self):
method _parse_dependencies (line 627) | def _parse_dependencies(raw):
class PlatformJsonManifestParser (line 647) | class PlatformJsonManifestParser(BaseManifestParser):
method parse (line 650) | def parse(self, contents):
method _parse_dependencies (line 669) | def _parse_dependencies(raw):
class PackageJsonManifestParser (line 680) | class PackageJsonManifestParser(BaseManifestParser):
method parse (line 683) | def parse(self, contents):
method _parse_system (line 694) | def _parse_system(self, data):
method _parse_homepage (line 704) | def _parse_homepage(data):
method _parse_repository (line 711) | def _parse_repository(data):
FILE: platformio/package/manifest/schema.py
class BaseSchema (line 30) | class BaseSchema(Schema):
class Meta (line 31) | class Meta:
method load_manifest (line 34) | def load_manifest(self, data):
method handle_error (line 37) | def handle_error(self, error, data, **_): # pylint: disable=arguments...
class StrictSchema (line 45) | class StrictSchema(BaseSchema):
method handle_error (line 46) | def handle_error(self, error, data, **_): # pylint: disable=arguments...
class StrictListField (line 57) | class StrictListField(fields.List):
method _deserialize (line 58) | def _deserialize( # pylint: disable=arguments-differ
class AuthorSchema (line 69) | class AuthorSchema(StrictSchema):
class RepositorySchema (line 76) | class RepositorySchema(StrictSchema):
class DependencySchema (line 88) | class DependencySchema(StrictSchema):
class ExportSchema (line 115) | class ExportSchema(BaseSchema):
class ExampleSchema (line 120) | class ExampleSchema(StrictSchema):
class ScriptField (line 138) | class ScriptField(fields.Field):
method _deserialize (line 139) | def _deserialize(self, value, attr, data, **kwargs):
class ManifestSchema (line 150) | class ManifestSchema(BaseSchema):
method validate_version (line 235) | def validate_version(self, value):
method validate_license (line 252) | def validate_license(self, value):
method load_spdx_licenses (line 278) | def load_spdx_licenses():
FILE: platformio/package/meta.py
class PackageType (line 31) | class PackageType:
method items (line 37) | def items(cls):
method get_manifest_map (line 41) | def get_manifest_map(cls):
method from_archive (line 53) | def from_archive(cls, path):
class PackageCompatibility (line 67) | class PackageCompatibility:
method from_dependency (line 78) | def from_dependency(cls, dependency):
method __init__ (line 87) | def __init__(self, **kwargs):
method __repr__ (line 96) | def __repr__(self):
method to_search_qualifiers (line 99) | def to_search_qualifiers(self, fields=None):
method is_compatible (line 106) | def is_compatible(self, other):
method _compare_versions (line 124) | def _compare_versions(self, current, other):
class PackageOutdatedResult (line 139) | class PackageOutdatedResult:
method __init__ (line 144) | def __init__(self, current, latest=None, wanted=None, detached=False):
method __repr__ (line 150) | def __repr__(self):
method __setattr__ (line 161) | def __setattr__(self, name, value):
method update_increment_type (line 171) | def update_increment_type(self):
method is_outdated (line 188) | def is_outdated(self, allow_incompatible=False):
class PackageSpec (line 198) | class PackageSpec: # pylint: disable=too-many-instance-attributes
method __init__ (line 199) | def __init__( # pylint: disable=redefined-builtin,too-many-arguments,...
method __eq__ (line 218) | def __eq__(self, other):
method __hash__ (line 229) | def __hash__(self):
method __repr__ (line 237) | def __repr__(self):
method external (line 244) | def external(self):
method symlink (line 248) | def symlink(self):
method requirements (line 252) | def requirements(self):
method requirements (line 256) | def requirements(self, value):
method humanize (line 269) | def humanize(self):
method has_custom_name (line 283) | def has_custom_name(self):
method as_dict (line 286) | def as_dict(self):
method as_dependency (line 295) | def as_dependency(self):
method _parse (line 308) | def _parse(self, raw):
method _parse_local_file (line 336) | def _parse_local_file(raw):
method _parse_requirements (line 345) | def _parse_requirements(self, raw):
method _parse_custom_name (line 354) | def _parse_custom_name(self, raw):
method _parse_id (line 364) | def _parse_id(self, raw):
method _parse_owner (line 372) | def _parse_owner(self, raw):
method _parse_uri (line 380) | def _parse_uri(self, raw):
method _parse_name_from_uri (line 416) | def _parse_name_from_uri(uri):
class PackageMetadata (line 437) | class PackageMetadata:
method __init__ (line 438) | def __init__( # pylint: disable=redefined-builtin
method __repr__ (line 450) | def __repr__(self):
method __eq__ (line 456) | def __eq__(self, other):
method version (line 467) | def version(self):
method version (line 471) | def version(self, value):
method as_dict (line 481) | def as_dict(self):
method dump (line 489) | def dump(self, path):
method load (line 494) | def load(path):
class PackageItem (line 505) | class PackageItem:
method __init__ (line 508) | def __init__(self, path, metadata=None):
method __repr__ (line 514) | def __repr__(self):
method __eq__ (line 519) | def __eq__(self, other):
method __hash__ (line 530) | def __hash__(self):
method exists (line 533) | def exists(self):
method get_safe_dirname (line 536) | def get_safe_dirname(self):
method get_metafile_locations (line 540) | def get_metafile_locations(self):
method load_meta (line 548) | def load_meta(self):
method dump_meta (line 556) | def dump_meta(self):
FILE: platformio/package/pack.py
class PackagePacker (line 35) | class PackagePacker:
method __init__ (line 118) | def __init__(self, package, manifest_uri=None):
method get_archive_name (line 124) | def get_archive_name(name, version, system=None):
method load_gitignore_filters (line 136) | def load_gitignore_filters(path):
method pack (line 149) | def pack(self, dst=None):
method find_source_root (line 184) | def find_source_root(self, src):
method create_tarball (line 207) | def create_tarball(self, src, dst, manifest):
method compute_src_filters (line 231) | def compute_src_filters(self, src, include, exclude):
FILE: platformio/package/unpack.py
class ExtractArchiveItemError (line 28) | class ExtractArchiveItemError(PackageException):
class BaseArchiver (line 35) | class BaseArchiver:
method __init__ (line 36) | def __init__(self, arhfileobj):
method get_items (line 39) | def get_items(self):
method get_item_filename (line 42) | def get_item_filename(self, item):
method is_link (line 45) | def is_link(self, item):
method extract_item (line 48) | def extract_item(self, item, dest_dir):
method after_extract (line 52) | def after_extract(self, item, dest_dir):
method close (line 55) | def close(self):
class TARArchiver (line 59) | class TARArchiver(BaseArchiver):
method __init__ (line 60) | def __init__(self, archpath):
method get_items (line 63) | def get_items(self):
method get_item_filename (line 66) | def get_item_filename(self, item):
method is_link (line 70) | def is_link(item): # pylint: disable=arguments-differ
method resolve_path (line 74) | def resolve_path(path):
method is_bad_path (line 77) | def is_bad_path(self, path, base):
method is_bad_link (line 80) | def is_bad_link(self, item, base):
method extract_item (line 85) | def extract_item(self, item, dest_dir):
class ZIPArchiver (line 105) | class ZIPArchiver(BaseArchiver):
method __init__ (line 106) | def __init__(self, archpath):
method preserve_permissions (line 110) | def preserve_permissions(item, dest_dir):
method preserve_mtime (line 116) | def preserve_mtime(item, dest_dir):
method is_link (line 123) | def is_link(_): # pylint: disable=arguments-differ
method get_items (line 126) | def get_items(self):
method get_item_filename (line 129) | def get_item_filename(self, item):
method after_extract (line 132) | def after_extract(self, item, dest_dir):
class FileUnpacker (line 137) | class FileUnpacker:
method __init__ (line 138) | def __init__(self, path):
method __enter__ (line 142) | def __enter__(self):
method __exit__ (line 146) | def __exit__(self, *args):
method new_archiver (line 151) | def new_archiver(path):
method unpack (line 166) | def unpack(
FILE: platformio/package/vcsclient.py
class VCSBaseException (line 24) | class VCSBaseException(UserSideException):
class VCSClientFactory (line 28) | class VCSClientFactory:
method new (line 30) | def new(src_dir, remote_url, silent=False):
class VCSClientBase (line 56) | class VCSClientBase:
method __init__ (line 59) | def __init__(self, src_dir, remote_url=None, tag=None, silent=False):
method check_client (line 66) | def check_client(self):
method storage_dir (line 80) | def storage_dir(self):
method export (line 83) | def export(self):
method update (line 86) | def update(self):
method can_be_updated (line 90) | def can_be_updated(self):
method get_current_revision (line 93) | def get_current_revision(self):
method get_latest_revision (line 96) | def get_latest_revision(self):
method run_cmd (line 99) | def run_cmd(self, args, **kwargs):
method get_cmd_output (line 113) | def get_cmd_output(self, args, **kwargs):
class GitClient (line 125) | class GitClient(VCSClientBase):
method __init__ (line 129) | def __init__(self, *args, **kwargs):
method configure (line 134) | def configure(cls):
method check_client (line 150) | def check_client(self):
method get_branches (line 158) | def get_branches(self):
method get_current_branch (line 163) | def get_current_branch(self):
method get_tags (line 173) | def get_tags(self):
method is_commit_id (line 178) | def is_commit_id(text):
method can_be_updated (line 182) | def can_be_updated(self):
method export (line 185) | def export(self):
method update (line 201) | def update(self):
method get_current_revision (line 205) | def get_current_revision(self):
method get_latest_revision (line 208) | def get_latest_revision(self):
class HgClient (line 228) | class HgClient(VCSClientBase):
method export (line 231) | def export(self):
method update (line 238) | def update(self):
method get_current_revision (line 242) | def get_current_revision(self):
method get_latest_revision (line 245) | def get_latest_revision(self):
class SvnClient (line 251) | class SvnClient(VCSClientBase):
method export (line 254) | def export(self):
method update (line 261) | def update(self):
method get_current_revision (line 265) | def get_current_revision(self):
FILE: platformio/package/version.py
class SemanticVersionError (line 22) | class SemanticVersionError(UserSideException):
function cast_version_to_semver (line 26) | def cast_version_to_semver(value, force=True, raise_exception=False):
function pepver_to_semver (line 45) | def pepver_to_semver(pepver):
function get_original_version (line 51) | def get_original_version(version):
FILE: platformio/platform/_packages.py
class PlatformPackagesMixin (line 18) | class PlatformPackagesMixin:
method get_package_spec (line 19) | def get_package_spec(self, name, version=None):
method get_package (line 26) | def get_package(self, name, spec=None):
method get_package_dir (line 31) | def get_package_dir(self, name):
method get_package_version (line 35) | def get_package_version(self, name):
method get_installed_packages (line 39) | def get_installed_packages(self, with_optional=True, with_optional_ver...
method dump_used_packages (line 55) | def dump_used_packages(self):
method install_package (line 69) | def install_package(self, name, spec=None, force=False):
method install_required_packages (line 72) | def install_required_packages(self, force=False):
method uninstall_packages (line 78) | def uninstall_packages(self):
method update_packages (line 82) | def update_packages(self):
method are_outdated_packages (line 86) | def are_outdated_packages(self):
FILE: platformio/platform/_run.py
class PlatformRunMixin (line 31) | class PlatformRunMixin:
method encode_scons_arg (line 35) | def encode_scons_arg(value):
method decode_scons_arg (line 41) | def decode_scons_arg(data):
method run (line 47) | def run( # pylint: disable=too-many-arguments,too-many-positional-arg...
method _run_scons (line 70) | def _run_scons(self, variables, targets, jobs):
method _on_stdout_line (line 135) | def _on_stdout_line(self, line):
method _on_stderr_line (line 140) | def _on_stderr_line(self, line):
method _echo_line (line 150) | def _echo_line(self, line, level):
method _echo_missed_dependency (line 162) | def _echo_missed_dependency(filename):
FILE: platformio/platform/base.py
class PlatformBase (line 29) | class PlatformBase( # pylint: disable=too-many-instance-attributes,too-...
method __init__ (line 35) | def __init__(self, manifest_path):
method name (line 49) | def name(self):
method title (line 53) | def title(self):
method description (line 57) | def description(self):
method version (line 61) | def version(self):
method homepage (line 65) | def homepage(self):
method repository_url (line 69) | def repository_url(self):
method license (line 73) | def license(self):
method frameworks (line 77) | def frameworks(self):
method engines (line 81) | def engines(self):
method manifest (line 85) | def manifest(self):
method packages (line 89) | def packages(self):
method ensure_engine_compatible (line 105) | def ensure_engine_compatible(self):
method get_dir (line 118) | def get_dir(self):
method get_build_script (line 121) | def get_build_script(self):
method is_embedded (line 127) | def is_embedded(self):
method get_boards (line 133) | def get_boards(self, id_=None):
method board_config (line 171) | def board_config(self, id_):
method get_package_type (line 175) | def get_package_type(self, name):
method configure_project_packages (line 178) | def configure_project_packages(self, env, targets=None):
method configure_default_packages (line 187) | def configure_default_packages(self, options, targets):
method configure_debug_session (line 209) | def configure_debug_session(self, debug_config):
method generate_sample_code (line 212) | def generate_sample_code(self, project_config, environment):
method on_installed (line 215) | def on_installed(self):
method on_uninstalled (line 218) | def on_uninstalled(self):
method get_lib_storages (line 221) | def get_lib_storages(self):
FILE: platformio/platform/board.py
class PlatformBoardConfig (line 24) | class PlatformBoardConfig:
method __init__ (line 25) | def __init__(self, manifest_path):
method get (line 38) | def get(self, path, default=MISSING):
method update (line 49) | def update(self, path, value):
method __contains__ (line 58) | def __contains__(self, key):
method id (line 66) | def id(self):
method id_ (line 70) | def id_(self):
method manifest (line 74) | def manifest(self):
method get_brief_data (line 77) | def get_brief_data(self):
method get_debug_data (line 105) | def get_debug_data(self):
method get_debug_tool_name (line 116) | def get_debug_tool_name(self, custom=None):
FILE: platformio/platform/exception.py
class PlatformException (line 18) | class PlatformException(UserSideException):
class UnknownPlatform (line 22) | class UnknownPlatform(PlatformException):
class IncompatiblePlatform (line 26) | class IncompatiblePlatform(PlatformException):
class UnknownBoard (line 33) | class UnknownBoard(PlatformException):
class InvalidBoardManifest (line 37) | class InvalidBoardManifest(PlatformException):
class UnknownFramework (line 41) | class UnknownFramework(PlatformException):
class BuildScriptNotFound (line 45) | class BuildScriptNotFound(PlatformException):
FILE: platformio/platform/factory.py
class PlatformFactory (line 28) | class PlatformFactory:
method get_clsname (line 30) | def get_clsname(name):
method load_platform_module (line 35) | def load_platform_module(name, path):
method new (line 44) | def new(cls, pkg_or_spec, autoinstall=False) -> base.PlatformBase:
method from_env (line 95) | def from_env(cls, env, targets=None, autoinstall=False):
FILE: platformio/proc.py
class AsyncPipeBase (line 30) | class AsyncPipeBase:
method __init__ (line 31) | def __init__(self):
method get_buffer (line 40) | def get_buffer(self):
method fileno (line 43) | def fileno(self):
method run (line 46) | def run(self):
method do_reading (line 52) | def do_reading(self):
method close (line 55) | def close(self):
class BuildAsyncPipe (line 61) | class BuildAsyncPipe(AsyncPipeBase):
method __init__ (line 62) | def __init__(self, line_callback, data_callback):
method do_reading (line 67) | def do_reading(self):
class LineBufferedAsyncPipe (line 95) | class LineBufferedAsyncPipe(AsyncPipeBase):
method __init__ (line 96) | def __init__(self, line_callback):
method do_reading (line 100) | def do_reading(self):
function exec_command (line 107) | def exec_command(*args, **kwargs):
function capture_std_streams (line 144) | def capture_std_streams(stdout, stderr=None):
function is_ci (line 154) | def is_ci():
function is_container (line 158) | def is_container():
function get_pythonexe_path (line 167) | def get_pythonexe_path():
function copy_pythonpath_to_osenv (line 171) | def copy_pythonpath_to_osenv():
function where_is_program (line 187) | def where_is_program(program, envpath=None):
function append_env_path (line 210) | def append_env_path(name, value):
function force_exit (line 218) | def force_exit(code=0):
FILE: platformio/project/cli.py
function cli (line 31) | def cli():
FILE: platformio/project/commands/config.py
function project_config_cmd (line 35) | def project_config_cmd(project_dir, lint, json_output):
function print_configuration (line 44) | def print_configuration(json_output=False):
function lint_configuration (line 67) | def lint_configuration(json_output=False):
FILE: platformio/project/commands/init.py
function validate_boards (line 35) | def validate_boards(ctx, param, value): # pylint: disable=unused-argument
function project_init_cmd (line 71) | def project_init_cmd( # pylint: disable=too-many-positional-arguments
function print_header (line 131) | def print_header(project_dir):
function print_footer (line 148) | def print_footer(is_new_project):
function init_base_project (line 156) | def init_base_project(project_dir):
function init_include_readme (line 174) | def init_include_readme(include_dir):
function init_lib_readme (line 218) | def init_lib_readme(lib_dir):
function init_test_readme (line 271) | def init_test_readme(test_dir):
function init_cvs_ignore (line 289) | def init_cvs_ignore():
function update_board_envs (line 297) | def update_board_envs(project_dir, boards, extra_project_options, env_pr...
function update_project_env (line 338) | def update_project_env(environment, extra_project_options=None):
function init_sample_code (line 368) | def init_sample_code(config, environment):
FILE: platformio/project/commands/metadata.py
function project_metadata_cmd (line 39) | def project_metadata_cmd(project_dir, environments, json_output, json_ou...
FILE: platformio/project/config.py
class ProjectConfigBase (line 43) | class ProjectConfigBase:
method parse_multi_values (line 67) | def parse_multi_values(items):
method get_default_path (line 84) | def get_default_path():
method __init__ (line 91) | def __init__(self, path=None, parse_extra=True, expand_interpolations=...
method __getattr__ (line 103) | def __getattr__(self, name):
method read (line 106) | def read(self, path, parse_extra=True):
method _maintain_renamed_options (line 125) | def _maintain_renamed_options(self):
method get_section_scope (line 166) | def get_section_scope(section):
method walk_options (line 170) | def walk_options(self, root_section):
method options (line 187) | def options(self, section=None, env=None):
method has_option (line 210) | def has_option(self, section, option):
method items (line 215) | def items(self, section=None, env=None, as_dict=False):
method set (line 225) | def set(self, section, option, value):
method resolve_renamed_option (line 239) | def resolve_renamed_option(self, section, old_name):
method find_option_meta (line 252) | def find_option_meta(self, section, option):
method _traverse_for_value (line 264) | def _traverse_for_value(self, section, option, option_meta=None):
method getraw (line 276) | def getraw(
method _expand_interpolations (line 315) | def _expand_interpolations(self, section, option, value):
method _re_interpolation_handler (line 343) | def _re_interpolation_handler(self, parent_section, parent_option, mat...
method get (line 381) | def get(self, section, option, default=MISSING):
method cast_to (line 407) | def cast_to(value, to_type):
method envs (line 417) | def envs(self):
method default_envs (line 420) | def default_envs(self):
method get_default_env (line 423) | def get_default_env(self):
method validate (line 430) | def validate(self, envs=None, silent=False):
class ProjectConfigLintMixin (line 468) | class ProjectConfigLintMixin:
method lint (line 470) | def lint(cls, path=None):
class ProjectConfigDirsMixin (line 503) | class ProjectConfigDirsMixin:
method get_optional_dir (line 504) | def get_optional_dir(self, name):
class ProjectConfig (line 513) | class ProjectConfig(ProjectConfigBase, ProjectConfigLintMixin, ProjectCo...
method get_instance (line 517) | def get_instance(path=None):
method __repr__ (line 528) | def __repr__(self):
method as_tuple (line 531) | def as_tuple(self):
method to_json (line 534) | def to_json(self):
method update (line 537) | def update(self, data, clear=False):
method save (line 547) | def save(self, path=None):
FILE: platformio/project/exception.py
class ProjectError (line 18) | class ProjectError(PlatformioException):
class NotPlatformIOProjectError (line 22) | class NotPlatformIOProjectError(ProjectError, UserSideException):
class InvalidProjectConfError (line 30) | class InvalidProjectConfError(ProjectError, UserSideException):
class UndefinedEnvPlatformError (line 34) | class UndefinedEnvPlatformError(ProjectError, UserSideException):
class ProjectEnvsNotAvailableError (line 38) | class ProjectEnvsNotAvailableError(ProjectError, UserSideException):
class UnknownEnvNamesError (line 42) | class UnknownEnvNamesError(ProjectError, UserSideException):
class InvalidEnvNameError (line 46) | class InvalidEnvNameError(ProjectError, UserSideException):
class ProjectOptionValueError (line 53) | class ProjectOptionValueError(ProjectError, UserSideException):
FILE: platformio/project/helpers.py
function get_project_dir (line 27) | def get_project_dir():
function is_platformio_project (line 31) | def is_platformio_project(project_dir=None):
function find_project_dir_above (line 37) | def find_project_dir_above(path):
function get_project_watch_lib_dirs (line 47) | def get_project_watch_lib_dirs():
function get_project_cache_dir (line 66) | def get_project_cache_dir():
function get_default_projects_dir (line 71) | def get_default_projects_dir():
function compute_project_checksum (line 93) | def compute_project_checksum(config):
function load_build_metadata (line 134) | def load_build_metadata(project_dir, env_or_envs, cache=False, build_typ...
function _load_build_metadata (line 165) | def _load_build_metadata(project_dir, env_names, build_type=None):
function _get_cached_build_metadata (line 189) | def _get_cached_build_metadata(env_names):
FILE: platformio/project/integration/generator.py
class ProjectGenerator (line 26) | class ProjectGenerator:
method __init__ (line 27) | def __init__(self, config, env_name, ide, boards=None):
method get_best_envname (line 34) | def get_best_envname(self, boards=None):
method get_ide_tpls_dir (line 53) | def get_ide_tpls_dir():
method get_supported_ides (line 57) | def get_supported_ides(cls):
method filter_includes (line 68) | def filter_includes(includes_map, ignore_scopes=None, to_unix_path=True):
method _load_tplvars (line 81) | def _load_tplvars(self):
method get_src_files (line 132) | def get_src_files(self):
method get_tpls (line 142) | def get_tpls(self):
method generate (line 155) | def generate(self):
method _render_tpl (line 168) | def _render_tpl(tpl_path, tpl_vars):
method _merge_contents (line 173) | def _merge_contents(dst_path, contents):
FILE: platformio/project/options.py
class ConfigOption (line 26) | class ConfigOption: # pylint: disable=too-many-instance-attributes,too-...
method __init__ (line 27) | def __init__(
method as_dict (line 53) | def as_dict(self):
function ConfigPlatformioOption (line 74) | def ConfigPlatformioOption(*args, **kwargs):
function ConfigEnvOption (line 78) | def ConfigEnvOption(*args, **kwargs):
function validate_dir (line 82) | def validate_dir(path):
function get_default_core_dir (line 93) | def get_default_core_dir():
function get_config_options_schema (line 825) | def get_config_options_schema():
FILE: platformio/project/savedeps.py
function pkg_to_save_spec (line 23) | def pkg_to_save_spec(pkg, user_spec):
function save_project_dependencies (line 39) | def save_project_dependencies(
function _ignore_deps_by_specs (line 67) | def _ignore_deps_by_specs(deps, specs):
FILE: platformio/registry/access/cli.py
function cli (line 35) | def cli():
FILE: platformio/registry/access/commands/grant.py
function access_grant_cmd (line 33) | def access_grant_cmd(level, client, urn, urn_type): # pylint: disable=u...
FILE: platformio/registry/access/commands/list.py
function access_list_cmd (line 27) | def access_list_cmd(owner, urn_type, json_output): # pylint: disable=un...
FILE: platformio/registry/access/commands/private.py
function access_private_cmd (line 27) | def access_private_cmd(urn, urn_type): # pylint: disable=unused-argument
FILE: platformio/registry/access/commands/public.py
function access_public_cmd (line 27) | def access_public_cmd(urn, urn_type): # pylint: disable=unused-argument
FILE: platformio/registry/access/commands/revoke.py
function access_revoke_cmd (line 32) | def access_revoke_cmd(client, urn, urn_type): # pylint: disable=unused-...
FILE: platformio/registry/access/validate.py
function validate_urn (line 22) | def validate_urn(value):
function validate_client (line 29) | def validate_client(value):
FILE: platformio/registry/client.py
class RegistryClient (line 22) | class RegistryClient(HTTPClient):
method __init__ (line 23) | def __init__(self):
method allowed_private_packages (line 28) | def allowed_private_packages():
method publish_package (line 45) | def publish_package( # pylint: disable=redefined-builtin, too-many-po...
method unpublish_package (line 67) | def unpublish_package( # pylint: disable=redefined-builtin, too-many-...
method update_resource (line 77) | def update_resource(self, urn, private):
method grant_access_for_resource (line 85) | def grant_access_for_resource(self, urn, client, level):
method revoke_access_from_resource (line 93) | def revoke_access_from_resource(self, urn, client):
method list_resources (line 101) | def list_resources(self, owner):
method list_packages (line 110) | def list_packages(self, query=None, qualifiers=None, page=None, sort=N...
method get_package (line 145) | def get_package(
FILE: platformio/registry/mirror.py
class RegistryFileMirrorIterator (line 25) | class RegistryFileMirrorIterator:
method __init__ (line 28) | def __init__(self, download_url):
method __iter__ (line 34) | def __iter__(self): # pylint: disable=non-iterator-returned
method __next__ (line 37) | def __next__(self):
method get_http_client (line 96) | def get_http_client(self):
FILE: platformio/remote/ac/base.py
class AsyncCommandBase (line 19) | class AsyncCommandBase:
method __init__ (line 22) | def __init__(self, options=None, on_end_callback=None):
method id (line 36) | def id(self):
method pause (line 39) | def pause(self):
method unpause (line 43) | def unpause(self):
method start (line 47) | def start(self):
method stop (line 50) | def stop(self):
method _ac_ended (line 53) | def _ac_ended(self):
method _ac_ondata (line 64) | def _ac_ondata(self, data):
method ac_read (line 74) | def ac_read(self):
method ac_write (line 84) | def ac_write(self, data):
method ac_close (line 88) | def ac_close(self):
FILE: platformio/remote/ac/process.py
class ProcessAsyncCmd (line 22) | class ProcessAsyncCmd(protocol.ProcessProtocol, AsyncCommandBase):
method start (line 23) | def start(self):
method outReceived (line 30) | def outReceived(self, data):
method errReceived (line 33) | def errReceived(self, data):
method processExited (line 36) | def processExited(self, reason):
method processEnded (line 39) | def processEnded(self, reason):
FILE: platformio/remote/ac/psync.py
class ProjectSyncAsyncCmd (line 24) | class ProjectSyncAsyncCmd(AsyncCommandBase):
method __init__ (line 25) | def __init__(self, *args, **kwargs):
method start (line 30) | def start(self):
method stop (line 38) | def stop(self):
method ac_write (line 43) | def ac_write(self, data):
FILE: platformio/remote/ac/serial.py
class SerialPortAsyncCmd (line 23) | class SerialPortAsyncCmd(protocol.Protocol, AsyncCommandBase):
method start (line 24) | def start(self):
method connectionMade (line 37) | def connectionMade(self):
method reset_device (line 44) | def reset_device(self):
method dataReceived (line 53) | def dataReceived(self, data):
method connectionLost (line 56) | def connectionLost(self, reason): # pylint: disable=unused-argument
FILE: platformio/remote/cli.py
function cli (line 44) | def cli(ctx, agent):
function remote_agent (line 54) | def remote_agent():
function remote_agent_start (line 67) | def remote_agent_start(name, share, working_dir):
function remote_agent_list (line 74) | def remote_agent_list():
function remote_update (line 91) | def remote_update(agents, only_check, dry_run):
function remote_run (line 113) | def remote_run( # pylint: disable=too-many-positional-arguments
function remote_test (line 201) | def remote_test( # pylint: disable=redefined-builtin,too-many-positiona...
function remote_device (line 257) | def remote_device():
function device_list (line 264) | def device_list(agents, json_output):
function device_monitor (line 352) | def device_monitor(ctx, agents, **kwargs):
function project_options_to_monitor_argv (line 396) | def project_options_to_monitor_argv(cli_options):
FILE: platformio/remote/client/agent_list.py
class AgentListClient (line 22) | class AgentListClient(RemoteClientBase):
method agent_pool_ready (line 23) | def agent_pool_ready(self):
method _cbResult (line 28) | def _cbResult(self, result):
FILE: platformio/remote/client/agent_service.py
class RemoteAgentService (line 30) | class RemoteAgentService(RemoteClientBase):
method __init__ (line 31) | def __init__(self, name, share, working_dir=None):
method agent_pool_ready (line 47) | def agent_pool_ready(self):
method cb_disconnected (line 50) | def cb_disconnected(self, reason):
method remote_acread (line 55) | def remote_acread(self, ac_id):
method remote_acwrite (line 61) | def remote_acwrite(self, ac_id, data):
method remote_acclose (line 67) | def remote_acclose(self, ac_id):
method remote_cmd (line 75) | def remote_cmd(self, cmd, options):
method _defer_async_cmd (line 81) | def _defer_async_cmd(self, ac, pass_agent_name=True):
method _process_cmd_device_list (line 87) | def _process_cmd_device_list(self, _):
method _process_cmd_device_monitor (line 90) | def _process_cmd_device_monitor(self, options):
method _process_cmd_psync (line 117) | def _process_cmd_psync(self, options):
method _process_cmd_run (line 132) | def _process_cmd_run(self, options):
method _process_cmd_test (line 135) | def _process_cmd_test(self, options):
method _process_cmd_run_or_test (line 138) | def _process_cmd_run_or_test( # pylint: disable=too-many-locals,too-m...
method _process_cmd_update (line 220) | def _process_cmd_update(self, options):
FILE: platformio/remote/client/async_base.py
class AsyncClientBase (line 21) | class AsyncClientBase(RemoteClientBase):
method __init__ (line 22) | def __init__(self, command, agents, options):
method agent_pool_ready (line 31) | def agent_pool_ready(self):
method cb_async_result (line 34) | def cb_async_result(self, result):
method acread_data (line 42) | def acread_data(self, agent_id, ac_id, agent_name=None):
method cb_acread_result (line 47) | def cb_acread_result(self, result, agent_id, ac_id, agent_name):
method acclose (line 56) | def acclose(self, agent_id, ac_id):
method cb_acclose_result (line 61) | def cb_acclose_result(self, exit_code):
FILE: platformio/remote/client/base.py
class RemoteClientBase (line 33) | class RemoteClientBase( # pylint: disable=too-many-instance-attributes
method __init__ (line 40) | def __init__(self):
method _log_observer (line 56) | def _log_observer(self, event):
method connect (line 72) | def connect(self):
method cb_client_authorization_failed (line 100) | def cb_client_authorization_failed(self, err):
method cb_client_authorization_made (line 107) | def cb_client_authorization_made(self, perspective):
method _cb_client_join_made (line 114) | def _cb_client_join_made(self, result):
method remote_service (line 123) | def remote_service(self, command, options):
method restart_ping (line 130) | def restart_ping(self, reset_counter=True):
method _do_ping (line 135) | def _do_ping(self):
method stop_ping (line 142) | def stop_ping(self, reset_counter=True):
method _cb_pong (line 150) | def _cb_pong(self, result):
method agent_pool_ready (line 160) | def agent_pool_ready(self):
method disconnect (line 163) | def disconnect(self, exit_code=None):
method cb_disconnected (line 171) | def cb_disconnected(self, _):
method cb_global_error (line 176) | def cb_global_error(self, err):
FILE: platformio/remote/client/device_list.py
class DeviceListClient (line 22) | class DeviceListClient(RemoteClientBase):
method __init__ (line 23) | def __init__(self, agents, json_output):
method agent_pool_ready (line 28) | def agent_pool_ready(self):
method _cbResult (line 33) | def _cbResult(self, result):
FILE: platformio/remote/client/device_monitor.py
class SMBridgeProtocol (line 25) | class SMBridgeProtocol(protocol.Protocol):
method connectionMade (line 26) | def connectionMade(self):
method connectionLost (line 29) | def connectionLost(self, reason): # pylint: disable=unused-argument
method dataReceived (line 32) | def dataReceived(self, data):
class SMBridgeFactory (line 36) | class SMBridgeFactory(protocol.ServerFactory):
method __init__ (line 37) | def __init__(self, cdm):
method buildProtocol (line 41) | def buildProtocol(self, addr): # pylint: disable=unused-argument
method add_client (line 46) | def add_client(self, client):
method remove_client (line 51) | def remove_client(self, client):
method has_clients (line 57) | def has_clients(self):
method send_to_clients (line 60) | def send_to_clients(self, data):
method send_to_server (line 67) | def send_to_server(self, data):
class DeviceMonitorClient (line 71) | class DeviceMonitorClient( # pylint: disable=too-many-instance-attributes
method __init__ (line 76) | def __init__(self, agents, **kwargs):
method agent_pool_ready (line 88) | def agent_pool_ready(self):
method _cb_device_list (line 95) | def _cb_device_list(self, result):
method start_remote_monitor (line 143) | def start_remote_monitor(self, agent, port):
method cb_async_result (line 157) | def cb_async_result(self, result):
method client_terminal_stopped (line 184) | def client_terminal_stopped(self):
method acread_data (line 192) | def acread_data(self, force=False):
method cb_acread_result (line 211) | def cb_acread_result(self, result):
method acwrite_data (line 218) | def acwrite_data(self, data, force=False):
method cb_acwrite_result (line 238) | def cb_acwrite_result(self, result):
FILE: platformio/remote/client/run_or_test.py
class RunOrTestClient (line 30) | class RunOrTestClient(AsyncClientBase):
method __init__ (line 55) | def __init__(self, *args, **kwargs):
method generate_project_id (line 60) | def generate_project_id(self, path):
method add_project_items (line 65) | def add_project_items(self, psync):
method _add_project_source_items (line 82) | def _add_project_source_items(self, cfg, psync):
method _add_project_binary_items (line 98) | def _add_project_binary_items(cfg, psync):
method _cb_tarfile_filter (line 112) | def _cb_tarfile_filter(self, path):
method is_file_with_exts (line 125) | def is_file_with_exts(path, exts):
method agent_pool_ready (line 130) | def agent_pool_ready(self):
method psync_init (line 133) | def psync_init(self):
method cb_psync_init_result (line 147) | def cb_psync_init_result(self, result):
method cb_psync_dbindex_result (line 165) | def cb_psync_dbindex_result(self, result, agent_id, ac_id):
method cb_psync_delete_result (line 200) | def cb_psync_delete_result(self, result, agent_id, ac_id, dbindex):
method psync_upload (line 204) | def psync_upload(self, agent_id, ac_id, dbindex):
method psync_upload_chunk (line 216) | def psync_upload_chunk(self, agent_id, ac_id, dbindex, fileobj):
method cb_psync_upload_chunk_result (line 242) | def cb_psync_upload_chunk_result( # pylint: disable=too-many-argument...
method psync_finalize (line 256) | def psync_finalize(self, agent_id, ac_id):
method cb_psync_completed_result (line 264) | def cb_psync_completed_result(self, result, agent_id):
FILE: platformio/remote/client/update_core.py
class UpdateCoreClient (line 18) | class UpdateCoreClient(AsyncClientBase):
method agent_pool_ready (line 19) | def agent_pool_ready(self):
FILE: platformio/remote/factory/client.py
class RemoteClientFactory (line 23) | class RemoteClientFactory(pb.PBClientFactory, protocol.ReconnectingClien...
method clientConnectionMade (line 24) | def clientConnectionMade(self, broker):
method clientAuthorizationFailed (line 58) | def clientAuthorizationFailed(self, err):
method clientConnectionFailed (line 62) | def clientConnectionFailed(self, connector, reason):
method clientConnectionLost (line 71) | def clientConnectionLost( # pylint: disable=arguments-differ
FILE: platformio/remote/factory/ssl.py
class SSLContextFactory (line 20) | class SSLContextFactory(ssl.ClientContextFactory):
method __init__ (line 21) | def __init__(self, host):
method getContext (line 25) | def getContext(self):
method verifyHostname (line 33) | def verifyHostname( # pylint: disable=unused-argument,too-many-argume...
FILE: platformio/remote/projectsync.py
class PROJECT_SYNC_STAGE (line 29) | class PROJECT_SYNC_STAGE(constants.Flags):
class ProjectSync (line 38) | class ProjectSync:
method __init__ (line 39) | def __init__(self, path):
method add_item (line 46) | def add_item(self, path, relpath, cb_filter=None):
method get_items (line 49) | def get_items(self):
method rebuild_dbindex (line 52) | def rebuild_dbindex(self):
method _insert_to_db (line 66) | def _insert_to_db(self, path, relpath):
method get_dbindex (line 73) | def get_dbindex(self):
method delete_dbindex (line 76) | def delete_dbindex(self, dbindex):
method delete_empty_folders (line 87) | def delete_empty_folders(self):
method compress_items (line 101) | def compress_items(self, fileobj, dbindex, max_size):
method decompress_items (line 117) | def decompress_items(self, fileobj):
FILE: platformio/run/cli.py
function cli (line 81) | def cli( # pylint: disable=too-many-positional-arguments
function process_env (line 179) | def process_env( # pylint: disable=too-many-positional-arguments
function print_processing_header (line 232) | def print_processing_header(env, config, verbose=False):
function print_processing_footer (line 245) | def print_processing_footer(result):
function print_processing_summary (line 261) | def print_processing_summary(results, verbose=False):
function print_target_list (line 311) | def print_target_list(envs):
FILE: platformio/run/helpers.py
function clean_build_dir (line 26) | def clean_build_dir(build_dir, config):
FILE: platformio/run/processor.py
class EnvironmentProcessor (line 24) | class EnvironmentProcessor:
method __init__ (line 25) | def __init__( # pylint: disable=too-many-arguments,too-many-positiona...
method get_build_variables (line 48) | def get_build_variables(self):
method process (line 65) | def process(self):
FILE: platformio/system/cli.py
function cli (line 31) | def cli():
FILE: platformio/system/commands/completion.py
function system_completion_cmd (line 26) | def system_completion_cmd():
function system_completion_install (line 40) | def system_completion_install(shell, path):
function system_completion_uninstall (line 61) | def system_completion_uninstall(shell, path):
FILE: platformio/system/commands/info.py
function system_info_cmd (line 32) | def system_info_cmd(json_output):
FILE: platformio/system/commands/prune.py
function system_prune_cmd (line 39) | def system_prune_cmd(force, dry_run, cache, core_packages, platform_pack...
FILE: platformio/system/completion.py
class ShellType (line 25) | class ShellType(Enum):
function get_bash_version (line 31) | def get_bash_version():
function get_completion_install_path (line 41) | def get_completion_install_path(shell):
function get_completion_code (line 55) | def get_completion_code(shell):
function is_completion_code_installed (line 66) | def is_completion_code_installed(shell, path):
function install_completion_code (line 73) | def install_completion_code(shell, path):
function uninstall_completion_code (line 88) | def uninstall_completion_code(shell, path):
FILE: platformio/system/prune.py
function prune_cached_data (line 27) | def prune_cached_data(force=False, dry_run=False, silent=False):
function prune_core_packages (line 46) | def prune_core_packages(force=False, dry_run=False, silent=False):
function prune_platform_packages (line 52) | def prune_platform_packages(force=False, dry_run=False, silent=False):
function _prune_packages (line 58) | def _prune_packages(force, dry_run, silent, handler):
function calculate_unnecessary_system_data (line 93) | def calculate_unnecessary_system_data():
FILE: platformio/telemetry.py
class MeasurementProtocol (line 37) | class MeasurementProtocol:
method __init__ (line 38) | def __init__(self, events=None):
method event_to_dict (line 49) | def event_to_dict(name, params, timestamp=None):
method set_user_property (line 55) | def set_user_property(self, name, value):
method add_event (line 58) | def add_event(self, name, params):
method to_payload (line 61) | def to_payload(self):
class TelemetryLogger (line 70) | class TelemetryLogger:
method __init__ (line 71) | def __init__(self):
method close (line 81) | def close(self):
method log_event (line 84) | def log_event(self, name, params, timestamp=None, instant_sending=False):
method send (line 99) | def send(self):
method _sender_worker (line 116) | def _sender_worker(self):
method _commit_events (line 128) | def _commit_events(self, events):
method terminate_sender (line 151) | def terminate_sender(self):
method is_sending (line 154) | def is_sending(self):
method get_unsent_events (line 157) | def get_unsent_events(self):
function log_event (line 167) | def log_event(name, params, instant_sending=False):
function on_cmd_start (line 171) | def on_cmd_start(cmd_ctx):
function on_exit (line 176) | def on_exit():
function log_command (line 180) | def log_command(ctx):
function resolve_ci_actor (line 189) | def resolve_ci_actor():
function dump_project_env_params (line 205) | def dump_project_env_params(config, env, platform):
function log_platform_run (line 227) | def log_platform_run(platform, project_config, project_env, targets=None):
function log_exception (line 234) | def log_exception(exc):
function log_debug_started (line 279) | def log_debug_started(debug_config: DebugConfigBase):
function log_debug_exception (line 288) | def log_debug_exception(exc, debug_config: DebugConfigBase):
function _finalize (line 310) | def _finalize():
function load_postponed_events (line 327) | def load_postponed_events():
function save_postponed_events (line 337) | def save_postponed_events(events):
function postpone_events (line 352) | def postpone_events(events):
function process_postponed_logs (line 365) | def process_postponed_logs():
FILE: platformio/test/cli.py
function cli (line 93) | def cli( # pylint: disable=too-many-arguments,too-many-positional-argum...
function print_suite_header (line 178) | def print_suite_header(test_suite):
function print_suite_footer (line 190) | def print_suite_footer(test_suite):
FILE: platformio/test/exception.py
class UnitTestError (line 18) | class UnitTestError(PlatformioException):
class TestDirNotExistsError (line 22) | class TestDirNotExistsError(UnitTestError, UserSideException):
class UnitTestSuiteError (line 32) | class UnitTestSuiteError(UnitTestError):
FILE: platformio/test/helpers.py
function list_test_names (line 22) | def list_test_names(project_config):
function list_test_suites (line 36) | def list_test_suites(project_config, environments, filters, ignores):
FILE: platformio/test/reports/base.py
class TestReportBase (line 20) | class TestReportBase:
method __init__ (line 21) | def __init__(self, test_result):
method generate (line 24) | def generate(self, output_path, verbose):
class TestReportFactory (line 28) | class TestReportFactory:
method new (line 30) | def new(format, test_result) -> TestReportBase: # pylint: disable=red...
FILE: platformio/test/reports/json.py
class JsonTestReport (line 26) | class JsonTestReport(TestReportBase):
method generate (line 27) | def generate(self, output_path, verbose=False):
method to_json (line 49) | def to_json(self):
method test_suite_to_json (line 64) | def test_suite_to_json(self, test_suite):
method test_case_to_json (line 89) | def test_case_to_json(test_case):
FILE: platformio/test/reports/junit.py
class JunitTestReport (line 26) | class JunitTestReport(TestReportBase):
method generate (line 27) | def generate(self, output_path, verbose=False):
method build_xml_tree (line 44) | def build_xml_tree(self):
method build_testsuite_node (line 56) | def build_testsuite_node(self, test_suite):
method build_testcase_node (line 75) | def build_testcase_node(self, test_case):
method build_testcase_error_node (line 92) | def build_testcase_error_node(test_case):
method build_testcase_failure_node (line 101) | def build_testcase_failure_node(test_case):
FILE: platformio/test/reports/stdout.py
class StdoutTestReport (line 23) | class StdoutTestReport(TestReportBase):
method generate (line 24) | def generate(self, verbose=False): # pylint: disable=arguments-differ
method print_failed_test_cases (line 83) | def print_failed_test_cases(self):
FILE: platformio/test/result.py
class TestStatus (line 23) | class TestStatus(enum.Enum):
method from_string (line 31) | def from_string(cls, value: str):
method to_ansi_color (line 43) | def to_ansi_color(self):
class TestCaseSource (line 51) | class TestCaseSource:
method __init__ (line 52) | def __init__(self, filename, line=None):
class TestCase (line 57) | class TestCase:
method __init__ (line 58) | def __init__( # pylint: disable=too-many-arguments,too-many-positiona...
method humanize (line 79) | def humanize(self):
class TestSuite (line 95) | class TestSuite:
method __init__ (line 96) | def __init__(self, env_name, test_name, finished=False, test_dir=None):
method cases (line 106) | def cases(self):
method status (line 110) | def status(self):
method get_status_nums (line 118) | def get_status_nums(self, status):
method add_case (line 121) | def add_case(self, case: TestCase):
method is_finished (line 125) | def is_finished(self):
method on_start (line 128) | def on_start(self):
method on_finish (line 131) | def on_finish(self):
class TestResult (line 138) | class TestResult:
method __init__ (line 139) | def __init__(self, project_dir):
method suites (line 144) | def suites(self):
method add_suite (line 147) | def add_suite(self, suite):
method duration (line 152) | def duration(self):
method case_nums (line 156) | def case_nums(self):
method is_errored (line 160) | def is_errored(self):
method get_status_nums (line 163) | def get_status_nums(self, status):
FILE: platformio/test/runners/base.py
class TestRunnerOptions (line 28) | class TestRunnerOptions: # pylint: disable=too-many-instance-attributes
method __init__ (line 29) | def __init__( # pylint: disable=too-many-arguments,too-many-positiona...
class TestRunnerBase (line 56) | class TestRunnerBase:
method __init__ (line 61) | def __init__(self, test_suite, project_config, options=None):
method name (line 73) | def name(self):
method get_test_speed (line 76) | def get_test_speed(self):
method get_test_port (line 81) | def get_test_port(self):
method start (line 86) | def start(self, cmd_ctx):
method setup (line 113) | def setup(self):
method stage_building (line 116) | def stage_building(self):
method stage_uploading (line 136) | def stage_uploading(self):
method stage_testing (line 158) | def stage_testing(self):
method teardown (line 177) | def teardown(self):
method run_project_targets (line 180) | def run_project_targets(self, targets):
method configure_build_env (line 196) | def configure_build_env(self, env):
method on_testing_data_output (line 203) | def on_testing_data_output(self, data):
method on_testing_line_output (line 214) | def on_testing_line_output(self, line):
FILE: platformio/test/runners/doctest.py
class DoctestTestCaseParser (line 21) | class DoctestTestCaseParser:
method __init__ (line 22) | def __init__(self):
method parse (line 26) | def parse(self, line):
method is_divider (line 54) | def is_divider(line):
method _on_divider (line 58) | def _on_divider(self):
method parse_source (line 74) | def parse_source(line):
method parse_name (line 81) | def parse_name(tokens):
method _parse_assert (line 89) | def _parse_assert(self, line):
class DoctestTestRunner (line 103) | class DoctestTestRunner(TestRunnerBase):
method __init__ (line 106) | def __init__(self, *args, **kwargs):
method on_testing_line_output (line 110) | def on_testing_line_output(self, line):
FILE: platformio/test/runners/factory.py
class TestRunnerFactory (line 26) | class TestRunnerFactory:
method get_clsname (line 28) | def get_clsname(name):
method new (line 33) | def new(cls, test_suite, project_config, options=None) -> TestRunnerBase:
FILE: platformio/test/runners/googletest.py
class GoogletestTestCaseParser (line 24) | class GoogletestTestCaseParser:
method __init__ (line 37) | def __init__(self):
method parse (line 40) | def parse(self, line):
method _parse_test_case (line 45) | def _parse_test_case(self, line):
method _parse_status_and_name (line 63) | def _parse_status_and_name(self, line):
method _parse_source_and_message (line 73) | def _parse_source_and_message(self, stdout):
class GoogletestTestRunner (line 90) | class GoogletestTestRunner(TestRunnerBase):
method __init__ (line 93) | def __init__(self, *args, **kwargs):
method on_testing_line_output (line 98) | def on_testing_line_output(self, line):
FILE: platformio/test/runners/readers/native.py
class ProgramProcessProtocol (line 33) | class ProgramProcessProtocol(asyncio.SubprocessProtocol):
method __init__ (line 34) | def __init__(self, test_runner, exit_future):
method pipe_data_received (line 39) | def pipe_data_received(self, _, data):
method process_exited (line 50) | def process_exited(self):
method _stop_testing (line 53) | def _stop_testing(self):
class NativeTestOutputReader (line 60) | class NativeTestOutputReader:
method __init__ (line 61) | def __init__(self, test_runner):
method get_testing_command (line 68) | def get_testing_command(self):
method gather_results (line 93) | async def gather_results(self):
method raise_for_status (line 118) | def raise_for_status(return_code):
method begin (line 131) | def begin(self):
FILE: platformio/test/runners/readers/serial.py
class SerialTestOutputReader (line 24) | class SerialTestOutputReader:
method __init__ (line 27) | def __init__(self, test_runner):
method begin (line 30) | def begin(self):
method resolve_test_port (line 64) | def resolve_test_port(self):
FILE: platformio/test/runners/unity.py
class UnityTestRunner (line 28) | class UnityTestRunner(TestRunnerBase):
method get_unity_framework_config (line 187) | def get_unity_framework_config(self):
method configure_build_env (line 211) | def configure_build_env(self, env):
method custom_unity_config_exists (line 224) | def custom_unity_config_exists(self):
method generate_unity_extras (line 238) | def generate_unity_extras(self, dst_dir):
method on_testing_line_output (line 262) | def on_testing_line_output(self, line):
method parse_test_case (line 278) | def parse_test_case(self, line):
FILE: platformio/util.py
class memoized (line 40) | class memoized:
method __init__ (line 41) | def __init__(self, expire=0):
method __call__ (line 50) | def __call__(self, func):
method _reset (line 63) | def _reset(self):
class throttle (line 67) | class throttle:
method __init__ (line 68) | def __init__(self, threshold):
method __call__ (line 72) | def __call__(self, func):
class RetryException (line 87) | class RetryException(Exception):
class RetryNextException (line 91) | class RetryNextException(RetryException):
class RetryStopException (line 95) | class RetryStopException(RetryException):
class retry (line 99) | class retry:
method __init__ (line 103) | def __init__(self, timeout=0, step=0.25):
method __call__ (line 107) | def __call__(self, func):
function singleton (line 127) | def singleton(cls):
function get_systype (line 139) | def get_systype():
function pioversion_to_intstr (line 157) | def pioversion_to_intstr():
function items_to_list (line 164) | def items_to_list(items):
function items_in_list (line 170) | def items_in_list(needle, haystack):
function parse_datetime (line 178) | def parse_datetime(datestr):
function merge_dicts (line 183) | def merge_dicts(d1, d2, path=None):
function print_labeled_bar (line 194) | def print_labeled_bar(label, is_error=False, fg=None, sep="="):
function humanize_duration_time (line 201) | def humanize_duration_time(duration):
function strip_ansi_codes (line 213) | def strip_ansi_codes(text):
FILE: scripts/docspregen.py
function reg_package_url (line 75) | def reg_package_url(type_, owner, name):
function campaign_url (line 83) | def campaign_url(url, source="platformio.org", medium="docs"):
function install_platforms (line 96) | def install_platforms():
function get_frameworks (line 118) | def get_frameworks():
function is_compat_platform_and_framework (line 146) | def is_compat_platform_and_framework(platform, framework):
function generate_boards_table (line 151) | def generate_boards_table(boards, skip_columns=None):
function generate_frameworks_contents (line 209) | def generate_frameworks_contents(frameworks):
function generate_platforms_contents (line 240) | def generate_platforms_contents(platforms):
function generate_debug_contents (line 267) | def generate_debug_contents(boards, skip_board_columns=None, extra_rst=N...
function generate_packages (line 342) | def generate_packages(platform, packages, is_embedded):
function generate_platform (line 415) | def generate_platform(pkg, rst_dir):
function update_platform_docs (line 587) | def update_platform_docs():
function generate_framework (line 595) | def generate_framework(type_, framework, rst_dir=None):
function update_framework_docs (line 698) | def update_framework_docs():
function update_boards (line 707) | def update_boards():
function update_embedded_board (line 767) | def update_embedded_board(rst_path, board):
function update_debugging (line 969) | def update_debugging():
function update_project_examples (line 1076) | def update_project_examples():
function main (line 1206) | def main():
FILE: scripts/fixsymlink.py
function fix_symlink (line 20) | def fix_symlink(root, fname, brokenlink):
function main (line 30) | def main():
FILE: scripts/install_devplatforms.py
function main (line 34) | def main(desktop, names, ownernames):
FILE: tests/commands/pkg/test_exec.py
function test_pkg_not_installed (line 23) | def test_pkg_not_installed(clirunner, validate_cliresult, isolated_pio_c...
function test_pkg_specified (line 35) | def test_pkg_specified(clirunner, validate_cliresult, isolated_pio_core):
function test_unrecognized_options (line 48) | def test_unrecognized_options(clirunner, validate_cliresult, isolated_pi...
FILE: tests/commands/pkg/test_install.py
function pkgs_to_specs (line 46) | def pkgs_to_specs(pkgs):
function test_global_packages (line 53) | def test_global_packages(
function test_skip_dependencies (line 130) | def test_skip_dependencies(
function test_baremetal_project (line 155) | def test_baremetal_project(
function test_project (line 186) | def test_project(
function test_private_lib_deps (line 231) | def test_private_lib_deps(
function test_remove_project_unused_libdeps (line 291) | def test_remove_project_unused_libdeps(
function test_unknown_project_dependencies (line 351) | def test_unknown_project_dependencies(
function test_custom_project_libraries (line 388) | def test_custom_project_libraries(
function test_custom_project_tools (line 463) | def test_custom_project_tools(
function test_custom_project_platforms (line 535) | def test_custom_project_platforms(
FILE: tests/commands/pkg/test_list.py
function test_project (line 36) | def test_project(clirunner, validate_cliresult, isolated_pio_core, tmp_p...
function test_global_packages (line 100) | def test_global_packages(clirunner, validate_cliresult, isolated_pio_cor...
FILE: tests/commands/pkg/test_outdated.py
function test_project (line 39) | def test_project(clirunner, validate_cliresult, isolated_pio_core, tmp_p...
FILE: tests/commands/pkg/test_search.py
function test_empty_query (line 18) | def test_empty_query(clirunner, validate_cliresult):
function test_pagination (line 27) | def test_pagination(clirunner, validate_cliresult):
function test_sorting (line 43) | def test_sorting(clirunner, validate_cliresult):
function test_not_found (line 52) | def test_not_found(clirunner, validate_cliresult):
FILE: tests/commands/pkg/test_show.py
function test_spec_name (line 21) | def test_spec_name(clirunner, validate_cliresult):
function test_spec_owner (line 50) | def test_spec_owner(clirunner, validate_cliresult):
function test_complete_spec (line 68) | def test_complete_spec(clirunner, validate_cliresult):
function test_name_conflict (line 87) | def test_name_conflict(clirunner):
function test_spec_version (line 96) | def test_spec_version(clirunner, validate_cliresult):
FILE: tests/commands/pkg/test_uninstall.py
function pkgs_to_names (line 42) | def pkgs_to_names(pkgs):
function test_global_packages (line 46) | def test_global_packages(
function test_project (line 192) | def test_project(clirunner, validate_cliresult, isolated_pio_core, tmp_p...
function test_custom_project_libraries (line 242) | def test_custom_project_libraries(
function test_custom_project_tools (line 319) | def test_custom_project_tools(
function test_custom_project_platforms (line 383) | def test_custom_project_platforms(
FILE: tests/commands/pkg/test_update.py
function pkgs_to_specs (line 49) | def pkgs_to_specs(pkgs):
function test_global_packages (line 56) | def test_global_packages(
function test_project (line 151) | def test_project(
function test_custom_project_libraries (line 224) | def test_custom_project_libraries(
function test_custom_project_tools (line 292) | def test_custom_project_tools(
function test_custom_project_platforms (line 339) | def test_custom_project_platforms(
FILE: tests/commands/test_account_org_team.py
function verify_account (line 57) | def verify_account(email_contents):
function test_account_register (line 71) | def test_account_register(
function test_account_login (line 94) | def test_account_login(
function test_account_summary (line 106) | def test_account_summary(
function test_account_token (line 141) | def test_account_token(clirunner, validate_cliresult, isolated_pio_core):
function test_account_change_password (line 202) | def test_account_change_password(clirunner, validate_cliresult, isolated...
function test_account_update (line 239) | def test_account_update(
function test_org_create (line 322) | def test_org_create(clirunner, validate_cliresult, isolated_pio_core):
function test_org_list (line 330) | def test_org_list(clirunner, validate_cliresult, isolated_pio_core):
function test_org_add_owner (line 350) | def test_org_add_owner(clirunner, validate_cliresult, isolated_pio_core):
function test_org_remove_owner (line 359) | def test_org_remove_owner(clirunner, validate_cliresult, isolated_pio_co...
function test_org_update (line 368) | def test_org_update(clirunner, validate_cliresult, isolated_pio_core):
function test_team_create (line 417) | def test_team_create(clirunner, validate_cliresult, isolated_pio_core):
function test_team_list (line 430) | def test_team_list(clirunner, validate_cliresult, isolated_pio_core):
function _test_team_add_member (line 444) | def _test_team_add_member(clirunner, validate_cliresult, isolated_pio_co...
function _test_team_remove (line 459) | def _test_team_remove(clirunner, validate_cliresult, isolated_pio_core):
function _test_team_update (line 474) | def _test_team_update(clirunner, validate_cliresult, receive_email, isol...
function test_cleanup (line 516) | def test_cleanup(clirunner, validate_cliresult, receive_email, isolated_...
FILE: tests/commands/test_boards.py
function test_board_json_output (line 21) | def test_board_json_output(clirunner, validate_cliresult):
function test_board_raw_output (line 29) | def test_board_raw_output(clirunner, validate_cliresult):
function test_board_options (line 35) | def test_board_options(clirunner, validate_cliresult):
FILE: tests/commands/test_check.py
function check_dir (line 77) | def check_dir(tmpdir_factory):
function count_defects (line 84) | def count_defects(output):
function test_check_cli_output (line 96) | def test_check_cli_output(clirunner, validate_cliresult, check_dir):
function test_check_json_output (line 105) | def test_check_json_output(clirunner, validate_cliresult, check_dir):
function test_check_tool_defines_passed (line 117) | def test_check_tool_defines_passed(clirunner, check_dir):
function test_check_tool_complex_defines_handled (line 125) | def test_check_tool_complex_defines_handled(
function test_check_language_standard_definition_passed (line 167) | def test_check_language_standard_definition_passed(clirunner, tmpdir):
function test_check_language_standard_option_is_converted (line 177) | def test_check_language_standard_option_is_converted(clirunner, tmpdir):
function test_check_language_standard_is_prioritized_over_build_flags (line 188) | def test_check_language_standard_is_prioritized_over_build_flags(clirunn...
function test_check_language_standard_for_c_language (line 201) | def test_check_language_standard_for_c_language(clirunner, tmpdir):
function test_check_severity_threshold (line 212) | def test_check_severity_threshold(clirunner, validate_cliresult, check_d...
function test_check_includes_passed (line 225) | def test_check_includes_passed(clirunner, check_dir):
function test_check_silent_mode (line 237) | def test_check_silent_mode(clirunner, validate_cliresult, check_dir):
function test_check_no_source_files (line 248) | def test_check_no_source_files(clirunner, tmpdir):
function test_check_bad_flag_passed (line 262) | def test_check_bad_flag_passed(clirunner, check_dir):
function test_check_success_if_no_errors (line 275) | def test_check_success_if_no_errors(clirunner, validate_cliresult, tmpdir):
function test_check_individual_flags_passed (line 301) | def test_check_individual_flags_passed(clirunner, validate_cliresult, tm...
function test_check_cppcheck_misra_addon (line 332) | def test_check_cppcheck_misra_addon(clirunner, validate_cliresult, tmpdi...
function test_check_fails_on_defects_only_with_flag (line 376) | def test_check_fails_on_defects_only_with_flag(clirunner, validate_clire...
function test_check_fails_on_defects_only_on_specified_level (line 391) | def test_check_fails_on_defects_only_on_specified_level(
function test_check_pvs_studio_free_license (line 421) | def test_check_pvs_studio_free_license(clirunner, tmpdir):
function test_check_pvs_studio_fails_without_license (line 445) | def test_check_pvs_studio_fails_without_license(clirunner, tmpdir):
function test_check_pvs_studio_fails_broken_license (line 465) | def test_check_pvs_studio_fails_broken_license(clirunner, tmpdir):
function test_check_embedded_platform_all_tools (line 490) | def test_check_embedded_platform_all_tools(
function test_check_skip_includes_from_packages (line 530) | def test_check_skip_includes_from_packages(clirunner, validate_cliresult...
function test_check_multiline_error (line 555) | def test_check_multiline_error(clirunner, tmpdir_factory):
function test_check_handles_spaces_in_paths (line 582) | def test_check_handles_spaces_in_paths(
function test_check_src_filter (line 630) | def test_check_src_filter(
function test_check_src_filter_from_config (line 659) | def test_check_src_filter_from_config(clirunner, validate_cliresult, tmp...
function test_check_custom_pattern_absolute_path_legacy (line 683) | def test_check_custom_pattern_absolute_path_legacy(
function test_check_custom_pattern_relative_path_legacy (line 705) | def test_check_custom_pattern_relative_path_legacy(
function test_check_src_filter_from_config_legacy (line 727) | def test_check_src_filter_from_config_legacy(
function test_check_src_filter_multiple_envs (line 753) | def test_check_src_filter_multiple_envs(clirunner, validate_cliresult, t...
function test_check_sources_in_project_root (line 789) | def test_check_sources_in_project_root(clirunner, validate_cliresult, tm...
function test_check_sources_in_external_dir (line 809) | def test_check_sources_in_external_dir(clirunner, validate_cliresult, tm...
FILE: tests/commands/test_ci.py
function test_ci_empty (line 21) | def test_ci_empty(clirunner):
function test_ci_boards (line 27) | def test_ci_boards(clirunner, validate_cliresult):
function test_ci_build_dir (line 41) | def test_ci_build_dir(clirunner, tmpdir_factory, validate_cliresult):
function test_ci_keep_build_dir (line 57) | def test_ci_keep_build_dir(clirunner, tmpdir_factory, validate_cliresult):
function test_ci_keep_build_dir_single_src_dir (line 91) | def test_ci_keep_build_dir_single_src_dir(
function test_ci_keep_build_dir_nested_src_dirs (line 112) | def test_ci_keep_build_dir_nested_src_dirs(
function test_ci_project_conf (line 151) | def test_ci_project_conf(clirunner, validate_cliresult):
function test_ci_lib_and_board (line 165) | def test_ci_lib_and_board(clirunner, tmpdir_factory, validate_cliresult):
FILE: tests/commands/test_init.py
function validate_pioproject (line 25) | def validate_pioproject(pioproject_dir):
function test_init_default (line 33) | def test_init_default(clirunner, validate_cliresult):
function test_init_duplicated_boards (line 40) | def test_init_duplicated_boards(clirunner, validate_cliresult, tmpdir):
function test_init_ide_without_board (line 64) | def test_init_ide_without_board(clirunner, tmpdir):
function test_init_ide_vscode (line 71) | def test_init_ide_vscode(clirunner, validate_cliresult, tmpdir):
function test_init_ide_eclipse (line 132) | def test_init_ide_eclipse(clirunner, validate_cliresult):
function test_init_special_board (line 143) | def test_init_special_board(clirunner, validate_cliresult):
function test_init_enable_auto_uploading (line 167) | def test_init_enable_auto_uploading(clirunner, validate_cliresult):
function test_init_custom_framework (line 192) | def test_init_custom_framework(clirunner, validate_cliresult):
function test_init_incorrect_board (line 215) | def test_init_incorrect_board(clirunner):
FILE: tests/commands/test_lib.py
function test_saving_deps (line 30) | def test_saving_deps(clirunner, validate_cliresult, isolated_pio_core, t...
function test_update (line 160) | def test_update(clirunner, validate_cliresult, isolated_pio_core, tmpdir...
FILE: tests/commands/test_lib_complex.py
function test_search (line 29) | def test_search(clirunner, validate_cliresult):
function test_global_install_registry (line 41) | def test_global_install_registry(clirunner, validate_cliresult, isolated...
function test_global_install_archive (line 75) | def test_global_install_archive(clirunner, validate_cliresult, isolated_...
function test_global_install_repository (line 111) | def test_global_install_repository(clirunner, validate_cliresult, isolat...
function test_install_duplicates (line 137) | def test_install_duplicates( # pylint: disable=unused-argument
function test_global_lib_list (line 173) | def test_global_lib_list(clirunner, validate_cliresult):
function test_global_lib_update_check (line 233) | def test_global_lib_update_check(clirunner, validate_cliresult):
function test_global_lib_update (line 242) | def test_global_lib_update(clirunner, validate_cliresult):
function test_global_lib_uninstall (line 268) | def test_global_lib_uninstall(clirunner, validate_cliresult, isolated_pi...
function test_lib_show (line 316) | def test_lib_show(clirunner, validate_cliresult):
function test_lib_builtin (line 325) | def test_lib_builtin(clirunner, validate_cliresult):
function test_lib_stats (line 332) | def test_lib_stats(clirunner, validate_cliresult):
FILE: tests/commands/test_platform.py
function test_search_json_output (line 25) | def test_search_json_output(clirunner, validate_cliresult, isolated_pio_...
function test_search_raw_output (line 37) | def test_search_raw_output(clirunner, validate_cliresult):
function test_install_unknown_version (line 43) | def test_install_unknown_version(clirunner):
function test_install_unknown_from_registry (line 49) | def test_install_unknown_from_registry(clirunner):
function test_install_core_3_dev_platform (line 63) | def test_install_core_3_dev_platform(clirunner, validate_cliresult, isol...
function test_install_known_version (line 71) | def test_install_known_version(clirunner, validate_cliresult, isolated_p...
function test_install_from_vcs (line 82) | def test_install_from_vcs(clirunner, validate_cliresult, isolated_pio_co...
function test_list_json_output (line 95) | def test_list_json_output(clirunner, validate_cliresult):
function test_list_raw_output (line 105) | def test_list_raw_output(clirunner, validate_cliresult):
function test_update_check (line 111) | def test_update_check(clirunner, validate_cliresult, isolated_pio_core):
function test_update_raw (line 127) | def test_update_raw(clirunner, validate_cliresult, isolated_pio_core):
function test_uninstall (line 136) | def test_uninstall(clirunner, validate_cliresult, isolated_pio_core):
FILE: tests/commands/test_run.py
function test_generic_build (line 20) | def test_generic_build(clirunner, validate_cliresult, tmpdir):
function test_build_unflags (line 143) | def test_build_unflags(clirunner, validate_cliresult, tmpdir):
function test_debug_default_build_flags (line 200) | def test_debug_default_build_flags(clirunner, validate_cliresult, tmpdir):
function test_debug_custom_build_flags (line 226) | def test_debug_custom_build_flags(clirunner, validate_cliresult, tmpdir):
function test_symlinked_libs (line 255) | def test_symlinked_libs(clirunner, validate_cliresult, tmp_path: Path):
function test_stringification (line 290) | def test_stringification(clirunner, validate_cliresult, tmp_path: Path):
function test_ldf (line 330) | def test_ldf(clirunner, validate_cliresult, tmp_path: Path):
FILE: tests/commands/test_settings.py
function test_settings_check (line 19) | def test_settings_check(clirunner, validate_cliresult):
FILE: tests/commands/test_test.py
function test_calculator_example (line 28) | def test_calculator_example(tmp_path: Path):
function test_list_tests (line 73) | def test_list_tests(clirunner, validate_cliresult, tmp_path: Path):
function test_group_and_custom_runner (line 98) | def test_group_and_custom_runner(clirunner, tmp_path: Path):
function test_crashed_program (line 196) | def test_crashed_program(clirunner, tmpdir):
function test_unity_setup_teardown (line 299) | def test_unity_setup_teardown(clirunner, validate_cliresult, tmpdir):
function test_unity_custom_config (line 338) | def test_unity_custom_config(clirunner, validate_cliresult, tmp_path: Pa...
function test_legacy_unity_custom_transport (line 385) | def test_legacy_unity_custom_transport(clirunner, validate_cliresult, tm...
function test_doctest_framework (line 447) | def test_doctest_framework(clirunner, tmp_path: Path):
function test_googletest_framework (line 573) | def test_googletest_framework(clirunner, tmp_path: Path):
FILE: tests/conftest.py
function pytest_configure (line 29) | def pytest_configure(config):
function validate_cliresult (line 34) | def validate_cliresult():
function clirunner (line 43) | def clirunner(request, tmpdir_factory):
function _isolated_pio_core (line 69) | def _isolated_pio_core(request, tmpdir_factory):
function isolated_pio_core (line 82) | def isolated_pio_core(request, tmpdir_factory):
function func_isolated_pio_core (line 87) | def func_isolated_pio_core(request, tmpdir_factory):
function without_internet (line 92) | def without_internet(monkeypatch):
function receive_email (line 97) | def receive_email(): # pylint:disable=redefined-outer-name, too-many-lo...
function get_pkg_latest_version (line 140) | def get_pkg_latest_version():
FILE: tests/misc/ino2cpp/test_ino2cpp.py
function pytest_generate_tests (line 23) | def pytest_generate_tests(metafunc):
function test_example (line 34) | def test_example(clirunner, validate_cliresult, piotest_dir):
function test_warning_line (line 39) | def test_warning_line(clirunner, validate_cliresult):
FILE: tests/misc/test_maintenance.py
function test_check_pio_upgrade (line 24) | def test_check_pio_upgrade(clirunner, isolated_pio_core, validate_clires...
FILE: tests/misc/test_misc.py
function test_platformio_cli (line 24) | def test_platformio_cli():
function test_ping_internet_ips (line 31) | def test_ping_internet_ips():
function test_api_internet_offline (line 36) | def test_api_internet_offline(without_internet, isolated_pio_core):
function test_api_cache (line 42) | def test_api_cache(monkeypatch, isolated_pio_core):
FILE: tests/package/test_manager.py
function test_download (line 38) | def test_download(isolated_pio_core):
function test_find_pkg_root (line 56) | def test_find_pkg_root(isolated_pio_core, tmpdir_factory):
function test_build_legacy_spec (line 93) | def test_build_legacy_spec(isolated_pio_core, tmpdir_factory):
function test_build_metadata (line 122) | def test_build_metadata(isolated_pio_core, tmpdir_factory):
function test_install_from_uri (line 149) | def test_install_from_uri(isolated_pio_core, tmpdir_factory):
function test_install_from_registry (line 197) | def test_install_from_registry(isolated_pio_core, tmpdir_factory):
function test_install_lib_depndencies (line 237) | def test_install_lib_depndencies(isolated_pio_core, tmpdir_factory):
function test_install_force (line 271) | def test_install_force(isolated_pio_core, tmpdir_factory):
function test_symlink (line 287) | def test_symlink(tmp_path: Path):
function test_scripts (line 342) | def test_scripts(isolated_pio_core, tmp_path: Path):
function test_install_circular_dependencies (line 376) | def test_install_circular_dependencies(tmp_path: Path):
function test_get_installed (line 423) | def test_get_installed(isolated_pio_core, tmpdir_factory):
function test_uninstall (line 490) | def test_uninstall(isolated_pio_core, tmpdir_factory):
function test_registry (line 538) | def test_registry(isolated_pio_core):
function test_update_with_metadata (line 565) | def test_update_with_metadata(isolated_pio_core, tmpdir_factory):
function test_update_without_metadata (line 603) | def test_update_without_metadata(isolated_pio_core, tmpdir_factory):
FILE: tests/package/test_manifest.py
function test_library_json_parser (line 27) | def test_library_json_parser():
function test_module_json_parser (line 140) | def test_module_json_parser():
function test_library_properties_parser (line 199) | def test_library_properties_parser():
function test_library_json_schema (line 297) | def test_library_json_schema():
function test_library_properties_schema (line 451) | def test_library_properties_schema():
function test_platform_json_schema (line 568) | def test_platform_json_schema():
function test_package_json_schema (line 656) | def test_package_json_schema():
function test_parser_from_dir (line 715) | def test_parser_from_dir(tmpdir_factory):
function test_examples_from_dir (line 730) | def test_examples_from_dir(tmpdir_factory):
function test_parser_from_archive (line 845) | def test_parser_from_archive(tmpdir_factory):
function test_broken_schemas (line 860) | def test_broken_schemas():
FILE: tests/package/test_meta.py
function test_outdated_result (line 29) | def test_outdated_result():
function test_spec_owner (line 44) | def test_spec_owner():
function test_spec_id (line 54) | def test_spec_id():
function test_spec_name (line 62) | def test_spec_name():
function test_spec_requirements (line 67) | def test_spec_requirements():
function test_spec_local_urls (line 84) | def test_spec_local_urls(tmpdir_factory):
function test_spec_external_urls (line 108) | def test_spec_external_urls():
function test_spec_vcs_urls (line 138) | def test_spec_vcs_urls():
function test_spec_as_dict (line 187) | def test_spec_as_dict():
function test_spec_as_dependency (line 213) | def test_spec_as_dependency():
function test_metadata_as_dict (line 231) | def test_metadata_as_dict():
function test_metadata_dump (line 268) | def test_metadata_dump(tmpdir_factory):
function test_metadata_load (line 284) | def test_metadata_load(tmpdir_factory):
function test_compatibility (line 318) | def test_compatibility():
FILE: tests/package/test_pack.py
function test_base (line 27) | def test_base(tmpdir_factory):
function test_filters (line 48) | def test_filters(tmpdir_factory):
function test_gitgnore_filters (line 98) | def test_gitgnore_filters(tmpdir_factory):
function test_symlinks (line 132) | def test_symlinks(tmpdir_factory):
function test_source_root (line 157) | def test_source_root(tmpdir_factory):
function test_manifest_uri (line 168) | def test_manifest_uri(tmpdir_factory):
FILE: tests/project/test_config.py
function config (line 120) | def config(tmpdir_factory):
function test_empty_config (line 129) | def test_empty_config():
function test_warnings (line 138) | def test_warnings(config):
function test_defaults (line 147) | def test_defaults(config):
function test_sections (line 165) | def test_sections(config):
function test_envs (line 184) | def test_envs(config):
function test_options (line 196) | def test_options(config):
function test_has_option (line 220) | def test_has_option(config):
function test_sysenv_options (line 228) | def test_sysenv_options(config):
function test_getraw_value (line 288) | def test_getraw_value(config):
function test_get_value (line 327) | def test_get_value(config):
function test_items (line 367) | def test_items(config):
function test_update_and_save (line 439) | def test_update_and_save(tmpdir_factory):
function test_update_and_clear (line 486) | def test_update_and_clear(tmpdir_factory):
function test_dump (line 503) | def test_dump(tmpdir_factory):
function test_win_core_root_dir (line 570) | def test_win_core_root_dir(tmpdir_factory):
function test_this (line 603) | def test_this(tmp_path: Path):
function test_project_name (line 619) | def test_project_name(tmp_path: Path):
function test_nested_interpolation (line 639) | def test_nested_interpolation(tmp_path: Path):
function test_extends_order (line 675) | def test_extends_order(tmp_path: Path):
function test_invalid_env_names (line 694) | def test_invalid_env_names(tmp_path: Path):
function test_linting_errors (line 704) | def test_linting_errors(tmp_path: Path):
function test_linting_warnings (line 719) | def test_linting_warnings(tmp_path: Path):
FILE: tests/project/test_metadata.py
function test_metadata_dump (line 20) | def test_metadata_dump(clirunner, validate_cliresult, tmpdir):
FILE: tests/project/test_savedeps.py
function test_save_libraries (line 47) | def test_save_libraries(tmp_path):
function test_save_tools (line 134) | def test_save_tools(tmp_path):
FILE: tests/test_examples.py
function pytest_generate_tests (line 28) | def pytest_generate_tests(metafunc):
function test_run (line 67) | def test_run(pioproject_dir):
Condensed preview — 350 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,638K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 38,
"preview": "custom: https://platformio.org/donate\n"
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 1743,
"preview": "What kind of issue is this?\n\n- [ ] **Question**.\n This issue tracker is not the place for questions. If you want to"
},
{
"path": ".github/workflows/core.yml",
"chars": 1287,
"preview": "name: Core\n\non: [push, pull_request]\n\njobs:\n build:\n strategy:\n fail-fast: false\n matrix:\n os: [ubu"
},
{
"path": ".github/workflows/deployment.yml",
"chars": 1086,
"preview": "name: Deployment\n\non:\n push:\n branches:\n - \"master\"\n - \"release/**\"\n\njobs:\n deployment:\n runs-on: ubun"
},
{
"path": ".github/workflows/docs.yml",
"chars": 3409,
"preview": "name: Docs\n\non: [push, pull_request]\n\njobs:\n build:\n name: Build Docs\n runs-on: ubuntu-latest\n steps:\n - "
},
{
"path": ".github/workflows/examples.yml",
"chars": 1918,
"preview": "name: Examples\n\non: [push, pull_request]\n\n\njobs:\n build:\n strategy:\n fail-fast: false\n matrix:\n os:"
},
{
"path": ".github/workflows/projects.yml",
"chars": 1607,
"preview": "name: Projects\n\non: [push, pull_request]\n\njobs:\n build:\n strategy:\n fail-fast: false\n matrix:\n proj"
},
{
"path": ".gitignore",
"chars": 109,
"preview": "*.egg-info\n*.pyc\n__pycache__\n.tox\ndocs/_build\ndist\nbuild\n.cache\ncoverage.xml\n.coverage\nhtmlcov\n.pytest_cache\n"
},
{
"path": ".gitmodules",
"chars": 208,
"preview": "[submodule \"examples\"]\n\tpath = examples\n\turl = https://github.com/platformio/platformio-examples.git\n[submodule \"docs\"]\n"
},
{
"path": ".pylintrc",
"chars": 221,
"preview": "[REPORTS]\noutput-format=colorized\n\n[MESSAGES CONTROL]\ndisable=\n missing-docstring,\n duplicate-code,\n invalid-na"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 70,
"preview": "# Code of Conduct\n\nSee https://piolabs.com/legal/code-of-conduct.html\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 1016,
"preview": "Contributing\n------------\n\nTo get started, <a href=\"https://cla-assistant.io/platformio/platformio-core\">sign the Contri"
},
{
"path": "HISTORY.rst",
"chars": 45454,
"preview": "Release Notes\n=============\n\n.. |PIOCONF| replace:: `\"platformio.ini\" <https://docs.platformio.org/en/latest/projectconf"
},
{
"path": "LICENSE",
"chars": 9169,
"preview": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AN"
},
{
"path": "Makefile",
"chars": 813,
"preview": "lint:\n\tpylint --rcfile=./.pylintrc ./tests\n\tpylint --rcfile=./.pylintrc ./platformio\n\nisort:\n\tisort ./platformio\n\tisort "
},
{
"path": "README.rst",
"chars": 5240,
"preview": "PlatformIO Core\n===============\n\n.. image:: https://github.com/platformio/platformio-core/workflows/Core/badge.svg\n :"
},
{
"path": "SECURITY.md",
"chars": 2101,
"preview": "# Security Policy\n\n## Supported Versions\n\nWe are committed to ensuring the security and protection of PlatformIO Core. \n"
},
{
"path": "platformio/__init__.py",
"chars": 1612,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/__main__.py",
"chars": 4631,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/cli.py",
"chars": 1593,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/client.py",
"chars": 11181,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/destroy.py",
"chars": 1246,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/forgot.py",
"chars": 1039,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/login.py",
"chars": 1036,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/logout.py",
"chars": 879,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/password.py",
"chars": 1086,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/register.py",
"chars": 1702,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/show.py",
"chars": 4263,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/token.py",
"chars": 1255,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/commands/update.py",
"chars": 2282,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/cli.py",
"chars": 1267,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/commands/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/commands/add.py",
"chars": 1089,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/commands/create.py",
"chars": 1305,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/commands/destroy.py",
"chars": 1194,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/commands/list.py",
"chars": 1666,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/commands/remove.py",
"chars": 1100,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/org/commands/update.py",
"chars": 1804,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/cli.py",
"chars": 1287,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/commands/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/commands/add.py",
"chars": 1324,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/commands/create.py",
"chars": 1289,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/commands/destroy.py",
"chars": 1388,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/commands/list.py",
"chars": 2245,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/commands/remove.py",
"chars": 1327,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/team/commands/update.py",
"chars": 1809,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/account/validate.py",
"chars": 2895,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/app.py",
"chars": 8502,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/assets/schema/library.json",
"chars": 17507,
"preview": "{\r\n \"$id\": \"https://example.com/library.json\",\r\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\r\n \"title\""
},
{
"path": "platformio/assets/system/99-platformio-udev.rules",
"chars": 9031,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/main.py",
"chars": 7911,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/pioasm.py",
"chars": 1027,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piobuild.py",
"chars": 13425,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piohooks.py",
"chars": 1676,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/pioino.py",
"chars": 8210,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piointegration.py",
"chars": 6211,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piolib.py",
"chars": 43640,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piomaxlen.py",
"chars": 2973,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piomisc.py",
"chars": 4527,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/pioplatform.py",
"chars": 8184,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/pioproject.py",
"chars": 1700,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piosize.py",
"chars": 8702,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piotarget.py",
"chars": 3347,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/piotest.py",
"chars": 2106,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/builder/tools/pioupload.py",
"chars": 8435,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/cache.py",
"chars": 5239,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/check/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/check/cli.py",
"chars": 11503,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/check/defect.py",
"chars": 3142,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/check/tools/__init__.py",
"chars": 1319,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/check/tools/base.py",
"chars": 8650,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/check/tools/clangtidy.py",
"chars": 3094,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/check/tools/cppcheck.py",
"chars": 9357,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/check/tools/pvsstudio.py",
"chars": 8430,
"preview": "# Copyright (c) 2020-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/cli.py",
"chars": 3672,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/boards.py",
"chars": 2824,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/ci.py",
"chars": 5668,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/device/__init__.py",
"chars": 750,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/lib.py",
"chars": 16085,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/platform.py",
"chars": 12941,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/settings.py",
"chars": 2475,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/update.py",
"chars": 1244,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/commands/upgrade.py",
"chars": 5129,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/compat.py",
"chars": 6315,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/cli.py",
"chars": 6315,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/base.py",
"chars": 8991,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/blackmagic.py",
"chars": 2074,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/factory.py",
"chars": 1750,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/generic.py",
"chars": 971,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/jlink.py",
"chars": 1163,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/mspdebug.py",
"chars": 923,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/native.py",
"chars": 952,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/qemu.py",
"chars": 964,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/config/renode.py",
"chars": 1158,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/exception.py",
"chars": 1201,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/helpers.py",
"chars": 5093,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/process/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/process/base.py",
"chars": 4893,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/process/client.py",
"chars": 3461,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/process/gdb.py",
"chars": 7024,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/debug/process/server.py",
"chars": 5739,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/dependencies.py",
"chars": 2147,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/cli.py",
"chars": 933,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/finder.py",
"chars": 8801,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/list/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/list/command.py",
"chars": 3333,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/list/util.py",
"chars": 5484,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/command.py",
"chars": 6168,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/filters/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/filters/base.py",
"chars": 3718,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/filters/hexlify.py",
"chars": 1514,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/filters/log2file.py",
"chars": 1547,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/filters/send_on_enter.py",
"chars": 1266,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/filters/time.py",
"chars": 1386,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/device/monitor/terminal.py",
"chars": 6429,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/exception.py",
"chars": 3019,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/fs.py",
"chars": 6912,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/cli.py",
"chars": 3419,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/account.py",
"chars": 1196,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/app.py",
"chars": 2909,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/base.py",
"chars": 653,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/ide.py",
"chars": 2994,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/misc.py",
"chars": 1966,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/os.py",
"chars": 5202,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/piocore.py",
"chars": 7603,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/platform.py",
"chars": 5222,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/project.py",
"chars": 15336,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/handlers/registry.py",
"chars": 1268,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/rpc/server.py",
"chars": 4760,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/home/run.py",
"chars": 4089,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/http.py",
"chars": 7768,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/maintenance.py",
"chars": 9143,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/cli.py",
"chars": 1778,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/exec.py",
"chars": 3981,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/install.py",
"chars": 12454,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/list.py",
"chars": 8194,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/outdated.py",
"chars": 6981,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/pack.py",
"chars": 1606,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/publish.py",
"chars": 7063,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/search.py",
"chars": 2411,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/show.py",
"chars": 4835,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/uninstall.py",
"chars": 8363,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/unpublish.py",
"chars": 1656,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/commands/update.py",
"chars": 8644,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/download.py",
"chars": 5901,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/exception.py",
"chars": 2151,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/lockfile.py",
"chars": 3574,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/_download.py",
"chars": 3875,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/_install.py",
"chars": 10614,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/_legacy.py",
"chars": 2414,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/_registry.py",
"chars": 7943,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/_symlink.py",
"chars": 2642,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/_uninstall.py",
"chars": 3211,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/_update.py",
"chars": 4594,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/base.py",
"chars": 11989,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/core.py",
"chars": 3150,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/library.py",
"chars": 4369,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/platform.py",
"chars": 6342,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manager/tool.py",
"chars": 1180,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manifest/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manifest/parser.py",
"chars": 24761,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/manifest/schema.py",
"chars": 9005,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/meta.py",
"chars": 17237,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/pack.py",
"chars": 8511,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/unpack.py",
"chars": 6852,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/vcsclient.py",
"chars": 8517,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/package/version.py",
"chars": 1812,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/platform/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/platform/_packages.py",
"chars": 3490,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/platform/_run.py",
"chars": 6342,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/platform/base.py",
"chars": 8770,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/platform/board.py",
"chars": 5063,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/platform/exception.py",
"chars": 1376,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/platform/factory.py",
"chars": 3829,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/proc.py",
"chars": 6490,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/project/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/project/cli.py",
"chars": 1016,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/project/commands/__init__.py",
"chars": 610,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/project/commands/config.py",
"chars": 3377,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/project/commands/init.py",
"chars": 12820,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/project/commands/metadata.py",
"chars": 2873,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/project/config.py",
"chars": 20357,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
},
{
"path": "platformio/project/exception.py",
"chars": 1863,
"preview": "# Copyright (c) 2014-present PlatformIO <contact@platformio.org>\n#\n# Licensed under the Apache License, Version 2.0 (the"
}
]
// ... and 150 more files (download for full content)
About this extraction
This page contains the full source code of the platformio/platformio-core GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 350 files (1.5 MB), approximately 358.7k tokens, and a symbol index with 2014 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.