PlatformIO Library Manager 3.0 // Resolve #588 , Resolve #414, Resolve #498, Resolve #475, Resolve #410, Resolve #461, Resolve #361, Resolve #507, Resolve #554

This commit is contained in:
Ivan Kravets
2016-08-02 19:10:29 +03:00
parent 5b5a63cb5f
commit 758396c9ea
34 changed files with 1185 additions and 700 deletions

View File

@ -7,41 +7,65 @@ PlatformIO 3.0
3.0.0 (2016-??-??) 3.0.0 (2016-??-??)
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
* Decentralized architecture for development platforms: "platform.json", * Decentralized Development Platforms
semantic versioning, package dependencies, embedded board configs, isolated
build scripts + Development platform manifest "platform.json" and
(`issue #479 <https://github.com/platformio/platformio/issues/479>`_) `open source development platforms <https://github.com/platformio?utf8=✓&query=platform->`__
* Unit Testing for Embedded (`docs <http://docs.platformio.org/en/latest/platforms/unit_testing.html>`__) + `Semantic Versioning <http://semver.org/>`__ for platform commands,
development platforms and dependent packages
+ Custom package repositories
+ External embedded board configuration files, isolated build scripts
(`issue #479 <https://github.com/platformio/platformio/issues/479>`_)
+ Embedded Board compatibility with more than one development platform
(`issue #456 <https://github.com/platformio/platformio/issues/456>`_)
* `Unit Testing <http://docs.platformio.org/en/latest/platforms/unit_testing.html>`__ for Embedded
(`issue #408 <https://github.com/platformio/platformio/issues/408>`_) (`issue #408 <https://github.com/platformio/platformio/issues/408>`_)
* Library Manager 3.0
+ `Semantic Versioning <http://semver.org/>`__ for library commands and
dependencies
(`issue #410 <https://github.com/platformio/platformio/issues/410>`_)
+ Multiple library storages: project's local, PlatformIO global or custom
(`issue #475 <https://github.com/platformio/platformio/issues/475>`_)
+ Install library by name
(`issue #414 <https://github.com/platformio/platformio/issues/414>`_)
+ Depend on a library using VCS URL (GitHub, Git, ARM mbed code registry, Hg, SVN)
(`issue #498 <https://github.com/platformio/platformio/issues/498>`_)
+ Strict search for library dependencies
(`issue #588 <https://github.com/platformio/platformio/issues/588>`_)
+ Allowed ``library.json`` to specify sources other than PlatformIO's Repository
(`issue #461 <https://github.com/platformio/platformio/issues/461>`_)
* New Intelligent Library Build System * New Intelligent Library Build System
+ `Library Dependency Finder <http://docs.platformio.org/en/latest/faq.html#how-works-library-dependency-finder-ldf>`__ + `Library Dependency Finder <http://docs.platformio.org/en/latest/faq.html#how-works-library-dependency-finder-ldf>`__
that interprets C Preprocessor conditional macros with deep search behavior that interprets C Preprocessor conditional macros with deep search behavior
+ Check library compatibility with project environment before building + Check library compatibility with project environment before building
(`issue #415 <https://github.com/platformio/platformio/issues/415>`_) (`issue #415 <https://github.com/platformio/platformio/issues/415>`_)
+ Control Library Dependency Finder for compatibility using + Control Library Dependency Finder for compatibility using
`lib_compat_mode <http://docs.platformio.org/en/latest/projectconf.html#lib-compat-mode>`__ `lib_compat_mode <http://docs.platformio.org/en/latest/projectconf.html#lib-compat-mode>`__
option option
+ Custom library storages/directories with + Custom library storages/directories with
`lib_extra_dirs <http://docs.platformio.org/en/latest/projectconf.html#lib-extra-dirs>`__ option `lib_extra_dirs <http://docs.platformio.org/en/latest/projectconf.html#lib-extra-dirs>`__ option
(`issue #537 <https://github.com/platformio/platformio/issues/537>`_) (`issue #537 <https://github.com/platformio/platformio/issues/537>`_)
+ Handle extra build flags, source filters and build script from + Handle extra build flags, source filters and build script from
`library.json <http://docs.platformio.org/en/latest/librarymanager/config.html>`__ `library.json <http://docs.platformio.org/en/latest/librarymanager/config.html>`__
(`issue #289 <https://github.com/platformio/platformio/issues/289>`_) (`issue #289 <https://github.com/platformio/platformio/issues/289>`_)
+ Allowed to disable library archiving (``*.ar``) + Allowed to disable library archiving (``*.ar``)
(`issue #719 <https://github.com/platformio/platformio/issues/719>`_) (`issue #719 <https://github.com/platformio/platformio/issues/719>`_)
+ Show detailed build information about dependent libraries + Show detailed build information about dependent libraries
(`issue #617 <https://github.com/platformio/platformio/issues/617>`_) (`issue #617 <https://github.com/platformio/platformio/issues/617>`_)
+ Support for the 3rd party manifests (Arduino IDE "library.properties" + Support for the 3rd party manifests (Arduino IDE "library.properties"
and ARM mbed "module.json") and ARM mbed "module.json")
* Print human-readable information when processing environments without * Print human-readable information when processing environments without
``-v, --verbose`` option ``-v, --verbose`` option
(`issue #721 <https://github.com/platformio/platformio/issues/721>`_) (`issue #721 <https://github.com/platformio/platformio/issues/721>`_)
* Added ``license`` field to `library.json <http://docs.platformio.org/en/latest/librarymanager/config.html>`__ * Added ``license`` field to `library.json <http://docs.platformio.org/en/latest/librarymanager/config.html>`__
(`issue #522 <https://github.com/platformio/platformio/issues/522>`_) (`issue #522 <https://github.com/platformio/platformio/issues/522>`_)
* Embedded Board compatibility with more than one development platform
(`issue #456 <https://github.com/platformio/platformio/issues/456>`_)
PlatformIO 2.0 PlatformIO 2.0
-------------- --------------

View File

@ -50,7 +50,7 @@ libraries. These folders/path have priority and LDF operates in the next order:
2. :ref:`projectconf_pio_lib_dir` - own/private library storage per project 2. :ref:`projectconf_pio_lib_dir` - own/private library storage per project
3. :ref:`projectconf_pio_piolibdeps_dir` - project dependencies storage used by 3. :ref:`projectconf_pio_piolibdeps_dir` - project dependencies storage used by
:ref:`librarymanager` :ref:`librarymanager`
4. :ref:`projectconf_pio_home_dir`/lib - global storage per all projects. 4. ":ref:`projectconf_pio_home_dir`/lib" - global storage per all projects.
.. _ldf_mode: .. _ldf_mode:

View File

@ -253,7 +253,7 @@ General options
:ref:`platforms` name. :ref:`platforms` name.
PlatformIO allows to use specific platform versions using PlatformIO allows to use specific version of platform using
`Semantic Versioning <http://semver.org>`_ (X.Y.Z=MAJOR.MINOR.PATCH). `Semantic Versioning <http://semver.org>`_ (X.Y.Z=MAJOR.MINOR.PATCH).
Version specifications can take any of the following forms: Version specifications can take any of the following forms:

View File

@ -1,4 +1,4 @@
.. Copyright 2014-2016 Ivan Kravets <me@ikravets.com> .. Copyright 2014-present Ivan Kravets <me@ikravets.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
@ -21,22 +21,67 @@ Usage
.. code-block:: bash .. code-block:: bash
platformio lib install [OPTIONS] [LIBRARY_ID] platformio lib [STORAGE_OPTIONS] install [OPTIONS] [LIBRARY...]
# install project dependent library
# (run it from a project root where is located "platformio.ini")
platformio lib install [OPTIONS] [LIBRARY...]
# install to global storage
platformio lib --global install [OPTIONS] [LIBRARY...]
platformio lib -g install [OPTIONS] [LIBRARY...]
# install to custom storage
platformio lib --storage-dir /path/to/dir install [OPTIONS] [LIBRARY...]
platformio lib -d /path/to/dir install [OPTIONS] [LIBRARY...]
# [LIBRARY...] forms
platformio lib [STORAGE_OPTIONS] install (with no args, project dependencies)
platformio lib [STORAGE_OPTIONS] install <id>
platformio lib [STORAGE_OPTIONS] install <id>@<version>
platformio lib [STORAGE_OPTIONS] install <id>@<version range>
platformio lib [STORAGE_OPTIONS] install <name>
platformio lib [STORAGE_OPTIONS] install <name>@<version>
platformio lib [STORAGE_OPTIONS] install <name>@<version range>
platformio lib [STORAGE_OPTIONS] install <zip or tarball url>
platformio lib [STORAGE_OPTIONS] install file://<zip or tarball file>
platformio lib [STORAGE_OPTIONS] install file://<folder>
platformio lib [STORAGE_OPTIONS] install <repository>
platformio lib [STORAGE_OPTIONS] install <name=repository> (name it should have locally)
platformio lib [STORAGE_OPTIONS] install <repository#tag> ("tag" can be commit, branch or tag)
Description Description
----------- -----------
Install new library by specified Install a library, and any libraries that it depends on using:
`PlatformIO Library Registry ID <http://platformio.org/lib>`_.
Installs the project library dependencies or a specific set of libraries. 1. Library ``id`` or ``name`` from `PlatformIO Library Registry <http://platformio.org/lib>`_
[LIBRARY] can have multiple forms: <source>, <source>@<target>, 2. Custom folder, repository or archive.
<id=> or <name>=<source>@<target>
Where, <source> is a registry ID, registry name, repository URL, physical The ``version`` supports `Semantic Versioning <http://semver.org>`_ (
location, <target> is a valid semantic version/range, commit, branch, etc., and ``<major>.<minor>.<patch>``) and can take any of the following forms:
<name> is the name it should have locally.
* ``0.1.2`` - an exact version number. Use only this exact version
* ``^0.1.2`` - any compatible version (exact version for ``0.x.x`` versions
* ``~0.1.2`` - any version with the same major and minor versions, and an
equal or greater patch version
* ``>0.1.2`` - any version greater than ``0.1.2``. ``>=``, ``<``, and ``<=``
are also possible
* ``>0.1.0,!=0.2.0,<0.3.0`` - any version greater than ``0.1.0``, not equal to
``0.2.0`` and less than ``0.3.0``
Also, PlatformIO supports installing from local directory or archive. Need
to use ``file://`` prefix before local path. Also, directory or
archive should contain ``.library.json`` manifest (see :ref:`library_config`).
* ``file:///local/path/to/the/platform/dir``
* ``file:///local/path/to/the/platform.zip``
* ``file:///local/path/to/the/platform.tar.gz``
Storage Options
---------------
See base options for :ref:`userguide_lib`.
Options Options
------- -------
@ -44,50 +89,151 @@ Options
.. program:: platformio lib install .. program:: platformio lib install
.. option:: .. option::
-v, --version -q, --quiet
Install specified version of library Suppress progress reporting
Version control
---------------
PlatformIO supports installing from Git, Mercurial and Subversion, and detects
the type of VCS using url prefixes: "git+", "hg+", or "svn+".
.. note::
PlatformIO requires a working VCS command on your path: ``git``, ``hg``
or ``svn``.
Git
^^^
The supported schemes are: ``git``, ``git+https`` and ``git+ssh``. Here are
the supported forms:
* user/library (short version for GitHub repository)
* https://github.com/user/library.git
* git+git://git.server.org/my-library
* git+https://git.server.org/my-library
* git+ssh://git.server.org/my-library
Passing branch names, a commit hash or a tag name is possible like so:
* https://github.com/user/library.git#master
* git+git://git.server.org/my-library#master
* git+https://git.server.org/my-library#v1.0
* git+ssh://git.server.org/my-library#7846d8ad52f983f2f2887bdc0f073fe9755a806d
Mercurial
^^^^^^^^^
The supported schemes are: ``hg+http``, ``hg+https`` and ``hg+ssh``. Here are
the supported forms:
* https://developer.mbed.org/users/user/code/library/ (install ARM mbed library)
* hg+hg://hg.server.org/my-library
* hg+https://hg.server.org/my-library
* hg+ssh://hg.server.org/my-library
Passing branch names, a commit hash or a tag name is possible like so:
* hg+hg://hg.server.org/my-library#master
* hg+https://hg.server.org/my-library#v1.0
* hg+ssh://hg.server.org/my-library#4cfe2fa00668
Subversion
^^^^^^^^^^
The supported schemes are: ``svn``, ``svn+svn``, ``svn+http``, ``svn+https``
and ``svn+ssh``. Here are the supported forms:
* svn+svn://svn.server.org/my-library
* svn+https://svn.server.org/my-library
* svn+ssh://svn.server.org/my-library
You can also give specific revisions to an SVN URL, like so:
* svn+svn://svn.server.org/my-library#13
Examples Examples
-------- --------
1. Install the latest version of library 1. Install the latest version of library to a global storage using ID or NAME
.. code-block:: bash .. code::
# IRremote: http://platformio.org/lib/show/4/IRremote > platformio lib -g install 4
$ platformio lib install 4
# Installing library [ 4 ]: Library Storage: /storage/dir/...
# Downloading [####################################] 100% LibraryManager: Installing id=4
# Unpacking [####################################] 100% Downloading [####################################] 100%
# The library #4 'IRremote' has been successfully installed! Unpacking [####################################] 100%
IRremote @ 2.2.1 has been successfully installed!
# repeat command with name
> platformio lib -g install IRRemote
Library Storage: /storage/dir/...
Looking for IRRemote library in registry
Found: http://platformio.org/lib/show/4/IRremote
LibraryManager: Installing id=4
IRremote @ 2.2.1 is already installed
2. Install specified version of library 2. Install specified version of a library to a global storage
.. code-block:: bash .. code::
# XBee: http://platformio.org/lib/show/6/XBee > platformio lib -g install Json@5.4.0
$ platformio lib install 6 --version=0.5
# Installing library [ 6 ]: Library Storage: /storage/dir/...
# Downloading [####################################] 100% Looking for Json library in registry
# Unpacking [####################################] 100% Found: http://platformio.org/lib/show/64/Json
# The library #6 'XBee' has been successfully installed! LibraryManager: Installing id=64 @ 5.4.0
Downloading [####################################] 100%
Unpacking [####################################] 100%
Json @ 5.4.0 has been successfully installed!
3. Install library with dependencies 3. Install library with dependencies to custom storage
.. code-block:: bash .. code::
# Adafruit-ST7735: http://platformio.org/lib/show/12/Adafruit-ST7735 > platformio lib --storage-dir /my/storage/dir install DallasTemperature
$ platformio lib install 12
# Installing library [ 12 ]: Library Storage: /my/storage/dir
# Downloading [####################################] 100% Looking for DallasTemperature library in registry
# Unpacking [####################################] 100% Found: http://platformio.org/lib/show/54/DallasTemperature
# The library #12 'Adafruit-ST7735' has been successfully installed! LibraryManager: Installing id=54
# Installing dependencies: Downloading [####################################] 100%
# Installing library [ 13 ]: Unpacking [####################################] 100%
# Downloading [####################################] 100% DallasTemperature @ 3.7.7 has been successfully installed!
# Unpacking [####################################] 100% Installing dependencies
# The library #13 'Adafruit-GFX' has been successfully installed! Looking for OneWire library in registry
Found: http://platformio.org/lib/show/1/OneWire
LibraryManager: Installing id=1
Downloading [####################################] 100%
Unpacking [####################################] 100%
OneWire @ 8fd2ebfec7 has been successfully installed!
4. Install ARM mbed library to the global storage
.. code::
> platformio lib -g install https://developer.mbed.org/users/simon/code/TextLCD/
Library Storage: /storage/dir/...
LibraryManager: Installing TextLCD
Mercurial Distributed SCM (version 3.8.4)
(see https://mercurial-scm.org for more information)
Copyright (C) 2005-2016 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
requesting all changes
adding changesets
adding manifests
adding file changes
added 9 changesets with 18 changes to 6 files
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
TextLCD @ 308d188a2d3a has been successfully installed!

View File

@ -1,4 +1,4 @@
.. Copyright 2014-2016 Ivan Kravets <me@ikravets.com> .. Copyright 2014-present Ivan Kravets <me@ikravets.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
@ -21,14 +21,30 @@ Usage
.. code-block:: bash .. code-block:: bash
platformio lib [STORAGE_OPTIONS] list [OPTIONS]
# list project dependent libraries
# (run it from a project root where is located "platformio.ini")
platformio lib list [OPTIONS] platformio lib list [OPTIONS]
# list libraries from global storage
platformio lib --global list [OPTIONS]
platformio lib -g list [OPTIONS]
# list libraries from custom storage
platformio lib --storage-dir /path/to/dir list [OPTIONS]
platformio lib -d /path/to/dir list [OPTIONS]
Description Description
----------- -----------
List installed libraries List installed libraries
Storage Options
---------------
See base options for :ref:`userguide_lib`.
Options Options
~~~~~~~ ~~~~~~~
@ -42,18 +58,14 @@ Return the output in `JSON <http://en.wikipedia.org/wiki/JSON>`_ format
Examples Examples
-------- --------
.. code-block:: bash .. code::
$ platformio lib list > platformio lib list
#
# [ ID ] Name Compatibility "Authors": Description pio lib -g list
# ------------------------------------------------------------------------------------- Library Storage: /storage/dir/...
# [ 23 ] Adafruit-L3GD20-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the L3GD20 Gyroscope [ ID ] Name Compatibility "Authors": Description
# [ 12 ] Adafruit-ST7735 arduino, atmelavr "Adafruit Industries": A library for the Adafruit 1.8" SPI display -----------------------------------------------------------------------------------------------------------
# [ 31 ] Adafruit-Unified-Sensor arduino, atmelavr "Adafruit Industries": Adafruit Unified Sensor Driver [ 4 ] IRremote arduino, atmelavr "Rafi Khan, Ken Shirriff": Send and receive infrared signals with multiple protocols | @2.2.1
# [ 26 ] Adafruit-LSM303DLHC-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for Adafruit's LSM303 Breakout (Accelerometer + Magnetometer) [ 64 ] Json arduino, atmelavr, atmelsam, timsp430, titiva, teensy, freescalekinetis, ststm32, nordicnrf51, nxplpc, espressif, siliconlabsefm32, linux_arm, native, intel_arc32 "Benoit Blanchon": An elegant and efficient JSON library for embedded systems | @5.4.0
# [ 6 ] XBee arduino, atmelavr "Andrew Rapp": Arduino library for communicating with XBees in API mode [ VCS ] TextLCD - "Unknown": hg+https://developer.mbed.org/users/simon/code/TextLCD/ | @308d188a2d3a
# [ 13 ] Adafruit-GFX arduino, atmelavr "Adafruit Industries": A core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.)
# [ 4 ] IRremote arduino, atmelavr "Ken Shirriff": Send and receive infrared signals with multiple protocols
# [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303)
# ...

View File

@ -1,4 +1,4 @@
.. Copyright 2014-2016 Ivan Kravets <me@ikravets.com> .. Copyright 2014-present Ivan Kravets <me@ikravets.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
@ -32,6 +32,6 @@ Register new library and allow others to install it.
Examples Examples
-------- --------
.. code-block:: bash .. code::
$ platformio lib register http://my.example.com/library.json platformio lib register http://my.example.com/raw-library.json

View File

@ -1,4 +1,4 @@
.. Copyright 2014-2016 Ivan Kravets <me@ikravets.com> .. Copyright 2014-present Ivan Kravets <me@ikravets.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
@ -74,6 +74,11 @@ Options
.. program:: platformio lib search .. program:: platformio lib search
.. option::
-n, --name
Filter libraries by specified name (strict search)
.. option:: .. option::
-a, --author -a, --author
@ -112,126 +117,134 @@ Examples
1. List all libraries 1. List all libraries
.. code-block:: bash .. code::
$ platformio lib search > platformio lib search
# Found N libraries:
# Found N libraries:
# [ ID ] Name Compatibility "Authors": Description
# ------------------------------------------------------------------------------------- [ ID ] Name Compatibility "Authors": Description
# [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303) -------------------------------------------------------------------------------------
# [ 13 ] Adafruit-GFX arduino, atmelavr "Adafruit Industries": A core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.) [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303)
# [ 23 ] Adafruit-L3GD20-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the L3GD20 Gyroscope [ 13 ] Adafruit-GFX arduino, atmelavr "Adafruit Industries": A core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.)
# [ 26 ] Adafruit-LSM303DLHC-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for Adafruit's LSM303 Breakout (Accelerometer + Magnetometer) [ 23 ] Adafruit-L3GD20-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the L3GD20 Gyroscope
# [ 12 ] Adafruit-ST7735 arduino, atmelavr "Adafruit Industries": A library for the Adafruit 1.8" SPI display [ 26 ] Adafruit-LSM303DLHC-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for Adafruit's LSM303 Breakout (Accelerometer + Magnetometer)
# [ 31 ] Adafruit-Unified-Sensor arduino, atmelavr "Adafruit Industries": Adafruit Unified Sensor Driver [ 12 ] Adafruit-ST7735 arduino, atmelavr "Adafruit Industries": A library for the Adafruit 1.8" SPI display
# [ 4 ] IRremote arduino, atmelavr "Ken Shirriff": Send and receive infrared signals with multiple protocols [ 31 ] Adafruit-Unified-Sensor arduino, atmelavr "Adafruit Industries": Adafruit Unified Sensor Driver
# [ 1 ] OneWire arduino, atmelavr "Paul Stoffregen": Control devices (from Dallas Semiconductor) that use the One Wire protocol (DS18S20, DS18B20, DS2408 and etc) [ 4 ] IRremote arduino, atmelavr "Ken Shirriff": Send and receive infrared signals with multiple protocols
# [ 6 ] XBee arduino, atmelavr "Andrew Rapp": Arduino library for communicating with XBees in API mode [ 1 ] OneWire arduino, atmelavr "Paul Stoffregen": Control devices (from Dallas Semiconductor) that use the One Wire protocol (DS18S20, DS18B20, DS2408 and etc)
# [ 15 ] Adafruit-ADXL345-Unified arduino, atmelavr "Adafruit Industries": Unified driver for the ADXL345 Accelerometer [ 6 ] XBee arduino, atmelavr "Andrew Rapp": Arduino library for communicating with XBees in API mode
# Show next libraries? [y/N]: [ 15 ] Adafruit-ADXL345-Unified arduino, atmelavr "Adafruit Industries": Unified driver for the ADXL345 Accelerometer
# ... Show next libraries? [y/N]:
...
2. Search for `1-Wire libraries <http://platformio.org/lib/search?query=%25221-wire%2522>`_ 2. Search for `1-Wire libraries <http://platformio.org/lib/search?query=%25221-wire%2522>`_
.. code-block:: bash .. code::
$ platformio lib search "1-wire" > platformio lib search "1-wire"
# Found N libraries:
# Found N libraries:
# [ ID ] Name Compatibility "Authors": Description
# ------------------------------------------------------------------------------------- [ ID ] Name Compatibility "Authors": Description
# [ 1 ] OneWire arduino, atmelavr "Paul Stoffregen": Control devices (from Dallas Semiconductor) that use the One Wire protocol (DS18S20, DS18B20, DS2408 and etc) -------------------------------------------------------------------------------------
# ... [ 1 ] OneWire arduino, atmelavr "Paul Stoffregen": Control devices (from Dallas Semiconductor) that use the One Wire protocol (DS18S20, DS18B20, DS2408 and etc)
...
3. Search for `Arduino-based "I2C" libraries <http://platformio.org/lib/search?query=framework%253Aarduino%2520i2c>`_ 3. Search for `Arduino-based "I2C" libraries <http://platformio.org/lib/search?query=framework%253Aarduino%2520i2c>`_
.. code-block:: bash .. code::
$ platformio lib search "i2c" --framework="arduino" > platformio lib search "i2c" --framework="arduino"
# Found N libraries:
# Found N libraries:
# [ ID ] Name Compatibility "Authors": Description
# ------------------------------------------------------------------------------------- [ ID ] Name Compatibility "Authors": Description
# [ 11 ] I2Cdevlib-Core arduino, atmelavr "Jeff Rowberg": The I2C Device Library (I2Cdevlib) is a collection of uniform and well-documented classes to provide simple and intuitive interfaces to I2C devices. -------------------------------------------------------------------------------------
# [ 24 ] Adafruit-L3GD20 arduino, atmelavr "Adafruit Industries": Driver for Adafruit's L3GD20 I2C Gyroscope Breakout [ 11 ] I2Cdevlib-Core arduino, atmelavr "Jeff Rowberg": The I2C Device Library (I2Cdevlib) is a collection of uniform and well-documented classes to provide simple and intuitive interfaces to I2C devices.
# [ 10 ] I2Cdevlib-AK8975 arduino, atmelavr "Jeff Rowberg": AK8975 is 3-axis electronic compass IC with high sensitive Hall sensor technology [ 24 ] Adafruit-L3GD20 arduino, atmelavr "Adafruit Industries": Driver for Adafruit's L3GD20 I2C Gyroscope Breakout
# [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303) [ 10 ] I2Cdevlib-AK8975 arduino, atmelavr "Jeff Rowberg": AK8975 is 3-axis electronic compass IC with high sensitive Hall sensor technology
# ... [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303)
...
4. Search for `libraries by "web" and "http" keywords <http://platformio.org/lib/search?query=keyword%253A%2522web%2522%2520keyword%253A%2522http%2522>`_. 4. Search for `libraries by "web" and "http" keywords <http://platformio.org/lib/search?query=keyword%253A%2522web%2522%2520keyword%253A%2522http%2522>`_.
.. code-block:: bash .. code::
$ platformio lib search --keyword="web" --keyword="http" > platformio lib search --keyword="web" --keyword="http"
# Found N libraries:
# Found N libraries:
# [ ID ] Name Compatibility "Authors": Description
# ------------------------------------------------------------------------------------- [ ID ] Name Compatibility "Authors": Description
# [ 5 ] Webduino arduino, atmelavr "Ben Combee": An extensible web server library (for use with the Arduino WizNet Ethernet Shield) -------------------------------------------------------------------------------------
# [ 17 ] Adafruit-CC3000 arduino, atmelavr "Adafruit Industries": Library code for Adafruit's CC3000 Wi-Fi/WiFi breakouts [ 5 ] Webduino arduino, atmelavr "Ben Combee": An extensible web server library (for use with the Arduino WizNet Ethernet Shield)
# ... [ 17 ] Adafruit-CC3000 arduino, atmelavr "Adafruit Industries": Library code for Adafruit's CC3000 Wi-Fi/WiFi breakouts
...
5. Search for `libraries by "Adafruit Industries" author <http://platformio.org/lib/search?query=author%253A%2522Adafruit%20Industries%2522>`_ 5. Search for `libraries by "Adafruit Industries" author <http://platformio.org/lib/search?query=author%253A%2522Adafruit%20Industries%2522>`_
.. code-block:: bash .. code::
$ platformio lib search --author="Adafruit Industries" > platformio lib search --author="Adafruit Industries"
# Found N libraries:
# Found N libraries:
# [ ID ] Name Compatibility "Authors": Description
# ------------------------------------------------------------------------------------- [ ID ] Name Compatibility "Authors": Description
# [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303) -------------------------------------------------------------------------------------
# [ 13 ] Adafruit-GFX arduino, atmelavr "Adafruit Industries": A core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.) [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303)
# [ 23 ] Adafruit-L3GD20-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the L3GD20 Gyroscope [ 13 ] Adafruit-GFX arduino, atmelavr "Adafruit Industries": A core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.)
# [ 26 ] Adafruit-LSM303DLHC-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for Adafruit's LSM303 Breakout (Accelerometer + Magnetometer) [ 23 ] Adafruit-L3GD20-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the L3GD20 Gyroscope
# ... [ 26 ] Adafruit-LSM303DLHC-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for Adafruit's LSM303 Breakout (Accelerometer + Magnetometer)
...
6. Search for `libraries which are compatible with Dallas temperature sensors <http://platformio.org/lib/search?query=DS*>`_ 6. Search for `libraries which are compatible with Dallas temperature sensors <http://platformio.org/lib/search?query=DS*>`_
like DS18B20, DS18S20 and etc. like DS18B20, DS18S20 and etc.
.. code-block:: bash .. code::
$ platformio lib search "DS*" > platformio lib search "DS*"
# Found N libraries:
# Found N libraries:
# [ ID ] Name Compatibility "Authors": Description
# ------------------------------------------------------------------------------------- [ ID ] Name Compatibility "Authors": Description
# [ 1 ] OneWire arduino, atmelavr "Paul Stoffregen": Control devices (from Dallas Semiconductor) that use the One Wire protocol (DS18S20, DS18B20, DS2408 and etc) -------------------------------------------------------------------------------------
# ... [ 1 ] OneWire arduino, atmelavr "Paul Stoffregen": Control devices (from Dallas Semiconductor) that use the One Wire protocol (DS18S20, DS18B20, DS2408 and etc)
...
7. Search for `Energia-based *nRF24* or *HttpClient* libraries <http://platformio.org/lib/search?query=framework%253Aenergia%2520%252B(nRF24%2520HttpClient)>`_. 7. Search for `Energia-based *nRF24* or *HttpClient* libraries <http://platformio.org/lib/search?query=framework%253Aenergia%2520%252B(nRF24%2520HttpClient)>`_.
The search query that is described below can be interpreted like The search query that is described below can be interpreted like
``energia nRF24 OR energia HttpClient`` ``energia nRF24 OR energia HttpClient``
.. code-block:: bash .. code::
$ platformio lib search "+(nRF24 HttpClient)" --framework="energia" > platformio lib search "+(nRF24 HttpClient)" --framework="energia"
# Found 2 libraries:
# Found 2 libraries:
# [ ID ] Name Compatibility "Authors": Description
# ------------------------------------------------------------------------------------- [ ID ] Name Compatibility "Authors": Description
# [ 46 ] HttpClient energia, timsp430, titiva "Zack Lalanne": HttpClient is a library to make it easier to interact with web servers -------------------------------------------------------------------------------------
# [ 43 ] nRF24 energia, timsp430 "Eric": The nRF24L01 is a low-cost 2.4GHz ISM transceiver module. It supports a number of channel frequencies in the 2.4GHz band and a range of data rates. [ 46 ] HttpClient energia, timsp430, titiva "Zack Lalanne": HttpClient is a library to make it easier to interact with web servers
[ 43 ] nRF24 energia, timsp430 "Eric": The nRF24L01 is a low-cost 2.4GHz ISM transceiver module. It supports a number of channel frequencies in the 2.4GHz band and a range of data rates.
8. Search for the `all sensor libraries excluding temperature <http://platformio.org/lib/search?query=sensor%2520-temperature>`_. 8. Search for the `all sensor libraries excluding temperature <http://platformio.org/lib/search?query=sensor%2520-temperature>`_.
.. code-block:: bash .. code::
$ platformio lib search "sensor -temperature" > platformio lib search "sensor -temperature"
# Found N libraries:
# Found N libraries:
# [ ID ] Name Compatibility "Authors": Description
# ------------------------------------------------------------------------------------- [ ID ] Name Compatibility "Authors": Description
# [ 31 ] Adafruit-Unified-Sensor arduino, atmelavr "Adafruit Industries": Adafruit Unified Sensor Driver -------------------------------------------------------------------------------------
# [ 10 ] I2Cdevlib-AK8975 arduino, atmelavr "Jeff Rowberg": AK8975 is 3-axis electronic compass IC with high sensitive Hall sensor technology [ 31 ] Adafruit-Unified-Sensor arduino, atmelavr "Adafruit Industries": Adafruit Unified Sensor Driver
# [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303) [ 10 ] I2Cdevlib-AK8975 arduino, atmelavr "Jeff Rowberg": AK8975 is 3-axis electronic compass IC with high sensitive Hall sensor technology
# [ 23 ] Adafruit-L3GD20-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the L3GD20 Gyroscope [ 14 ] Adafruit-9DOF-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the Adafruit 9DOF Breakout (L3GD20 / LSM303)
# [ 26 ] Adafruit-LSM303DLHC-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for Adafruit's LSM303 Breakout (Accelerometer + Magnetometer) [ 23 ] Adafruit-L3GD20-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for the L3GD20 Gyroscope
# [ 33 ] Adafruit-TMP006 arduino, atmelavr "Adafruit Industries": A library for the Adafruit TMP006 Infrared Thermopile Sensor [ 26 ] Adafruit-LSM303DLHC-Unified arduino, atmelavr "Adafruit Industries": Unified sensor driver for Adafruit's LSM303 Breakout (Accelerometer + Magnetometer)
# [ 34 ] Adafruit-TSL2561-Unified arduino, atmelavr "Adafruit Industries": Unified light sensor driver for Adafruit's TSL2561 breakouts [ 33 ] Adafruit-TMP006 arduino, atmelavr "Adafruit Industries": A library for the Adafruit TMP006 Infrared Thermopile Sensor
# [ 97 ] I2Cdevlib-BMA150 arduino, atmelavr "Jeff Rowberg": The BMA150 is a triaxial, low-g acceleration sensor IC with digital output for consumer market applications [ 34 ] Adafruit-TSL2561-Unified arduino, atmelavr "Adafruit Industries": Unified light sensor driver for Adafruit's TSL2561 breakouts
# [ 106 ] I2Cdevlib-MPR121 arduino, atmelavr "Jeff Rowberg": The MPR121 is a 12-bit proximity capacitive touch sensor [ 97 ] I2Cdevlib-BMA150 arduino, atmelavr "Jeff Rowberg": The BMA150 is a triaxial, low-g acceleration sensor IC with digital output for consumer market applications
# [ 111 ] I2Cdevlib-AK8975 energia, timsp430 "Jeff Rowberg": AK8975 is 3-axis electronic compass IC with high sensitive Hall sensor technology [ 106 ] I2Cdevlib-MPR121 arduino, atmelavr "Jeff Rowberg": The MPR121 is a 12-bit proximity capacitive touch sensor
# Show next libraries? [y/N]: [ 111 ] I2Cdevlib-AK8975 energia, timsp430 "Jeff Rowberg": AK8975 is 3-axis electronic compass IC with high sensitive Hall sensor technology
Show next libraries? [y/N]:

View File

@ -1,4 +1,4 @@
.. Copyright 2014-2016 Ivan Kravets <me@ikravets.com> .. Copyright 2014-present Ivan Kravets <me@ikravets.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
@ -21,28 +21,65 @@ Usage
.. code-block:: bash .. code-block:: bash
platformio lib show ID platformio lib [STORAGE_OPTIONS] show [LIBRARY]
# show info about project dependent library
# (run it from a project root where is located "platformio.ini")
platformio lib show [LIBRARY]
# show info about library from global storage
platformio lib --global show [LIBRARY]
platformio lib -g show [LIBRARY]
# show info about library from custom storage
platformio lib --storage-dir /path/to/dir show [LIBRARY]
platformio lib -d /path/to/dir show [LIBRARY]
# [LIBRARY] forms
platformio lib [STORAGE_OPTIONS] show <id>
platformio lib [STORAGE_OPTIONS] show <id>
platformio lib [STORAGE_OPTIONS] show <id>@<version>
platformio lib [STORAGE_OPTIONS] show <id>@<version range>
platformio lib [STORAGE_OPTIONS] show <name>
platformio lib [STORAGE_OPTIONS] show <name>@<version>
platformio lib [STORAGE_OPTIONS] show <name>@<version range>
Description Description
----------- -----------
Show details about the installed library Show details about the installed library.
The ``version`` supports `Semantic Versioning <http://semver.org>`_ (
``<major>.<minor>.<patch>``) and can take any of the following forms:
* ``0.1.2`` - an exact version number. Use only this exact version
* ``^0.1.2`` - any compatible version (exact version for ``0.x.x`` versions
* ``~0.1.2`` - any version with the same major and minor versions, and an
equal or greater patch version
* ``>0.1.2`` - any version greater than ``0.1.2``. ``>=``, ``<``, and ``<=``
are also possible
* ``>0.1.0,!=0.2.0,<0.3.0`` - any version greater than ``0.1.0``, not equal to
``0.2.0`` and less than ``0.3.0``
Storage Options
---------------
See base options for :ref:`userguide_lib`.
Examples Examples
-------- --------
.. code-block:: bash .. code::
# OneWire: http://platformio.org/lib/show/1/OneWire platformio lib -g show Json
$ platformio lib show 1
# OneWire Library Storage: /storage/dir/...
# ------- Json
# Authors: Paul Stoffregen <paul@pjrc.com> http://www.pjrc.com/teensy/td_libs_OneWire.html (maintainer), Jim Studt, Jason Dangel <dangel.jason@gmail.com>, Derek Yerger, Tom Pollard <pollard@alum.mit.edu>, Robin James ====
# Keywords: onewire, 1-wire, bus, sensor, temperature, ibutton An elegant and efficient JSON library for embedded systems
# Frameworks: arduino
# Platforms: atmelavr Authors: Benoit Blanchon http://blog.benoitblanchon.fr
# Version: 2.2 Keywords: json, rest, http, web
# Frameworks: arduino
# Control devices (from Dallas Semiconductor) that use the One Wire protocol (DS18S20, DS18B20, DS2408 and etc) Platforms: atmelavr, atmelsam, timsp430, titiva, teensy, freescalekinetis, ststm32, nordicnrf51, nxplpc, espressif, siliconlabsefm32, linux_arm, native, intel_arc32
Version: 5.4.0

View File

@ -1,4 +1,4 @@
.. Copyright 2014-2016 Ivan Kravets <me@ikravets.com> .. Copyright 2014-present Ivan Kravets <me@ikravets.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
@ -21,20 +21,56 @@ Usage
.. code-block:: bash .. code-block:: bash
platformio lib uninstall ID platformio lib [STORAGE_OPTIONS] uninstall [LIBRARY...]
# uninstall project dependent library
# (run it from a project root where is located "platformio.ini")
platformio lib uninstall [LIBRARY...]
# uninstall library from global storage
platformio lib --global uninstall [LIBRARY...]
platformio lib -g uninstall [LIBRARY...]
# uninstall library from custom storage
platformio lib --storage-dir /path/to/dir uninstall [LIBRARY...]
platformio lib -d /path/to/dir uninstall [LIBRARY...]
# [LIBRARY...] forms
platformio lib [STORAGE_OPTIONS] uninstall <id>
platformio lib [STORAGE_OPTIONS] uninstall <id>@<version>
platformio lib [STORAGE_OPTIONS] uninstall <id>@<version range>
platformio lib [STORAGE_OPTIONS] uninstall <name>
platformio lib [STORAGE_OPTIONS] uninstall <name>@<version>
platformio lib [STORAGE_OPTIONS] uninstall <name>@<version range>
Description Description
----------- -----------
Uninstall specified library Uninstall specified library
The ``version`` supports `Semantic Versioning <http://semver.org>`_ (
``<major>.<minor>.<patch>``) and can take any of the following forms:
* ``0.1.2`` - an exact version number. Use only this exact version
* ``^0.1.2`` - any compatible version (exact version for ``0.x.x`` versions
* ``~0.1.2`` - any version with the same major and minor versions, and an
equal or greater patch version
* ``>0.1.2`` - any version greater than ``0.1.2``. ``>=``, ``<``, and ``<=``
are also possible
* ``>0.1.0,!=0.2.0,<0.3.0`` - any version greater than ``0.1.0``, not equal to
``0.2.0`` and less than ``0.3.0``
Storage Options
---------------
See base options for :ref:`userguide_lib`.
Examples Examples
-------- --------
.. code-block:: bash .. code::
# XBee: http://platformio.org/lib/show/6/XBee > platformio lib -g uninstall AsyncMqttClient
$ platformio lib uninstall 6
# The library #6 'XBee' has been successfully uninstalled! Library Storage: /storage/dir/...
Uninstalling AsyncMqttClient @ 0.2.0: [OK]

View File

@ -1,4 +1,4 @@
.. Copyright 2014-2016 Ivan Kravets <me@ikravets.com> .. Copyright 2014-present Ivan Kravets <me@ikravets.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
@ -21,51 +21,102 @@ Usage
.. code-block:: bash .. code-block:: bash
platformio lib update [LIBRARY_ID] platformio lib [STORAGE_OPTIONS] update [OPTIONS]
# update all project libraries
# (run it from a project root where is located "platformio.ini")
platformio lib update [OPTIONS]
# update project dependent library
platformio lib [STORAGE_OPTIONS] update [OPTIONS] [LIBRARY...]
# update library in global storage
platformio lib --global update [OPTIONS] [LIBRARY...]
platformio lib -g update [OPTIONS] [LIBRARY...]
# update library in custom storage
platformio lib --storage-dir /path/to/dir update [OPTIONS] [LIBRARY...]
platformio lib -d /path/to/dir update [OPTIONS] [LIBRARY...]
# [LIBRARY...] forms
platformio lib [STORAGE_OPTIONS] update <id>
platformio lib [STORAGE_OPTIONS] update <id>@<version>
platformio lib [STORAGE_OPTIONS] update <id>@<version range>
platformio lib [STORAGE_OPTIONS] update <name>
platformio lib [STORAGE_OPTIONS] update <name>@<version>
platformio lib [STORAGE_OPTIONS] update <name>@<version range>
Description Description
----------- -----------
Check or update installed libraries Check or update installed libraries.
The ``version`` supports `Semantic Versioning <http://semver.org>`_ (
``<major>.<minor>.<patch>``) and can take any of the following forms:
* ``0.1.2`` - an exact version number. Use only this exact version
* ``^0.1.2`` - any compatible version (exact version for ``0.x.x`` versions
* ``~0.1.2`` - any version with the same major and minor versions, and an
equal or greater patch version
* ``>0.1.2`` - any version greater than ``0.1.2``. ``>=``, ``<``, and ``<=``
are also possible
* ``>0.1.0,!=0.2.0,<0.3.0`` - any version greater than ``0.1.0``, not equal to
``0.2.0`` and less than ``0.3.0``
Storage Options
---------------
See base options for :ref:`userguide_lib`.
Options
-------
.. program:: platformio lib update
.. option::
-c, --only-check
Do not update, only check for new version
Examples Examples
-------- --------
1. Update all installed libraries 1. Update all installed libraries in global storage
.. code-block:: bash .. code::
$ platformio lib update > platformio lib -g update
# Updating [ 23 ] Adafruit-L3GD20-Unified library:
# Versions: Current=63de2eb9ea, Latest=63de2eb9ea [Up-to-date]
# Updating [ 12 ] Adafruit-ST7735 library:
# Versions: Current=e880eb1687, Latest=e880eb1687 [Up-to-date]
# Updating [ 31 ] Adafruit-Unified-Sensor library:
# Versions: Current=88ae805bce, Latest=88ae805bce [Up-to-date]
# Updating [ 26 ] Adafruit-LSM303DLHC-Unified library:
# Versions: Current=59767208a8, Latest=59767208a8 [Up-to-date]
# Updating [ 13 ] Adafruit-GFX library:
# Versions: Current=a9e5bc4707, Latest=a9e5bc4707 [Up-to-date]
# Updating [ 1 ] OneWire library:
# Versions: Current=2.2, Latest=2.2 [Up-to-date]
# Updating [ 4 ] IRremote library:
# Versions: Current=f2dafe5030, Latest=f2dafe5030 [Up-to-date]
# Updating [ 14 ] Adafruit-9DOF-Unified library:
# Versions: Current=b2f07242ac, Latest=b2f07242ac [Up-to-date]
2. Update specified libraries Library Storage: /storage/dir/...
Updating ESP8266_SSD1306 @ 3.2.3: [Up-to-date]
Updating EngduinoMagnetometer @ 3.1.0: [Up-to-date]
Updating IRremote @ 2.2.1: [Up-to-date]
Updating Json @ 5.4.0: [Out-of-date]
LibraryManager: Installing id=64 @ 5.6.4
Downloading [####################################] 100%
Unpacking [####################################] 100%
Json @ 5.6.4 has been successfully installed!
Updating PJON @ 1fb26fd: [Checking]
git version 2.7.4 (Apple Git-66)
Already up-to-date.
Updating TextLCD @ 308d188a2d3a: [Checking]
Mercurial Distributed SCM (version 3.8.4)
(see https://mercurial-scm.org for more information)
.. code-block:: bash Copyright (C) 2005-2016 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
pulling from https://developer.mbed.org/users/simon/code/TextLCD/
searching for changes
no changes found
$ platformio lib update 1 59 2. Update specified libraries in global storage
# Updating [ 1 ] OneWire library:
# Versions: Current=2.2, Latest=2.2 [Up-to-date] .. code::
# Updating [ 59 ] USB-Host-Shield-20 library:
# Versions: Current=fcab83dcb3, Latest=c61f9ce1c2 [Out-of-date] > platformio lib -g update Json 4
# The library #59 'USB-Host-Shield-20' has been successfully uninstalled!
# Installing library [ 59 ]: Library Storage: /storage/dir/...
# Downloading [####################################] 100% Updating Json @ 5.6.4: [Up-to-date]
# Unpacking [####################################] 100% Updating IRremote @ 2.2.1: [Up-to-date]
# The library #59 'USB-Host-Shield-20' has been successfully installed!

View File

@ -14,15 +14,48 @@
Library Manager Library Manager
=============== ===============
To print all available commands and options use: Usage
-----
.. code-block:: bash .. code-block:: bash
$ platformio lib --help platformio lib [OPTIONS] COMMAND
$ platformio lib COMMAND --help
# To print all available commands and options use
platformio lib --help
platformio lib COMMAND --help
Options
-------
.. program:: platformio lib
.. option::
-g, --global
.. versionadded:: 3.0
Manage global PlatformIO's library storage (
":ref:`projectconf_pio_home_dir`/lib") where :ref:`ldf` will look for
dependencies by default.
.. option::
-d, --storage-dir
.. versionadded:: 3.0
Manage custom library storage. It can be used later for the
:ref:`projectconf_extra_script` option from :ref:`projectconf`.
Demo
----
.. image:: ../../_static/platformio-demo-lib.gif .. image:: ../../_static/platformio-demo-lib.gif
Commands
--------
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2

View File

@ -21,14 +21,18 @@ Usage
.. code-block:: bash .. code-block:: bash
# install platform by name
platformio platform install [OPTIONS] [PLATFORM...] platformio platform install [OPTIONS] [PLATFORM...]
# install specific platform version using Semantic Versioning # [PLATFORM...] forms
platformio platform install [OPTIONS] PLATFORM@X.Y.Z platformio platform install <name>
platformio platform install <name>@<version>
# install platform using URL platformio platform install <name>@<version range>
platformio platform install [OPTIONS] URL platformio platform install <zip or tarball url>
platformio platform install file://<zip or tarball file>
platformio platform install file://<folder>
platformio platform install <repository>
platformio platform install <name=repository> (name it should have locally)
platformio platform install <repository#tag> ("tag" can be commit, branch or tag)
Description Description
@ -36,33 +40,56 @@ Description
Install :ref:`platforms` and dependent packages. Install :ref:`platforms` and dependent packages.
There are several predefined aliases for packages, such as: The ``version`` supports `Semantic Versioning <http://semver.org>`_ (
``<major>.<minor>.<patch>``) and can take any of the following forms:
* ``framework`` * ``0.1.2`` - an exact version number. Use only this exact version
* ``toolchain`` * ``^0.1.2`` - any compatible version (exact version for ``0.x.x`` versions
* ``uploader`` * ``~0.1.2`` - any version with the same major and minor versions, and an
equal or greater patch version
* ``>0.1.2`` - any version greater than ``0.1.2``. ``>=``, ``<``, and ``<=``
are also possible
* ``>0.1.0,!=0.2.0,<0.3.0`` - any version greater than ``0.1.0``, not equal to
``0.2.0`` and less than ``0.3.0``
Local Also, PlatformIO supports installing from local directory or archive. Need to
~~~~~ use ``file://`` prefix before local path. Also, directory or archive should
contain ``platform.json`` manifest.
PlatformIO supports installing development platform from local directory or
archive. Need to use ``file://`` prefix before local path. Also, platform
directory or archive should contain ``platform.json`` manifest.
* ``file:///local/path/to/the/platform/dir`` * ``file:///local/path/to/the/platform/dir``
* ``file:///local/path/to/the/platform.zip`` * ``file:///local/path/to/the/platform.zip``
* ``file:///local/path/to/the/platform.tar.gz`` * ``file:///local/path/to/the/platform.tar.gz``
Remote Options
~~~~~~ -------
VCS .. program:: platformio platform install
~~~
.. option::
--with-package
Install specified package (or alias)
.. option::
--without-package
Do not install specified package (or alias)
.. option::
--skip-default
Skip default packages
Version control
---------------
PlatformIO supports installing from Git, Mercurial and Subversion, and detects PlatformIO supports installing from Git, Mercurial and Subversion, and detects
the type of VCS using url prefixes: "git+", "hg+", or "svn+". the type of VCS using url prefixes: "git+", "hg+", or "svn+".
PlatformIO requires a working VCS command on your path: git, hg or svn. .. note::
PlatformIO requires a working VCS command on your path: ``git``, ``hg``
or ``svn``.
Git Git
^^^ ^^^
@ -70,6 +97,7 @@ Git
The supported schemes are: ``git``, ``git+https`` and ``git+ssh``. Here are The supported schemes are: ``git``, ``git+https`` and ``git+ssh``. Here are
the supported forms: the supported forms:
* platformio/platform-NAME (short version for GitHub repository)
* https://github.com/platformio/platform-NAME.git * https://github.com/platformio/platform-NAME.git
* git+git://git.server.org/my-platform * git+git://git.server.org/my-platform
* git+https://git.server.org/my-platform * git+https://git.server.org/my-platform
@ -112,35 +140,15 @@ You can also give specific revisions to an SVN URL, like so:
* svn+svn://svn.server.org/my-platform#13 * svn+svn://svn.server.org/my-platform#13
Options
-------
.. program:: platformio platform install
.. option::
--with-package
Install specified package (or alias)
.. option::
--without-package
Do not install specified package (or alias)
.. option::
--skip-default
Skip default packages
Examples Examples
-------- --------
1. Install :ref:`platform_atmelavr` with default packages 1. Install :ref:`platform_atmelavr` with default packages
.. code-block:: bash .. code::
> platformio platform install atmelavr
$ platformio platform install atmelavr
PlatformManager: Installing atmelavr PlatformManager: Installing atmelavr
Downloading... Downloading...
Unpacking [####################################] 100% Unpacking [####################################] 100%
@ -159,7 +167,9 @@ Examples
2. Install :ref:`platform_atmelavr` with ``uploader`` utility only and skip 2. Install :ref:`platform_atmelavr` with ``uploader`` utility only and skip
default packages default packages
.. code-block:: bash .. code::
> platformio platform install atmelavr --skip-default-package --with-package=uploader
PlatformManager: Installing atmelavr PlatformManager: Installing atmelavr
Downloading [####################################] 100% Downloading [####################################] 100%
@ -178,9 +188,9 @@ Examples
3. Install the latest development :ref:`platform_atmelavr` from Git repository 3. Install the latest development :ref:`platform_atmelavr` from Git repository
.. code-block:: bash .. code::
$ platformio platform install https://github.com/platformio/platform-atmelavr.git > platformio platform install https://github.com/platformio/platform-atmelavr.git
PlatformManager: Installing platform-atmelavr PlatformManager: Installing platform-atmelavr
git version 2.7.4 (Apple Git-66) git version 2.7.4 (Apple Git-66)

View File

@ -42,9 +42,10 @@ Return the output in `JSON <http://en.wikipedia.org/wiki/JSON>`_ format
Examples Examples
-------- --------
.. code-block:: bash .. code::
> platformio platform list
$ platformio platform list
atmelavr ~ Atmel AVR atmelavr ~ Atmel AVR
==================== ====================
Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming. Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming.

View File

@ -45,9 +45,10 @@ Examples
1. Print all available development platforms 1. Print all available development platforms
.. code-block:: bash .. code::
> platformio platform search
$ platformio platform search
atmelavr ~ Atmel AVR atmelavr ~ Atmel AVR
==================== ====================
Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming. Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming.
@ -75,9 +76,10 @@ Examples
2. Search for TI development platforms 2. Search for TI development platforms
.. code-block:: bash .. code::
> platformio platform search texas
$ platformio platform search texas
timsp430 ~ TI MSP430 timsp430 ~ TI MSP430
==================== ====================
MSP430 microcontrollers (MCUs) from Texas Instruments (TI) are 16-bit, RISC-based, mixed-signal processors designed for ultra-low power. These MCUs offer the lowest power consumption and the perfect mix of integrated peripherals for thousands of applications. MSP430 microcontrollers (MCUs) from Texas Instruments (TI) are 16-bit, RISC-based, mixed-signal processors designed for ultra-low power. These MCUs offer the lowest power consumption and the perfect mix of integrated peripherals for thousands of applications.
@ -92,9 +94,10 @@ Examples
Home: http://platformio.org/platforms/titiva Home: http://platformio.org/platforms/titiva
Packages: ldscripts, framework-libopencm3, toolchain-gccarmnoneeabi, tool-lm4flash, framework-energiativa Packages: ldscripts, framework-libopencm3, toolchain-gccarmnoneeabi, tool-lm4flash, framework-energiativa
.. code-block:: bash .. code::
> platformio platform search framework-mbed
$ platformio platform search framework-mbed
atmelsam ~ Atmel SAM atmelsam ~ Atmel SAM
==================== ====================
Atmel | SMART offers Flash- based ARM products based on the ARM Cortex-M0+, Cortex-M3 and Cortex-M4 architectures, ranging from 8KB to 2MB of Flash including a rich peripheral and feature mix. Atmel | SMART offers Flash- based ARM products based on the ARM Cortex-M0+, Cortex-M3 and Cortex-M4 architectures, ranging from 8KB to 2MB of Flash including a rich peripheral and feature mix.

View File

@ -33,9 +33,10 @@ Show details about the installed :ref:`platforms`
Examples Examples
-------- --------
.. code-block:: bash .. code::
> platformio platform show atmelavr
$ platformio platform show atmelavr
atmelavr ~ Atmel AVR atmelavr ~ Atmel AVR
==================== ====================
Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming. Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming.

View File

@ -36,9 +36,9 @@ Uninstall specified :ref:`platforms`
Examples Examples
-------- --------
.. code-block:: bash .. code::
$ platformio platform uninstall atmelavr > platformio platform uninstall atmelavr
Uninstalling platform atmelavr @ 0.0.0: [OK] Uninstalling platform atmelavr @ 0.0.0: [OK]
Uninstalling package tool-scons @ 2.4.1: [OK] Uninstalling package tool-scons @ 2.4.1: [OK]
Uninstalling package toolchain-atmelavr @ 1.40801.0: [OK] Uninstalling package toolchain-atmelavr @ 1.40801.0: [OK]

View File

@ -51,9 +51,10 @@ Do not update, only check for new version
Examples Examples
-------- --------
.. code-block:: bash .. code::
> platformio platform update
$ platformio platform update
Platform atmelavr Platform atmelavr
-------- --------
Updating atmelavr @ 0.0.0: [Up-to-date] Updating atmelavr @ 0.0.0: [Up-to-date]

View File

@ -18,8 +18,8 @@ To print all available commands and options use:
.. code-block:: bash .. code-block:: bash
$ platformio platform --help platformio platform --help
$ platformio platform COMMAND --help platformio platform COMMAND --help
.. image:: ../../_static/platformio-demo-platforms.gif .. image:: ../../_static/platformio-demo-platforms.gif

View File

@ -14,7 +14,7 @@
import sys import sys
VERSION = (3, 0, "0.dev15") VERSION = (3, 0, "0.dev16")
__version__ = ".".join([str(s) for s in VERSION]) __version__ = ".".join([str(s) for s in VERSION])
__title__ = "platformio" __title__ = "platformio"

View File

@ -1,4 +1,4 @@
# Copyright 2014-2016 Ivan Kravets <me@ikravets.com> # Copyright 2014-present Ivan Kravets <me@ikravets.com>
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -13,51 +13,136 @@
# limitations under the License. # limitations under the License.
import json import json
from os.path import join
import click import click
from platformio import app, exception from platformio import app, exception, util
from platformio.libmanager import LibraryManager from platformio.managers.lib import LibraryManager
from platformio.util import get_api_result from platformio.util import get_api_result
@click.group(short_help="Library Manager")
@click.option(
"-g",
"--global",
is_flag=True,
help="Manager global PlatformIO"
" library storage `%s`" % join(util.get_home_dir(), "lib"))
@click.option(
"-d",
"--storage-dir",
default=None,
type=click.Path(
exists=True,
file_okay=False,
dir_okay=True,
writable=True,
resolve_path=True),
help="Manage custom library storage")
@click.pass_context
def cli(ctx, **options):
# skip commands that don't need storage folder
if ctx.invoked_subcommand in ("search", "register") or \
(len(ctx.args) == 2 and ctx.args[1] in ("-h", "--help")):
return
storage_dir = options['storage_dir']
if not storage_dir and options['global']:
storage_dir = join(util.get_home_dir(), "lib")
if not storage_dir and not util.is_platformio_project():
raise exception.PlatformioException(
"The `%s` is not a PlatformIO project.\nTo manage libraries "
"in the global storage `%s`, please use "
"`platformio lib --global %s` instead." %
(util.get_project_dir(), join(util.get_home_dir(), "lib"),
ctx.invoked_subcommand))
ctx.obj = LibraryManager(storage_dir)
click.echo("Library Storage: " + storage_dir)
@cli.command("install", short_help="Install library")
@click.argument("libraries", required=False, nargs=-1, metavar="[LIBRARY...]")
@click.option(
"--save",
is_flag=True,
help="Save installed libraries into the project's platformio.ini "
"library dependencies")
@click.option(
"-q", "--quiet", is_flag=True, help="Suppress progress reporting")
@click.pass_obj
def lib_install(lm, libraries, save, quiet): # pylint: disable=unused-argument
# @TODO "save" option
for library in libraries:
lm.install(library, quiet=quiet)
@cli.command("uninstall", short_help="Uninstall libraries")
@click.argument("libraries", nargs=-1, metavar="[LIBRARY...]")
@click.pass_obj
def lib_uninstall(lm, libraries):
for library in libraries:
lm.uninstall(library)
@cli.command("update", short_help="Update installed libraries")
@click.argument("libraries", required=False, nargs=-1, metavar="[LIBRARY...]")
@click.option(
"-c",
"--only-check",
is_flag=True,
help="Do not update, only check for new version")
@click.pass_obj
def lib_update(lm, libraries, only_check):
if not libraries:
libraries = [str(m.get("id", m['name'])) for m in lm.get_installed()]
for library in libraries:
lm.update(library, only_check=only_check)
#######
LIBLIST_TPL = ("[{id:^14}] {name:<25} {compatibility:<30} " LIBLIST_TPL = ("[{id:^14}] {name:<25} {compatibility:<30} "
"\"{authornames}\": {description}") "\"{authornames}\": {description}")
def echo_liblist_header(): def echo_liblist_header():
click.echo(LIBLIST_TPL.format( click.echo(
id=click.style("ID", fg="green"), LIBLIST_TPL.format(
name=click.style("Name", fg="cyan"), id=click.style(
compatibility=click.style("Compatibility", fg="yellow"), "ID", fg="green"),
authornames="Authors", name=click.style(
description="Description" "Name", fg="cyan"),
)) compatibility=click.style(
"Compatibility", fg="yellow"),
authornames="Authors",
description="Description"))
terminal_width, _ = click.get_terminal_size() terminal_width, _ = click.get_terminal_size()
click.echo("-" * terminal_width) click.echo("-" * terminal_width)
def echo_liblist_item(item): def echo_liblist_item(item):
click.echo(LIBLIST_TPL.format( click.echo(
id=click.style(str(item['id']), fg="green"), LIBLIST_TPL.format(
name=click.style(item['name'], fg="cyan"), id=click.style(
compatibility=click.style( str(item.get("id", "VCS")), fg="green"),
", ".join(item['frameworks'] + item['platforms']), name=click.style(
fg="yellow" item['name'], fg="cyan"),
), compatibility=click.style(
authornames=", ".join(item['authornames']), ", ".join(
description=item['description'] item.get("frameworks", ["-"]) + item.get("platforms", [])),
)) fg="yellow"),
authornames=", ".join(item.get("authornames", ["Unknown"])),
description=item.get("description", item.get("url", ""))) +
@click.group(short_help="Library Manager") (" | @" + click.style(
def cli(): item['version'], fg="yellow") if "version" in item else ""))
pass
@cli.command("search", short_help="Search for library") @cli.command("search", short_help="Search for library")
@click.option("--json-output", is_flag=True) @click.option("--json-output", is_flag=True)
@click.option("--page", type=click.INT, default=1) @click.option("--page", type=click.INT, default=1)
@click.option("-n", "--name", multiple=True)
@click.option("-a", "--author", multiple=True) @click.option("-a", "--author", multiple=True)
@click.option("-k", "--keyword", multiple=True) @click.option("-k", "--keyword", multiple=True)
@click.option("-f", "--framework", multiple=True) @click.option("-f", "--framework", multiple=True)
@ -73,8 +158,9 @@ def lib_search(query, json_output, page, **filters):
for value in values: for value in values:
query.append('%s:"%s"' % (key, value)) query.append('%s:"%s"' % (key, value))
result = get_api_result("/lib/search", result = get_api_result(
dict(query=" ".join(query), page=page)) "/lib/search", dict(
query=" ".join(query), page=page))
if json_output: if json_output:
click.echo(json.dumps(result)) click.echo(json.dumps(result))
@ -84,17 +170,22 @@ def lib_search(query, json_output, page, **filters):
click.secho( click.secho(
"Nothing has been found by your request\n" "Nothing has been found by your request\n"
"Try a less-specific search or use truncation (or wildcard) " "Try a less-specific search or use truncation (or wildcard) "
"operator", fg="yellow", nl=False) "operator",
fg="yellow",
nl=False)
click.secho(" *", fg="green") click.secho(" *", fg="green")
click.secho("For example: DS*, PCA*, DHT* and etc.\n", fg="yellow") click.secho("For example: DS*, PCA*, DHT* and etc.\n", fg="yellow")
click.echo("For more examples and advanced search syntax, " click.echo("For more examples and advanced search syntax, "
"please use documentation:") "please use documentation:")
click.secho("http://docs.platformio.org" click.secho(
"/en/latest/userguide/lib/cmd_search.html\n", fg="cyan") "http://docs.platformio.org"
"/en/latest/userguide/lib/cmd_search.html\n",
fg="cyan")
return return
click.secho("Found %d libraries:\n" % result['total'], click.secho(
fg="green" if result['total'] else "yellow") "Found %d libraries:\n" % result['total'],
fg="green" if result['total'] else "yellow")
if result['total']: if result['total']:
echo_liblist_header() echo_liblist_header()
@ -111,94 +202,17 @@ def lib_search(query, json_output, page, **filters):
click.confirm("Show next libraries?")): click.confirm("Show next libraries?")):
result = get_api_result( result = get_api_result(
"/lib/search", "/lib/search",
dict(query=" ".join(query), page=int(result['page']) + 1) dict(
) query=" ".join(query), page=int(result['page']) + 1))
else: else:
break break
@cli.command("install", short_help="Install library")
@click.argument("libid", type=click.INT, nargs=-1, metavar="[LIBRARY_ID]")
@click.option("-v", "--version")
@click.pass_context
def lib_install(ctx, libid, version):
lm = LibraryManager()
for id_ in libid:
click.echo(
"Installing library [ %s ]:" % click.style(str(id_), fg="green"))
try:
if not lm.install(id_, version):
continue
info = lm.get_info(id_)
click.secho(
"The library #%s '%s' has been successfully installed!"
% (str(id_), info['name']), fg="green")
if "dependencies" in info:
click.secho("Installing dependencies:", fg="yellow")
_dependencies = info['dependencies']
if not isinstance(_dependencies, list):
_dependencies = [_dependencies]
for item in _dependencies:
try:
lib_install_dependency(ctx, item)
except AssertionError:
raise exception.LibInstallDependencyError(str(item))
except exception.LibAlreadyInstalled:
click.secho("Already installed", fg="yellow")
def lib_install_dependency(ctx, data):
assert isinstance(data, dict)
query = []
for key in data:
if key in ("authors", "frameworks", "platforms", "keywords"):
values = data[key]
if not isinstance(values, list):
values = [v.strip() for v in values.split(",") if v]
for value in values:
query.append('%s:"%s"' % (key[:-1], value))
elif isinstance(data[key], basestring):
query.append('+"%s"' % data[key])
result = get_api_result("/lib/search", dict(query=" ".join(query)))
assert result['total'] > 0
if result['total'] == 1 or not app.get_setting("enable_prompts"):
ctx.invoke(lib_install, libid=[result['items'][0]['id']])
else:
click.secho(
"Conflict: More than one dependent libraries have been found "
"by request %s:" % json.dumps(data), fg="red")
echo_liblist_header()
for item in result['items']:
echo_liblist_item(item)
deplib_id = click.prompt(
"Please choose one dependent library ID",
type=click.Choice([str(i['id']) for i in result['items']]))
ctx.invoke(lib_install, libid=[int(deplib_id)])
@cli.command("uninstall", short_help="Uninstall libraries")
@click.argument("libid", type=click.INT, nargs=-1)
def lib_uninstall(libid):
lm = LibraryManager()
for id_ in libid:
info = lm.get_info(id_)
if lm.uninstall(id_):
click.secho("The library #%s '%s' has been successfully "
"uninstalled!" % (str(id_), info['name']), fg="green")
@cli.command("list", short_help="List installed libraries") @cli.command("list", short_help="List installed libraries")
@click.option("--json-output", is_flag=True) @click.option("--json-output", is_flag=True)
def lib_list(json_output): @click.pass_obj
lm = LibraryManager() def lib_list(lm, json_output):
items = lm.get_installed().values() items = lm.get_installed()
if json_output: if json_output:
click.echo(json.dumps(items)) click.echo(json.dumps(items))
@ -208,21 +222,34 @@ def lib_list(json_output):
return return
echo_liblist_header() echo_liblist_header()
for item in sorted(items, key=lambda i: i['id']): for item in sorted(items, key=lambda i: i['name']):
item['authornames'] = [i['name'] for i in item['authors']] if "authors" in item:
item['authornames'] = [i['name'] for i in item['authors']]
echo_liblist_item(item) echo_liblist_item(item)
@cli.command("show", short_help="Show details about installed library") @cli.command("show", short_help="Show details about installed library")
@click.argument("libid", type=click.INT) @click.pass_obj
def lib_show(libid): @click.argument("library", metavar="[LIBRARY]")
lm = LibraryManager() def lib_show(lm, library): # pylint: disable=too-many-branches
info = lm.get_info(libid) name, requirements, url = lm.parse_pkg_name(library)
click.secho(info['name'], fg="cyan") installed_dir = lm.get_installed_dir(name, requirements, url)
click.echo("-" * len(info['name'])) if not installed_dir:
click.secho(
"%s @ %s is not installed" % (name, requirements or "*"),
fg="yellow")
return
manifest = lm.load_manifest(installed_dir)
click.secho(manifest['name'], fg="cyan")
click.echo("=" * len(manifest['name']))
if "description" in manifest:
click.echo(manifest['description'])
click.echo()
_authors = [] _authors = []
for author in info['authors']: for author in manifest.get("authors", []):
_data = [] _data = []
for key in ("name", "email", "url", "maintainer"): for key in ("name", "email", "url", "maintainer"):
if not author[key]: if not author[key]:
@ -234,61 +261,29 @@ def lib_show(libid):
else: else:
_data.append(author[key]) _data.append(author[key])
_authors.append(" ".join(_data)) _authors.append(" ".join(_data))
click.echo("Authors: %s" % ", ".join(_authors)) if _authors:
click.echo("Authors: %s" % ", ".join(_authors))
click.echo("Keywords: %s" % ", ".join(info['keywords'])) for key in ("keywords", "frameworks", "platforms", "license", "url",
if "frameworks" in info: "version"):
click.echo("Frameworks: %s" % ", ".join(info['frameworks'])) if key not in manifest:
if "platforms" in info:
click.echo("Platforms: %s" % ", ".join(info['platforms']))
click.echo("Version: %s" % info['version'])
click.echo()
click.echo(info['description'])
click.echo()
@cli.command("update", short_help="Update installed libraries")
@click.argument("libid", type=click.INT, nargs=-1, required=False,
metavar="[LIBRARY_ID]")
@click.pass_context
def lib_update(ctx, libid):
lm = LibraryManager()
for id_, latest_version in (lm.get_latest_versions() or {}).items():
if libid and int(id_) not in libid:
continue
info = lm.get_info(int(id_))
click.echo("Updating [ %s ] %s library:" % (
click.style(id_, fg="yellow"),
click.style(info['name'], fg="cyan")))
current_version = info['version']
if latest_version is None:
click.secho("Unknown library", fg="red")
continue
click.echo("Versions: Current=%s, Latest=%s \t " % (
current_version, latest_version), nl=False)
if current_version == latest_version:
click.echo("[%s]" % (click.style("Up-to-date", fg="green")))
continue continue
if isinstance(manifest[key], list):
click.echo("%s: %s" % (key.title(), ", ".join(manifest[key])))
else: else:
click.echo("[%s]" % (click.style("Out-of-date", fg="red"))) click.echo("%s: %s" % (key.title(), manifest[key]))
ctx.invoke(lib_uninstall, libid=[int(id_)])
ctx.invoke(lib_install, libid=[int(id_)])
@cli.command("register", short_help="Register new library") @cli.command("register", short_help="Register new library")
@click.argument("config_url") @click.argument("config_url")
def lib_register(config_url): def lib_register(config_url):
if (not config_url.startswith("http://") and not if (not config_url.startswith("http://") and
config_url.startswith("https://")): not config_url.startswith("https://")):
raise exception.InvalidLibConfURL(config_url) raise exception.InvalidLibConfURL(config_url)
result = get_api_result("/lib/register", data=dict(config_url=config_url)) result = get_api_result("/lib/register", data=dict(config_url=config_url))
if "message" in result and result['message']: if "message" in result and result['message']:
click.secho(result['message'], fg="green" if "successed" in result and click.secho(
result['successed'] else "red") result['message'],
fg="green"
if "successed" in result and result['successed'] else "red")

View File

@ -21,11 +21,11 @@ from time import time
import click import click
from platformio import __version__, app, exception, telemetry, util from platformio import __version__, exception, telemetry, util
from platformio.commands.lib import lib_install as cmd_lib_install from platformio.commands.lib import lib_install as cmd_lib_install
from platformio.commands.platform import \ from platformio.commands.platform import \
platform_install as cmd_platform_install platform_install as cmd_platform_install
from platformio.libmanager import LibraryManager from platformio.managers.lib import LibraryManager
from platformio.managers.platform import PlatformFactory from platformio.managers.platform import PlatformFactory
@ -188,8 +188,8 @@ class EnvironmentProcessor(object):
# install dependent libraries # install dependent libraries
if "lib_install" in self.options: if "lib_install" in self.options:
_autoinstall_libs(self.cmd_ctx, self.options['lib_install']) _autoinstall_libs(self.cmd_ctx, self.options['lib_install'],
self.verbose)
try: try:
p = PlatformFactory.newPlatform(self.options['platform']) p = PlatformFactory.newPlatform(self.options['platform'])
@ -201,22 +201,15 @@ class EnvironmentProcessor(object):
return p.run(build_vars, build_targets, self.verbose) return p.run(build_vars, build_targets, self.verbose)
def _autoinstall_libs(ctx, libids_list): def _autoinstall_libs(ctx, libids_list, verbose=False):
require_libs = [int(l.strip()) for l in libids_list.split(",")] storage_dir = util.get_projectlibdeps_dir()
installed_libs = [ ctx.obj = LibraryManager(storage_dir)
l['id'] for l in LibraryManager().get_installed().values() if verbose:
] click.echo("Library Storage: " + storage_dir)
ctx.invoke(
not_intalled_libs = set(require_libs) - set(installed_libs) cmd_lib_install,
if not require_libs or not not_intalled_libs: libraries=[int(l.strip()) for l in libids_list.split(",")],
return quiet=not verbose)
if (not app.get_setting("enable_prompts") or
click.confirm(
"The libraries with IDs '%s' have not been installed yet. "
"Would you like to install them now?" %
", ".join([str(i) for i in not_intalled_libs]))):
ctx.invoke(cmd_lib_install, libid=not_intalled_libs)
def _clean_pioenvs_dir(pioenvs_dir): def _clean_pioenvs_dir(pioenvs_dir):

View File

@ -146,18 +146,9 @@ class APIRequestError(PlatformioException):
MESSAGE = "[API] {0}" MESSAGE = "[API] {0}"
class LibAlreadyInstalled(PlatformioException): class LibNotFound(PlatformioException):
pass
MESSAGE = "Library `{0}` has not been found in the registry"
class LibNotInstalled(PlatformioException):
MESSAGE = "Library #{0:d} has not been installed yet"
class LibInstallDependencyError(PlatformioException):
MESSAGE = "Error has been occurred for library dependency '{0}'"
class InvalidLibConfURL(PlatformioException): class InvalidLibConfURL(PlatformioException):

View File

@ -1,121 +0,0 @@
# Copyright 2014-2016 Ivan Kravets <me@ikravets.com>
#
# 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
from os import listdir, makedirs, remove, rename
from os.path import isdir, isfile, join
from shutil import rmtree
from tempfile import gettempdir
from platformio import telemetry, util
from platformio.downloader import FileDownloader
from platformio.exception import LibAlreadyInstalled, LibNotInstalled
from platformio.unpacker import FileUnpacker
class LibraryManager(object):
CONFIG_NAME = ".library.json"
def __init__(self, lib_dir=None):
self.lib_dir = lib_dir or join(util.get_home_dir(), "lib")
@staticmethod
def download(url, dest_dir):
fd = FileDownloader(url, dest_dir)
fd.start()
return fd.get_filepath()
@staticmethod
def unpack(pkgpath, dest_dir):
fu = FileUnpacker(pkgpath, dest_dir)
return fu.start()
def get_installed(self):
items = {}
if not isdir(self.lib_dir):
return items
for dirname in sorted(listdir(self.lib_dir)):
conf_path = join(self.lib_dir, dirname, self.CONFIG_NAME)
if not isfile(conf_path):
continue
items[dirname] = util.load_json(conf_path)
return items
def get_latest_versions(self):
lib_ids = [str(item['id']) for item in self.get_installed().values()]
if not lib_ids:
return None
return util.get_api_result("/lib/version/" + str(",".join(lib_ids)))
def get_outdated(self):
outdated = []
for id_, latest_version in (self.get_latest_versions() or {}).items():
info = self.get_info(int(id_))
if latest_version != info['version']:
outdated.append(info['name'])
return outdated
def get_info(self, id_):
for item in self.get_installed().values():
if "id" in item and item['id'] == id_:
return item
raise LibNotInstalled(id_)
def is_installed(self, id_):
try:
return int(self.get_info(id_)['id']) == id_
except LibNotInstalled:
return False
def install(self, id_, version=None):
if self.is_installed(id_):
raise LibAlreadyInstalled()
dlinfo = util.get_api_result(
"/lib/download/" + str(id_),
dict(version=version) if version else None
)
dlpath = None
tmplib_dir = join(self.lib_dir, str(id_))
try:
dlpath = self.download(dlinfo['url'], gettempdir())
if not isdir(tmplib_dir):
makedirs(tmplib_dir)
self.unpack(dlpath, tmplib_dir)
finally:
if dlpath:
remove(dlpath)
info = self.get_info(id_)
rename(tmplib_dir, join(self.lib_dir, "%s_ID%d" % (
re.sub(r"[^\da-zA-Z]+", "_", info['name']), id_)))
telemetry.on_event(
category="LibraryManager", action="Install",
label="#%d %s" % (id_, info['name'])
)
return True
def uninstall(self, id_):
for libdir, item in self.get_installed().iteritems():
if "id" in item and item['id'] == id_:
rmtree(join(self.lib_dir, libdir))
telemetry.on_event(
category="LibraryManager", action="Uninstall",
label="#%d %s" % (id_, item['name'])
)
return True
raise LibNotInstalled(id_)

View File

@ -22,12 +22,12 @@ import click
import semantic_version import semantic_version
from platformio import __version__, app, exception, telemetry, util from platformio import __version__, app, exception, telemetry, util
from platformio.commands.lib import lib_update as cmd_libraries_update from platformio.commands.lib import lib_update as cmd_lib_update
from platformio.commands.platform import \ from platformio.commands.platform import \
platform_install as cmd_platform_install platform_install as cmd_platform_install
from platformio.commands.platform import platform_update as cmd_platform_update from platformio.commands.platform import platform_update as cmd_platform_update
from platformio.commands.upgrade import get_latest_version from platformio.commands.upgrade import get_latest_version
from platformio.libmanager import LibraryManager from platformio.managers.lib import LibraryManager
from platformio.managers.platform import PlatformManager from platformio.managers.platform import PlatformManager
@ -221,16 +221,12 @@ def check_internal_updates(ctx, what):
last_check[what + '_update'] = int(time()) last_check[what + '_update'] = int(time())
app.set_state_item("last_check", last_check) app.set_state_item("last_check", last_check)
pm = PlatformManager() if what == "platforms" else LibraryManager()
outdated_items = [] outdated_items = []
if what == "platforms": for manifest in pm.get_installed():
pm = PlatformManager() if manifest['name'] not in outdated_items and \
for manifest in pm.get_installed(): pm.is_outdated(manifest['name']):
if manifest['name'] not in outdated_items and \ outdated_items.append(manifest['name'])
pm.is_outdated(manifest['name']):
outdated_items.append(manifest['name'])
elif what == "libraries":
lm = LibraryManager()
outdated_items = lm.get_outdated()
if not outdated_items: if not outdated_items:
return return
@ -245,19 +241,26 @@ def check_internal_updates(ctx, what):
if not app.get_setting("auto_update_" + what): if not app.get_setting("auto_update_" + what):
click.secho("Please update them via ", fg="yellow", nl=False) click.secho("Please update them via ", fg="yellow", nl=False)
click.secho("`platformio %s update`" % click.secho("`platformio %s update`" %
("lib" if what == "libraries" else "platform"), ("lib --global" if what == "libraries" else "platform"),
fg="cyan", nl=False)
click.secho(" command.\n", fg="yellow")
click.secho("If you want to manually check for the new versions "
"without updating, please use ", fg="yellow", nl=False)
click.secho("`platformio %s update --only-check`" %
("lib --global" if what == "libraries" else "platform"),
fg="cyan", nl=False) fg="cyan", nl=False)
click.secho(" command.", fg="yellow") click.secho(" command.", fg="yellow")
else: else:
click.secho("Please wait while updating %s ..." % what, fg="yellow") click.secho("Please wait while updating %s ..." % what, fg="yellow")
if what == "platforms": if what == "platforms":
ctx.invoke(cmd_platform_update) ctx.invoke(cmd_platform_update, platforms=outdated_items)
elif what == "libraries": elif what == "libraries":
ctx.invoke(cmd_libraries_update) ctx.obj = pm
ctx.invoke(cmd_lib_update, libraries=outdated_items)
click.echo() click.echo()
telemetry.on_event(category="Auto", action="Update", telemetry.on_event(
label=what.title()) category="Auto", action="Update", label=what.title())
click.echo("*" * terminal_width) click.echo("*" * terminal_width)
click.echo("") click.echo("")

209
platformio/managers/lib.py Normal file
View File

@ -0,0 +1,209 @@
# Copyright 2014-present Ivan Kravets <me@ikravets.com>
#
# 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
from os.path import join
import click
import semantic_version
from platformio import app, commands, exception, util
from platformio.managers.package import BasePkgManager
class LibraryManager(BasePkgManager):
def __init__(self, package_dir=None):
if not package_dir:
package_dir = join(util.get_home_dir(), "lib")
BasePkgManager.__init__(self, package_dir)
@property
def manifest_name(self):
return ".library.json"
@staticmethod
def max_satisfying_repo_version(versions, requirements=None):
def _cmp_dates(datestr1, datestr2):
from datetime import datetime
assert "T" in datestr1 and "T" in datestr2
dateformat = "%Y-%m-%d %H:%M:%S"
date1 = datetime.strptime(datestr1[:-1].replace("T", " "),
dateformat)
date2 = datetime.strptime(datestr2[:-1].replace("T", " "),
dateformat)
if date1 == date2:
return 0
return -1 if date1 < date2 else 1
item = None
reqspec = None
if requirements:
try:
reqspec = semantic_version.Spec(requirements)
except ValueError:
pass
for v in versions:
specver = None
try:
specver = semantic_version.Version(v['version'], partial=True)
except ValueError:
pass
if reqspec:
if not specver or specver not in reqspec:
continue
if not item or semantic_version.Version(
item['version'], partial=True) < specver:
item = v
elif requirements:
if requirements == v['version']:
return v
else:
if not item or _cmp_dates(item['date'], v['date']) == -1:
item = v
return item
def get_latest_repo_version(self, name, requirements):
item = self.max_satisfying_repo_version(
util.get_api_result("/lib/versions/%d" % self._get_pkg_id_by_name(
name, requirements)), requirements)
return item['version'] if item else None
def _get_pkg_id_by_name(self, name, requirements, quiet=False):
if name.startswith("id="):
return int(name[3:])
# try to find ID from installed packages
installed_dir = self.get_installed_dir(name, requirements)
if installed_dir:
manifest = self.load_manifest(installed_dir)
if "id" in manifest:
return int(manifest['id'])
return int(self.search_for_library({"name": name}, quiet)['id'])
def _install_from_piorepo(self, name, requirements):
assert name.startswith("id=")
version = self.get_latest_repo_version(name, requirements)
if not version:
raise exception.UndefinedPackageVersion(requirements or "latest",
util.get_systype())
dl_data = util.get_api_result(
"/lib/download/" + str(name[3:]), dict(version=version))
assert dl_data
pkg_dir = None
try:
pkg_dir = self._install_from_url(
name, dl_data['url'].replace("http://", "https://"),
requirements)
except exception.APIRequestError:
pkg_dir = self._install_from_url(name, dl_data['url'],
requirements)
return pkg_dir
def install(self, name, requirements=None, quiet=False,
trigger_event=True):
_name, _requirements, _url = self.parse_pkg_name(name, requirements)
if not _url:
_name = "id=%d" % self._get_pkg_id_by_name(
_name, _requirements, quiet=quiet)
already_installed = self.get_installed_dir(_name, _requirements, _url)
pkg_dir = BasePkgManager.install(self, _name if not _url else name,
_requirements, quiet, trigger_event)
if already_installed:
return
manifest = self.load_manifest(pkg_dir)
if "dependencies" not in manifest:
return pkg_dir
if not quiet:
click.secho("Installing dependencies", fg="yellow")
_dependencies = manifest['dependencies']
if not isinstance(_dependencies, list):
_dependencies = [_dependencies]
for filters in _dependencies:
assert "name" in filters
if any([s in filters.get("version", "") for s in ("\\", "/")]):
self.install("{name}={version}".format(**filters))
else:
lib_info = self.search_for_library(filters, quiet)
if filters.get("version"):
self.install(
lib_info['id'],
requirements=filters.get("version"),
quiet=quiet,
trigger_event=trigger_event)
else:
self.install(
lib_info['id'],
quiet=quiet,
trigger_event=trigger_event)
return pkg_dir
@staticmethod
def search_for_library( # pylint: disable=too-many-branches
filters, quiet=False):
assert isinstance(filters, dict)
assert "name" in filters
if not quiet:
click.echo("Looking for %s library in registry" % click.style(
filters['name'], fg="cyan"))
query = []
for key in filters:
if key not in ("name", "authors", "frameworks", "platforms"):
continue
values = filters[key]
if not isinstance(values, list):
values = [v.strip() for v in values.split(",") if v]
for value in values:
query.append('%s:"%s"' % (key[:-1] if key.endswith("s") else
key, value))
lib_info = None
result = util.get_api_result(
"/lib/search", dict(query=" ".join(query)))
if result['total'] == 1:
lib_info = result['items'][0]
elif result['total'] > 1:
click.secho(
"Conflict: More than one library has been found "
"by request %s:" % json.dumps(filters),
fg="red")
commands.lib.echo_liblist_header()
for item in result['items']:
commands.lib.echo_liblist_item(item)
if not app.get_setting("enable_prompts"):
click.echo("Automatically chose the first available library")
lib_info = result['items'][0]
else:
deplib_id = click.prompt(
"Please choose library ID",
type=click.Choice([str(i['id']) for i in result['items']]))
for item in result['items']:
if item['id'] == int(deplib_id):
lib_info = item
break
if not lib_info:
raise exception.LibNotFound(str(filters))
if not quiet:
click.echo("Found: %s" % click.style(
"http://platformio.org/lib/show/{id}/{name}".format(
**lib_info),
fg="blue"))
return lib_info

View File

@ -312,7 +312,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
if "=" in text and not text.startswith("id="): if "=" in text and not text.startswith("id="):
name, url = text.split("=", 1) name, url = text.split("=", 1)
# Handle GitHub URL (https://github.com/user/package.git) # Handle GitHub URL (https://github.com/user/package)
if url.startswith("https://github.com/") and \ if url.startswith("https://github.com/") and \
not url.endswith((".zip", ".tar.gz")): not url.endswith((".zip", ".tar.gz")):
url = "git+" + url url = "git+" + url
@ -394,6 +394,20 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
return best.get("__pkg_dir") return best.get("__pkg_dir")
return None return None
def is_outdated(self, name, requirements=None):
installed_dir = self.get_installed_dir(name, requirements)
if not installed_dir:
click.secho(
"%s @ %s is not installed" % (name, requirements or "*"),
fg="yellow")
return
manifest_path = self.get_manifest_path(installed_dir)
if manifest_path.endswith(self.VCS_MANIFEST_NAME):
return False
manifest = self.load_manifest(installed_dir)
return manifest['version'] != self.get_latest_repo_version(
name, requirements)
def install(self, name, requirements=None, quiet=False, def install(self, name, requirements=None, quiet=False,
trigger_event=True): trigger_event=True):
name, requirements, url = self.parse_pkg_name(name, requirements) name, requirements, url = self.parse_pkg_name(name, requirements)

View File

@ -71,9 +71,10 @@ class PlatformManager(BasePkgManager):
return True return True
def is_outdated(self, name, requirements=None): def is_outdated(self, name, requirements=None):
if BasePkgManager.is_outdated(self, name, requirements):
return True
p = PlatformFactory.newPlatform(name, requirements) p = PlatformFactory.newPlatform(name, requirements)
return (p.are_outdated_packages() or return p.are_outdated_packages()
p.version != self.get_latest_repo_version(name, requirements))
def cleanup_packages(self, names): def cleanup_packages(self, names):
self.reset_cache() self.reset_cache()

View File

@ -43,10 +43,10 @@ class VCSClientBase(object):
command = None command = None
def __init__(self, src_dir, remote_url=None, branch=None): def __init__(self, src_dir, remote_url=None, tag=None):
self.src_dir = src_dir self.src_dir = src_dir
self.remote_url = remote_url self.remote_url = remote_url
self.branch = branch self.tag = tag
self.check_client() self.check_client()
def check_client(self): def check_client(self):
@ -71,7 +71,7 @@ class VCSClientBase(object):
@property @property
def can_be_updated(self): def can_be_updated(self):
return not self.branch return not self.tag
def get_current_revision(self): def get_current_revision(self):
raise NotImplementedError raise NotImplementedError
@ -113,19 +113,19 @@ class GitClient(VCSClientBase):
@property @property
def can_be_updated(self): def can_be_updated(self):
return not self.branch or not self.is_commit_id(self.branch) return not self.tag or not self.is_commit_id(self.tag)
def export(self): def export(self):
is_commit = self.is_commit_id(self.branch) is_commit = self.is_commit_id(self.tag)
args = ["clone", "--recursive"] args = ["clone", "--recursive"]
if not self.branch or not is_commit: if not self.tag or not is_commit:
args += ["--depth", "1"] args += ["--depth", "1"]
if self.branch: if self.tag:
args += ["--branch", self.branch] args += ["--branch", self.tag]
args += [self.remote_url, self.src_dir] args += [self.remote_url, self.src_dir]
assert self.run_cmd(args) assert self.run_cmd(args)
if is_commit: if is_commit:
return self.run_cmd(["reset", "--hard", self.branch]) return self.run_cmd(["reset", "--hard", self.tag])
return True return True
def update(self): def update(self):
@ -142,8 +142,8 @@ class HgClient(VCSClientBase):
def export(self): def export(self):
args = ["clone"] args = ["clone"]
if self.branch: if self.tag:
args.extend(["--updaterev", self.branch]) args.extend(["--updaterev", self.tag])
args.extend([self.remote_url, self.src_dir]) args.extend([self.remote_url, self.src_dir])
return self.run_cmd(args) return self.run_cmd(args)
@ -161,8 +161,8 @@ class SvnClient(VCSClientBase):
def export(self): def export(self):
args = ["checkout"] args = ["checkout"]
if self.branch: if self.tag:
args.extend(["--revision", self.branch]) args.extend(["--revision", self.tag])
args.extend([self.remote_url, self.src_dir]) args.extend([self.remote_url, self.src_dir])
return self.run_cmd(args) return self.run_cmd(args)

View File

@ -14,10 +14,8 @@
import json import json
from platformio import util
from platformio.commands.boards import cli as cmd_boards from platformio.commands.boards import cli as cmd_boards
from platformio.commands.platform import \ from platformio.commands.platform import platform_search as cmd_platform_search
platform_search as cmd_platform_search
def test_board_json_output(platformio_setup, clirunner, validate_cliresult): def test_board_json_output(platformio_setup, clirunner, validate_cliresult):

View File

@ -13,12 +13,12 @@
# limitations under the License. # limitations under the License.
import json import json
from os import makedirs, getcwd from os import getcwd, makedirs
from os.path import getsize, isdir, isfile, join from os.path import getsize, isdir, isfile, join
from platformio.commands.init import cli
from platformio.commands.boards import cli as cmd_boards
from platformio import util from platformio import util
from platformio.commands.boards import cli as cmd_boards
from platformio.commands.init import cli
def validate_pioproject(pioproject_dir): def validate_pioproject(pioproject_dir):

View File

@ -12,25 +12,12 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from os import listdir
from os.path import isdir, isfile, join
import re import re
from platformio.commands.lib import cli from platformio.commands.lib import cli
from platformio import util
def validate_libfolder(): def test_search(clirunner, validate_cliresult):
libs_path = util.get_lib_dir()
installed_libs = listdir(libs_path)
for lib in installed_libs:
assert isdir(join(libs_path, lib))
assert isfile(join(libs_path, lib, ".library.json")) and isfile(
join(libs_path, lib, "library.json"))
def test_lib_search(clirunner, validate_cliresult):
result = clirunner.invoke(cli, ["search", "DHT22"]) result = clirunner.invoke(cli, ["search", "DHT22"])
validate_cliresult(result) validate_cliresult(result)
match = re.search(r"Found\s+(\d+)\slibraries:", result.output) match = re.search(r"Found\s+(\d+)\slibraries:", result.output)
@ -42,34 +29,70 @@ def test_lib_search(clirunner, validate_cliresult):
assert int(match.group(1)) == 1 assert int(match.group(1)) == 1
def test_lib_install(clirunner, validate_cliresult): def test_global_install_registry(clirunner, validate_cliresult,
result = clirunner.invoke(cli, ["install", "58", "115"]) isolated_pio_home):
result = clirunner.invoke(
cli, ["-g", "install", "58", "OneWire", "Json@5.4.0", "Json@>5.4"])
validate_cliresult(result) validate_cliresult(result)
validate_libfolder() items1 = [d.basename for d in isolated_pio_home.join("lib").listdir()]
items2 = ["DHT22_ID58", "Json_ID64", "Json_ID64@5.4.0", "OneWire_ID1"]
assert set(items1) == set(items2)
def test_lib_list(clirunner, validate_cliresult): def test_global_install_repository(clirunner, validate_cliresult,
result = clirunner.invoke(cli, ["list"]) isolated_pio_home):
result = clirunner.invoke(
cli, ["-g", "install", "https://github.com/gioblu/PJON.git#3.0",
"https://developer.mbed.org/users/simon/code/TextLCD/",
"http://dl.platformio.org/libraries/archives/3/3756.tar.gz",
"knolleary/pubsubclient"])
validate_cliresult(result) validate_cliresult(result)
assert "58" in result.output and "115" in result.output items1 = [d.basename for d in isolated_pio_home.join("lib").listdir()]
items2 = ["PJON", "TextLCD", "ESPAsyncTCP", "PubSubClient"]
assert set(items2) & set(items1)
def test_lib_show(clirunner, validate_cliresult): def test_global_lib_list(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli, ["show", "115"]) result = clirunner.invoke(cli, ["-g", "list"])
validate_cliresult(result) validate_cliresult(result)
assert "arduino" in result.output and "atmelavr" in result.output assert all([n in result.output for n in ("OneWire", "DHT22", "64")])
result = clirunner.invoke(cli, ["show", "58"]) result = clirunner.invoke(cli, ["-g", "list", "--json-output"])
validate_cliresult(result) validate_cliresult(result)
assert "energia" in result.output and "timsp430" in result.output assert all(
[n in result.output
for n in ("PJON",
"https://developer.mbed.org/users/simon/code/TextLCD/")])
def test_lib_update(clirunner, validate_cliresult): def test_global_lib_show(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli, ["update"]) result = clirunner.invoke(cli, ["-g", "show", "64@5.4.0"])
validate_cliresult(result) validate_cliresult(result)
assert "58" in result.output and "115" in result.output assert all(
[s in result.output for s in ("Json", "arduino", "atmelavr", "5.4.0")])
result = clirunner.invoke(cli, ["-g", "show", "Json@>5.4.0"])
def test_lib_uninstall(clirunner, validate_cliresult):
result = clirunner.invoke(cli, ["uninstall", "58", "115"])
validate_cliresult(result) validate_cliresult(result)
assert all([s in result.output for s in ("Json", "arduino", "atmelavr")])
assert "5.4.0" not in result.output
result = clirunner.invoke(cli, ["-g", "show", "1"])
validate_cliresult(result)
assert "OneWire" in result.output
def test_global_lib_update(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli, ["-g", "update"])
validate_cliresult(result)
assert all([s in result.output for s in ("Up-to-date", "Checking")])
def test_global_lib_uninstall(clirunner, validate_cliresult,
isolated_pio_home):
result = clirunner.invoke(
cli, ["-g", "uninstall", "1", "Json@!=5.4.0", "TextLCD"])
validate_cliresult(result)
items1 = [d.basename for d in isolated_pio_home.join("lib").listdir()]
items2 = ["DHT22_ID58", "Json_ID64@5.4.0", "ESPAsyncTCP_ID305",
"pubsubclient", "PJON"]
assert set(items1) == set(items2)

View File

@ -16,8 +16,8 @@ import json
import os import os
from os.path import join from os.path import join
from platformio.commands import platform as cli_platform
from platformio import exception, util from platformio import exception, util
from platformio.commands import platform as cli_platform
def test_list_json_output(clirunner, validate_cliresult): def test_list_json_output(clirunner, validate_cliresult):

View File

@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from platformio.commands.settings import cli
from platformio import app from platformio import app
from platformio.commands.settings import cli
def test_settings_check(clirunner, validate_cliresult): def test_settings_check(clirunner, validate_cliresult):

View File

@ -1,4 +1,4 @@
# Copyright 2014-2016 Ivan Kravets <me@ikravets.com> # Copyright 2014-present Ivan Kravets <me@ikravets.com>
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -12,29 +12,28 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from os import environ import os
from click.testing import CliRunner
import pytest import pytest
from click.testing import CliRunner
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def platformio_setup(request): def platformio_setup(request):
pioenvvars = ("ENABLE_PROMPTS", "ENABLE_TELEMETRY") pioenvvars = ("ENABLE_PROMPTS", "ENABLE_TELEMETRY")
for v in pioenvvars: for v in pioenvvars:
environ["PLATFORMIO_SETTING_%s" % v] = "No" os.environ["PLATFORMIO_SETTING_%s" % v] = "No"
def platformio_teardown(): def platformio_teardown():
for v in pioenvvars: for v in pioenvvars:
_name = "PLATFORMIO_SETTING_%s" % v _name = "PLATFORMIO_SETTING_%s" % v
if _name in environ: if _name in os.environ:
del environ[_name] del os.environ[_name]
request.addfinalizer(platformio_teardown) request.addfinalizer(platformio_teardown)
@pytest.fixture(scope="session") @pytest.fixture(scope="module")
def clirunner(): def clirunner():
return CliRunner() return CliRunner()
@ -46,3 +45,15 @@ def validate_cliresult():
assert not result.exception assert not result.exception
assert "error" not in result.output.lower() assert "error" not in result.output.lower()
return decorator return decorator
@pytest.fixture(scope="module")
def isolated_pio_home(request, tmpdir_factory):
home_dir = tmpdir_factory.mktemp(".platformio")
os.environ['PLATFORMIO_HOME_DIR'] = str(home_dir)
def fin():
del os.environ['PLATFORMIO_HOME_DIR']
request.addfinalizer(fin)
return home_dir