Compare commits

...
Author SHA1 Message Date
David Lechner f664757ef3 npm/jedi: new js package
This adds a new javascript package for distributing the pybricks-jedi
Python package and it's dependencies via the npm ecosystem for use in
Pybricks Code.
2022-09-07 20:10:34 -05:00
David Lechner b747520d1c jedi: add LICENSE file
This adds a LICENSE file to the jedi directory specifically for the
pybricks-jedi Python package. Poetry will automatically pick up this
file and include it in the distributed package.
2022-09-07 19:41:23 -05:00
The Vinh Luong (Lương Thế Vinh) dcddf15d15 flake8: Update VSCode settings and suppress some Flake8 linting warnings.
* update VSCode settings to exclude __pycache__

* suppress some Flake8 linting warnings

* minor fix: SPHINX_BUILD env var may not be set

* decorate _PybricksEnumMeta.__dir__() with @classmethod

* flake8-ignore E501
2022-09-05 18:40:39 -05:00
The Vinh Luong (Lương Thế Vinh) c64458d3b9 parameters: Fix wrong typing in pybricks.parameters.Stop. 2022-09-05 18:38:29 -05:00
David Lechner 2a963b2a0b poetry: update dependencies
This fixes:

    Invalid PEP 440 version: '5.1.0.dev20220527.dev-20220527'
2022-09-05 16:58:56 -05:00
Laurens Valk 6df509b66e pybricks.hubs.EssentialHub: Fix duplicate example.
Also delete reference image with the light consistent with other small hubs.
2022-07-04 15:00:41 +02:00
Laurens Valk ac9585b7a5 ubuiltins: Fix broken classmethod decorator.
Since classmethod is being redefined here, it broke Sphinx.

Fixes https://github.com/pybricks/pybricks-api/issues/86
2022-07-04 14:33:17 +02:00
Laurens Valk 0982d5d65b ubuiltins: Document int. 2022-07-04 14:33:17 +02:00
Laurens Valk 8e7f8c619e ubuiltins: Document float. 2022-07-04 14:33:17 +02:00
Laurens Valk a0b3ba1d74 ubuiltins: Document dict.
This just adds a direct reference to the Python docs.
2022-07-04 14:33:17 +02:00
Laurens Valk 3dc28579ef ubuiltins: Document bool, complex. 2022-07-04 14:33:17 +02:00
Laurens Valk 923f9df3da ubuiltins: Document input, print. 2022-07-04 14:33:17 +02:00
Laurens Valk 1665b77847 ubuiltins: Start converting signatures to new standard.
Also clarify description wherever applicable.
2022-07-04 14:33:17 +02:00
Laurens Valk 96e7e5f3d0 umath: Convert signatures to new standard. 2022-07-04 14:33:17 +02:00
Laurens Valk 1b51d71061 examples: Generate hub examples while building.
This way we don't have to commit the generated scripts.

While we do this, rename ExampleHub to ThisHub so that the common scripts can actually run.
2022-07-04 14:29:33 +02:00
Laurens Valk 9d706d719a .gitignore: Ignore .python-version. 2022-07-04 08:40:28 +02:00
David Lechner 7c62a2833a doc/main/images: add temporary essentialhub images
We don't have proper images yet, so we are adding copies of the Prime
hub images for now to not take up space in git history with temporary
images and to at least have something so the docs will build.
2022-06-29 12:08:33 -05:00
David Lechner 03ee7f74e8 doc/pup/essentialhub: fix bit rot
This fixes bitrot for PR #96. Also fixes a few minor issues where
changes were missed.
2022-06-29 12:08:33 -05:00
Pavel Lobodinský 025147680c pybricks.hubs.EssentialHub: Added missing Hub 2022-06-29 12:08:33 -05:00
David Lechner e467bb57c9 pybricks_jedi/v1.1.0 2022-06-26 00:10:04 -05:00
David Lechner 33d0c9fa49 v3.2.0b1-r3 2022-06-26 00:00:11 -05:00
David Lechner e95386e23e jedi: improve signature information
This fixes numerous issues where jedi provided incomplete or poorly
formatted signatures and docstrings.

Issue: https://github.com/pybricks/pybricks-code/issues/932
2022-06-25 23:54:49 -05:00
David Lechner a758eaa1db github/build: don't run build on tags
This is almost always redundant.
2022-06-24 15:37:59 -05:00
David Lechner 470eebd1c5 github/jedi: fix working directory in publish job
This was building the pybricks package instead of the pybricks_jedi
package because it was using the wrong directory.
2022-06-24 15:29:02 -05:00
David Lechner 37cdd2a83b v3.2.0b1-r2 2022-06-24 15:14:42 -05:00
David Lechner a2d9c33eb5 jedi: add new pybricks_jedi package
This package will be used in Pybricks Code to provide some intellesense
operations.
2022-06-24 14:52:45 -05:00
Laurens Valk 6d0de1effa doc/main: Drop beta tag.
Less variants is better. Now we'll just have to add beta support for SPIKE in the next release.

Fixes https://github.com/pybricks/pybricks-api/issues/102
2022-06-10 11:31:08 +02:00
Laurens Valk 8e7fc53974 doc/main: Disable NXT and EV3 pages again.
Now that all typehints have been added, we can
revert commit 4c583a9d4e again.
2022-06-10 11:20:32 +02:00
Laurens Valk e456c8ef91 pybricks: Drop underscores on imports.
Fixes https://github.com/pybricks/pybricks-api/issues/101
2022-06-10 11:10:20 +02:00
Laurens Valk 6500440031 pybricks: Drop most ellipsis and pass instances.
See [1]: "I still prefer ... over pass. This clarifies to the readers that they are reading a stub. But if there's a docstring we need neither."

[1] https://github.com/srittau/type-stub-pep/issues/88#issuecomment-758843441

Fixes https://github.com/pybricks/pybricks-api/issues/101#issuecomment-1148780369
2022-06-10 10:46:44 +02:00
Laurens Valk 8ec1b18629 pybricks.parameters: Add typing, part 2. 2022-06-10 10:33:33 +02:00
Laurens Valk 26908040eb pybricks.common: Add CommonColorSensor class.
Fixes https://github.com/pybricks/pybricks-api/issues/103
2022-06-10 10:05:13 +02:00
Laurens Valk f67c98105a pybricks.parameters: Add typing, part 1. 2022-06-10 10:05:13 +02:00
Laurens Valk 877391dea7 pybricks.parameters: Add typing. 2022-06-10 10:05:13 +02:00
Laurens Valk fb3446ad0d pybricks.robotics: Add typing. 2022-06-10 10:05:12 +02:00
Laurens Valk 31256d70c1 pybricks.tools: Add typing. 2022-06-10 10:05:12 +02:00
Laurens Valk f87e1b48ac pybricks.messaging: Add typing. 2022-06-10 10:05:12 +02:00
Laurens Valk 6bcf6117c3 pybricks.hubs: Add typing. 2022-06-10 10:05:11 +02:00
Laurens Valk c77682f50d pybricks.iodevices: Add typing. 2022-06-10 10:05:11 +02:00
Laurens Valk 4c583a9d4e doc/main: Enable NXT and EV3 pages.
This will help us review the pages as we add typing to the documentation. Then they will be hidden again.

This commit can be cherry-picked later on if we ever enable NXT and EV3 content again.
2022-06-10 10:05:10 +02:00
Laurens Valk 0688b8dded doc/common/conf.py: Add missing units.
These are used for NXT sensors.
2022-06-10 10:05:10 +02:00
Laurens Valk d1a4327751 pybricks.ev3dev.media: Type file classes. 2022-06-10 10:05:10 +02:00
Laurens Valk 4aec24a051 pybricks.ev3dev.media: Type Font class. 2022-06-10 10:05:09 +02:00
Laurens Valk 7bc995d0b6 pybricks.ev3dev.media: Type Image class. 2022-06-10 10:05:09 +02:00
Laurens Valk 725a07e6e1 pybricks.ev3dev._speaker: Add typing. 2022-06-10 10:05:09 +02:00
David Lechner d43bf94720 v3.2.0b1-r1 2022-06-09 19:31:04 -05:00
David Lechner c6163fcc81 pybricks: add __init__.py
This file was missing which breaks some tools that don't know about
namespace packages. Also `from pybricks import version` is a thing.
2022-06-09 19:25:44 -05:00
David Lechner 34992d5b20 vscode: drop deprecated setting
This setting no longer has any effect.
2022-06-09 19:25:21 -05:00
David Lechner c77aedcd8a @pybricks/ide-docs v2.2.0 2022-06-02 10:44:03 -05:00
David Lechner 7b9209681c @pybricks/ide-docs v2.1.0 2022-06-02 10:40:55 -05:00
Laurens Valk 7de33c0ce5 v3.2.0b1 2022-06-02 17:10:46 +02:00
Laurens Valk dbc5d327e3 doc/common/conf: Display s^2 units correctly.
Now that we no longer use these in hyperlinks, we can use the right
unicode to display this unit correctly.
2022-05-30 17:29:30 +02:00
Laurens Valk 2e39740e4b pybricks.nxtdevices: Add typing. 2022-05-30 17:19:38 +02:00
Laurens Valk 45e0744b3f pybricks.ev3devices: Add typing. 2022-05-30 15:34:07 +02:00
Laurens Valk aab6c0d3e0 pybricks.media.ev3dev: Repair build.
Upon temporarily including these to update typing for pybricks.ev3devices, a lot of build errors were encountered.

Even though we won't be re-including these pages any time soon, we'll want to occasionally make sure that they still build with more recent versions of Sphinx.
2022-05-30 14:29:14 +02:00
Laurens Valk 8a4c4a5400 CONTRIBUTING: Add basic docstring guidelines.
Fixes https://github.com/pybricks/pybricks-api/issues/99
2022-05-30 10:57:31 +02:00
Laurens Valk ecfbc6ca75 CONTRIBUTING: Fix formatting and link to setup.
We don't have a wiki.
2022-05-30 10:21:34 +02:00
Laurens Valk c3b6d44c59 pybricks.geometry: Add typing. 2022-05-30 10:17:47 +02:00
Laurens Valk db71a80f36 pybricks.common.IMU: Add typing. 2022-05-30 10:03:44 +02:00
Laurens Valk a80d5cf91e pybricks.common.Accelerometer: Add typing.
Also remove tapped and shaken, which are not implemented.
2022-05-30 09:46:00 +02:00
Laurens Valk 515d261bad pybricks.common.Charger: Add typing. 2022-05-30 09:29:14 +02:00
Laurens Valk dd54d67720 pybricks.common: Use Number as input type where allowed. 2022-05-28 11:33:08 +02:00
Laurens Valk 453332201e pybricks.common.Battery: Add typing. 2022-05-28 11:23:21 +02:00
Laurens Valk 3548ff47ce pybricks.common.Keypad: Add typing. 2022-05-28 11:20:07 +02:00
Laurens Valk a02b283f3f pybricks.common.LightMatrix: Add typing. 2022-05-28 11:15:17 +02:00
Laurens Valk f197531979 pybricks.common.LightArray: Add typing.
Remove blink and animate, which aren't implemented. These weren't displayed in the docs, so this is not a real change; it just makes typing more correct.
2022-05-28 10:55:40 +02:00
Laurens Valk 2167b9d52d pybricks.common.ColorLight: Add typing.
Also remove pybricks.common.Light which isn't used anywhere.

pupdevices.Light is a standalone light that does not support animations or blinks, so don't inherit from this nonexistent class.

Also remove the ColorLight.reset() method which was never implemented.
2022-05-27 20:00:28 +02:00
Laurens Valk 2be15fdf4d pybricks.common.Speaker: Add typing. 2022-05-27 19:14:22 +02:00
Laurens Valk aaf3ad1b9c pybricks.common.Control: Add typing. 2022-05-27 17:15:24 +02:00
Laurens Valk bd7806d2d4 all: Format with black.
Also activate auto formatting. Bump flake8 and mark black
disagreements in setup.cfg.
2022-05-27 16:22:05 +02:00
Laurens Valk 24f7d7c288 pybricks.common.Motor: Add typing. 2022-05-27 16:01:18 +02:00
Laurens Valk 5e0ba1de07 doc/common/conf: Format units in return type.
This formats return types so they don't look like tuples:

int: deg

If we can figure out how these nodes work, we can create proper links
and maybe use italics for the units or a slightly different font color.
2022-05-27 14:59:32 +02:00
Laurens Valk 2f8ba40034 poetry: Patch Sphinx to use docstring signatures when given.
This is the intended behavior everywhere, but it wasn't working for overloaded functions and methods.

See https://github.com/pybricks/sphinx/commit/f57417c042cbf4a72448518b7599517495cc6fde
2022-05-27 12:21:45 +02:00
Laurens Valk c4a09ab62a pybricks.common.DCMotor: Add typing. 2022-05-09 15:05:09 +02:00
Laurens Valk c0c53db5ee pybricks.common.System: Add typing. 2022-05-09 10:41:39 +02:00
Laurens Valk 5e09a6f1bd .vscode/settings: Add rewrap setting.
Now we can press Alt+Q to hard (re)wrap comments and docstrings.
2022-05-09 10:28:39 +02:00
Laurens Valk 5e9a8c5737 doc/main/signaltypes: Change how units are documented.
Previously, arguments had "types" like ":ref:`speed`", which would be rendered by Sphinx as a hyperlink and displayed as "rotational speed: deg/s".

This worked well enough but it had a few shortcomings:
- It looks bad on autocomplete, which doesn't know how to render RST with cross references.
- No real type information: int, float, ... ?
- Some units are very long, making the docs less concise.
- The unified approach doesn't always work. Some method arguments can be either deg/s or mm/s, depending on the application. This gets even lengthier.
- It's hard to maintain if you don't know what to link to.

In the new approach, the unit is just added to the type as plain text. Instead of giving the physical signal name, we give the real data type, which is more standard. The physical signal name is usually apparent from the docstring anyway, and can be inferred from the unit as well. This also solves all of the above problems.

Since most Pybricks methods allow both int and float for numeric inputs, we document these as a Number type, which is the union of int and float. Since the type is no longer directly tied to the type, we can still document the return type correctly, since this is never a union.

Instead of having complicated hacks in Sphinx to make this work (I have tried many), it turns out we can conveniently suppress broken references and still display the units. The only downside is that units will no longer have hyperlinks to the signal pages, at least for the moment. We should be able to make on_missing_reference a bit smarter to format the units as we see fit if needed.

The approach here is exemplified in the Motor.run_until_stalled method. Subsequent commits will apply it everywhere. Also clarify the behavior for duty_limit=None while we are updating this code anyway.
2022-05-09 10:28:31 +02:00
Laurens Valk f934fdd9bd pybricks.common.IMU: Change example to print G force.
Since we changed the acceleration units to mm/s/s, the output values are
fairly large.

The Matrix repr function prints values up to 999, so this avoids
truncating the output.

It is also a good demo of scalar division for a Matrix / Vector.
2022-04-01 16:32:39 +02:00
Laurens Valk 556728937f pybricks.common.Accelerometer: Use mm/s/s units.
Fixes https://github.com/pybricks/pybricks-api/issues/94

For Move Hub, this is a breaking change since Move Hub IMU support
was already released. For the other hubs, the IMU API has not been
released yet, so we can do this silently.
2022-04-01 15:41:15 +02:00
Laurens Valk 813ea61308 doc/main/conf.py: Show beta features on RTD/latest. 2022-04-01 14:51:38 +02:00
Laurens Valk 2e8e43bcdf rtd-requirements: Upgrade to Sphinx 4.4.0. 2022-04-01 14:31:35 +02:00
Laurens Valk e4ddd1ffce pybricks.geometry.Axis: Drop ANY.
This was previously dropped in a2583944d9
but it was added in again in c666009511.

Since this module was never included in a release (it was hidden),
it is OK to do this.
2022-04-01 14:28:38 +02:00
Laurens Valk 243f2948ef pybricks.hubs.primehub: Show in beta version.
Make it show up in the beta build and hide it in the release build.
2022-04-01 14:28:31 +02:00
Laurens Valk 81a1379781 doc/Makefile: Allow BETA=1 to include beta features.
Prior to every previous release, we we had to delete certain
features that did not make it into the release. This lets us
do that with a tag instead. This way we can keep a clean git
history that is easier to follow.
2022-04-01 13:39:04 +02:00
Laurens Valk 93a9370790 doc/common/extensions: Hide version directives in IDE build.
Version tags can be useful to keep track of new or updated features.

This lets us hide such details in the documentation that ships with the IDE to keep it concise.
2022-04-01 09:38:41 +02:00
Laurens Valk 1989561c90 .github/workflows: Fix typo in build name. 2022-03-22 15:49:23 +01:00
Laurens Valk 4101f9be79 poetry: Update Sphinx and RTD-theme.
We were not using a proper release for sphinx-rtd-theme
in order to work around some bugs. Meanwhile, a proper
release has come out, so let's upgrade to 1.0.0.

Also bump Sphinx to 4.4.

Also update and fix workarounds for cross references.
Fixes https://github.com/pybricks/pybricks-api/issues/98.
2022-03-22 15:38:04 +01:00
Laurens Valk 0a31bc711f pybricks.common.Control: Add deceleration setter.
Fixes https://github.com/pybricks/pybricks-api/issues/97
2022-03-21 11:17:34 +01:00
Pavel Lobodinský d8bd890101 pybricks.common: Charger, IMU and System auto-completion 2022-03-02 10:31:53 -06:00
David Lechner 2ba7edab0c pybricks.ev3/pupdevices: fix Motor code completion
The Microsoft Python extension for VS code doesn't include imports in
type hints, so the Motor type wasn't working properly. We can fix this
by wrapping the import type in a new, empty class definition.

The DCMotor class was also missing from ev3devices and the typing for
the overloaded reset_angle method in pupdevices was missing. These are
fixed as well.
2022-02-21 10:59:00 -06:00
Pavel Lobodinský 616051149b pybricks.common.Speaker: Add volume setter. 2022-01-20 08:56:29 +01:00
Laurens Valk e69c422f83 pybricks.common.Motor: Add absolute value example.
Fixes https://github.com/pybricks/support/issues/611
2022-01-20 08:39:43 +01:00
Laurens Valk 0ceabe8497 pybricks.common.Charger: Document it. 2022-01-14 15:14:28 +01:00
Laurens Valk d3ae4ec9ee pybricks.pupdevices.ColorSensor: Move cleanup example.
The color sensor light is much brighter, so having an example
to turn it off is a bit more useful.

Fixes https://github.com/pybricks/pybricks-api/pull/90
2022-01-07 14:11:03 +01:00
Laurens Valk ffb2f8aa96 pybricks.pupdevices.UltrasonicSensor: Move cleanup example.
Also generalize the example so that it can be used on all hubs.
2022-01-07 13:38:07 +01:00
Pavel Lobodinský 65c81834c9 pybricks.hubs.PrimeHub: Added a cleanup example. 2022-01-07 13:38:07 +01:00
Pavel Lobodinský 97002948d1 pybricks.common: Refactored Speaker API to be hub specific.
The Prime/Inventor Hub Speaker allows only a subset of EV3 Speaker API. Hence, splitting the API up.
2022-01-05 12:10:11 -06:00
Pavel Lobodinský 70aa5ee0e2 pybricks._common: Renamed incorrect argument name, fixed tuple type. 2022-01-03 11:01:33 +01:00
Pavel Lobodinský efc1650e7f pybricks.parameters: Added Icon class, added missing methods and attributes.
Added missing Icon class present in the firmware
2022-01-03 11:01:33 +01:00
Pavel Lobodinský fe60636072 pybricks.geometry: Fixed Matrix incorrect rows type, added missing methods. 2022-01-03 11:01:33 +01:00
Pavel Lobodinský a1342f77c9 pybricks.hubs: Default values for the PrimeHub. 2022-01-03 11:01:33 +01:00
Laurens Valk d806fe9fbe pybricks.common.Control: Fix docstring and type hints for limits().
Fixes https://github.com/pybricks/support/issues/565
2021-12-30 09:12:27 +01:00
David Lechner 1259d5d33a bump version for development 2021-12-16 15:36:52 -06:00
David Lechner 098b8eb9cb v3.1.0 2021-12-16 15:36:14 -06:00
David Lechner c666009511 pybricks.geometry: add Axis.ANY
This exists in the firmware but was missing here.
2021-12-16 15:08:50 -06:00
David Lechner 7f4234fc1e pybricks._common: remove type hint for integral_range()
This was removed in e061617.

Also fix import of Axis while we are touching this file.
2021-12-16 15:07:33 -06:00
David Lechner 482289c384 pybricks.robotics: add type hint for curve()
This method was added in 30803fc.
2021-12-16 15:06:00 -06:00
Laurens Valk 30803fc017 pybricks.robotics.DriveBase: Add curve method.
This generalizes motion to curves (arcs), which is in
between straight lines and in-place turns.
2021-12-01 15:38:27 +01:00
Laurens Valk 749eceefc4 pybricks.robotics.DriveBase: Document then and wait arguments. 2021-12-01 15:35:37 +01:00
Laurens Valk 57f6f0fbef pybricks.pupdevices.DCMotor: Document settings method.
Also update changelog for recent changes.
2021-12-01 14:55:34 +01:00
Laurens Valk e061617c34 pybricks.common.Control: Drop integral_range.
This setting is no longer used. We leave a placeholder setting so we don't break existing programs.

See https://github.com/pybricks/pybricks-micropython/commit/e82dd6a2be4e378ab0b1ee7e3b2643fe654de4a9#diff-e529f43c94cf766ade4b68930f9713a45b62618f4305e4c0c88ba872e9f9cd0e
2021-12-01 14:54:21 +01:00
Laurens Valk eb09ecd7c7 pybricks.common.Control: Drop duty limit.
This is now a per-motor voltage limit.

See https://github.com/pybricks/support/issues/536
2021-12-01 14:41:09 +01:00
Laurens Valk 06a1542613 pybricks.pupdevices.DCMotor: Document settings method.
See https://github.com/pybricks/support/issues/536
2021-12-01 14:40:06 +01:00
Laurens Valk 82a8f2ae89 pybricks.pupdevices.Motor: Add small motor render.
Fixes https://github.com/pybricks/support/issues/441
2021-11-23 08:59:44 +01:00
Laurens Valk 7d0fe9cb85 doc/common/extensions: Fix classlink.
Allow the link to be different from the name.

This lets us fix the link for the Inventor Hub, which was linking to a non-existent page.
2021-11-22 14:49:20 +01:00
Laurens Valk 1af876ac8f pybricks.pupdevices.ColorLightMatrix: Fix render.
- Use isometric projection
- Fix broken plug
- Use correct background color

While we are at it, add colors to show which 9 colors this device supports.
2021-11-22 14:49:20 +01:00
David Lechner 718a28c0da @pybricks/ide-docs v2.0.1 2021-11-19 20:30:11 -06:00
David Lechner a2a375cb5c docs/pupdevices: fix broken link
The link to the color light matrix page was broken due to an invalid
file name.
2021-11-19 20:28:33 -06:00
David Lechner 466d8d6c86 @pybricks/ide-docs v2.0.0 2021-11-19 19:59:19 -06:00
David Lechner e77b3dcf4d v3.1.0rc1 2021-11-19 19:42:07 -06:00
David Lechner b6d1eef2a1 pybricks.iodevices.LWP3Device: add api and docs
This adds docs and API stubs for pybricks.iodevices.LWP3Device.

Fixes: https://github.com/pybricks/support/issues/534
2021-11-19 19:31:53 -06:00
David Lechner 20cb5fdde5 doc: make all titles sentence case
This makes the casing of titles consistent throughout the docs.

Fixes: https://github.com/pybricks/pybricks-api/issues/75
2021-11-19 19:30:57 -06:00
David Lechner 2f574e8c03 pybricks.pupdevices.ColorLightMatrix: add api and docs
This adds the SPIKE 3x3 Color Light Matrix to the API and docs.
2021-11-19 19:30:57 -06:00
David Lechner 9d8531a85b npm/ide-docs: move npm packaging to separate directory
This makes a clean separation between the packaging and the docs.
2021-11-19 19:30:57 -06:00
David Lechner fee122cf33 CHANGELOG: move to top level
This makes the CHANGELOG easy to find.
2021-11-19 16:37:38 -06:00
David Lechner f42ed06d4f doc/main/CHANGELOG: use keepachangelog.com recommendations
This updates the changelog to use keepachangelog.com recommendations
to make it consistent with other Pybricks changelogs.
2021-08-30 13:29:38 -05:00
David Lechner a8126f0bed doc/main: fix dir in package.json
Another case of a missed ide to main directory.
2021-08-30 12:20:44 -05:00
David Lechner 2c4685f594 doc/main: add TAG make option
This splits the Sphinx tag option from SPHINXOPTS. This allows us to
specify the tag without having to remember to add -W and -t. It also
fixes not being able to specify the tag with make.bat on Windows.

While we are touching this, redundant SOURCEDIR uses are removed (main
is already the default) and the .github/workflows/publish-ide-docs.yml
script is fixed (ide directory no longer exists).
2021-08-30 12:14:34 -05:00
David Lechner 8b0f98d25b @pybricks/ide-docs v1.6.0 2021-08-30 11:12:05 -05:00
Laurens Valk dd2e6e8603 ubuiltins.int: Document from_bytes manually.
Sphinx fails to show the docsting for class methods. Since we have very few of them, it is easier to just document this one manually

Fixes https://github.com/pybricks/pybricks-api/issues/86
2021-08-22 12:15:42 +02:00
Laurens Valk a0f4818e26 ubuiltins.int: Document it. 2021-08-06 14:59:45 +02:00
Laurens Valk af23c10566 ubuiltins.float: Document it.
Override typed docstrings in order to hide types like SupportsFloat.
2021-08-06 14:58:19 +02:00
Laurens Valk d7096dad80 ubuiltins.complex: Document it.
Override typed docstrings in order to hide types like SupportsFloat and SupportsComplex.

Avoid use of ``real`` and ``imag``, since both ``a`` and ``b`` can be
either.

Also reduce number of overloads by letting ``b`` default to 0, which is true in practice.

See also https://github.com/pybricks/pybricks-api/issues/84
2021-08-06 14:25:00 +02:00
Laurens Valk 1d2b1f0307 rtd-requirements: Update to Sphinx 4.1
See https://github.com/pybricks/pybricks-api/issues/70
2021-08-06 10:47:14 +02:00
Laurens Valk 9945b43713 pyproject: Update to Sphinx 4.1.
Also bump to a development version of sphinx-rtd-theme that supports Sphinx 4.

Fixes https://github.com/pybricks/pybricks-api/issues/70
2021-08-06 10:40:26 +02:00
Laurens Valk 4124e1dd4e doc/common/conf: Drop unused imports.
These prevent us from upgrading Sphinx and they aren't being used anyway.

Fixes e4c7e5abeb
2021-08-06 10:07:42 +02:00
Laurens Valk d86b5584fb ubuiltins: Type enumerate as a class.
This reverts commit a0ea0d8ca0 because of https://github.com/pybricks/pybricks-api/issues/72
2021-08-06 09:51:52 +02:00
Laurens Valk 1c01e981e0 usys: Clean up.
Add requirements, drop autodoc, and add a few cross references.
2021-08-05 16:13:50 +02:00
Laurens Valk 8a6ddf677c pybricks.pupdevices.Remote: Light examples. 2021-08-05 14:56:00 +02:00
Laurens Valk 5d4481dbb0 pybricks.pupdevices.ColorDistanceSensor: Drop duplicate example. 2021-08-05 13:45:57 +02:00
Laurens Valk 786770cff2 ubuiltins.bool: Use arguments.
https://github.com/pybricks/pybricks-api/issues/82
2021-08-05 12:49:44 +02:00
Laurens Valk 572b573d2f ubuiltins: Fix _type typos.
This was accidentally introduced via https://github.com/pybricks/pybricks-api/issues/71 by replacing too many things automatically.
2021-08-05 12:33:00 +02:00
Laurens Valk 15bd870140 ubuiltins: Use argument layout.
https://github.com/pybricks/pybricks-api/issues/82
2021-08-05 12:32:56 +02:00
Laurens Valk b101d1992d ubuiltins.print: Use English. 2021-08-05 12:32:51 +02:00
Laurens Valk b013204f88 ubuiltins.input: Say what it does.
The docstring said something about an argument, but not what this function is for.
2021-08-05 12:32:47 +02:00
Laurens Valk b3c5353dd6 ubuiltins: Reorganize page.
Fixes https://github.com/pybricks/pybricks-api/issues/80
2021-08-05 12:32:41 +02:00
Laurens Valk 0ecf536cda ubuiltins: Add compatibility everywhere.
This lets us sort everything by category or alphabetically without having to make special categories for Move Hub.
2021-08-05 12:32:37 +02:00
David Lechner f2124615ba ubuiltins: List decorators in separate section.
This moves the built-in decorators to their own section and uses
`autodecorator` to indicate they are decorators.
2021-08-05 12:32:29 +02:00
Laurens Valk 49ade9d9c6 pybricks.robotics: Show compatibility. 2021-08-05 12:32:03 +02:00
Laurens Valk 045312921e pybricks.geometry: Show compatibility. 2021-08-05 12:32:03 +02:00
Laurens Valk 39f58b9e03 pybricks.tools: Show compatibility. 2021-08-05 12:32:03 +02:00
Laurens Valk a0467b8d8e doc/common/requirements: Fix image paths.
This ensures that the requirements directive works regardless of the depth of the document in the tree.
2021-08-05 12:32:03 +02:00
Laurens Valk 4945156d9a pybricks.parameters: Show compatibility. 2021-08-05 12:32:03 +02:00
Laurens Valk 97b2de46ac pybricks.hubs: Show compatibility. 2021-08-05 12:32:03 +02:00
Laurens Valk e8d7281626 doc/common/requirements: A hub supports itself.
This way we can do the following, which is useful if it cannot be expressed in terms of other requirements.

.. pybricks-requirements:: movehub

A good example is on the specific hub page itself. The Move Hub requires the Move Hub.
2021-08-05 12:32:03 +02:00
Laurens Valk 979da8b170 pybricks.pupdevices: Show compatibility. 2021-08-05 12:32:03 +02:00
Laurens Valk ac4a913be3 doc/common/requirements: Toggle hub table.
This makes it possible to hide/unhide the compatibility table.

It is adapted from the sphinxcontrib-contentui extension: https://github.com/ulrobix/sphinxcontrib-contentui
2021-08-05 12:32:03 +02:00
Laurens Valk 31a30f380f doc/common/requirements: Rename to static.
We will work on a version that can be toggled dynamically. It will just include this static version. This keeps things simple and still lets
us use the static version as needed.
2021-08-05 12:32:03 +02:00
Laurens Valk 87dacfbf76 doc/common/extensions/requirements: Allow none.
With no requirements imposed, this means all hubs will work.
2021-08-05 12:32:03 +02:00
Laurens Valk b02895e5fc ubuiltins: Use raw strings for inline math.
This resolves the following warnings:
./src/ubuiltins/__init__.py:143:31: W605 invalid escape sequence '\l'
./src/ubuiltins/__init__.py:143:38: W605 invalid escape sequence '\l'
./src/ubuiltins/__init__.py:174:31: W605 invalid escape sequence '\l'
./src/ubuiltins/__init__.py:174:38: W605 invalid escape sequence '\l'
2021-08-05 12:32:21 +02:00
Laurens Valk 486ac60ea0 ubuiltins.bool: Clarify docs.
Avoid double and triple negatives.
2021-08-05 12:32:17 +02:00
Laurens Valk a3b6507a15 ubuiltins.bytes: Clarify docs. 2021-08-05 12:32:14 +02:00
Laurens Valk 75bc15f071 ubuiltins: Add bytearray. 2021-08-05 12:32:03 +02:00
Laurens Valk 0b9280a8df uerrno: Display on separate page.
Fixes https://github.com/pybricks/pybricks-api/issues/78
2021-08-02 11:01:20 +02:00
David Lechner 677656f669 pybricks.robotics.DriveBase: Fix arg name in type hints.
This fixes the `speed` arg name in the `DriveBase.drive()` method in the type hint file. Fixes #76.
2021-07-30 15:27:09 -05:00
Laurens Valk a8ab8b2314 pybricks.pupdevices.Motor: Add reset_angle kwarg.
Documents https://github.com/pybricks/support/issues/389
2021-07-28 16:07:53 +02:00
Laurens Valk 62bb262b96 pybricks.pupdevices.Remote: Add more examples. 2021-07-28 14:50:43 +02:00
Laurens Valk 8463206f8e pybricks.pupdevices.Remote: Add name().
https://github.com/pybricks/support/issues/404
2021-07-28 13:41:00 +02:00
Laurens Valk 1cf6f8d31b pybricks.iodevices: Document availability. 2021-07-27 15:55:38 +02:00
Laurens Valk a0bd4a6812 doc/common/extensions: Show compatibility on hub.
This simplifies the table and reduces its size.

Also copy assets manually since Sphinx does not automatically copy
images to _images when used for custom directives.
2021-07-27 15:43:13 +02:00
Laurens Valk efc907fb0c doc/main: Add hub compatibility icons.
Also render to git tree.
2021-07-27 14:56:11 +02:00
Laurens Valk be0903de9e doc/common/extensions: Basic styling.
Turns it into a table with images, using builtin RTD classes for CSS.
2021-07-26 15:47:02 +02:00
Laurens Valk 20361971da doc/main/images: Crop City Hub.
This hub had extra whitespace so they were all the same height, but this is no longer needed in the current layout.
2021-07-26 15:03:42 +02:00
Laurens Valk cefa78270a doc/common/extensions: Add requirements directive.
Displays compatibility for each hub depending on its features.
2021-07-26 12:18:55 +02:00
Laurens Valk 1f5eb1790b doc/main/package: Reenable warnings as errors.
This gets disabled when overriding SPHINXOPTS.
2021-07-23 15:59:33 +02:00
Laurens Valk 84335d0032 doc/make: Build main doc target by default.
Less typing is better.
2021-07-23 15:46:58 +02:00
Laurens Valk cb74f8e302 doc/main: Move signals to Pybricks TOC.
This was the only remaining section under "extras", so it is better to have it elsewhere. Since it only applies to the Pybricks package, put it there.

Also rename Pybricks Modules heading to Pybricks Package, since it behaves more like a package in contrast with the MicroPython modules that we now document as well.
2021-07-23 15:38:05 +02:00
Laurens Valk 78bd21b197 pybricks.common.Control: Drop feed_forward.
The implementation no longer includes this, so it is removed from the docs as well.

Fixes https://github.com/pybricks/pybricks-api/issues/74
2021-07-23 15:35:13 +02:00
Laurens Valk 24bba6d24c pybricks.pupdevices.Motor: Document control here.
Based on user feedback, we learned that the control attribute is used more frequently than anticipated. Therefore it makes sense to document it here, just like we do with instances of pybricks.common classes in hubs.

This makes it a bit easier to find and see how it is used, along with some of the existing examples.
2021-07-23 15:33:18 +02:00
Laurens Valk 0edddbb0c2 pybricks.common.Control: Fix scale doc.
Document it as an attribute instead of in the main docstring. This way we can choose where it shows up in the docs.
2021-07-23 14:51:21 +02:00
Laurens Valk a11af0845b doc/main/motors: Drop commented sections.
This is not going to be completed here in the API docs.
2021-07-23 14:37:28 +02:00
Laurens Valk 3b71bce0b0 doc/main: Build IDE docs from main docs.
With EV3 dropped from the 3.X documentation, the main docs are now nearly identical to the IDE docs, save for some layout changes.

Having just one set of docs is easier to maintain. This drops the IDE doc target.
2021-07-23 12:56:33 +02:00
Laurens Valk 434ff5e346 doc/common/conf: Keep IDE conf settings.
We are going to be deleting the ide build files, so make sure we keep what's needed.
2021-07-23 12:45:30 +02:00
Laurens Valk f7239fc9a9 pybricks.parameters.Port: Drop EV3 sensor ports.
We can restore these if the docs cover EV3 once more.
2021-07-23 12:35:46 +02:00
Laurens Valk 7e13611bc5 doc/common/conf: Default to main on RTD.
It would be nicer to specify this in the .readthedocs.yaml file, but this appears to not to be supported.
2021-07-23 12:34:10 +02:00
Laurens Valk 78feab8949 pybricks.tools: Drop Datalog class from doc.
We can unhide this if/when we support this on Powered Up.
2021-07-23 11:35:32 +02:00
Laurens Valk f692e5a127 pybricks.iodevices: Drop EV3 specific devices.
Some of these could be brought back if we add Powered Up support.
2021-07-23 11:32:01 +02:00
Laurens Valk fbd843cb54 doc/main/index: Unify IDE and main build.
The `only` directive can be used to include content selectively. It cannot be used to select a different TOC, which is why we resorted to separate doc builds before.

Now that we have dropped EV3 references from the docs, we can use a single build and just customize the content on the landing page with the only directive.

The docs can now be built with:

# Main docs:
make -C doc html SPHINXOPTS=-tmain

# IDE docs:
make -C doc html SPHINXOPTS=-tide
2021-07-23 11:25:51 +02:00
Laurens Valk e4c7e5abeb doc/common/conf: Drop class method hack.
This can be traced back to 0013a74d72 and 92e3735d63.

It was used to work around things like

sound.beeps(number)
   Description

being incorrectly displayed as

classmethod sound.beeps(number)
   Description

But the current version of sphinx appears to display this correctly even without the hack. We want to reduce the number of hacks because they tend to break updates (https://github.com/pybricks/pybricks-api/issues/69#issuecomment-879822417).
2021-07-23 11:04:03 +02:00
Laurens Valk 8d521c1b1f doc/common/conf: Drop EV3 hack.
This is no longer required, perhaps not even for EV3. For example, PrimeHub.speaker looks as intended.

We want to reduce the number of hacks because they tend to break updates (https://github.com/pybricks/pybricks-api/issues/69#issuecomment-879822417).
2021-07-23 10:48:07 +02:00
Laurens Valk 1be7fce116 doc/main: Drop EV3 references.
To make the documentation easier to use and maintain, EV3 content will be hidden.

The stable 2.0 docs should be used for EV3 instead.
2021-07-23 10:41:34 +02:00
Laurens Valk 5ab81dc732 doc/main: Update landing page with link to EV3. 2021-07-21 19:27:45 +02:00
Laurens Valk 72e0d87f77 ubuiltins: Examples for common exceptions. 2021-07-21 14:53:56 +02:00
Laurens Valk 923e8caf84 ubuiltins: Organize exceptions. 2021-07-21 11:12:51 +02:00
Laurens Valk e8d47ffca1 uerrno: Document alongside OSError.
These are meant to be used together, so document them in the same place along with a practical example.
2021-07-19 15:03:10 +02:00
Laurens Valk 2c32d093d0 ubuiltins.bytes: Clarify range up to 255.
Be consistent and use <= for both. A bit more intuitive because the number 256 cannot be used in bytes objects.
2021-07-16 16:12:43 +02:00
Laurens Valk ba6d7ac3f5 ubuiltins: Fix unwanted ubuiltins prefix.
Fixes https://github.com/pybricks/pybricks-api/issues/71.
2021-07-16 16:07:55 +02:00
Laurens Valk 64ea5e341c ubuiltins: Sort classes and functions by use case. 2021-07-16 16:07:55 +02:00
Laurens Valk a0ea0d8ca0 ubuiltins: Document enumerate as a function.
Though it is technically its own type in MicroPython, this change follows the CPython documentation. Essentially this just drops the class prefix and leaves everything else unchanged.

This makes more sense when organizing this module by classes and functions. It's also a bit more logical since the equivalent example we provoide is a function definition, not a class definition.
2021-07-16 16:07:55 +02:00
Laurens Valk 29404babcf ubuiltins: Split out automodule.
List all functions and classes explicitly so we can organize them by category in later commits.

Also split out exceptions and uerrno to dedicated page because the builtins page was getting very long and hard to navigate.
2021-07-16 16:07:46 +02:00
Laurens Valk 3b1fd091f1 micropython: Add examples for memory stats. 2021-07-14 16:08:52 +02:00
Laurens Valk cd7d5be748 micropython.stack_info: Clean up docstring.
Reword to say how it useful, not how it is not useful.

Also fix return type.
2021-07-14 15:36:18 +02:00
Laurens Valk 97e368312e micropython.qstr_info: Clean up docstring.
Say the same with less words. Also add one line from elsewhere in the MicroPython docs to explain what this is about.
2021-07-14 15:32:28 +02:00
Laurens Valk 28af77fcfc micropython.mem_info: Clean up docstring.
Say the same with less words.
2021-07-14 15:31:41 +02:00
Laurens Valk 3ed6e2dd7d micropython.opt_level: Clarify docstring.
Just list what each level does instead of a complicated if-then bullet list. It's still shorter anyway.

Also add a note that this only applies to REPL code in case of Pybricks.
2021-07-14 15:13:26 +02:00
Laurens Valk 4c00c3209b micropython.const: Improve docstring, add example.
This merges the useful information from two different places:
- The original docstring for const.
- Writing MicroPython code for constrained devices.

Also reduce type to just int, because only ints are supported.
2021-07-14 14:48:59 +02:00
Laurens Valk c656eae2f3 micropython: Drop TConst type.
TConst does not exist, so adding it makes it a bit harder to read than needed. The const() "function" will take int or float, and the return value can be used as such, even if it is optimized out. This is described in the docstring, so we can leave out the additional type.

Also adds autofunctions in place of one auto module so we can move things around as needed. Also fix cross links with usys to get the build to pass before we update that module.
2021-07-14 14:13:18 +02:00
Laurens Valk 456dc28c1b .readthedocs: Add configuration file.
When this file is present, the settings in the online dashboard will be ignored.

This lets us explicitly set the Python version, in this case to 3.8 to match pyproject.toml.

Fixes https://github.com/pybricks/pybricks-api/issues/68.
2021-07-14 13:06:30 +02:00
Laurens Valk 238204d280 doc/main: Rename from doc/api.
The doc/api is a legacy name, which is confusing in the current use, since all build targets are now APIs.

Today we have:

doc/common: Common configuration and settings between all targets.

doc/main: Main Pybricks documentation at docs.pybricks.com.

doc/ide: Documentation shipped with the Pybricks Code IDE.
2021-07-14 11:39:20 +02:00
Laurens Valk 55aec445b1 CONTRIBUTING: Update commit message guidelines. 2021-07-14 11:39:20 +02:00
Laurens Valk 7f622927ff CHANGELOG: Add recent changes. 2021-07-14 11:39:20 +02:00
Laurens Valk 8384a10c2d doc/ide/index: Enable MicroPython modules. 2021-07-14 11:39:20 +02:00
Laurens Valk 619fa0c968 doc/main: Group MicroPython rst files.
They are easier to find when they are not mixed with Pybricks docs.
2021-07-14 11:39:25 +02:00
Laurens Valk 1fab46e67f doc/main/index: Clean up menu and builtins.
There is no ubuiltins module, so we shouldn't mention it.

Also reduce size of other module titles so they fit on one line in the
menu. This makes it easier to read and get an overview.
2021-07-14 11:39:20 +02:00
Laurens Valk 727ec3fe46 umath: Redo module docs.
This reworks the documentation for the umath module, as done previously as per https://github.com/pybricks/pybricks-api/pull/64 and https://github.com/pybricks/pybricks-api/issues/63

The presentation and docstrings are inspired by the Python 3 math module documentation instead of the MicroPython math module documentation. Functions are grouped roughly by use case.
2021-07-14 11:22:04 +02:00
Laurens Valk a0e4ffdb5c umath: Use umath for math.
Do this for all Powered Up examples.
2021-07-14 11:22:04 +02:00
Laurens Valk 9b8a66e3da pybricks.hubs.PrimeHub: Add system examples. 2021-07-14 09:43:34 +02:00
Laurens Valk 9944cf3adf pybricks.common.System: Add name() getter. 2021-07-14 09:43:20 +02:00
David Lechner 286079fe68 ubuiltins: add stubs and docs for ubuiltins module
Issue: https://github.com/pybricks/support/issues/236
2021-07-14 09:41:30 +02:00
David Lechner d492b04402 umath: add stubs and docs for umath module
Issue: https://github.com/pybricks/support/issues/236
2021-07-14 09:41:30 +02:00
David Lechner 818409f675 usys: add stubs and docs for usys module
Issue: https://github.com/pybricks/support/issues/236
2021-07-14 09:41:30 +02:00
David Lechner 9dd131142e uselect: add stubs and docs for uselect module
Issue: https://github.com/pybricks/support/issues/236
2021-07-14 09:41:30 +02:00
David Lechner f828d11f40 urandom: add stubs and docs for urandom module
Issue: https://github.com/pybricks/support/issues/236
2021-07-14 09:41:30 +02:00
David Lechner 532639b820 uio: add stubs and docs for uio module
Issue: https://github.com/pybricks/support/issues/236
2021-07-14 09:41:30 +02:00
David Lechner 0865a58632 uerrno: add uerrno module stubs and docs
Issue: https://github.com/pybricks/support/issues/236
2021-07-14 09:41:30 +02:00
David Lechner 0eb0e160e9 micropython: Add stubs and docs for micropython module
Issue: https://github.com/pybricks/support/issues/236
2021-07-14 09:41:30 +02:00
David Lechner 7126431f9f pybricks: move into src/ directory
Moving the pybricks package into a src/ directory so that we can add
additional packages without polluting the top-level directory.
2021-07-14 09:41:30 +02:00
Laurens Valk 5a8baeff4c pybricks.hubs: Add system examples. 2021-07-07 09:58:51 +02:00
Laurens Valk a2801aff41 pybricks.hubs: Enable single button. 2021-07-07 09:47:28 +02:00
Laurens Valk 76432120c4 pybricks.common.System: Add shutdown method.
Also drop reset() and update reset_reason() after https://github.com/pybricks/support/issues/379
2021-07-07 09:47:35 +02:00
Laurens Valk 3ce741ac2b pybricks.common.System: Add initial documentation. 2021-07-07 09:47:28 +02:00
486 changed files with 13475 additions and 5957 deletions
+15 -3
View File
@@ -3,7 +3,19 @@
name: Build Python package and docs
on: [ push, pull_request ]
on:
push:
tags-ignore:
- "*"
pull_request:
paths:
- doc/**
- src/**
- poetry.lock
- poetry.toml
- pyproject.toml
- setup.cfg
jobs:
build:
@@ -35,9 +47,9 @@ jobs:
run: poetry run doc8
- name: Build html docs for Read the Docs
run: poetry run make -C doc html
- name: Instal IDE docs dependencies
- name: Install IDE docs dependencies
run: |
sudo apt-get update
sudo apt-get install dvisvgm preview-latex-style texlive texlive-fonts-extra texlive-latex-extra
- name: Build html docs for Pybricks Code IDE
run: poetry run make -C doc html SOURCEDIR=ide
run: poetry run make -C doc html TAG=ide
+36
View File
@@ -0,0 +1,36 @@
name: pybricks_jedi
on: [push, pull_request]
jobs:
test:
if: github.ref_type != 'tag'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: "3.10"
- run: pipx install poetry
- run: poetry install
working-directory: ./jedi
- run: poetry run pytest -vv
working-directory: ./jedi
publish:
if: github.ref_type == 'tag' && startsWith(github.ref_name, 'pybricks_jedi/')
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: "3.10"
- run: pipx install poetry
- run: poetry install
working-directory: ./jedi
- run: poetry build
working-directory: ./jedi
- run: poetry publish
working-directory: ./jedi
env:
POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_PYBRICKS_JEDI_TOKEN }}
+2 -2
View File
@@ -31,8 +31,8 @@ jobs:
node-version: '14.x'
registry-url: 'https://registry.npmjs.org'
- run: yarn build
working-directory: doc/ide
working-directory: npm/ide-docs
- run: yarn publish
working-directory: doc/ide
working-directory: npm/ide-docs
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
+23
View File
@@ -0,0 +1,23 @@
name: Release @pybricks/jedi
on:
push:
tags:
- '@pybricks/jedi/**'
jobs:
publish_ide_docs:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
# Setup .npmrc file to publish to npm
- uses: actions/setup-node@v3
with:
node-version: '16.x'
registry-url: 'https://registry.npmjs.org'
- run: ./build.py
working-directory: npm/jedi
- run: yarn publish
working-directory: npm/jedi/build
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
+3 -1
View File
@@ -26,8 +26,9 @@ build/
build-*/
_build/
# Test failure outputs
# Tests
######################
.pytest_cache/
tests/*.exp
tests/*.out
@@ -57,3 +58,4 @@ genrst/
# Virtual environment
######################
.venv/
.python-version
+22
View File
@@ -0,0 +1,22 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
#
# Settings in the readthedocs online dashboard will be ignored.
# Required
version: 2
# Build documentation in the doc/main directory with Sphinx
sphinx:
configuration: doc/main/conf.py
# Build your docs in additional formats such as PDF
formats:
- pdf
# Set the version of Python and requirements required to build the docs
python:
version: 3.8
install:
- requirements: rtd-requirements.txt
+25 -4
View File
@@ -1,12 +1,26 @@
{
"python.pythonPath": "${workspaceFolder}/.venv",
"files.exclude": {
"**/__pycache__": true,
},
"python.autoComplete.extraPaths": ["jedi/src"],
"python.formatting.provider": "black",
"python.linting.pycodestyleEnabled": false,
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,
"python.linting.pycodestyleEnabled": false,
"python.linting.enabled": true,
"[python]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "ms-python.python"
},
"python.languageServer": "Pylance",
"python.testing.pytestArgs": [
"jedi/tests"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
"files.associations": {"*.inc": "restructuredtext"},
"restructuredtext.confPath": "${workspaceFolder}/doc/api",
"restructuredtext.confPath": "${workspaceFolder}/doc/main",
"spellright.language": [
"en_US"
],
@@ -34,5 +48,12 @@
"plaintext",
"python",
"restructuredtext",
]
],
"rewrap.wrappingColumn": 78,
"python.analysis.extraPaths": [
"jedi/src"
],
"yaml.schemas": {
"https://json.schemastore.org/github-workflow.json": "file:///home/david/work/pybricks/pybricks-api/.github/workflows/build.yml"
},
}
+1
View File
@@ -78,3 +78,4 @@ thermistor
toctree
TODO
UART
utf-8
+132
View File
@@ -0,0 +1,132 @@
# Changelog
<!-- refer to https://keepachangelog.com/en/1.0.0/ for guidance -->
## Unreleased
### Added
- Code auto-completion for `EssentialHub`.
### Fixed
- Fixed some type hints in `parameters` submodule.
## 3.2.0b1-r3 - 2022-06-26
### Fixed
- Fixed more type hints and improved compatibility with jedi.
## 3.2.0b1-r2 - 2022-06-24
### Changed
- Moved remaining type hints from `.pyi` files to the python stub modules, and
fixed numerous errors in the type hints throughout.
## 3.2.0b1-r1 - 2022-06-09
## Added
- Added `__init__.py` to `pybricks` package.
## 3.2.0b1 - 2022-06-02
### Added
- Code auto-completion for `hub.charger`, `hub.imu` and `hub.system`.
- Moved typing from several `.pyi` files to the actual python modules.
### Fixed
- Fixed code completion for `DCMotor` and `Motor` classes in MS Python VS Code extension.
- Fixed missing `DCMotor` type in `ev3devices`.
- Fixed type hint for `Motor.reset_angle()` in `pupdevices`.
### Changed
- Setter for acceleration can now also be used to set acceleration and
deceleration to different values, using a two-valued tuple.
## 3.1.0 - 2021-12-16
### Added
- Added maximum voltage setter for `DCMotor` and `Motor`.
- Documented `DriveBase.curve()` method.
### Changed
- Removed `duty` setting from `Control.limits` method.
- Removed `integral_range` setting from `Control.pid` method.
### Fixed
- Fixed link to Color Light Matrix page.
- Fixed link to Inventor Hub page.
## 3.1.0rc1 - 2021-11-19
### Added
- Added `ColorLightMatrix` class.
- Added `LWP3Device` class.
**NOTE: version number after this point were from JavaScript package and do
not correspond to Pybricks firmware version numbers.**
## 1.6.0 - 2021-08-30
### Added
- MicroPython module documentation.
- Examples for hub system functions including stop button and shutdown.
### Changed
- Build IDE docs as main docs with minor changes, instead of a completely
separate build.
- Moved motor control documentation to the motor page.
## 1.5.0 - 2021-07-01
### Added
- Documentation for Powered Up Remote Control.
## 1.4.0 - 2021-06-23
### Added
- Enabled beta content that was hidden for the 3.0 release.
- Added notice about using the latest beta version.
## 1.3.3 - 2021-05-21
### Changed
- Match example snippet styling to IDE.
- Add more examples.
## 1.3.2 - 2021-04-26
## Changed
- Theme style fixes.
- Example code fixes
- Match doc version to firmware version.
## 1.3.1 - 2021-04-12
### Changed
- Upgrade sphinx and rtd-theme to fix style issues.
## 1.3.0 - 2021-04-12
### Removed
- Removed features which not be in the official 3.0 release. These features
are still in beta. They'll come back in future releases once tested.
## 1.2.0 - 2021-04-09
### Changed
- Moved installation guide to external site.
## 1.1.1 - 2021-02-14
### Added
- Added installation guide.
- Various documentation fixes.
## 1.1.0 - 2021-01-28
### Added
- Scrollbar styling.
## 1.0.0 - 2021-01-25
### Added
- Sphinx build output.
+104 -15
View File
@@ -20,23 +20,103 @@ will actually be implemented.
- Commit messages have a one-line subject, a blank line and a multiline body:
prefix: subject
prefix: Subject of the change.
body...
- Use a prefix to categorize the change. Usually this is the path the the file
being changed.
- If it is a documentation change, it can be shortened to `doc/<file>` (omit
`api` from the path).
- If it is an API change (in the `pybricks` folder), write `api/<file>`
instead of `pybricks/<file>`.
- The subject briefly describes _what_ was changed, e.g. `fix typo`.
- Use a prefix to categorize the change:
- Use the import path as the prefix whenever possible. Examples:
- pybricks.tools: Add StopWatch class.
- pybricks.tools: Reorganize RST files.
- pybricks.tools.StopWatch: Fix return type.
- pybricks.tools.wait: Add example of waiting.
- pybricks.pupdevices: Fix all sensor class ports.
- umath.sin: Fix spelling of Hypotenuse.
- If an import path makes no sense, just use the file path without
extensions:
- .vscode/settings: Fix file associations.
- The subject briefly describes _what_ was changed. Use a short full sentence
as in the examples above.
- The body describes _why_ the change was made, e.g. `The word "sensor" was
spelled incorrectly`.
- See the [commit history][commits] for more examples.
[commits]: https://github.com/pybricks/pybricks-api/commits/master
**General docstring principles:**
The stubs libraries in this repository have two different purposes:
1. Auto-generating documentation with Sphinx. For this purpose, the
documentation should be concise and clear.
2. Provide autocomplete and intellisense in code editors. For this purpose,
the code needs to be 100% correct. This way, computers can parse your code
correctly and tell you when something is wrong.
Since these objectives don't always align, we address these separately in the
stubs library:
1. The first line(s) of the docstring contain the function or method signature
as it should be displayed in the human-readable documentation.
2. The real function signature can be as complex as it needs to be to make it
correct for intellisense. Overloads can be uses if needed.
In the rare case where the docstring signature is the same as the typed
version, we'll still include it for consistency.
**Docstring details:**
Make sure to look at existing function signatures and docstrings for
inspiration when documenting new functionality. As an example, consider:
```python
def run_until_stalled(
self,
speed: Number,
then: Stop = Stop.COAST,
duty_limit: Optional[Number] = None,
) -> int:
"""
run_until_stalled(speed, then=Stop.COAST, duty_limit=None) -> int: deg
Runs the motor at a constant speed until it stalls.
Arguments:
speed (Number, deg/s): Speed of the motor.
then (Stop): What to do after coming to a standstill.
duty_limit (Number, %): Duty cycle limit during this
command. This is useful to avoid applying the full motor
torque to a geared or lever mechanism. If it is ``None``, the
duty limit won't be changed during this command.
Returns:
Angle at which the motor becomes stalled.
"""
```
The real method signature at the top contains the full detail, including the
type of each argument and return value.
The docstring starts with the signature. Use more than one signature if needed
to represent overloaded methods. The signatures are written in the way they
should be displayed in the docs:
- Argument types are omitted because they are also shown with the argument
description below.
- Default values should be given (``then=Stop.COAST``).
- The return type should be given (``-> int``). When applicable, include
the unit of the return value, so it becomes ``-> int: deg``
Then follows a concise description of what this method, function, or class
does.
Then follows a list of arguments:
- For each argument, include the expected type and unit if applicable, e.g.
``(int)`` or ``(Number, deg/s)``.
- Use ``Number`` when ``int`` and ``float`` are both allowed.
- If the description is long, use the indentation shown above.
- Make it readable. Instead
of ``Union[float, SupportsFloat, complex, SupportsComplex]``,
just say _float or complex_.
Then follows a description of the return value. The type is omitted here since
it is already include in the docstring signature.
**Development environment:**
@@ -46,8 +126,8 @@ Prerequisites:
- [Python 3][python]
- [Poetry][poetry]
Information on installing prerequisites can be found on the [pybricks-micropython
wiki][wiki].
Information on installing prerequisites can be found on the
[pybricks-micropython contributor's guide][contributing].
Initial setup:
@@ -59,15 +139,24 @@ Build docs:
# Linux
poetry run make -C doc html
xdg-open doc/api/build/html/index.html
xdg-open doc/main/build/html/index.html
# macOS
poetry run make -C doc html
open doc/api/build/html/index.html
open doc/main/build/html/index.html
# Windows (PowerShell)
poetry run doc\make.bat html
Invoke-Item doc\api\build\html\index.html
Invoke-Item doc\main\build\html\index.html
Building IDE docs variant:
# Linux/macOS
poetry run make -C doc html TAG=ide
# Windows (PowerShell)
$env:TAG="ide"
poetry run doc\make.bat html
Linting:
@@ -78,4 +167,4 @@ Linting:
[git]: https://git-scm.com/
[python]: https://www.python.org/
[poetry]: https://python-poetry.org/
[wiki]: https://github.com/pybricks-micropython/wiki
[contributing]: https://github.com/pybricks/pybricks-micropython/blob/master/CONTRIBUTING.md
+4 -3
View File
@@ -5,12 +5,13 @@
SPHINXOPTS = -W
SPHINXBUILD = sphinx-build
SPHINXPROJ = Pybricks
SOURCEDIR = api
SOURCEDIR = main
BUILDDIR = "$(SOURCEDIR)"/build
TAG = main
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(TAG) $(O)
.PHONY: help Makefile
@@ -21,4 +22,4 @@ diagrams:
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) -t $(TAG) $(O)
-22
View File
@@ -1,22 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Pybricks documentation build configuration file
#
import os
# General information about the project.
project = 'pybricks'
copyright = '2018-2021 The Pybricks Authors'
author = ''
_TITLE = 'Pybricks Modules and Examples'
_DISCLAIMER = 'LEGO, the LEGO logo, MINDSTORMS and the MINDSTORMS EV3 logo are\
trademarks and/or copyrights of the LEGO Group of companies \
which does not sponsor, authorize or endorse this site.'
html_favicon = '../common/images/favicon.ico'
html_logo = '../common/images/pybricks-logo-rtd.png'
latex_logo = '../common/images/pybricks-logo-large.png'
exec(open(os.path.abspath("../common/conf.py")).read())
-13
View File
@@ -1,13 +0,0 @@
0 Name: pupmotors.ldr
0 Author: Pybricks {laurens@pybricks.com}
0 !LICENSE MIT
0 ROTATION CENTER 0 0 0 1 "Custom"
0 ROTATION CONFIG 0 0
1 15 430 -96 190 0 0 1 1 0 0 0 1 0 54675c01.dat
1 15 430 -96 400 0 0 1 1 0 0 0 1 0 54675c01.dat
1 322 430 -72 30 0 0 1 1 0 0 0 1 0 54696c01.dat
1 71 430 -72 -180 0 0 1 1 0 0 0 1 0 54696c01.dat
1 71 190 -144 -180 1 0 0 0 1 0 0 0 1 22169c01.dat
1 71 -20 -216 -140 1 0 0 0 1 0 0 0 1 22172c01.dat
1 15 120 -320 160 1 0 0 0 1 0 0 0 1 26913c01.dat
0
Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 KiB

-51
View File
@@ -1,51 +0,0 @@
City Hub
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. figure:: ../../api/images/cityhub.png
:height: 15 em
.. autoclass:: pybricks.hubs.CityHub
:no-members:
.. rubric:: Using the hub status light
.. automethod:: pybricks.hubs::CityHub.light.on
.. automethod:: pybricks.hubs::CityHub.light.off
.. automethod:: pybricks.hubs::CityHub.light.blink
.. automethod:: pybricks.hubs::CityHub.light.animate
.. rubric:: Using the battery
.. automethod:: pybricks.hubs::CityHub.battery.voltage
.. automethod:: pybricks.hubs::CityHub.battery.current
Status light examples
---------------------
Turning the light on and off
****************************
.. literalinclude::
../../../examples/pup/hub_cityhub/light_off.py
Changing brightness and using custom colors
*******************************************
.. literalinclude::
../../../examples/pup/hub_cityhub/light_hsv.py
Making the light blink
**********************
.. literalinclude::
../../../examples/pup/hub_cityhub/light_blink.py
Creating light animations
*************************
.. literalinclude::
../../../examples/pup/hub_cityhub/light_animate.py
Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1009 KiB

-82
View File
@@ -1,82 +0,0 @@
Pybricks API Documentation
==================================================================
This documentation has everything you need to install Pybricks and
run your first scripts.
**Step 1: Install Pybricks**
Pybricks scripts are the same across all hubs. The only difference is in how
you install Pybricks and how you run scripts. To get started, click one of
the platforms below.
.. list-table::
* - **MINDSTORMS EV3**
- **Powered Up (Technic/City/BOOST)**
- **SPIKE / MINDSTORMS Inventor**
* - .. image:: ../api/images/ev3brick.png
:target: https://pybricks.com/install/mindstorms-ev3/installation
- .. figure:: ../api/images/powereduphubs.png
:target: https://pybricks.com/install/technic-boost-city/
- .. figure:: ../api/images/primeinventorhub.png
:target: https://pybricks.com/install/spike-mindstorms/
**Step 2: Start coding!**
After you've followed the installation steps for your hub,
check out the Pybricks modules in the left hand menu to see what
you can do.
**Step 3: Share what you made (or ask for help!)**
Got questions or issues? Please share your
findings on our `support page`_ so we can make Pybricks even better.
*Thank you!*
.. _support page: https://github.com/pybricks/support/issues/
.. toctree::
:maxdepth: 1
:caption: Table of Contents
:hidden:
.. toctree::
:maxdepth: 1
:caption: Pybricks
:hidden:
Home Page <https://pybricks.com>
Installation <https://pybricks.com/install/>
.. toctree::
:maxdepth: 1
:caption: Pybricks Modules
:hidden:
hubs/index
pupdevices/index
ev3devices
nxtdevices
iodevices/index
parameters/index
tools/index
robotics
media
messaging
geometry
.. toctree::
:maxdepth: 1
:caption: Engineering Extras
:hidden:
signaltypes
motors
.. frames
-61
View File
@@ -1,61 +0,0 @@
:mod:`iodevices <pybricks.iodevices>` -- Generic I/O Devices
============================================================
.. automodule:: pybricks.iodevices
:no-members:
.. toctree::
:maxdepth: 1
:hidden:
pupdevice
i2cdevice
uartdevice
analogsensor
lumpdevice
dcmotor
ev3devsensor
.. pybricks-classlink:: PUPDevice
.. figure:: ../../api/images/sensor_pup.png
:width: 70 %
:target: pupdevice.html
This class is only available on Powered Up hubs.
.. pybricks-classlink:: I2CDevice
.. figure:: ../../api/images/sensor_rj12_bluegreen.png
:width: 25 %
:target: i2cdevice.html
.. pybricks-classlink:: UARTDevice
.. figure:: ../../api/images/sensor_rj12_gray.png
:width: 25 %
:target: uartdevice.html
.. pybricks-classlink:: AnalogSensor
.. figure:: ../../api/images/sensor_rj12_brown.png
:width: 25 %
:target: analogsensor.html
.. pybricks-classlink:: LUMPDevice
.. figure:: ../../api/images/sensor_rj12_green.png
:width: 25 %
:target: lumpdevice.html
.. pybricks-classlink:: DCMotor
.. figure:: ../../api/images/rcxmotor.png
:width: 40 %
:target: dcmotor.html
.. pybricks-classlink:: Ev3devSensor
.. figure:: ../../api/images/sensor_ev3dev.png
:width: 70 %
:target: ev3devsensor.html
-139
View File
@@ -1,139 +0,0 @@
More about Motors
===========================================
.. Motor Tips & Tricks
.. ^^^^^^^^^^^^^^^^^^^
.. The difference between ``run_angle`` and ``run_target``
.. -------------------------------------------------------
.. *TODO*
.. .. _absangles:
.. Absolute angles
.. ----------------------------
.. .. todo::
.. This section will be included in a future release.
.. .. _stalled:
.. Using stall detection
.. ---------------------
.. .. todo::
.. This section will be included in a future release.
.. When a motor cannot move any further despite using the maximally allowed
.. torque we say that the motor is stalled. Something could be blocking the
.. motor, or the load is just too heavy. For example, if you manually hold
.. the motor shaft still while the motor is busy executing a command, the
.. motor will stall.
.. What can I do with stall detection?
.. +++++++++++++++++++++++++++++++++++
.. Stall detection is useful to detect that a motor can't move any further.
.. This can be used to detect an endpoint of a mechanism. For example, you
.. can detect whether a robotic hand is fully closed, because the gripper
.. motor simply can't go further. This way, you don't need a touch or light
.. sensor to detect this.
.. *TODO: How, what, why. Explain run_until_stalled. Rack & pinion example.*
.. When is a motor stalled?
.. ++++++++++++++++++++++++
.. TODO
.. .. _gears:
.. Using gears
.. -----------------
.. .. todo::
.. This section will be included in a future release.
.. Many LEGO robots use mechanisms with gears to change the speed and torque
.. output of a motor. Let's consider the following dial mechanism.
.. *TODO: INSERT PICTURE OF MOTOR WITH 12z gear AND 36z gear.*
.. This gear train slows down the dial on the output axle by a factor of 3.
.. Therefore, if you want to rotate the dial by 90 degrees, the motor has to
.. rotate by 270 degrees. To turn at 200 degrees per second, the motor has to
.. turn at 600 degrees per second, and so on.
.. To avoid using this factor 3 everywhere in your program, you can use the
.. `gears` setting of the ``Motor`` object, as shown in this example::
.. # This example uses the EV3 brick, but the same
.. # technique applies to other programmable hubs.
.. ev3 = EV3Brick()
.. # Initialize the motor. See picture above.
.. dial = Motor(Port.C, Direction.COUNTERCLOCKWISE, gears=[12, 36])
.. # Turn the dial by 90-degrees
.. dial.run_angle(500, 90)
.. # Print the dial angle
.. print(dial.angle())
.. # Turn the dial back to the original position
.. dial.run_target(500, 0)
.. When you use any of the other methods, the same scaling is applied. For
.. example, you can print the angle of the dial as shown above. This will print
.. 90 (approximately), even though the motor has turned 270 degrees.
.. Notice that there is no magic going on. It is just a convenient scaling
.. function. This helps you organize your code. For example, if you change
.. your mechanism to use different gears, you only have to change the first
.. line of this example.
.. _control:
The Control Class
^^^^^^^^^^^^^^^^^
The ``Motor`` class uses PID control to accurately track your commanded target
angles. Similarly, the ``DriveBase`` class uses two of such controllers:
one to control the heading and one to control the traveled distance.
You can change the control settings through the following attributes, which are
instances of the ``Control`` class given below.:
- ``Motor.control``
- ``DriveBase.heading_control``
- ``DriveBase.distance_control``
You can only change the settings while the controller is stopped. For example,
you can set the settings at the beginning of your program. Alternatively, first
call ``stop()`` to make your ``Motor`` or ``DriveBase`` stop, and then change
the settings.
.. autoclass:: pybricks._common.Control
:no-members:
.. rubric:: Status
.. automethod:: pybricks._common.Control.done
.. automethod:: pybricks._common.Control.stalled
.. automethod:: pybricks._common.Control.load
.. rubric:: Settings
.. automethod:: pybricks._common.Control.limits
.. automethod:: pybricks._common.Control.pid
.. automethod:: pybricks._common.Control.target_tolerances
.. automethod:: pybricks._common.Control.stall_tolerances
-38
View File
@@ -1,38 +0,0 @@
Port
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. class:: Port
Input and output ports:
.. autoattribute:: pybricks.parameters.Port.A
:annotation:
.. autoattribute:: pybricks.parameters.Port.B
:annotation:
.. autoattribute:: pybricks.parameters.Port.C
:annotation:
.. autoattribute:: pybricks.parameters.Port.D
:annotation:
.. autoattribute:: pybricks.parameters.Port.E
:annotation:
.. autoattribute:: pybricks.parameters.Port.F
:annotation:
EV3 Sensor ports:
.. autoattribute:: pybricks.parameters.Port.S1
:annotation:
.. autoattribute:: pybricks.parameters.Port.S2
:annotation:
.. autoattribute:: pybricks.parameters.Port.S3
:annotation:
.. autoattribute:: pybricks.parameters.Port.S4
:annotation:
-30
View File
@@ -1,30 +0,0 @@
Remote Control
^^^^^^^^^^^^^^^^^^^^^^^^^
.. figure:: ../../api/images/pupremote.png
:width: 60 %
.. autoclass:: pybricks.pupdevices.Remote
:no-members:
.. autoattribute:: pybricks.pupdevices::Remote.address
:annotation:
.. automethod:: pybricks.pupdevices::Remote.light.on
.. automethod:: pybricks.pupdevices::Remote.light.off
.. automethod:: pybricks.pupdevices::Remote.buttons.pressed
.. note::
The ``light`` and ``address`` features are not yet supported.
Examples
-------------------
Check which buttons are pressed
*******************************
.. literalinclude::
../../../examples/pup/remote/basics.py
+162 -124
View File
@@ -27,22 +27,20 @@ from docutils import nodes
from docutils.parsers.rst.directives import flag
from docutils.parsers.rst import Directive
from sphinx.application import Sphinx
from sphinx.domains.python import PyClassmember, PythonDomain
from sphinx.addnodes import pending_xref
from sphinx.environment import BuildEnvironment
from sphinx.util.nodes import make_refnode
import toml
TOP_DIR = os.path.abspath(os.path.join('..', '..'))
sys.path.insert(0, TOP_DIR)
sys.path.append(os.path.abspath('../common/extensions'))
from pybricks.hubs import EV3Brick # noqa E402
from pybricks.media.ev3dev import Image # noqa E402
from pybricks._common import Speaker # noqa E402
TOP_DIR = os.path.abspath(os.path.join("..", ".."))
sys.path.insert(0, os.path.join(TOP_DIR, "src"))
sys.path.append(os.path.abspath("../common/extensions"))
# ON_RTD is whether we are on readthedocs.org
# this line of code grabbed from docs.readthedocs.org
ON_RTD = os.environ.get('READTHEDOCS', None) == 'True'
ON_RTD = os.environ.get("READTHEDOCS", None) == "True"
_pyproject = toml.load(os.path.join(TOP_DIR, 'pyproject.toml'))
_pyproject = toml.load(os.path.join(TOP_DIR, "pyproject.toml"))
# -- General configuration ------------------------------------------------
@@ -54,25 +52,29 @@ _pyproject = toml.load(os.path.join(TOP_DIR, 'pyproject.toml'))
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.napoleon',
'sphinx.ext.todo',
'sphinx.ext.mathjax',
'color',
'classlink',
"sphinx.ext.autodoc",
"sphinx.ext.napoleon",
"sphinx.ext.todo",
"sphinx.ext.mathjax",
# Custom Pybricks extensions
"color",
"classlink",
"requirements",
"requirements-static",
"versionchanged",
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['../common/_templates']
templates_path = ["../common/_templates"]
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
source_suffix = ".rst"
# The master toctree document.
master_doc = 'index'
master_doc = "index"
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -81,17 +83,17 @@ master_doc = 'index'
# The full version, including alpha/beta/rc tags.
release = "v" + _pyproject["tool"]["poetry"]["version"]
# The short X.Y version.
version = re.match(r'(v\d+\.\d+)', release)[0]
version = re.match(r"(v\d+\.\d+)", release)[0]
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
language = "en"
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'xcode'
pygments_style = "xcode"
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
@@ -99,10 +101,10 @@ todo_include_todos = True
# Figure numbering
numfig = True
numfig_format = {
'figure': 'Figure %s',
'table': 'Table %s',
'code-block': 'Listing %s',
'section': 'Section %s'
"figure": "Figure %s",
"table": "Table %s",
"code-block": "Listing %s",
"section": "Section %s",
}
# Find cross-reference errors
@@ -110,45 +112,49 @@ nitpicky = True
# https://stackoverflow.com/a/30624034/1976323
nitpick_ignore = [
('py:class', 'bool'),
('py:class', 'bytearray'),
('py:class', 'bytes'),
('py:class', 'callable'),
('py:class', 'dict'),
('py:class', 'float'),
('py:class', 'int'),
('py:class', 'iter'),
('py:class', 'list'),
('py:class', 'object'),
('py:class', 'str'),
('py:class', 'tuple'),
('py:exc', 'OSError'),
('py:exc', 'RuntimeError'),
('py:exc', 'TypeError'),
('py:exc', 'ValueError'),
("py:class", "bool"),
("py:class", "bytearray"),
("py:class", "bytes"),
("py:class", "callable"),
("py:class", "dict"),
("py:class", "float"),
("py:class", "int"),
("py:class", "iter"),
("py:class", "list"),
("py:class", "object"),
("py:class", "str"),
("py:class", "tuple"),
("py:exc", "OSError"),
("py:exc", "RuntimeError"),
("py:exc", "TypeError"),
("py:exc", "ValueError"),
]
# not sure why, but this is needed for typing.IO in uselect
nitpick_ignore.append(("py:obj", "typing.IO"))
# -- Autodoc options ------------------------------------------------------
autodoc_member_order = 'bysource'
autodoc_member_order = "bysource"
autodoc_default_options = {
'members': True,
'undoc-members': True,
"members": True,
"undoc-members": True,
}
autoclass_content = 'both' # This ensures init arguments are not ignored
autoclass_content = "both" # This ensures init arguments are not ignored
add_module_names = False # Hide module name
# -- Options for HTML output ----------------------------------------------
if ON_RTD:
html_theme = 'default'
html_theme = "default"
else:
import sphinx_rtd_theme
html_theme = 'sphinx_rtd_theme'
html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
html_context = {
'disclaimer': _DISCLAIMER,
"disclaimer": _DISCLAIMER,
}
# The theme to use for HTML and HTML Help pages. See the documentation for
@@ -161,14 +167,14 @@ html_context = {
# documentation.
#
html_theme_options = {
'style_external_links': True,
'logo_only': True,
"style_external_links": True,
"logo_only": True,
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['../common/_static']
html_static_path = ["../common/_static"]
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
@@ -176,9 +182,9 @@ html_static_path = ['../common/_static']
# This is required for the alabaster theme
# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
html_sidebars = {
'**': [
'relations.html', # needs 'show_related': True theme option to display
'searchbox.html',
"**": [
"relations.html", # needs 'show_related': True theme option to display
"searchbox.html",
]
}
@@ -188,7 +194,7 @@ html_scaled_image_link = False
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'Pybricksdoc'
htmlhelp_basename = "Pybricksdoc"
# -- Options for LaTeX output ---------------------------------------------
@@ -197,14 +203,12 @@ latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
'preamble': r'''
"preamble": r"""
\usepackage{CJKutf8}
\makeatletter
\fancypagestyle{normal}{
@@ -224,34 +228,46 @@ latex_elements = {
\renewcommand{\footrulewidth}{0.4pt}
}
\makeatother
''' % {
'disclaimer': ' '.join((_DISCLAIMER, '©', copyright)),
"""
% {
"disclaimer": " ".join((_DISCLAIMER, "©", copyright)),
},
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
'extraclassoptions': 'openany,oneside',
'releasename': 'Version',
"extraclassoptions": "openany,oneside",
"releasename": "Version",
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, ''.join([project, '-v', version, '.tex']), _TITLE,
author, 'manual'),
(master_doc, "".join([project, "-v", version, ".tex"]), _TITLE, author, "manual"),
]
# -- Content control -----------------------------------------------------
exclude_patterns = [
"ev3devices.rst",
"hubs/ev3brick.rst",
"iodevices/analogsensor.rst",
"iodevices/dcmotor.rst",
"iodevices/ev3devsensor.rst",
"iodevices/i2cdevice.rst",
"iodevices/lumpdevice.rst",
"iodevices/uartdevice.rst",
"media.rst",
"messaging.rst",
"nxtdevices.rst",
"tools/datalog.rst",
]
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'pybricks', 'Pybricks Documentation',
[author], 1)
]
man_pages = [(master_doc, "pybricks", "Pybricks Documentation", [author], 1)]
# -- Options for Texinfo output -------------------------------------------
@@ -260,74 +276,96 @@ man_pages = [
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'Pybricks', 'Pybricks Documentation',
author, 'Pybricks', 'One line description of project.',
'Miscellaneous'),
(
master_doc,
"Pybricks",
"Pybricks Documentation",
author,
"Pybricks",
"One line description of project.",
"Miscellaneous",
),
]
# -- .. availability:: directive
class AvailabilityDirective(Directive):
has_content = True
option_spec = {
'movehub': flag,
'cityhub': flag,
'technichub': flag,
'ev3dev-stretch': flag,
"movehub": flag,
"cityhub": flag,
"technichub": flag,
"ev3dev-stretch": flag,
}
def run(self):
if not self.options:
raise self.error('Must specify at least one platform.')
raise self.error("Must specify at least one platform.")
# TODO: make links to platform pages
return [nodes.emphasis(text='Availability: '),
nodes.Text(', '.join(self.options))]
return [
nodes.emphasis(text="Availability: "),
nodes.Text(", ".join(self.options)),
]
def on_missing_reference(
app: Sphinx, env: BuildEnvironment, node: pending_xref, contnode: nodes.Element
) -> nodes.Element:
# The Number type alias is on the Signals and Units page instead of on the
# pybricks.parameters page so normal resolution doesn't work
if node["reftype"] == "class" and node["reftarget"] == "Number":
return make_refnode(
app.builder, node["refdoc"], "signaltypes", "numbers", contnode
)
# References with special characters can't exist, so we have to supress
# warnings when Sphinx tries to cross reference units like deg/s. For
# consistency, we also treat units without special characters this way.
for unit in [
"deg",
"deg/s",
"deg/s²",
"mm",
"mm/s",
"mm/s²",
"%",
"mV",
"mA",
"ms",
"mNm",
"Hz",
"°C",
"J",
"Ω",
"N",
]:
# If they match on raw source, we are dealing with argument types.
if unit == contnode.rawsource:
# Return as-is to suppress missing cross reference warning. We
# could make this more fancy by returning an xref node that links
# to the signals page.
return contnode
# Return types are denoted as "int: deg"
try:
# Try to unpack the node.
ret_type, ret_unit = str(contnode).split(": ")
except ValueError:
# Not a valid format, so skip.
continue
# If it's a match, we could format the node so it looks a bit nicer.
# For now just keep the colon notation as is.
if unit == ret_unit:
return nodes.Text(f"{ret_type}: {ret_unit}")
def setup(app: Sphinx):
app.add_directive('availability', AvailabilityDirective)
app.add_directive("availability", AvailabilityDirective)
app.connect("missing-reference", on_missing_reference)
# -- Python domain hacks ---------------------------------------------------
real_get_signature_prefix = PyClassmember.get_signature_prefix
def get_signature_prefix(self, sig):
# hacks for battery and light
if sig.count('.') >= 2:
return ''
return real_get_signature_prefix(self, sig)
PyClassmember.get_signature_prefix = get_signature_prefix
# HACK: For certain hub attributes, we list the class members of the attributes
# class as if the attribute was a nested class so that readers don't have to
# skip around the docs as much. To make this work, we replace the attribute
# values with the type and override PythonDomain.find_obj so that references
# still work.
base_find_obj = PythonDomain.find_obj
def find_obj(self, env, modname, classname, name, type, searchmode=0):
if modname == 'pybricks.hubs':
if classname == 'screen':
if name.startswith('Font.') or name == 'Font':
modname = 'pybricks.media.ev3dev'
elif name.startswith('Image.') or name == 'Image':
modname = 'pybricks.media.ev3dev'
else:
classname = 'EV3Brick.screen'
elif classname == 'speaker':
classname = 'EV3Brick.speaker'
return base_find_obj(self, env, modname, classname, name, type, searchmode)
PythonDomain.find_obj = find_obj
EV3Brick.screen = Image
EV3Brick.speaker = Speaker
+16 -12
View File
@@ -5,27 +5,31 @@ from docutils.parsers.rst import Directive
class PybricksClasslinkDirective(Directive):
required_arguments = 1
optional_arguments = 1
def run(self):
# Get link name from sphinx-directive
# Get link and name from sphinx-directive
name = self.arguments[0]
link = name if len(self.arguments) == 1 else self.arguments[1]
html = (
'<a href="{0}.html">'.format(name.lower()) +
'<dl class="py class">' +
'<dt>' +
'<em class="property">class </em>' +
'<code class="sig-name descname">' + name + '</code>' +
'</dt>' +
'<dd></dd>' +
'</dl>' +
'</a>'
'<a href="{0}.html">'.format(link.lower())
+ '<dl class="py class">'
+ "<dt>"
+ '<em class="property">class </em>'
+ '<code class="sig-name descname">'
+ name
+ "</code>"
+ "</dt>"
+ "<dd></dd>"
+ "</dl>"
+ "</a>"
)
# Return the node
node = nodes.raw('', html, format="html")
node = nodes.raw("", html, format="html")
return [node]
def setup(app):
app.add_directive_to_domain('py', 'pybricks-classlink', PybricksClasslinkDirective)
app.add_directive_to_domain("py", "pybricks-classlink", PybricksClasslinkDirective)
+8 -9
View File
@@ -16,28 +16,27 @@ class PybricksColorDirective(Directive):
color = getattr(Color, name)
# Convert HSV to RGB
r, g, b = hsv_to_rgb(color.h/360, color.s/100, color.v/100)
r, g, b = hsv_to_rgb(color.h / 360, color.s / 100, color.v / 100)
# Convert RGB to HEX
rgbhex = '#{0:02x}{1:02x}{2:02x}'.format(
round(r*255),
round(g*255),
round(b*255)
rgbhex = "#{0:02x}{1:02x}{2:02x}".format(
round(r * 255), round(g * 255), round(b * 255)
)
# Render a small block of the given color
css = "background-color: {0}; color: {0}; width: 50px;".format(rgbhex)
if name == "WHITE":
css += "border-style: solid; border-width: 0.5px;" + \
"border-color: #666666;"
css += (
"border-style: solid; border-width: 0.5px;" + "border-color: #666666;"
)
html = '<div id="test" style="{0}">_</div>'.format(css)
# Return the node
node = nodes.raw('', html, format="html")
node = nodes.raw("", html, format="html")
return [node]
def setup(app):
app.add_directive_to_domain('py', 'pybricks-color', PybricksColorDirective)
app.add_directive_to_domain("py", "pybricks-color", PybricksColorDirective)
@@ -0,0 +1,103 @@
from os import path, makedirs
from docutils import nodes
from docutils.parsers.rst import Directive
from sphinx.util.osutil import copyfile
# Base feature set.
FEATURES_SMALL = set()
# Medium feature set.
FEATURES_MEDIUM = FEATURES_SMALL | {
"pybricks-geometry",
"pybricks-iodevices",
"stm32-extra",
"stm32-float",
}
# Large feature set.
FEATURES_LARGE = FEATURES_MEDIUM | set()
# Features per hub.
HUB_FEATURES = {
"movehub": {"movehub"} | FEATURES_SMALL,
"cityhub": {"cityhub"} | FEATURES_MEDIUM,
"technichub": {"technichub"} | FEATURES_MEDIUM,
"primehub": {"primehub", "inventorhub"} | FEATURES_LARGE,
"inventorhub": {"primehub", "inventorhub"} | FEATURES_LARGE,
"essentialhub": {"essentialhub"} | FEATURES_LARGE,
}
class PybricksRequirementsStaticDirective(Directive):
required_arguments = 0
optional_arguments = 10
def run(self):
# Copy required resources to static
# CC BY-SA 4.0 via https://stackoverflow.com/a/63728208
env = self.state.document.settings.env
destdir = path.join(env.app.builder.outdir, "_images")
if not path.exists(destdir):
makedirs(destdir)
for hub in HUB_FEATURES:
for compat in ("true", "false"):
uri = "compat_{0}_{1}_label.png".format(hub, compat)
src_uri = path.join(env.app.builder.srcdir, "images", uri)
build_uri = path.join(env.app.builder.outdir, "_images", uri)
copyfile(src_uri, build_uri)
# Get requirements from sphinx-directive.
requirements = set(self.arguments)
# Cell with image of a hub.
hub_cell = """
<th><div class="align-default">
<img alt="" src="{0}_images/compat_{1}_{2}_label.png">
</div></th>
"""
# Determine how far up the tree we are to set correct image path.
current_document = env.docname
depth = len(current_document.split("/")) - 1
depth_path = "../" * depth
# Table row with hub images.
compat_row = "".join(
[
hub_cell.format(
depth_path, hub, "true" if requirements <= features else "false"
)
for hub, features in HUB_FEATURES.items()
]
)
# Generate full table.
html = """
<div class="wy-table-responsive">
<table class="docutils align-default">
<tbody>
<tr>
{0}
</tr>
</tbody>
</table>
</div>
""".format(
compat_row
)
# Return the node.
node = nodes.raw("", html, format="html")
return [node]
def setup(app):
app.add_directive_to_domain(
"py", "pybricks-requirements-static", PybricksRequirementsStaticDirective
)
+44
View File
@@ -0,0 +1,44 @@
/*MIT License
Copyright (c) 2017 Robert, https://github.com/ulrobix/sphinxcontrib-contentui
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. */
.toggle-header {
display: block;
float: right;
clear: both;
cursor: pointer;
}
.toggle-header p {display: inline;}
.toggle-header strong {color: #2980b9 }
.toggle-header:after {
content: "Compatibility ▼";
}
.toggle-header.open:after {
content: "▲";
}
.toggle-content {
display: none;
margin-bottom: 0px;
}
+33
View File
@@ -0,0 +1,33 @@
/*MIT License
Copyright (c) 2017 Robert, https://github.com/ulrobix/sphinxcontrib-contentui
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. */
$(function() {
/**
* Toggle logic
*/
$('.toggle-content').hide()
$('.toggle-header').click(function () {
$(this).toggleClass("open");
$(this).next('.toggle-content').toggle('400');
})
});
+79
View File
@@ -0,0 +1,79 @@
# MIT License
# Copyright (c) 2017 Robert, https://github.com/ulrobix/sphinxcontrib-requirements
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import os
from docutils.parsers.rst import Directive, directives
from docutils import nodes
from docutils.statemachine import StringList
from sphinx.util.osutil import copyfile
from sphinx.util import logging
CSS_FILE = "requirements.css"
JS_FILE = "requirements.js"
class PybricksRequirementsDirective(Directive):
has_content = True
option_spec = {"header": directives.unchanged}
required_arguments = 0
optional_arguments = 10
def run(self):
node = nodes.container()
node["classes"].append("toggle-content")
par = nodes.container()
par["classes"].append("toggle-header")
content = ".. pybricks-requirements-static:: " + " ".join(self.arguments)
self.state.nested_parse(StringList([content]), self.content_offset, node)
return [par, node]
def add_assets(app):
app.add_css_file(CSS_FILE)
app.add_js_file(JS_FILE)
def copy_assets(app, exception):
if app.builder.name not in ["html", "readthedocs"] or exception:
return
logger = logging.getLogger(__name__)
logger.info("Copying requirements stylesheet/javascript... ", nonl=True)
dest = os.path.join(app.builder.outdir, "_static", CSS_FILE)
source = os.path.join(os.path.abspath(os.path.dirname(__file__)), CSS_FILE)
copyfile(source, dest)
dest = os.path.join(app.builder.outdir, "_static", JS_FILE)
source = os.path.join(os.path.abspath(os.path.dirname(__file__)), JS_FILE)
copyfile(source, dest)
logger.info("done")
def setup(app):
app.add_directive("pybricks-requirements", PybricksRequirementsDirective)
app.connect("builder-inited", add_assets)
app.connect("build-finished", copy_assets)
+31
View File
@@ -0,0 +1,31 @@
"""This directive hides the builtin directives
* versionchanged
* versionadded
* deprecated
when building documentation with the 'ide' tag.
"""
from docutils import nodes
from docutils.parsers.rst import Directive
class PybricksVersionDirective(Directive):
has_content = True
def run(self):
html = ""
node = nodes.raw("", html, format="html")
return [node]
def setup(app):
if "ide" in app.tags.tags:
app.add_directive_to_domain(
"py", "deprecated", PybricksVersionDirective, override=True
)
app.add_directive_to_domain(
"py", "versionadded", PybricksVersionDirective, override=True
)
app.add_directive_to_domain(
"py", "versionchanged", PybricksVersionDirective, override=True
)
-55
View File
@@ -1,55 +0,0 @@
# 1.5.0 - 2021-07-01
## Added:
- Documentation for Powered Up Remote Control.
# 1.4.0 - 2021-06-23
## Added:
- Enabled beta content that was hidden for the 3.0 release.
- Added notice about using the latest beta version.
# 1.3.3 - 2021-05-21
## Changed:
- Match example snippet styling to IDE.
- Add more examples.
# 1.3.2 - 2021-04-26
## Changed:
- Theme style fixes.
- Example code fixes
- Match doc version to firmware version.
# 1.3.1 - 2021-04-12
## Changed:
- Upgrade sphinx and rtd-theme to fix style issues.
# 1.3.0 - 2021-04-12
## Removed:
- Removed features which not be in the official 3.0 release. These features
are still in beta. They'll come back in future releases once tested.
# 1.2.0 - 2021-04-09
## Changed:
- Moved installation guide to external site.
# 1.1.1 - 2021-02-14
## Added:
- Added installation guide.
- Various documentation fixes.
# 1.1.0 - 2021-01-28
## Added:
- Scrollbar styling.
# 1.0.0 - 2021-01-25
## Added:
- Sphinx build output.
-33
View File
@@ -1,33 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Pybricks documentation build configuration file
#
import os
# General information about the project.
project = 'pybricks'
copyright = '2018-2021 The Pybricks Authors'
author = ''
_TITLE = 'Pybricks Modules and Examples'
_DISCLAIMER = ''
html_favicon = '../common/images/favicon.ico'
html_logo = '../common/images/pybricks-logo-rtd.png'
html_show_copyright = False
html_show_sphinx = False
html_css_files = ['css/ide.css']
html_js_files = ['js/ide.js']
imgmath_image_format = 'svg'
imgmath_use_preview = True # requires Sphinx v3
imgmath_latex_preamble = r'''
\usepackage{newtxsf}
'''
exec(open(os.path.abspath("../common/conf.py")).read())
extensions.remove('sphinx.ext.mathjax') # noqa F821
extensions.append('sphinx.ext.imgmath') # noqa F821
html_theme_options['prev_next_buttons_location'] = None # noqa F821
-25
View File
@@ -1,25 +0,0 @@
SRC_DIR = .
OUT_DIR = ../images
POSTFIX := _label
SVG := $(wildcard $(SRC_DIR)/*.svg)
DIAGRAMS := $(patsubst $(SRC_DIR)/%.svg,$(OUT_DIR)/%$(POSTFIX).png,$(SVG))
DIR := ${CURDIR}
all: $(DIAGRAMS)
clean:
rm -f $(DIAGRAMS)
$(OUT_DIR)/%$(POSTFIX).png: $(SRC_DIR)/%.svg
if inkscape --version | grep -q "Inkscape 0"; then \
inkscape --file=$(DIR)/$< --export-area-drawing --export-png=$(DIR)/$@; \
else \
inkscape \
--export-area-drawing \
--export-background=white \
--export-background-opacity=1.0 \
--export-file=$(DIR)/$@ \
$(DIR)/$<; \
fi
-1
View File
@@ -1 +0,0 @@
.. include:: ../api/geometry.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/hubs/cityhub.rst
-43
View File
@@ -1,43 +0,0 @@
:mod:`hubs <pybricks.hubs>` -- Programmable Hubs
================================================
.. module:: pybricks.hubs
.. toctree::
:maxdepth: 1
:hidden:
movehub
cityhub
technichub
primehub
.. pybricks-classlink:: MoveHub
.. figure:: ../../api/images/movehub.png
:height: 10 em
:target: movehub.html
.. pybricks-classlink:: CityHub
.. figure:: ../../api/images/cityhub.png
:height: 10 em
:target: cityhub.html
.. pybricks-classlink:: TechnicHub
.. figure:: ../../api/images/technichub.png
:height: 10 em
:target: technichub.html
.. pybricks-classlink:: PrimeHub
.. figure:: ../../api/images/primehub.png
:height: 10 em
:target: primehub.html
.. pybricks-classlink:: InventorHub
.. figure:: ../../api/images/inventorhub.png
:height: 10 em
:target: primehub.html
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/hubs/movehub.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/hubs/primehub.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/hubs/technichub.rst
-55
View File
@@ -1,55 +0,0 @@
Pybricks Documentation
==================================================================
.. toctree::
:maxdepth: 1
:caption: Pybricks Modules
:hidden:
hubs/index
pupdevices/index
iodevices/index
parameters/index
tools/index
robotics
geometry
.. toctree::
:maxdepth: 1
:caption: Engineering Extras
:hidden:
signaltypes
motors
.. note::
**You are using a new beta version of Pybricks!**
This is great for trying the very latest features, but some things
might not work.
If in doubt, use the `latest stable release`_. Please report any
issues via our `support page`_. Thanks!
To begin, install the Pybricks firmware on your hub. Check
`pybricks.com/install`_ to learn how.
Use the ☰ menu to navigate all available classes, methods, and tools. A few
commonly used devices and classes are listed below for quick reference.
.. rubric:: Programmable Hubs
.. figure:: ../api/images/hubsoverview.png
:width: 100 %
:target: hubs/index.html
.. rubric:: Powered Up Motors and Sensors
.. figure:: ../api/images/pupdevicesoverview.png
:width: 100 %
:target: pupdevices/index.html
.. _pybricks.com/install: https://pybricks.com/install/
.. _latest stable release: https://www.code.pybricks.com/
.. _support page: https://github.com/pybricks/support
-17
View File
@@ -1,17 +0,0 @@
:mod:`iodevices <pybricks.iodevices>` -- Generic I/O Devices
============================================================
.. automodule:: pybricks.iodevices
:no-members:
.. toctree::
:maxdepth: 1
:hidden:
pupdevice
.. pybricks-classlink:: PUPDevice
.. figure:: ../../api/images/sensor_pup.png
:width: 70 %
:target: pupdevice.html
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/iodevices/pupdevice.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../api/motors.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/parameters/button.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/parameters/color.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/parameters/direction.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/parameters/index.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/parameters/side.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/parameters/stop.rst
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/colordistancesensor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/colorsensor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/dcmotor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/forcesensor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/index.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/infraredsensor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/light.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/motor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/pfmotor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/remote.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/tiltsensor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/pupdevices/ultrasonicsensor.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../api/robotics.rst
-1
View File
@@ -1 +0,0 @@
.. include:: ../api/signaltypes.rst
-10
View File
@@ -1,10 +0,0 @@
Data logging
^^^^^^^^^^^^^^^^^^^^^^^^^
.. note::
This functionality is not yet available. It could be added
to Powered Up hubs in a future release. If you'd like to see this happen,
be sure to ask us on our `support page`_.
.. _support page: https://github.com/pybricks/support/issues/
-1
View File
@@ -1 +0,0 @@
.. include:: ../../api/tools/index.rst
+57
View File
@@ -0,0 +1,57 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Pybricks documentation build configuration file
#
import os
import sys
# General information about the project.
project = "pybricks"
copyright = "2018-2021 The Pybricks Authors"
author = ""
_TITLE = "Pybricks Modules and Examples"
_DISCLAIMER = "LEGO, the LEGO logo, MINDSTORMS and the MINDSTORMS EV3 logo are\
trademarks and/or copyrights of the LEGO Group of companies \
which does not sponsor, authorize or endorse this site."
html_favicon = "../common/images/favicon.ico"
html_logo = "../common/images/pybricks-logo-rtd.png"
latex_logo = "../common/images/pybricks-logo-large.png"
# Build main docs for RTD by default.
# Since tags cannot be passed via the TAG make variable on read the docs,
# add it manually.
if os.environ.get("READTHEDOCS", None) == "True":
tags.add("main") # noqa F821
# HACK: this allows Number type alias to be imported by Sphinx
os.environ["SPHINX_BUILD"] = "True"
# Addtional configuration of the IDE docs
if "ide" in tags.tags: # noqa F821
_DISCLAIMER = ""
html_show_copyright = False
html_show_sphinx = False
html_css_files = ["css/ide.css"]
html_js_files = ["js/ide.js"]
imgmath_image_format = "svg"
imgmath_use_preview = True # requires Sphinx v3
imgmath_latex_preamble = r"""
\usepackage{newtxsf}
"""
exec(open(os.path.abspath("../common/conf.py")).read())
# Addtional configuration of the IDE docs
if "ide" in tags.tags: # noqa F821
extensions.remove("sphinx.ext.mathjax") # noqa F821
extensions.append("sphinx.ext.imgmath") # noqa F821
html_theme_options["prev_next_buttons_location"] = None # noqa F821
# Build hub specific example scripts.
sys.path.append(os.path.abspath("../../examples/pup/hub_common"))
import make_examples # noqa F401, E402

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_cityhub_false.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="10.681815"
inkscape:cy="89.597718"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="3.5527137e-15"
y="261.28122" />
<image
sodipodi:absref="../images/cityhub.png"
xlink:href="../images/cityhub.png"
style="stroke-width:5.6583333"
width="30.908323"
height="31.75"
preserveAspectRatio="none"
id="image1470"
x="5.2042809"
y="263.16479" />
<g
id="g862"
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
style="stroke-width:1.18304348">
<path
inkscape:connector-curvature="0"
id="path856"
d="m 51.33389,24.998882 5.622395,5.622396"
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.956285,24.998882 51.33389,30.621278"
id="path858"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_cityhub_true.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="10.681815"
inkscape:cy="89.597718"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="4.4408921e-16"
y="261.28122" />
<image
sodipodi:absref="../images/cityhub.png"
xlink:href="../images/cityhub.png"
style="stroke-width:5.6583333"
width="30.908323"
height="31.75"
preserveAspectRatio="none"
id="image1470"
x="5.2042809"
y="263.16479" />
<path
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
id="path854"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_inventorhub_false.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="10.681815"
inkscape:cy="89.597718"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="0"
y="261.28122" />
<image
sodipodi:absref="../images/inventorhub.png"
xlink:href="../images/inventorhub.png"
style="stroke-width:5.92592621"
width="34.915073"
height="35.71875"
preserveAspectRatio="none"
id="image1481"
x="2.6458333"
y="261.28122" />
<g
id="g862"
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
style="stroke-width:1.18304348">
<path
inkscape:connector-curvature="0"
id="path856"
d="m 51.33389,24.998882 5.622395,5.622396"
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.956285,24.998882 51.33389,30.621278"
id="path858"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_inventorhub_true.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="10.681815"
inkscape:cy="89.597718"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="3.5527137e-15"
y="261.28122" />
<image
sodipodi:absref="../images/inventorhub.png"
xlink:href="../images/inventorhub.png"
style="stroke-width:5.92592621"
width="34.915073"
height="35.71875"
preserveAspectRatio="none"
id="image1481"
x="2.6458333"
y="261.28122" />
<path
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
id="path854"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_movehub_false.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="10.681815"
inkscape:cy="89.597718"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="3.5527137e-15"
y="261.28122" />
<image
sodipodi:absref="../images/movehub.png"
xlink:href="../images/movehub.png"
transform="translate(25.390602,-51.6498)"
clip-path="url(#clipPath1545)"
style="stroke-width:5.92592621"
width="40.183594"
height="35.71875"
preserveAspectRatio="none"
id="image1492"
x="-25.506657"
y="312.93103" />
<g
id="g862"
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
style="stroke-width:1.18304348">
<path
inkscape:connector-curvature="0"
id="path856"
d="m 51.33389,24.998882 5.622395,5.622396"
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.956285,24.998882 51.33389,30.621278"
id="path858"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_movehub_true.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="69.775738"
inkscape:cy="79.243654"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="7.1054274e-15"
y="261.28122" />
<image
sodipodi:absref="../images/movehub.png"
xlink:href="../images/movehub.png"
transform="translate(25.390602,-51.6498)"
clip-path="url(#clipPath1545)"
style="stroke-width:5.92592621"
width="40.183594"
height="35.71875"
preserveAspectRatio="none"
id="image1492"
x="-25.506657"
y="312.93103" />
<path
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
id="path854"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_primehub_false.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="10.681815"
inkscape:cy="89.597718"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="0"
y="261.28122" />
<image
sodipodi:absref="../images/primehub.png"
xlink:href="../images/primehub.png"
style="stroke-width:5.92592621"
width="34.915073"
height="35.71875"
preserveAspectRatio="none"
id="image1503"
x="2.6458333"
y="261.28122" />
<g
id="g862"
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
style="stroke-width:1.18304348">
<path
inkscape:connector-curvature="0"
id="path856"
d="m 51.33389,24.998882 5.622395,5.622396"
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.956285,24.998882 51.33389,30.621278"
id="path858"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_primehub_true.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="10.681815"
inkscape:cy="89.597718"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="0"
y="261.28122" />
<image
sodipodi:absref="../images/primehub.png"
xlink:href="../images/primehub.png"
style="stroke-width:5.92592621"
width="34.915073"
height="35.71875"
preserveAspectRatio="none"
id="image1503"
x="2.6458333"
y="261.28122" />
<path
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
id="path854"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_technichub_false.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="10.681815"
inkscape:cy="89.597718"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1172"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="0"
y="261.28122" />
<image
sodipodi:absref="../images/technichub.png"
xlink:href="../images/technichub.png"
style="stroke-width:5.92592621"
width="35.71875"
height="35.71875"
preserveAspectRatio="none"
id="image1514"
x="2.1503351"
y="261.28122" />
<g
id="g862"
transform="matrix(0.84064533,0,0,0.84993509,-12.416361,243.07822)"
style="stroke-width:1.18304348">
<path
inkscape:connector-curvature="0"
id="path856"
d="m 51.33389,24.998882 5.622395,5.622396"
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#e2302f;stroke-width:1.18304348;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 56.956285,24.998882 51.33389,30.621278"
id="path858"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="150"
height="135"
viewBox="0 0 39.687499 35.718751"
version="1.1"
id="svg887"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="compat_technichub_true.svg">
<defs
id="defs881">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1545">
<rect
style="fill:#fe2020;fill-opacity:0.48022599;stroke:none;stroke-width:0.99999994;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1547"
width="39.6875"
height="35.71875"
x="-25.390602"
y="312.93103" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#fcfcfc"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="51.592993"
inkscape:cy="94.901019"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1853"
inkscape:window-height="1145"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata884">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-261.28123)">
<rect
style="fill:#fcfcfc;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect819"
width="39.6875"
height="35.71875"
x="0"
y="261.28122" />
<image
sodipodi:absref="../images/technichub.png"
xlink:href="../images/technichub.png"
y="261.28122"
x="2.1503351"
id="image1514"
preserveAspectRatio="none"
height="35.71875"
width="35.71875"
style="stroke-width:5.92592621" />
<path
style="fill:none;stroke:#84ba4c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 31.147057,265.82725 1.011052,2.9815 3.622948,-4.60003"
id="path854"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Before

Width:  |  Height:  |  Size: 236 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Some files were not shown because too many files have changed in this diff Show More