Compare commits

...

380 Commits

Author SHA1 Message Date
Fabio Manganiello ed697c0ad2
🐛 [CI/CD] Fixed build-ui.sh script.
continuous-integration/drone/push Build is passing Details
After doing "cd $SRCDIR", it should reference the `dist` directory in
the webapp by full relative path.
2024-06-06 22:46:37 +02:00
Fabio Manganiello 22cfe777fa
Merge pull request #428 from blacklight/snyk-upgrade-2f9bcb05344a53203d1db8700a74298c
continuous-integration/drone/push Build is failing Details
[Snyk] Upgrade core-js from 3.37.0 to 3.37.1
2024-06-06 22:32:31 +02:00
Fabio Manganiello 3f2832a077
Merge branch 'master' into snyk-upgrade-2f9bcb05344a53203d1db8700a74298c 2024-06-06 22:32:04 +02:00
Fabio Manganiello 6f8eb397d2
Merge pull request #427 from blacklight/snyk-upgrade-97c24303ee224553f29b460d83c6c780
[Snyk] Upgrade cronstrue from 2.49.0 to 2.50.0
2024-06-06 22:30:59 +02:00
Fabio Manganiello 3163721bf3
Merge pull request #426 from blacklight/snyk-upgrade-26bc4dca62d58f39bfb77f2e69121708
[Snyk] Upgrade sass from 1.75.0 to 1.76.0
2024-06-06 22:30:43 +02:00
Fabio Manganiello d79b8a1de5
Merge pull request #425 from blacklight/snyk-upgrade-a75151e7066361ecbf2a647d6e707a32
[Snyk] Upgrade vue from 3.4.23 to 3.4.24
2024-06-06 22:30:20 +02:00
Fabio Manganiello 3afc6b2271
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-06-06 20:29:13 +00:00
Fabio Manganiello 17b6b02986 Replaced `warnings.warn` with `logging.warnings`.
I couldn't find an easy and reliable way of routing `warnings.warn` to
`logging`.

Closes: #281
2024-06-06 20:28:23 +00:00
Fabio Manganiello 87a902bfa3
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-06-06 01:28:13 +00:00
Fabio Manganiello 421feffd3e
Bump version: 1.0.7 → 1.1.0
continuous-integration/drone/push Build is passing Details
2024-06-06 03:27:04 +02:00
Fabio Manganiello 518dc146d6
Bumped version in CHANGELOG. 2024-06-06 03:27:04 +02:00
Fabio Manganiello 6b11db7afb
[docs] Added `inherited-members`.
Closes: #403
2024-06-06 03:27:03 +02:00
Fabio Manganiello 8814859abc
[zwave.mqtt] Fixed typo in documentation. 2024-06-06 03:27:03 +02:00
Fabio Manganiello 0ccd029ff1
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-06-06 00:25:21 +00:00
Fabio Manganiello e52f5e06f4 [calendar.ical] Fixed timezone/datetime parsing issues.
Closes: #405
2024-06-06 00:24:31 +00:00
snyk-bot 066d71faa3
fix: upgrade core-js from 3.37.0 to 3.37.1
Snyk has created this PR to upgrade core-js from 3.37.0 to 3.37.1.

See this package in npm:
core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-06-04 18:18:54 +00:00
Fabio Manganiello 4f19b45975 Bump version: 1.0.6 → 1.0.7 2024-06-02 15:49:59 +00:00
Fabio Manganiello 7d6ffc76fb [CI/CD] The build-ui script should go back to the source root after running the UI build commands from the UI folder 2024-06-02 15:46:18 +00:00
Fabio Manganiello 7a8f30e5e0 [#384] Added `assistant.openai` and `tts.openai` plugins.
Closes: #384
2024-06-02 15:31:11 +00:00
Fabio Manganiello 3528b3646f [openai] Update documentation to include `assistant` and `tts`. 2024-06-02 15:31:11 +00:00
Fabio Manganiello 9cca928d4b [#348] Added `openai.transcribe` action.
This API is the foundation for the `assistant.openai` plugin.
2024-06-02 15:31:11 +00:00
Fabio Manganiello f356fcd844 Added `tts.stop` method. 2024-06-02 15:31:11 +00:00
Fabio Manganiello fcae7aa3ad Several improvements for `assistant` plugins.
- `stop_conversation_on_speech_match` should default to True.

- `render_response` should also handle conversation follow-ups, set the
  follow-up to True if the response ends with a question mark and the
  value of `with_follow_on_turn` is not set,

- Don't render responses if a `tts_plugin` is not set.
2024-06-02 15:31:11 +00:00
Fabio Manganiello c7d640a1d2 `IntentRecognizedEvent` should stop the current assistant conversation when matched by a hook. 2024-06-02 15:31:11 +00:00
Fabio Manganiello 1cc2aaf5a4 [assistant.picovoice] `_on_response_*` methods should have varargs. 2024-06-02 15:31:11 +00:00
Fabio Manganiello 2acf6ef3e9 Bump version: 1.0.5 → 1.0.6 2024-06-01 09:01:07 +00:00
Fabio Manganiello 1107e526f7 Updated CHANGELOG 2024-06-01 09:01:07 +00:00
Fabio Manganiello 5fc9c1199b Fixed the root cause of the failure on the `time` module.
The previous commit prompted a new error:

```
2024-06-01 10:54:08,310|ERROR|platypush:plugin:bluetooth|module 'platypush.entities.time' has no attribute 'time'
Traceback (most recent call last):
  File "/usr/lib/python3.9/dist-packages/platypush/plugins/__init__.py", line 247, in _runner
    self.main()
  File "/usr/lib/python3.9/dist-packages/platypush/plugins/bluetooth/__init__.py", line 590, in main
    self._refresh_cache()
  File "/usr/lib/python3.9/dist-packages/platypush/plugins/bluetooth/__init__.py", line 146, in _refresh_cache
    get_entities_engine().wait_start()
  File "/usr/lib/python3.9/dist-packages/platypush/entities/__init__.py", line 48, in get_entities_engine
    time_start = time.time()
AttributeError: module 'platypush.entities.time' has no attribute 'time'
```

Which explains even the previous error: `import time` in that module
won't use the `time` module from the Python library, but the `.time`
module within the same directory.

This error only happens when the current directory is part of PYTHONPATH
(and usually it shouldn't), but for sake of keeping things safe I've
replaced `time()` with `utcnow().timestamp()`, with `utcnow` imported
from `platypush.utils`.
2024-06-01 09:01:07 +00:00
Fabio Manganiello b067430cd5 Weird fix for a weird error that suddenly started on one of my machines.
```
Traceback (most recent call last):
  File "/usr/lib/python3.9/dist-packages/platypush/plugins/__init__.py", line 247, in _runner
    self.main()
  File "/usr/lib/python3.9/dist-packages/platypush/plugins/bluetooth/__init__.py", line 590, in main
    self._refresh_cache()
  File "/usr/lib/python3.9/dist-packages/platypush/plugins/bluetooth/__init__.py", line 146, in _refresh_cache
    get_entities_engine().wait_start()
  File "/usr/lib/python3.9/dist-packages/platypush/entities/__init__.py", line 48, in get_entities_engine
    time_start = time()
TypeError: 'module' object is not callable
```

There isn't a single reason in this world for this error to happen.

If I do `from time import time`, then `t = time()` is 100% valid Python.

I have no clue of what may be causing it, but I hope that this will fix
it.
2024-06-01 08:50:30 +00:00
Fabio Manganiello ff60896625
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-31 23:55:27 +00:00
Fabio Manganiello 67b6e3a608
Bump version: 1.0.4 → 1.0.5
continuous-integration/drone/push Build is passing Details
2024-06-01 01:43:12 +02:00
Fabio Manganiello c61a1b89d6
Updated CHANGELOG 2024-06-01 01:42:21 +02:00
Fabio Manganiello c9a5c29a4a
🐛 A proper cross-version solution for the `utcnow()` issue.
No need to maintain two different pieces of logic - a `utcnow()` for
Python < 3.11 and `now(datetime.UTC)` for Python >= 3.11.

`datetime.timezone.utc` existed long before datetime.UTC and that's what
the `utcnow` facade should use.

This means that all the `utcnow()` will always have `tzinfo=UTC`
regardless of the Python version.

There's still a problem with the `utcnow()`-generated timestamps that
have been generated by previous versions of Python and stored on the db.

Therefore, when the code performs comparisons with timestamps fetched
from the db, it should always explicitly do a `.replace(tzinfo=utc)` to
ensure that we always compare offset-aware datetime representations.

See blog post for technical details:
https://manganiello.blog/wheres-my-time-again
2024-06-01 01:34:47 +02:00
Fabio Manganiello 1067ab04d9
[tts.picovoice] Adapted to the new `orca.synthesize` API.
The new API no longer returns a list of numeric values alone. Instead,
it returns a tuple where the first element is the raw audio, and the
second element contains extra info on the rendered phonemes.
2024-05-31 21:10:48 +02:00
Fabio Manganiello 709b90fa4b
Merge branch 'master' into 384/assistant-openai 2024-05-31 21:07:06 +02:00
Fabio Manganiello 06f0ac4545
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-31 17:59:06 +00:00
Fabio Manganiello 944fd45f9f
Bump version: 1.0.3 → 1.0.4
continuous-integration/drone/push Build is passing Details
2024-05-31 19:57:51 +02:00
Fabio Manganiello 6acdde6164
Updated CHANGELOG 2024-05-31 19:57:43 +02:00
Fabio Manganiello 3583dafbc3
🐛 Partial revert of c18768e61f
`datetime.utcnow` may be deprecated on Python >= 3.12, but
`datetime.UTC` isn't present on older Python versions.

Added a `platypush.utils.utcnow()` method as a workaround compatible
with both.
2024-05-31 19:55:19 +02:00
Fabio Manganiello 4513bb9569
Set a `plugin` argument on `AssistantEvent`s besides `assistant`.
`assistant` contains the assistant plugin object that triggered the
event, but you can't create event hook conditions on attributes that are
plugins.

The event should also store a `plugin` attribute which contains the
unique plugin name, so hooks like these can be built:

```
from platypush import hook
from platypush.events.assistant import ConversationStartEvent

@when(ConversationStartEvent, plugin="assistant.google")
def on_google_conversation_start():
  ...
```

It wouldn't be possible to construct a hook condition like the one above
on the plugin object reported on the `assistant` attribute.
2024-05-31 19:55:19 +02:00
Fabio Manganiello 4e82dd17bb
🐛 Partial revert of c18768e61f
`datetime.utcnow` may be deprecated on Python >= 3.12, but
`datetime.UTC` isn't present on older Python versions.

Added a `platypush.utils.utcnow()` method as a workaround compatible
with both.
2024-05-31 19:52:32 +02:00
Fabio Manganiello e982c02524
Set a `plugin` argument on `AssistantEvent`s besides `assistant`.
`assistant` contains the assistant plugin object that triggered the
event, but you can't create event hook conditions on attributes that are
plugins.

The event should also store a `plugin` attribute which contains the
unique plugin name, so hooks like these can be built:

```
from platypush import hook
from platypush.events.assistant import ConversationStartEvent

@when(ConversationStartEvent, plugin="assistant.google")
def on_google_conversation_start():
  ...
```

It wouldn't be possible to construct a hook condition like the one above
on the plugin object reported on the `assistant` attribute.
2024-05-31 19:29:50 +02:00
Fabio Manganiello d9a5ea1e53
Merge branch 'master' into 384/assistant-openai 2024-05-31 02:58:08 +02:00
Fabio Manganiello 23e02de1d7
Bump version: 1.0.2 → 1.0.3
continuous-integration/drone/push Build is passing Details
2024-05-31 02:57:08 +02:00
Fabio Manganiello 4d0b63a155
Updated CHANGELOG 2024-05-31 02:57:08 +02:00
Fabio Manganiello ce1525e786
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-31 00:53:37 +00:00
Fabio Manganiello 67478e7ca1 🐛 Fixed proper support for event package alias `platypush.events`.
Even though `platypush.events` is just a symlink to
`platypush.message.event`, imports from those two modules will be
treated as different imports, thus hook conditions build on
`platypush.events` imports will never match.
2024-05-31 00:52:48 +00:00
Fabio Manganiello c18768e61f Replaced deprecated usages of `datetime.utcnow()` with `datetime.now(UTC)`. 2024-05-31 00:52:48 +00:00
Fabio Manganiello 30362b89e3 [assistant] `tts_plugin_args` should include `join=True` by default.
The assistant by default should be configured to wait for response audio
to be fully rendered before proceeding.
2024-05-31 00:52:48 +00:00
Fabio Manganiello 826a3fa55c CHANGELOG update 2024-05-31 00:52:48 +00:00
Fabio Manganiello 3986549326
🐛 Fixed proper support for event package alias `platypush.events`.
continuous-integration/drone/push Build is passing Details
Even though `platypush.events` is just a symlink to
`platypush.message.event`, imports from those two modules will be
treated as different imports, thus hook conditions build on
`platypush.events` imports will never match.
2024-05-31 02:50:00 +02:00
Fabio Manganiello fa318882a5
Replaced deprecated usages of `datetime.utcnow()` with `datetime.now(UTC)`. 2024-05-31 02:30:48 +02:00
Fabio Manganiello d6185ddb1e
[assistant] `tts_plugin_args` should include `join=True` by default.
The assistant by default should be configured to wait for response audio
to be fully rendered before proceeding.
2024-05-30 01:33:56 +02:00
snyk-bot fee12951d6
fix: upgrade cronstrue from 2.49.0 to 2.50.0
Snyk has created this PR to upgrade cronstrue from 2.49.0 to 2.50.0.

See this package in npm:
cronstrue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-27 17:30:57 +00:00
Fabio Manganiello d2caa989ac
CHANGELOG update 2024-05-27 00:18:27 +02:00
Fabio Manganiello fa3c804b71 [#368] Added Ubuntu release logic to `update-apt-repo` step too. 2024-05-26 20:57:10 +00:00
Fabio Manganiello 4cd0761e78
[#368] Added Ubuntu release logic to `update-apt-repo` step too.
continuous-integration/drone/push Build is passing Details
2024-05-26 22:56:23 +02:00
Fabio Manganiello 16f7b7e12a Merge pull request '[#368] Added Ubuntu packages' (#402) from 368/ubuntu-packages into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: platypush/platypush#402

Closes: #368
2024-05-26 22:41:44 +02:00
Fabio Manganiello 22222fab65
[#368] Added Ubuntu packages
continuous-integration/drone/push Build is passing Details
2024-05-26 22:38:22 +02:00
Fabio Manganiello 5b3c0ad1cf
Bump version: 1.0.1 → 1.0.2
continuous-integration/drone/push Build is passing Details
2024-05-26 11:09:51 +02:00
Fabio Manganiello 3758a8d759
Updated CHANGELOG 2024-05-26 11:09:42 +02:00
Fabio Manganiello de2bbc53c6
Support both `@procedure` and `@procedure(name)` notations.
continuous-integration/drone/push Build is passing Details
2024-05-26 11:02:19 +02:00
Fabio Manganiello a4a776986b
Bump version: 1.0.0 → 1.0.1
continuous-integration/drone/push Build is passing Details
2024-05-26 04:27:27 +02:00
Fabio Manganiello 9fef73a746
Bumped version in setup.py (for some reason bumpversion missed it) 2024-05-26 04:27:03 +02:00
Fabio Manganiello 0f6f119089
Bump version: 0.99.11 → 1.0.0
continuous-integration/drone/push Build is passing Details
2024-05-26 04:15:52 +02:00
Fabio Manganiello c64ff40dd3
Bump version: 0.99.10 → 0.99.11
continuous-integration/drone/push Build is passing Details
2024-05-26 04:06:15 +02:00
Fabio Manganiello 5c0f85c311
Don't provide `git+https://` dependencies in `setup.py` extras.
Otherwise Twine will complain with errors like this:

```
HTTPError: 400 Bad Request from https://upload.pypi.org/legacy/
Can't have direct dependency: pybluez@
git+https://github.com/pybluez/pybluez ; extra == "bluetooth". See
https://packaging.python.org/specifications/core-metadata for more
information.
```
2024-05-26 04:04:58 +02:00
Fabio Manganiello e6702398dc
Bump version: 0.99.9 → 0.99.10
continuous-integration/drone/push Build is passing Details
2024-05-26 03:46:51 +02:00
Fabio Manganiello 983bcc240a
[Docs] A more robust interceptor for the grid rendering. 2024-05-26 03:46:25 +02:00
Fabio Manganiello d6d9d7a8e7
[CI/CD] Added extra dependencies to `update-pip-package` step. 2024-05-26 03:40:10 +02:00
Fabio Manganiello 8d26721040
Bump version: 0.99.8 → 0.99.9
continuous-integration/drone/push Build is passing Details
2024-05-26 03:32:49 +02:00
Fabio Manganiello 96f265a4a2
[CI/CD] Use a base Alpine image instead of `python:3.11-alpine`.
Weird errors seem to happen on Twine on that image:

```
Traceback (most recent call last):
  File "/usr/bin/twine", line 5, in <module>
    from twine.__main__ import main
  File "/usr/lib/python3.11/site-packages/twine/__init__.py", line 32, in <module>
    import importlib.metadata
  File "/usr/lib/python3.11/importlib/metadata/__init__.py", line 17, in <module>
    from . import _adapters, _meta
  File "/usr/lib/python3.11/importlib/metadata/_adapters.py", line 3, in <module>
    import email.message
  File "/usr/lib/python3.11/email/message.py", line 15, in <module>
    from email import utils
  File "/usr/lib/python3.11/email/utils.py", line 28, in <module>
    import random
  File "/usr/lib/python3.11/random.py", line 49, in <module>
    from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
ImportError: Error relocating /usr/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-musl.so: _PyModule_Add: symbol not found
```
2024-05-26 03:31:25 +02:00
Fabio Manganiello 0ffff854d3
Bump version: 0.99.7 → 0.99.8
continuous-integration/drone/push Build is passing Details
2024-05-26 03:18:16 +02:00
Fabio Manganiello 020804fd1c
Don't link wiki/Home.md to wiki/index.md 2024-05-26 03:16:32 +02:00
Fabio Manganiello 42174b31bc
Bump version: 0.99.6 → 0.99.7
continuous-integration/drone/push Build is passing Details
2024-05-26 03:12:26 +02:00
Fabio Manganiello 3642d1ffa4
Added `dns` to mocked modules. 2024-05-26 03:02:57 +02:00
Fabio Manganiello 104457a302
Bump version: 0.99.5 → 0.99.6
continuous-integration/drone/push Build is passing Details
2024-05-26 01:47:22 +02:00
Fabio Manganiello 0445087699
[CI/CD] Removed hanging dependency. 2024-05-26 01:47:05 +02:00
Fabio Manganiello 751d719b04
Bump version: 0.99.4 → 0.99.5
continuous-integration/drone/push Build encountered an error Details
2024-05-26 01:46:29 +02:00
Fabio Manganiello bef027fc07
[CI/CD] Just remove the sync-stable-branch step. 2024-05-26 01:46:04 +02:00
Fabio Manganiello cc670f9d4a
Bump version: 0.99.3 → 0.99.4
continuous-integration/drone/push Build is passing Details
2024-05-26 01:26:46 +02:00
Fabio Manganiello 86674ddc28
[CI/CD] Do a git fetch beofre checkout/rebase in sync-stable-branch. 2024-05-26 01:26:19 +02:00
Fabio Manganiello ee3933dc77
Bump version: 0.99.2 → 0.99.3
continuous-integration/drone/push Build is passing Details
2024-05-26 00:56:29 +02:00
Fabio Manganiello e23664b5e7
[CI/CD] Be explicit about the origin in sync-stable-branch. 2024-05-26 00:56:01 +02:00
Fabio Manganiello 0537815721
Bump version: 0.99.1 → 0.99.2
continuous-integration/drone/push Build is passing Details
2024-05-26 00:50:37 +02:00
Fabio Manganiello a2ec20bb3a
[CI/CD] Create `stable` branch if it doesn't exist. 2024-05-26 00:50:02 +02:00
Fabio Manganiello d3562f4d20
Bump version: 0.99.0 → 0.99.1
continuous-integration/drone/push Build is passing Details
2024-05-26 00:44:30 +02:00
Fabio Manganiello bf5aece08b
Bumped version in setup.py (for some reason bumpversion missed it) 2024-05-26 00:44:20 +02:00
Fabio Manganiello 2f20580498
[CI/CD] Remove git remote rm/add logic from sync-stable-branch.
continuous-integration/drone/push Build is passing Details
2024-05-26 00:39:51 +02:00
Fabio Manganiello 1911c05afe
Bump version: 0.50.3 → 0.99.0
continuous-integration/drone/push Build is passing Details
2024-05-26 00:25:34 +02:00
Fabio Manganiello cac256af08
Updated CHANGELOG
continuous-integration/drone/push Build is passing Details
2024-05-26 00:21:40 +02:00
Fabio Manganiello a784a6fe23
The index symlink is not needed.
continuous-integration/drone/push Build is passing Details
2024-05-25 23:23:15 +02:00
Fabio Manganiello 0baae01ab7
[README and wiki changes]
continuous-integration/drone/push Build is passing Details
- Renamed _Post-installation_ README section as _Configuration_.

- Docs style tweaks for the latest version of the Sphinx theme.

- Adapted the docs index to the new structure of the wiki.
2024-05-25 23:17:12 +02:00
Fabio Manganiello f70d352cd7
[README] Added database, workdir and device ID sections.
continuous-integration/drone/push Build is passing Details
2024-05-25 22:14:15 +02:00
Fabio Manganiello 7c7e488867
Added example with return to the webhook handler.
continuous-integration/drone/push Build is passing Details
2024-05-25 22:05:09 +02:00
Fabio Manganiello baee33b88f
README.
continuous-integration/drone/push Build is passing Details
- Added/restyled badges.

- Added sections on the scripts directory and YAML `include` directive.
2024-05-25 21:43:44 +02:00
Fabio Manganiello 6de0b2e041
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-25 18:12:49 +00:00
Fabio Manganiello 35751da068
Added web hooks section to README.
continuous-integration/drone/push Build is passing Details
2024-05-25 20:11:07 +02:00
Fabio Manganiello 0479c37d64
Full rewrite of the README.
continuous-integration/drone/push Build is passing Details
2024-05-25 18:13:58 +02:00
Fabio Manganiello 3a4d7afcf0
Clean up all package manager caches after Docker build. 2024-05-25 14:15:13 +02:00
Fabio Manganiello e071e99dab
Remove all cached/compiled Python files after Docker build. 2024-05-25 13:36:52 +02:00
Fabio Manganiello 2e0246413c
Replaced an old `for ... in ... yield` loop with `yield from ...` 2024-05-25 10:35:23 +02:00
Fabio Manganiello b1dd484704
A more corner-case-proof logic for `wants_break_system_packages`.
continuous-integration/drone/push Build is passing Details
2024-05-25 10:33:05 +02:00
Fabio Manganiello 303b11613b
s/Dockerfile.default/Dockerfile.alpine/
continuous-integration/drone/push Build is passing Details
2024-05-25 10:30:53 +02:00
Fabio Manganiello 05c6449d8b
Always add --break-system-packages to pip when the Docker context is active.
This fixes the case where Platydock is called within the context of a
virtual environment, but it needs to generate a Docker image - and
therefore, unless the host virtual environment, it needs
--break-system-packages to write to /usr.
2024-05-25 10:30:52 +02:00
Fabio Manganiello 5e52741986
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-25 08:19:19 +00:00
Fabio Manganiello 7d8a00696c
Adapted Platydock to the new Dockerfile format.
continuous-integration/drone/push Build is passing Details
2024-05-25 10:17:45 +02:00
Fabio Manganiello 254604e404
py3-vlc has not been merged upstream in Alpine Linux yet. 2024-05-25 10:17:19 +02:00
Fabio Manganiello 8f0002ae40
Moved /Dockerfile to /Dockerfile.default.
It can mess up the Alpine Dockerfile if platydock is run from the source
directory.
2024-05-25 10:16:29 +02:00
Fabio Manganiello 8e05a7f4c9
Make Dockerfiles work both within and outside a Platypush source dir.
If the Platypush setup.py is found in the current directory, then use
that directory as the base for the new image.

Otherwise, clone the repo on the fly and build the image from there.
2024-05-25 00:42:30 +02:00
Fabio Manganiello 0fd2992894
Added `platypush.events` alias for `platypush.message.event` package. 2024-05-24 23:16:15 +02:00
Fabio Manganiello efd97f7186
Added a docker-compose.yml. 2024-05-24 23:15:37 +02:00
Fabio Manganiello 3ccdd4d179
Updated `pip ... --break-system-packages` configuration.
All the latest versions of Alpine, Debian, Ubuntu and Fedora now require
`--break-system-packages` when installing packages via `pip` outside of
a virtual environment, even if it's within a container.
2024-05-24 22:59:42 +02:00
Fabio Manganiello d20cd4b058
Added a nice ASCII-art logo at application startup. 2024-05-24 22:57:50 +02:00
Fabio Manganiello c49b4ca273
`platypush.run` should also support procedures in the format `procedure.<name>`.
continuous-integration/drone/push Build is passing Details
2024-05-24 20:20:25 +02:00
Fabio Manganiello 5c2204f99d
Allow for custom procedure names on the `@procedure` decorator.
```
@procedure("foo")
def bar():
    ...
```

Will now be published as `procedure.foo` instead of
`procedure.<module>.bar`.
2024-05-24 20:07:24 +02:00
Fabio Manganiello cbc58c7330
Fix: /var/lib/platypush is still empty at the time of package creation.
continuous-integration/drone/push Build is passing Details
2024-05-23 03:37:46 +02:00
Fabio Manganiello 7ca2159acb
Fix: missing newline escape
continuous-integration/drone/push Build is failing Details
2024-05-23 03:34:00 +02:00
Fabio Manganiello 2dd5b6c122
systemd-rpm-macros is a build requirement for the Fedora build.
continuous-integration/drone/push Build is failing Details
2024-05-23 03:28:56 +02:00
Fabio Manganiello a51d8978e7
[#319] Added /etc/platypush and /var/lib/platypush to rpm packages.
continuous-integration/drone/push Build is failing Details
2024-05-23 03:24:24 +02:00
Fabio Manganiello a5adac9314
[#319] Added /etc and /var/lib dirs to Debian package. 2024-05-23 02:46:38 +02:00
Fabio Manganiello a211e2e2e4
Changed default permissions for /var/lib/platypush from 0755 to 0750. 2024-05-23 01:15:26 +02:00
Fabio Manganiello 7fa0dbda7b
Split Drone CI steps into separate shell scripts.
continuous-integration/drone/push Build is passing Details
A fully self-contained 1.5k LoC Drone file isn't very maintainable, and
it makes it hard to reuse parts that are shared across multiple steps
(like SSH and git configuration).
2024-05-23 00:17:55 +02:00
snyk-bot 46da373637
fix: upgrade sass from 1.75.0 to 1.76.0
Snyk has created this PR to upgrade sass from 1.75.0 to 1.76.0.

See this package in npm:
sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-22 12:34:49 +00:00
Fabio Manganiello 4038ef3bc1
[#319] Added `platypush/config/systemd` directory.
continuous-integration/drone/push Build is passing Details
It contains both `platypush.service` and the `sysusers.d` and
`tmpfiles.d` configurations used by the package managers.
2024-05-20 22:19:30 +02:00
Fabio Manganiello 1cad0394ab
systemd requirements tweak.
continuous-integration/drone/push Build is passing Details
`Requires=redis.service` should be commented unless the service is
started as a privileged user.

Also added some comments on how the systemd service usually works.
2024-05-20 21:51:08 +02:00
Fabio Manganiello 02a3385638
Tweaked Platypush systemd service.
continuous-integration/drone/push Build is passing Details
- A more informative Description
- `s/WantedBy=default.target/WantedBy=multi-user.target/`
- `redis.service` is a strong requirement
2024-05-20 13:02:36 +02:00
Fabio Manganiello c899627eca
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-20 00:03:25 +00:00
Fabio Manganiello d0f781919d
[#345] Rewritten `sun` plugin.
continuous-integration/drone/push Build is passing Details
Closes: #345
2024-05-20 02:01:40 +02:00
Fabio Manganiello 86b4b14112
Added the current running application as a static object.
continuous-integration/drone/push Build is passing Details
```python
from platypush import app
```
2024-05-20 01:54:25 +02:00
Fabio Manganiello 32b8296244
[#400] Dynamic logic to infer procedures/hooks arguments.
This allows procedures and event hooks to have more flexible signatures.
Along the lines of:

```python
@when(SomeEvent)
def hook(event):
  ...

@when(SomeOtherEvent)
def hook2():
  ...
```

Instead of supporting only the full context spec:

```python
@when(SomeEvent)
def hook(event, **ctx):
  ...
```

Closes: #400
2024-05-19 02:17:42 +02:00
Fabio Manganiello 2ab1743bec
[Docs UI] Fix filter bar to the top while scrolling. 2024-05-19 02:17:42 +02:00
Fabio Manganiello 70ffe0ec04
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-17 00:23:06 +00:00
Fabio Manganiello 3d5c60e4f4
[UI docs] Added filter bar for integrations and events.
continuous-integration/drone/push Build is passing Details
2024-05-17 02:21:57 +02:00
Fabio Manganiello f06233801b
[#394] Dynamically generate setup extras.
Also, convert all code that relied on `manifest.yaml` to use
`manifest.json` instead.

Closes: #394
2024-05-17 02:21:57 +02:00
Fabio Manganiello 59c693d6a0
[#394] All `manifest.yaml` converted to `manifest.json`.
YAML isn't part of the Python standard library, while JSON is.

If we want `setup.py` to dynamically parse the available integration
manifest files in order to populate the extra dependencies, then it's
better to rely on a JSON format for manifest files - the parser is part
of the standard library and it doesn't require the user to install
`pyyaml` before `platypush`.
2024-05-17 02:21:57 +02:00
Fabio Manganiello 79a71d00b4
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-16 00:44:03 +00:00
Fabio Manganiello c77cf2c98b
[#372] Removed Google Fit plugin.
continuous-integration/drone/push Build is passing Details
The Fit API has (unfortunately) been deprecated by Google with no
alternatives - the new Health Connect API is only available on Android
devices.

Other Google APIs don't seem to be affected by the refresh token issue
either, so this should hopefully close that issue too.

Closes: #372
2024-05-16 02:42:54 +02:00
Fabio Manganiello f514f7ce1e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-15 07:57:10 +00:00
Fabio Manganiello 98a98ea1dc
[#398] Removed custom `Response` objects from Tensorflow and response docs generation logic.
continuous-integration/drone/push Build is passing Details
Closes: #398
2024-05-15 09:55:58 +02:00
Fabio Manganiello 77c91aa5e3
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-15 06:35:17 +00:00
Fabio Manganiello 0e11bbeb05
Fixed schema reference.
continuous-integration/drone/push Build is passing Details
2024-05-15 08:33:49 +02:00
Fabio Manganiello 20f3eaf375
[#398] Refactored `esp` plugin.
continuous-integration/drone/push Build was killed Details
- Converted `Response` objects into `Schema`s.

- Removed the last references to the deprecated `Mapping` object.

- Fixed all errors and warnings in the plugin.
2024-05-15 01:29:45 +02:00
Fabio Manganiello 55e230c361
Removed `wiimote` events associated to removed `wiimote` plugin. 2024-05-15 01:29:45 +02:00
snyk-bot 092f5b607c
fix: upgrade vue from 3.4.23 to 3.4.24
Snyk has created this PR to upgrade vue from 3.4.23 to 3.4.24.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-14 17:33:05 +00:00
Fabio Manganiello ad4d929c28
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-13 00:23:15 +00:00
Fabio Manganiello 7ae99b4325
[#398] `cups` plugin refactor.
continuous-integration/drone/push Build is passing Details
1. Renamed plugin: `printer.cups` ➡️  `cups`.
2. Replaced `Response` objects with schemas.
2024-05-13 02:22:04 +02:00
Fabio Manganiello 2efffb8ebe
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-12 23:26:45 +00:00
Fabio Manganiello 15b1c1f3c0
[#398] Replaced `GoogleDriveFile` response with `GoogleDriveFileSchema`.
continuous-integration/drone/push Build is passing Details
2024-05-13 01:25:33 +02:00
Fabio Manganiello 6003b205c8
[#398] Removed `TranslateResponse`. 2024-05-13 01:25:33 +02:00
Fabio Manganiello 825f20ab77
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-09 23:48:43 +00:00
Fabio Manganiello 7d87c5e92a
Merge pull request #424 from blacklight/snyk-upgrade-5e98f9077cfce52b1250c6e6a38f95a0
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade core-js from 3.36.1 to 3.37.0
2024-05-10 01:46:32 +02:00
Fabio Manganiello 3b3f157086
Merge branch 'master' into snyk-upgrade-5e98f9077cfce52b1250c6e6a38f95a0 2024-05-10 01:46:24 +02:00
Fabio Manganiello ad20345505
Merge pull request #423 from blacklight/snyk-upgrade-d36bc5586dd237b84d10196576744320
[Snyk] Upgrade cronstrue from 2.48.0 to 2.49.0
2024-05-10 01:45:09 +02:00
Fabio Manganiello fc4d006064
Merge pull request #422 from blacklight/snyk-upgrade-782bd84f2e24c5ffc88e43f1d25d5de4
[Snyk] Upgrade axios from 1.6.7 to 1.6.8
2024-05-10 01:44:51 +02:00
Fabio Manganiello e10fb4e549
Merge pull request #421 from blacklight/snyk-upgrade-7087de73af11ecfaae1f5f0a8dc827f2
[Snyk] Upgrade vue-router from 4.3.0 to 4.3.2
2024-05-10 01:44:34 +02:00
Fabio Manganiello 404737dc24
Merge branch 'master' into snyk-upgrade-7087de73af11ecfaae1f5f0a8dc827f2 2024-05-10 01:44:19 +02:00
Fabio Manganiello 2896bd64b6
Merge pull request #420 from blacklight/snyk-upgrade-9cd3716e8d2fdaf3c323b2566785c607
[Snyk] Upgrade vue-skycons from 4.2.0 to 4.3.4
2024-05-10 01:43:16 +02:00
Fabio Manganiello 7e8f8a35fc
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 23:38:23 +00:00
Fabio Manganiello b662e98447
[#398] Removed `ssh` response objects.
continuous-integration/drone/push Build is passing Details
2024-05-10 01:37:17 +02:00
Fabio Manganiello f978d708cb
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 23:02:32 +00:00
Fabio Manganiello 6f8c2085f2
[#398] Replaced `qrcode` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-10 01:01:22 +02:00
snyk-bot 6f0451b733
fix: upgrade core-js from 3.36.1 to 3.37.0
Snyk has created this PR to upgrade core-js from 3.36.1 to 3.37.0.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:23 +00:00
snyk-bot c80af03e8d
fix: upgrade cronstrue from 2.48.0 to 2.49.0
Snyk has created this PR to upgrade cronstrue from 2.48.0 to 2.49.0.

See this package in npm:
https://www.npmjs.com/package/cronstrue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:18 +00:00
snyk-bot 186e85cc86
fix: upgrade axios from 1.6.7 to 1.6.8
Snyk has created this PR to upgrade axios from 1.6.7 to 1.6.8.

See this package in npm:
https://www.npmjs.com/package/axios

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:14 +00:00
snyk-bot 83ca9fd8e5
fix: upgrade vue-router from 4.3.0 to 4.3.2
Snyk has created this PR to upgrade vue-router from 4.3.0 to 4.3.2.

See this package in npm:
https://www.npmjs.com/package/vue-router

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:10 +00:00
snyk-bot 8437f05d6a
fix: upgrade vue-skycons from 4.2.0 to 4.3.4
Snyk has created this PR to upgrade vue-skycons from 4.2.0 to 4.3.4.

See this package in npm:
https://www.npmjs.com/package/vue-skycons

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:06 +00:00
Fabio Manganiello 8d04eadd77
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-09 12:17:46 +00:00
Fabio Manganiello e74137d4d1
Merge pull request #419 from blacklight/snyk-upgrade-83595b90e84b75cb5b628ea340bc6c3c
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade core-js from 3.36.0 to 3.36.1
2024-05-09 14:15:26 +02:00
Fabio Manganiello 6b12d5ca0e
Merge pull request #418 from blacklight/snyk-upgrade-f5b9569657478ec13c79bc3064807f15
[Snyk] Upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2
2024-05-09 14:15:10 +02:00
Fabio Manganiello e683912228
Merge pull request #417 from blacklight/snyk-upgrade-503e414934e3e9df4999abbd15eed244
[Snyk] Upgrade vue-router from 4.2.5 to 4.3.0
2024-05-09 14:14:52 +02:00
Fabio Manganiello 912dddd3da
Merge branch 'master' into snyk-upgrade-503e414934e3e9df4999abbd15eed244 2024-05-09 14:14:07 +02:00
Fabio Manganiello afbb61565b
Merge pull request #416 from blacklight/snyk-upgrade-eb696c7a079843109d9453f80144a956
[Snyk] Upgrade sass from 1.71.0 to 1.75.0
2024-05-09 14:12:35 +02:00
Fabio Manganiello df8299ab61
Merge pull request #415 from blacklight/snyk-upgrade-9b35134e9eafc25285fde220c6d0dc11
[Snyk] Upgrade vue from 3.4.19 to 3.4.23
2024-05-09 14:12:17 +02:00
Fabio Manganiello 741f1aef84
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 12:08:36 +00:00
Fabio Manganiello 3df76a4a9c
[#398] Replaced `pihole` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-09 14:06:54 +02:00
Fabio Manganiello 929ac09cae
[#398] Removed unused `stt` response module.
continuous-integration/drone/push Build is passing Details
2024-05-09 11:01:42 +02:00
Fabio Manganiello 3277c56b43
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-08 23:48:25 +00:00
Fabio Manganiello c906aab64d
[camera.android.ipcam UI] Adapted to the new plugin API.
continuous-integration/drone/push Build is passing Details
2024-05-09 01:46:36 +02:00
Fabio Manganiello 2021e25752
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-08 23:42:25 +00:00
Fabio Manganiello 13bde4adba
[#398] Replaced `camera` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-09 01:41:15 +02:00
Fabio Manganiello 579faf63bc
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-08 20:00:37 +00:00
Fabio Manganiello 7a849379f9
[#399] Added `@when` decorator as an alias for `@hook`.
continuous-integration/drone/push Build is passing Details
Closes: #399
2024-05-08 21:58:58 +02:00
snyk-bot 4a100b0dc0
fix: upgrade core-js from 3.36.0 to 3.36.1
Snyk has created this PR to upgrade core-js from 3.36.0 to 3.36.1.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:30 +00:00
snyk-bot 5a1bccac4d
fix: upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2
Snyk has created this PR to upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2.

See this package in npm:
https://www.npmjs.com/package/@fortawesome/fontawesome-free

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:26 +00:00
snyk-bot 499b3cd9c9
fix: upgrade vue-router from 4.2.5 to 4.3.0
Snyk has created this PR to upgrade vue-router from 4.2.5 to 4.3.0.

See this package in npm:
https://www.npmjs.com/package/vue-router

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:22 +00:00
snyk-bot 8be6d80b45
fix: upgrade sass from 1.71.0 to 1.75.0
Snyk has created this PR to upgrade sass from 1.71.0 to 1.75.0.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:19 +00:00
snyk-bot fc621a27f3
fix: upgrade vue from 3.4.19 to 3.4.23
Snyk has created this PR to upgrade vue from 3.4.19 to 3.4.23.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:15 +00:00
Fabio Manganiello 85e44542e2
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-07 10:49:01 +00:00
Fabio Manganiello c094fac7dc
Merge pull request #407 from blacklight/snyk-upgrade-1d870abd0ad2c511fe65000600f02a14
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade cronstrue from 2.47.0 to 2.48.0
2024-05-07 12:42:38 +02:00
Fabio Manganiello 9dc0fbe6e7
Merge branch 'master' into snyk-upgrade-1d870abd0ad2c511fe65000600f02a14 2024-05-07 12:42:30 +02:00
Fabio Manganiello d6b1337c5a
Merge pull request #413 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/express-4.19.2
Bump express from 4.18.2 to 4.19.2 in /platypush/backend/http/webapp
2024-05-07 12:40:57 +02:00
Fabio Manganiello 0adde5a107
Merge pull request #414 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/ejs-3.1.10
Bump ejs from 3.1.9 to 3.1.10 in /platypush/backend/http/webapp
2024-05-07 12:40:41 +02:00
Fabio Manganiello 89ced918f1
Merge pull request #412 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/webpack-dev-middleware-5.3.4
Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /platypush/backend/http/webapp
2024-05-07 12:40:28 +02:00
Fabio Manganiello bf52f44f92
Merge pull request #411 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/follow-redirects-1.15.6
Bump follow-redirects from 1.15.4 to 1.15.6 in /platypush/backend/http/webapp
2024-05-07 12:40:08 +02:00
Fabio Manganiello e285009da3
Merge pull request #409 from blacklight/snyk-upgrade-f2aa58c6cb66ee05c32f925b535a8b1f
[Snyk] Upgrade core-js from 3.35.1 to 3.36.0
2024-05-07 12:39:56 +02:00
Fabio Manganiello 3edc8d1077
Merge pull request #408 from blacklight/snyk-upgrade-29d2bb6c813d352072249a6db7e3a805
[Snyk] Upgrade vue from 3.4.18 to 3.4.19
2024-05-07 12:39:36 +02:00
Fabio Manganiello cbaca5f303
Merge pull request #406 from blacklight/snyk-upgrade-bf6b4c595d14f755033e14807ed62fa7
[Snyk] Upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1
2024-05-07 12:39:20 +02:00
Fabio Manganiello df79bb3ea6
Merge pull request #410 from blacklight/snyk-upgrade-73632136d273593f5bc9c7ffc6fd9c71
[Snyk] Upgrade sass from 1.70.0 to 1.71.0
2024-05-07 12:39:04 +02:00
Fabio Manganiello 228031c4ad
[#331] Automatically initialize __init__.py in script dirs.
continuous-integration/drone/push Build is passing Details
Closes: #331
2024-05-07 02:59:13 +02:00
Fabio Manganiello fdeba9e53c
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-06 00:28:09 +00:00
Fabio Manganiello 3c88593e9a
[#293] Merged `midi` plugin and backend.
continuous-integration/drone/push Build is passing Details
Closes: #293
2024-05-06 02:26:27 +02:00
Fabio Manganiello 6a8c83f99b
🐛 Don't add the new password salt/iterations columns if already present.
continuous-integration/drone/push Build is passing Details
And, similarly, don't remove them if they aren't on the user table.
2024-05-05 21:58:51 +02:00
Fabio Manganiello 901338e228
[#397] Replaced bcrypt dependency with native hashlib logic.
continuous-integration/drone/push Build is failing Details
Closes: #397
2024-05-05 21:38:27 +02:00
dependabot[bot] 9651354fbf
Bump ejs from 3.1.9 to 3.1.10 in /platypush/backend/http/webapp
Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10.
- [Release notes](https://github.com/mde/ejs/releases)
- [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10)

---
updated-dependencies:
- dependency-name: ejs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-02 10:39:57 +00:00
Fabio Manganiello a5826892dd
[CI/CD] Added `python-setuptools` to build dependencies.
continuous-integration/drone/push Build is passing Details
It's apparently been extracted out of the core Python library on the
version 3.12 of the interpreter.
2024-05-02 03:31:41 +02:00
Fabio Manganiello 373d98fc6a
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2024-05-02 01:11:36 +00:00
Fabio Manganiello 61e466d8e2
[UI] Added `tts.picovoice` component and `assistant.picovoice` icon.
continuous-integration/drone/push Build is passing Details
2024-05-02 03:07:47 +02:00
Fabio Manganiello 4ac73837f6
[Automatic] Updated components cache
continuous-integration/drone/push Build is failing Details
2024-05-02 00:51:58 +00:00
Fabio Manganiello 72bc697122 [assistant.picovoice] Extended documentation. 2024-05-02 00:51:09 +00:00
Fabio Manganiello b2c07a31f2 Fixed tests 2024-05-02 00:51:09 +00:00
Fabio Manganiello d813356d9c [music.mopidy] Handle the case where `add` returns a list. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 1192782729 [tts.picovoice] Convert digits before replacing other substrings. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 4734909912 🐛 The `EventMatchResult` object shouldn't be initialized with `args` from the event.
If there's a good use-case for overriding `Event._matches_condition`
with a logic that also parses the event arguments, then those arguments
should be accessed directly from the event object, not from the match
result.

Initializing `EventMatchResult` with the arguments from the event means
that, if `EventMatchResult.parsed_args` are populated with custom
extracted arguments, then the upstream event arguments will also be
modified.

If the event is matched against multiple conditions, this will result in
the extracted tokens getting modified by each `matches_condition`
iteration.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 237fc58928 [tts.picovoice] A more robust logic for replacing unsupported characteres on the input. 2024-05-02 00:51:09 +00:00
Fabio Manganiello d8e24207c5 Added `openai` plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello bd4b1d3e0f [assistant.picovoice] Sync between the speech and intent engines. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a373091c64 Prevent duplicate hook runs.
Instead of being a list, the hooks in the hook processor should be
backed by by-name and by-value maps.

Don't insert a hook if its exact backing method has already been
inserted. This is actually very common when hooks are defined as Python
snippets imported in other scripts too.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 632d98703b New architecture for the assistant speech detection logic.
The assistant object now runs in its own thread and leverages an
external `SpeechProcessor` that uses two threads to scan for both
intents and speech in parallel on audio frames.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 6f8816d23d Prevent a potential recursion error in `wait_for_either`.
We shouldn't overwrite `event._set` and `event._clear` if those values
have already been set.

Those attributes hold the original references to `Event.set` and
`Event.clear` respectively, and the `OrEvent` logic overwrites them with
a callback-based logic.

This shouldn't happen if those attributes are already present.
2024-05-02 00:51:09 +00:00
Fabio Manganiello af1392b5b9 [assistant] Added `ResponseEndEvent` and `IntentMatchedEvent` 2024-05-02 00:51:09 +00:00
Fabio Manganiello bb9b6cd319 [assistant.picovoice] Various improvements.
- Added `intent_model_path` parameter.

- Always apply `expanduser` to configuration paths.

- Better logic to infer the fallback model path.

- The Picovoice Leonardo object should always be removed after
  `assistant.picovoice.transcribe` is called.
2024-05-02 00:51:09 +00:00
Fabio Manganiello f0a780b759 Added `assistant.picovoice.transcribe` and `assistant.picovoice.say`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello f04f7ce9d7 [tts.picovoice] Better text pre-processing logic. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 37d70d67ac [assistant.picovoice] Implemented `assistant.picovoice.send_text_query`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello fa1d5eb672 [tts.picovoice] Added text pre-processing workaround.
This workaround is required until
https://github.com/Picovoice/orca/issues/10 is fixed.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a345b12244 [assistant.picovoice] Leverage upstream `_on_mute_changed`.
The plugin should leverage `AssistantPlugin._on_mute_changed` to handle
the boilerplate state managent on mute/unmute actions instead of
re-implementing the same logic.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 2c197c275e [assistant.picovoice] Implemented mic mute/unmute handling. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 9de49c71a1 [assistant.picovoice] Conversation flow improvements.
- The `Responding` state should be modelled as an extra event/binary
  flag, not as an assistant state. The assistant may be listening for
  hotwords even while the `tts` plugin is responding, and we don't want
  the two states to interfere with each either - neither to build a more
  complex state machine that also needs to take concurrent states into
  account.

- Stop any responses being rendered upon the `tts` plugin when a new
  hotword audio is detected. If e.g. I say "Ok Google", I should always
  be able to trigger the assistant and stop any concurrent audio
  process.

- `SpeechRecognizedEvent` should be emitted even if `cheetah`'s latest
  audio frame results weren't marked as final, and the speech detection
  window timed out. Cheetah's `is_final` detection seems to be quite
  buggy sometimes, and it may not properly detect the end of utterances,
  especially with non-native accents. The workaround is to flush out
  whatever text is available (if at least some speech was detected) into
  a `SpeechRecognizedEvent` upon timeout.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a6f7b6e790 Added more default imports under the `platypush` module root.
These objects can now also be imported in scripts through
`from platypush import <name>`:

- `Variable`
- `cron`
- `hook`
- `procedure`
2024-05-02 00:51:09 +00:00
Fabio Manganiello aa333db05c [assistant.picovoice] More features.
- Added wiring between `assistant.picovoice` and `tts.picovoice`.

- Added `RESPONDING` status to the assistant.

- Added ability to override the default speech model upon
  `start_conversation`.

- Better handling of conversation timeouts.

- Cache Cheetah objects in a `model -> object` map - at least the
  default model should be pre-loaded, since model loading at runtime
  seems to take a while, and that could impact the ability to detect the
  speech in the first seconds after a hotword is detected.
2024-05-02 00:51:09 +00:00
Fabio Manganiello af875c996e Added `tts.picovoice` plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a4c911a5d7 Added ffmpeg requirement for `assistant.picovoice`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 8193c5702c s/partial_transcript/transcript/g 2024-05-02 00:51:09 +00:00
Fabio Manganiello 8378bee7c6 Refactored `AssistantEvent`.
`AssistantEvent.assistant` is now modelled as an opaque object that
behaves the following way:

- The underlying plugin name is saved under `event.args['_assistant']`.

- `event.assistant` is a property that returns the assistant instance
  via `get_plugin`.

- `event.assistant` is reported as a string (plugin qualified name) upon
  event dump.

This allows event hooks to easily use `event.assistant` to interact with
the underlying assistant and easily modify the conversation flow, while
event hook conditions can still be easily modelled as equality
operations between strings.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a670f01647 [assistant.picovoice] Better partial transcript + flush handling logic. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 921025be0c `picovoice` -> `assistant.picovoice` 2024-05-02 00:51:09 +00:00
Fabio Manganiello bb38f2439c Better integration with the native base API of the assistant plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello f7517eb321 [WIP] Added speech detection logic over Cheetah. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a9498ea191 [WIP] Added initial hotword integration. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 44f9c03bf3 [#304] Removed old Picovoice integrations 2024-05-02 00:51:09 +00:00
Fabio Manganiello 98c99c7888
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-17 02:09:18 +00:00
Fabio Manganiello e123463804
[media.chromecast] Refactored implementation.
continuous-integration/drone/push Build is passing Details
Explicitly use a `CastBrowser` object initialized at plugin boot instead
of relying on blocking calls to `pychromecast.get_chromecasts`.

1. It enables better event handling via callbacks instead of
   synchronously waiting for scan batches.

2. It optimizes resources - only one Zeroconf and one CastBrowser object
   will be created in the plugin, and destroyed upon stop.

3. No need for separate `get_chromecast`/`_refresh_chromecasts` methods:
   all the scanning is run continuously, so we can just return the
   results from the maps.
2024-04-17 03:56:45 +02:00
Fabio Manganiello f99f6bdab9
[media.chromecast] Resource clean up + new API adaptations.
continuous-integration/drone/push Build is passing Details
- `pychromecast.get_chromecasts` returns both a list of devices and a
  browser object. Since the Chromecast plugin is the most likely culprit
  of the excessive number of open MDNS sockets, it seems that we may
  need to explicitly stop discovery on the browser and close the
  ZeroConf object after the discovery is done.

- I was still using an ancient version of pychromecast on my RPi4, and I
  didn't notice that more recent versions implemented several breaking
  changes. Adapted the code to cope with those changes.
2024-04-17 02:49:31 +02:00
Fabio Manganiello 4972c8bdcf
Unregister a Zeroconf instance if it already exists before publishing a backend service.
continuous-integration/drone/push Build is passing Details
`mdns` connection are another culprit for the increasing number of open
files in the process.
2024-04-16 00:12:55 +02:00
Fabio Manganiello 33d4c8342d
[#389] Possible fix for "Too many open files" media issue.
continuous-integration/drone/push Build is passing Details
It seems that the process keeps a lot of open connections to Chromecast
devices during playback.

The most likely culprit is the `_refresh_chromecasts` logic.

We should start a `cast` object and register a status listener only if a
Chromecast with the same identifier isn't already registered in the
plugin.
2024-04-15 23:01:10 +02:00
Fabio Manganiello 027bcea612
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-08 21:05:46 +00:00
Fabio Manganiello b4d0716bc5
Added layer of compatibility with both paho.mqtt >= 2.0.0 and < 2.0.0.
See 28aa2e6b26/ChangeLog.txt (L6)
2024-04-08 23:01:54 +02:00
revil-O 584f226b62 mqtt CallbackAPIVersion fix for paho.mqtt >= 2.0.0
fix to work with paho.mqtt >= 2.0.0
2024-04-08 16:05:27 +02:00
Fabio Manganiello dba0acb82e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 18:57:53 +00:00
Fabio Manganiello a026a101cd
Removed `stt.deepspeech` integration.
continuous-integration/drone/push Build is passing Details
The project hasn't seen a commit in three years and it's probably been
abandoned by Mozilla.

New and better maintained speech-to-text integrations will be
investigated.
2024-04-05 20:56:45 +02:00
Fabio Manganiello b00623f655
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-05 02:00:03 +00:00
Fabio Manganiello 03765ad652
[UI] Better style for music widget.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:58:12 +02:00
Fabio Manganiello 96f3420c8e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 01:47:09 +00:00
Fabio Manganiello c31180dae8
[music.mopidy] Fixed parsing of `new_state` upon `playback_state_changed`.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:46:01 +02:00
Fabio Manganiello b1498bfc28
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 01:41:38 +00:00
Fabio Manganiello 083c9e250e
[music.mopidy] Better handling of client events.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:40:27 +02:00
Fabio Manganiello 88ffc3b795
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-04-05 00:56:48 +00:00
Fabio Manganiello 5f6fd4aa54
Added `--db` CLI option and support for configuration over environment.
continuous-integration/drone/push Build is passing Details
Closes: #280
2024-04-05 02:54:45 +02:00
Fabio Manganiello c8361aa475
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-04 00:53:18 +00:00
Fabio Manganiello 496a3f4911 Updated docs 2024-04-04 00:52:30 +00:00
Fabio Manganiello d2ec93b798 [#297] Removed `music.spotify` backend.
1. I no longer I use a Spotify account (I switched to Tidal after
   Spotify deprecated libspotify), and I wouldn't like to create one
   just to test this integration.

2. After a couple of years, the libspotify open fork (Librespot) seems
   to be still in an unstable stage and it's already been discontinued
   once - I would avoid rebuilding the integration against a dependency
   that may change a lot in the near future.
2024-04-04 00:52:30 +00:00
Fabio Manganiello 73cc47b964
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-03 23:57:10 +00:00
Fabio Manganiello 787b6a6af6
[UI] A more consistent light style for the music widget.
continuous-integration/drone/push Build is passing Details
2024-04-04 01:54:52 +02:00
Fabio Manganiello 6f24504cc4
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-03 23:11:49 +00:00
Fabio Manganiello 5d9a201a5b
[#297] Mopidy/MPD refactor+migration, UI side.
continuous-integration/drone/push Build is passing Details
2024-04-04 01:07:05 +02:00
Fabio Manganiello e2246c8d30
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-03 23:02:09 +00:00
Fabio Manganiello 58518a4d63 Better timeout management on mopidy status refresh. 2024-04-03 23:01:22 +00:00
Fabio Manganiello 5346833152 [WIP] API adaptations for `music.mpd` 2024-04-03 23:01:22 +00:00
Fabio Manganiello 89d618b35f [WIP] `music.mopidy` refactor, initial backend rewrite. 2024-04-03 23:01:22 +00:00
Fabio Manganiello d2e5e5230b [music.mpd] Removed deprecated actions.
- `setvol` ➡️  `set_volume`
- `seekcur` ➡️  `seek`
- `playlistinfo` ➡️  `get_tracks`
- `listplaylists` ➡️  `get_playlists`
- `listplaylist` ➡️  `get_playlist`
- `listplaylistinfo` ➡️  `get_playlist`
- `playlistadd` ➡️  `add_to_playlist`
- `playlistdelete` ➡️  `remove_from_playlist`
- `playlistmove` ➡️  `playlist_move`
- `playlistclear` ➡️  `playlist_clear`
- `rename` ➡️  `rename_playlist`
- `rm` ➡️  `delete_playlist`

stuff
2024-04-03 23:01:22 +00:00
Fabio Manganiello a3b6d411e4 [music.mpd] Adjust default poll_interval: 5 -> 20 seconds. 2024-04-03 23:01:22 +00:00
dependabot[bot] 749eda16b4
Bump express from 4.18.2 to 4.19.2 in /platypush/backend/http/webapp
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-29 06:46:45 +00:00
dependabot[bot] 2d72ce9645
Bump webpack-dev-middleware in /platypush/backend/http/webapp
Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4.
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4)

---
updated-dependencies:
- dependency-name: webpack-dev-middleware
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-23 19:14:44 +00:00
dependabot[bot] 8ed358fcc8
Bump follow-redirects in /platypush/backend/http/webapp
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-16 23:30:25 +00:00
snyk-bot a30042e1eb
fix: upgrade sass from 1.70.0 to 1.71.0
Snyk has created this PR to upgrade sass from 1.70.0 to 1.71.0.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-08 18:50:38 +00:00
snyk-bot b9d637187c
fix: upgrade core-js from 3.35.1 to 3.36.0
Snyk has created this PR to upgrade core-js from 3.35.1 to 3.36.0.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 15:26:22 +00:00
snyk-bot 6a55527694
fix: upgrade vue from 3.4.18 to 3.4.19
Snyk has created this PR to upgrade vue from 3.4.18 to 3.4.19.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 02:09:43 +00:00
snyk-bot 5488c97f4b
fix: upgrade cronstrue from 2.47.0 to 2.48.0
Snyk has created this PR to upgrade cronstrue from 2.47.0 to 2.48.0.

See this package in npm:
https://www.npmjs.com/package/cronstrue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 02:09:40 +00:00
snyk-bot e12054c484
fix: upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1
Snyk has created this PR to upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1.

See this package in npm:
https://www.npmjs.com/package/@fortawesome/fontawesome-free

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 02:09:36 +00:00
Fabio Manganiello 288344a348
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-05 10:19:13 +00:00
Fabio Manganiello 8f35fbed16
Merge pull request #404 from BlackLight/snyk-upgrade-66089ad9a01450eef161c7e7fac48843
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade axios from 1.6.4 to 1.6.7
2024-03-05 11:15:26 +01:00
Fabio Manganiello 0e8408a83f
Merge branch 'master' into snyk-upgrade-66089ad9a01450eef161c7e7fac48843 2024-03-05 11:15:09 +01:00
Fabio Manganiello 8c0939c308
Merge pull request #405 from BlackLight/snyk-upgrade-785cc8b707ebb00ef02379485bb64589
[Snyk] Upgrade sass-loader from 10.4.1 to 10.5.2
2024-03-05 11:14:19 +01:00
Fabio Manganiello 8c2abf5d9a
Merge branch 'master' into snyk-upgrade-785cc8b707ebb00ef02379485bb64589 2024-03-05 11:14:08 +01:00
Fabio Manganiello f7d651983a
Merge pull request #403 from BlackLight/snyk-upgrade-eaf91feb3c2e9502206ab6258f4f7a06
[Snyk] Upgrade sass from 1.69.3 to 1.70.0
2024-03-05 11:11:29 +01:00
Fabio Manganiello 57f269486c
Merge pull request #402 from BlackLight/snyk-upgrade-7bb8fbc94f3d6132decf153710b18875
[Snyk] Upgrade core-js from 3.33.0 to 3.35.1
2024-03-05 11:11:13 +01:00
Fabio Manganiello 82c8c79778
Merge pull request #401 from BlackLight/snyk-upgrade-6f8a6cdcfdde123a5d036b41986f9966
[Snyk] Upgrade vue from 3.3.6 to 3.4.18
2024-03-05 11:11:00 +01:00
snyk-bot 9de799f6a1
fix: upgrade sass-loader from 10.4.1 to 10.5.2
Snyk has created this PR to upgrade sass-loader from 10.4.1 to 10.5.2.

See this package in npm:
https://www.npmjs.com/package/sass-loader

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:51 +00:00
snyk-bot b21a27366c
fix: upgrade axios from 1.6.4 to 1.6.7
Snyk has created this PR to upgrade axios from 1.6.4 to 1.6.7.

See this package in npm:
https://www.npmjs.com/package/axios

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:47 +00:00
snyk-bot 50b712a8d3
fix: upgrade sass from 1.69.3 to 1.70.0
Snyk has created this PR to upgrade sass from 1.69.3 to 1.70.0.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:44 +00:00
snyk-bot aaa38c0f2d
fix: upgrade core-js from 3.33.0 to 3.35.1
Snyk has created this PR to upgrade core-js from 3.33.0 to 3.35.1.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:40 +00:00
snyk-bot 31222b3f05
fix: upgrade vue from 3.3.6 to 3.4.18
Snyk has created this PR to upgrade vue from 3.3.6 to 3.4.18.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:36 +00:00
Fabio Manganiello 3ebb59ed26
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-04 00:07:15 +00:00
Fabio Manganiello 5c9c9f0a61
[Nav UI] Better alignment of items on the expanded menu.
continuous-integration/drone/push Build is passing Details
2024-03-04 01:05:07 +01:00
Fabio Manganiello 41cbe40362
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-03 22:15:59 +00:00
Fabio Manganiello 0c6d3a5074
Merge pull request #399 from BlackLight/snyk-fix-cbc2d5f1b27baf97088c91fe8a0ed9ad
continuous-integration/drone/push Build is passing Details
[Snyk] Security upgrade axios from 1.6.0 to 1.6.4
2024-03-03 23:13:32 +01:00
Fabio Manganiello f78823981b
Merge pull request #396 from BlackLight/snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9
[Snyk] Upgrade vue from 3.3.4 to 3.3.6
2024-03-03 23:11:29 +01:00
Fabio Manganiello 0dea8c3b44
Merge branch 'master' into snyk-fix-cbc2d5f1b27baf97088c91fe8a0ed9ad 2024-03-03 23:10:22 +01:00
Fabio Manganiello c06d97d9b7
Merge branch 'master' into snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9 2024-03-03 23:06:23 +01:00
Fabio Manganiello 0653bcf5b9
Merge pull request #395 from BlackLight/snyk-upgrade-87b37fbfcf86065d749fecde13c6979c
[Snyk] Upgrade vue-router from 4.2.4 to 4.2.5
2024-03-03 23:03:33 +01:00
Fabio Manganiello 085cb1031a
Merge pull request #394 from BlackLight/snyk-upgrade-225081273089712ac56cf6c7af77c223
[Snyk] Upgrade core-js from 3.32.0 to 3.33.0
2024-03-03 23:03:16 +01:00
Fabio Manganiello 27afa90f9d
Merge pull request #393 from BlackLight/snyk-upgrade-8c58c38d04e6adb5e9a1902f135a9d45
[Snyk] Upgrade sass from 1.65.1 to 1.69.3
2024-03-03 23:02:43 +01:00
Fabio Manganiello 938b8761e7
Merge branch 'master' into snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9 2024-03-03 23:02:11 +01:00
Fabio Manganiello 3993a51aed
Merge branch 'master' into snyk-upgrade-87b37fbfcf86065d749fecde13c6979c 2024-03-03 23:00:23 +01:00
Fabio Manganiello 4a6f89582c
Merge branch 'master' into snyk-upgrade-225081273089712ac56cf6c7af77c223 2024-03-03 22:59:38 +01:00
Fabio Manganiello 3019ddfd0e
Merge branch 'master' into snyk-upgrade-8c58c38d04e6adb5e9a1902f135a9d45 2024-03-03 22:58:06 +01:00
Fabio Manganiello 05213d9afc
Updated docs
continuous-integration/drone/push Build is passing Details
2024-03-03 22:50:57 +01:00
Fabio Manganiello 91943304e1
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-03 21:38:37 +00:00
Fabio Manganiello 2066db463b
[#295] Merged `music.mpd` plugin and backend.
continuous-integration/drone/push Build is passing Details
Closes: #295
2024-03-03 22:37:26 +01:00
Fabio Manganiello e96eae73ec
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-03 14:41:00 +00:00
Fabio Manganiello 6bdc9e77ee
[#349] Refactored/rewritten `telegram` plugin.
continuous-integration/drone/push Build is passing Details
1. `chat.telegram` -> `telegram` plugin.

2. Merged `backend.chat.telegram` logic into `telegram` plugin.

3. Rewritten the architecture of the integration to adapt to the new
   asyncio API introduced in the latest versions of telegram-bot-api.

Closes: #349
2024-03-03 15:39:47 +01:00
Fabio Manganiello 7637890a54
[irc] Plugin rename/refactor.
The `chat.irc` plugin is now `irc`.
2024-03-03 15:39:47 +01:00
Fabio Manganiello 1ba85231d8
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-01 00:10:21 +00:00
Fabio Manganiello 66e19d608a
Fixed flic events module name and path
continuous-integration/drone/push Build is passing Details
2024-02-29 23:48:10 +01:00
Fabio Manganiello e462f3becf
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 23:51:02 +00:00
Fabio Manganiello d415d65bff
Removed legacy wiimote plugin
continuous-integration/drone/push Build is passing Details
2024-02-29 00:49:56 +01:00
Fabio Manganiello b30dc7ddb5
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 23:28:39 +00:00
Fabio Manganiello c7b0440562
[#357] Migrated `backend.button.flic` to `flic` plugin.
continuous-integration/drone/push Build is passing Details
Closes: #357
2024-02-29 00:27:32 +01:00
Fabio Manganiello 765ac6143e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:57:12 +00:00
Fabio Manganiello d16daa3fdf
Removed `backend.sensor.ir.zeroborg`.
continuous-integration/drone/push Build is passing Details
That code is very old and broken, and it covers a very marginal feature
(events from the IR sensor of a Zeroborg board) that can be easily
covered by any general-purpose IR sensors.
2024-02-28 01:56:06 +01:00
Fabio Manganiello b46d3da5de
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:50:56 +00:00
Fabio Manganiello f1e568d6c8
FIX: Fixed refactored plugin name
continuous-integration/drone/push Build is passing Details
2024-02-28 01:49:52 +01:00
Fabio Manganiello ef5c65ff4d
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:45:11 +00:00
Fabio Manganiello ac9b82236e
Renamed `http.request` plugin as `http`.
continuous-integration/drone/push Build is passing Details
2024-02-28 01:44:04 +01:00
Fabio Manganiello d0d80c1edf
Removed old backend.http.request.* files 2024-02-28 01:44:04 +01:00
Fabio Manganiello 3e4b7ac1b5
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:28:53 +00:00
Fabio Manganiello 553c4090b7
[#309] Remove `wiimote` integration.
continuous-integration/drone/push Build is passing Details
The `cwiid` library and the Python bindings haven't been updated in
years, the `cwiid-git` package on Arch Linux still targets Python 2, and
installing `cwiid` via `pip` breaks recent versions of Python 3.

Closes: #309
2024-02-28 01:25:49 +01:00
Fabio Manganiello 7ccbf9347f
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-27 22:19:30 +00:00
Fabio Manganiello ea4e293338 [#352] Migrated `backend.sensor.leap` to `leap` plugin.
Closes: #352
2024-02-27 22:18:41 +00:00
Fabio Manganiello fc45b606ab Removed (currently) incomplete paragraph from README 2024-02-27 21:41:39 +00:00
Fabio Manganiello d77aa0b167 Removed legacy `backend.scard`.
Closes: #303
2024-02-27 21:39:02 +00:00
Fabio Manganiello 07dfc19bf5 Added `nfc.status` action. 2024-02-27 21:39:02 +00:00
Fabio Manganiello 99f9737211
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 23:55:43 +00:00
Fabio Manganiello 850cbe4237
Updated docs
continuous-integration/drone/push Build is passing Details
2024-02-27 00:53:27 +01:00
Fabio Manganiello dfaa5447ac
[#299] Refactored NFC backend into a runnable plugin. 2024-02-27 00:53:26 +01:00
Fabio Manganiello bbf755eef2
[#299] Refactored NFC backend into a runnable plugin.
continuous-integration/drone/push Build is passing Details
2024-02-27 00:10:15 +01:00
Fabio Manganiello c7c31fb48d
Log the canonical name of plugins when starting them. 2024-02-27 00:02:30 +01:00
Fabio Manganiello 5ab66e6746
[UI] Render docs link on `ExtensionIcon` only on docs panel.
continuous-integration/drone/push Build was killed Details
2024-02-26 23:47:07 +01:00
Fabio Manganiello 8079b08a54
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 20:36:57 +00:00
Fabio Manganiello f8e0b5e17e
[#366] Context variables should be dynamically assigned through `locals()` instead of `exec()`.
continuous-integration/drone/push Build is passing Details
Closes: #366
2024-02-26 21:29:35 +01:00
Fabio Manganiello 6c2e9deda4
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 20:11:46 +00:00
Fabio Manganiello 6de9f741f0
[UI] Use extension icons also for menu entries.
continuous-integration/drone/push Build is passing Details
2024-02-26 21:09:36 +01:00
Fabio Manganiello e7c1e2f44e
[UI] Added icons to plugins and backends. 2024-02-26 17:39:19 +01:00
Fabio Manganiello 2d8c34522f
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 00:57:55 +00:00
Fabio Manganiello 5961b08387
[Carousel UI] Removed margin
continuous-integration/drone/push Build is passing Details
2024-02-26 01:55:49 +01:00
Fabio Manganiello d6ea4a1c42
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 00:29:32 +00:00
Fabio Manganiello e58f5d2fa1
[Camera] The `wait_for_either` barrier should be enabled on streaming by default.
continuous-integration/drone/push Build is passing Details
`camera.pi*` plugins are an exception, as they handle the lifecycle of
the camera streaming process through the `picamera*` libraries.

Otherwise, the streaming thread should explicitly wait on either the
plugin stop or streaming stop events and exit accordingly, or the camera
thread may be streaming indefinitely.
2024-02-26 01:28:25 +01:00
Fabio Manganiello 56a04975ae
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 00:20:42 +00:00
Fabio Manganiello 9df08de24f
[Carousel UI] Replaced `blur` filter with `brightness` for background.
continuous-integration/drone/push Build is passing Details
It's much less expensive on the CPU side, and the effect is similar.

Closes: #359
2024-02-26 01:18:51 +01:00
Fabio Manganiello 18f2c26725
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-25 22:12:19 +00:00
Fabio Manganiello 195a4b58b9
[chore] Updated caniuse db
continuous-integration/drone/push Build is passing Details
2024-02-25 23:10:15 +01:00
Fabio Manganiello 4ebc29a151
[UI] Added icon for `camera.pi.legacy` web panel. 2024-02-25 23:10:14 +01:00
Fabio Manganiello b246fbe328
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-25 22:08:34 +00:00
Fabio Manganiello 31528e3c0e
[UI] Added `camera.pi.legacy` web panel.
continuous-integration/drone/push Build is passing Details
2024-02-25 23:06:24 +01:00
Fabio Manganiello b6bd86794b
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-25 20:42:51 +00:00
Fabio Manganiello 9445bd4dc4
Added `config.yaml` example/docs for camera streaming configuration.
continuous-integration/drone/push Build is passing Details
2024-02-25 21:39:12 +01:00
Fabio Manganiello 1c14450781 FIX: Remove `wait_for_either` barrier from the streaming thread.
continuous-integration/drone/push Build is passing Details
The `_accept_client` logic will be executed anyway at the next
iteration, unless the server socket is closed - in that case, the thread
will fail and exit anyway.

The `wait_for_either` barrier in the streaming thread may instead
prevent other connections from being established after the first one is
closed.
2024-02-25 16:02:52 +01:00
Fabio Manganiello 4c92bdd11c
FIX: Handle `stop_streaming` exceptions in the main loop of the camera plugin.
continuous-integration/drone/push Build is passing Details
Otherwise camera process teardown errors may bubble up and prevent the
plugin from restarting the streaming.
2024-02-24 21:36:08 +01:00
Fabio Manganiello 8999a226b1
[WIP] Updated documentation for `camera.pi`.
continuous-integration/drone/push Build is passing Details
2024-02-24 21:16:43 +01:00
Fabio Manganiello e46704010b
[WIP] Rewritten `camera.pi.legacy` plugin.
continuous-integration/drone/push Build is passing Details
2024-02-24 14:07:07 +01:00
Fabio Manganiello 9ad9bd20e4
Added `stream_on_start` argument to `camera` plugins.
continuous-integration/drone/push Build is passing Details
It replaces the functionalities of the deprecated `camera` backends.
2024-02-24 01:31:05 +01:00
Fabio Manganiello 9cf95125a6 [WIP] Added streaming support to camera.pi using new picamera2 API
continuous-integration/drone/push Build is passing Details
2024-02-22 22:52:52 +01:00
Fabio Manganiello 659c33837e [WIP] Using new picamera2 module for camera.pi, and moved old picamera integration to camera.pi.legacy
continuous-integration/drone/push Build is passing Details
2024-02-19 00:07:29 +00:00
Fabio Manganiello d0f1ee0582
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-16 23:03:08 +00:00
Fabio Manganiello c59446fdb1
Fixed setting of `output_file` on `FfmpegWriter`.
continuous-integration/drone/push Build is passing Details
Also, fixed parameters passed to camera
writer objects.
2024-02-17 00:01:47 +01:00
Fabio Manganiello a38ef6bc7a Workaround for possible `multiple camera parameter` error.
continuous-integration/drone/push Build was killed Details
2024-02-15 00:51:04 +00:00
Fabio Manganiello 191d7a75ea
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-06 22:29:48 +00:00
Fabio Manganiello 8f7aad2af7
google-assistant-sdk is no longer a dependency for the Google Assistant integration
continuous-integration/drone/push Build is passing Details
2024-02-06 20:08:57 +01:00
Fabio Manganiello 48756e6287
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-05 01:19:21 +00:00
Fabio Manganiello 2b595623b3
[#348] Converted `gps` backend into a plugin.
continuous-integration/drone/push Build is passing Details
Closes: #348
2024-02-05 02:16:02 +01:00
Fabio Manganiello 8351463a11
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-03 21:11:01 +00:00
Fabio Manganiello c8944feca4 [#348] Merge + refactor for the `mail` backend/plugin (#362)
continuous-integration/drone/push Build is passing Details
Closes: #348

Reviewed-on: platypush/platypush#362
2024-02-03 22:09:40 +01:00
Fabio Manganiello 5badc935ac
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-03 21:08:07 +00:00
Fabio Manganiello 7d362cae1a
FIX: Redis pub/sub error can also raise a `ValueError` on close.
continuous-integration/drone/push Build is passing Details
2024-02-03 22:06:36 +01:00
snyk-bot c6593cfa06
fix: platypush/backend/http/webapp/package.json & platypush/backend/http/webapp/package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-AXIOS-6144788
2024-01-05 14:12:29 +00:00
snyk-bot d54970765e
fix: upgrade vue from 3.3.4 to 3.3.6
Snyk has created this PR to upgrade vue from 3.3.4 to 3.3.6.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-10 14:35:37 +00:00
snyk-bot 9814292a2e
fix: upgrade vue-router from 4.2.4 to 4.2.5
Snyk has created this PR to upgrade vue-router from 4.2.4 to 4.2.5.

See this package in npm:
https://www.npmjs.com/package/vue-router

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-05 15:30:06 +00:00
snyk-bot eff126052d
fix: upgrade core-js from 3.32.0 to 3.33.0
Snyk has created this PR to upgrade core-js from 3.32.0 to 3.33.0.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-05 15:30:02 +00:00
snyk-bot 3ddac09412
fix: upgrade sass from 1.65.1 to 1.69.3
Snyk has created this PR to upgrade sass from 1.65.1 to 1.69.3.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-05 15:29:57 +00:00
912 changed files with 24337 additions and 15473 deletions

View File

@ -27,80 +27,7 @@ steps:
from_secret: ssh_privkey
commands:
- apk add --update --no-cache git openssh
- mkdir -p ~/.ssh
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null
- git config --global --add safe.directory $PWD
- git remote add github git@github.com:/BlackLight/platypush.git
- git pull --rebase github "$(git branch | head -1 | awk '{print $2}')" || echo "No such branch on Github"
- git push --all -v github
###
### Synchronize the `stable` branch to the new release
###
- name: sync-stable-branch
image: alpine
environment:
SSH_PUBKEY:
from_secret: ssh_pubkey
SSH_PRIVKEY:
from_secret: ssh_privkey
PGP_KEY:
from_secret: pgp_key
PGP_KEY_ID:
from_secret: pgp_key_id
commands:
- apk add --update --no-cache git bash gnupg openssh
# Backup the original git configuration before changing attributes
- export GIT_CONF=$PWD/.git/config
- export TMP_GIT_CONF=/tmp/git.config.orig
- cp $GIT_CONF $TMP_GIT_CONF
- git config --global --add safe.directory $PWD
# Install the SSH and PGP keys
- mkdir -p ~/.ssh
- |
cat <<EOF | gpg --import --armor
$PGP_KEY
EOF
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
# Git configuration
- git config user.name "Platypush CI/CD Automation"
- git config user.email "admin@platypush.tech"
- git config commit.gpgsign true
- git config user.signingkey $PGP_KEY_ID
- git remote rm origin
- git remote add origin git@git.platypush.tech:platypush/platypush.git
# Merge and push to the `stable` branch
- git checkout stable
- git rebase master
- git push -u origin stable
- git checkout master
# Restore the original git configuration
- mv $TMP_GIT_CONF $GIT_CONF
when:
event:
- tag
- . .drone/github-mirror.sh
###
### Rebuild the docs
@ -113,36 +40,12 @@ steps:
path: /docs
commands:
- echo "Installing required build dependencies"
- apk add --update --no-cache git make py3-sphinx py3-myst-parser py3-pip $(cat platypush/install/requirements/alpine.txt)
- pip install -U sphinx-rtd-theme sphinx-book-theme --break-system-packages
- pip install . --break-system-packages
- mkdir -p /docs/current
- export APPDIR=$PWD
- rm -rf "$APPDIR/docs/build"
- echo "Building the updated documentation"
- cd "$APPDIR/docs/source"
- git clone 'https://git.platypush.tech/platypush/platypush.wiki.git' wiki
- cd wiki
- ln -s Home.md index.md
- cd "$APPDIR/docs"
- make html
- rm -f config*.yaml
- cd "$APPDIR"
- echo "Copying the new documentation files to the target folder"
- mv -v "$APPDIR/docs/build" /docs/new
- cd /docs
- mv current old
- mv new current
- rm -rf old
- . .drone/rebuild-docs.sh
when:
event:
- tag
depends_on:
- sync-stable-branch
###
### Run the tests
###
@ -150,10 +53,7 @@ steps:
- name: tests
image: alpine
commands:
- apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
- pip install . --break-system-packages
- pip install -r requirements-tests.txt --break-system-packages
- pytest tests
- . .drone/run-tests.sh
###
### Rebuild the UI files
@ -182,69 +82,7 @@ steps:
- tests
commands:
- export SKIPCI="$PWD/.skipci"
- rm -rf "$SKIPCI"
- apk add --update --no-cache git
# Backup the original git configuration before changing attributes
- export GIT_CONF=$PWD/.git/config
- export TMP_GIT_CONF=/tmp/git.config.orig
- cp $GIT_CONF $TMP_GIT_CONF
- git config --global --add safe.directory $PWD
- cd platypush/backend/http/webapp
- |
if [ $(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE . | wc -l) -eq 0 ]; then
echo "No UI changes detected, skipping build"
exit 0
fi
- |
if [ "$(git log --pretty=format:%s HEAD...HEAD~1 | head -1)" == "[Automatic] Updated UI files" ]; then
echo "UI changes have already been committed, skipping build"
exit 0
fi
- rm -rf dist node_modules
- npm install
- npm run build
- |
if [ $(git status --porcelain dist | wc -l) -eq 0 ]; then
echo "No build files have been changed"
exit 0
fi
# Create a .skipci file to mark the fact that the next steps should be skipped
# (we're going to do another push anyway, so another pipeline will be triggered)
- touch "$SKIPCI"
- apk add --update --no-cache bash gnupg openssh
- mkdir -p ~/.ssh
- |
cat <<EOF | gpg --import --armor
$PGP_KEY
EOF
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
- git config user.name "Platypush CI/CD Automation"
- git config user.email "admin@platypush.tech"
- git config commit.gpgsign true
- git config user.signingkey $PGP_KEY_ID
- git add dist
- git commit dist -S -m "[Automatic] Updated UI files" --no-verify
- git remote rm origin
- git remote add origin git@git.platypush.tech:platypush/platypush.git
- git push -f origin master
# Restore the original git configuration
- mv $TMP_GIT_CONF $GIT_CONF
- . .drone/build-ui.sh
###
### Regenerate the components.json cache
@ -273,66 +111,7 @@ steps:
- build-ui
commands:
- export SKIPCI="$PWD/.skipci"
- export CACHEFILE="$PWD/platypush/components.json.gz"
- |
[ -f "$SKIPCI" ] && exit 0
# Only regenerate the components cache if either the plugins, backends,
# events or schemas folders have some changes (excluding the webapp files).
- apk add --update --no-cache git
- |
if [ -z "$(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE -- platypush/backend platypush/plugins platypush/schemas platypush/message/event ':(exclude)platypush/backend/http/webapp')" ]; then
echo 'No changes to the components file'
exit 0
fi
- echo 'Updating components cache'
- apk add --update --no-cache bash gnupg openssh $(cat platypush/install/requirements/alpine.txt)
- pip install . --break-system-packages
- |
python - <<EOF
from platypush import get_plugin
get_plugin('inspect').refresh_cache(force=True)
EOF
# Backup the original git configuration before changing attributes
- export GIT_CONF=$PWD/.git/config
- export TMP_GIT_CONF=/tmp/git.config.orig
- cp $GIT_CONF $TMP_GIT_CONF
- git config --global --add safe.directory $PWD
# Create a .skipci file to mark the fact that the next steps should be skipped
# (we're going to do another push anyway, so another pipeline will be triggered)
- touch "$SKIPCI"
- mkdir -p ~/.ssh
- |
cat <<EOF | gpg --import --armor
$PGP_KEY
EOF
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
- git config user.name "Platypush CI/CD Automation"
- git config user.email "admin@platypush.tech"
- git config commit.gpgsign true
- git config user.signingkey $PGP_KEY_ID
- git add "$CACHEFILE"
- git commit "$CACHEFILE" -S -m "[Automatic] Updated components cache" --no-verify
- git remote rm origin
- git remote add origin git@git.platypush.tech:platypush/platypush.git
- git push -f origin master
# Restore the original git configuration
- mv $TMP_GIT_CONF $GIT_CONF
- . .drone/update-components-cache.sh
###
### Update the Arch packages
@ -357,79 +136,7 @@ steps:
- update-components-cache
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Installing dependencies"
- apk add --update --no-cache curl git openssh pacman sudo
- echo "--- Parsing metadata"
- git config --global --add safe.directory $PWD
- git pull --rebase origin master --tags
- export VERSION=$(python setup.py --version)
- export HEAD=$(git log --pretty=format:%h HEAD...HEAD~1 | head -1)
- export GIT_VERSION="$VERSION.r$(git log --pretty=oneline HEAD...v$VERSION | wc -l).g$${HEAD}"
- export TAG_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
- echo "--- Preparing environment"
- mkdir -p ~/.ssh
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
- ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts 2>/dev/null
- adduser -u 1000 -D build
- mkdir -p $WORKDIR
- echo "--- Updating Arch git version"
- export PKGDIR=$WORKDIR/git
- git clone ssh://aur@aur.archlinux.org/platypush-git.git $PKGDIR
- git config --global --add safe.directory $PKGDIR
- chown -R build $PKGDIR
- cd $PKGDIR
- |
sed -i 'PKGBUILD' -r \
-e "s/^pkgver=.*/pkgver=$GIT_VERSION/" \
-e "s/^pkgrel=.*/pkgrel=1/" \
- sudo -u build makepkg --printsrcinfo > .SRCINFO
- export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
- |
if [ $FILES_CHANGED -gt 0 ]; then
echo "--- Pushing git package version $GIT_VERSION"
git commit -a -m '[Automatic] Package update'
git push origin master
fi
- echo "--- Updating Arch stable version"
- export PKGDIR=$WORKDIR/stable
- git clone ssh://aur@aur.archlinux.org/platypush.git $PKGDIR
- git config --global --add safe.directory $PKGDIR
- chown -R build $PKGDIR
- cd $PKGDIR
- export RELEASED_VERSION=$(grep -e '^pkgver=' PKGBUILD | sed -r -e 's/^pkgver=(.*)\s*/\1/')
- |
if [ "$RELEASED_VERSION" == "$VERSION" ]; then
exit 0
fi
- export TAG_CHECKSUM=$(curl --silent "$TAG_URL" | sha512sum | awk '{print $1}')
- |
sed -i 'PKGBUILD' -r \
-e "s/^pkgver=.*/pkgver=$VERSION/" \
-e "s/^pkgrel=.*/pkgrel=1/" \
-e "s/^sha512sums=.*/sha512sums=('$TAG_CHECKSUM')/"
- sudo -u build makepkg --printsrcinfo > .SRCINFO
- export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
- |
if [ $FILES_CHANGED -gt 0 ]; then
echo "--- Pushing stable package version $VERSION"
git commit -a -m '[Automatic] Package update'
git push origin master
fi
- . .drone/update-arch-packages.sh
###
### Update the Debian (stable) packages
@ -457,78 +164,7 @@ steps:
- update-components-cache
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Installing dependencies"
- apt update
- apt install -y curl dpkg-dev gpg git python3 python3-pip
- echo "-- Copying source directory"
- mkdir -p "$WORKDIR"
- export SRCDIR="$WORKDIR/src"
- cp -r "$PWD" "$SRCDIR"
- cd "$SRCDIR"
- echo "--- Parsing metadata"
- git config --global --add safe.directory "$PWD"
- git pull --rebase origin master --tags
- export VERSION=$(python3 setup.py --version)
- export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
- export GIT_BUILD_DIR="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all"
- export GIT_DEB="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all.deb"
- export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
- echo "--- Building git package"
- pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
- |
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
base="$(dirname "$dir")"
mv "$dir" "$base/dist-packages"
done
- mkdir -p "$GIT_BUILD_DIR/DEBIAN"
- |
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
Package: $PKG_NAME
Version: $GIT_VERSION
Maintainer: Fabio Manganiello <fabio@platypush.tech>
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
Architecture: all
Homepage: https://platypush.tech
Description: Universal command executor and automation hub.
EOF
- mkdir -p "$POOL_PATH"
- rm -f "$POOL_PATH/"*.deb
- dpkg --build "$GIT_BUILD_DIR"
- echo "--- Copying $GIT_DEB to $POOL_PATH"
- cp "$GIT_DEB" "$POOL_PATH"
# If main/all/Packages doesn't exist, then we should create the first main release
- |
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
- export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
- |
[ -z "$UPDATE_STABLE_PKG" ] &&
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
# If the published release version differs from the current one, then we should publish a new main release
- |
if [ -z "$UPDATE_STABLE_PKG" ]; then
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
fi
# Proceed and update the main release if the version number has changed
- |
if [ -n "$UPDATE_STABLE_PKG" ]; then
echo "--- Updating main package"
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-1_all.deb"
fi
- . .drone/update-deb-packages.sh
###
### Update the Debian (oldstable) packages
@ -556,78 +192,35 @@ steps:
- update-components-cache
commands:
- |
[ -f .skipci ] && exit 0
- . .drone/update-deb-packages.sh
- echo "-- Copying source directory"
- mkdir -p "$WORKDIR"
- export SRCDIR="$WORKDIR/src"
- cp -r "$PWD" "$SRCDIR"
- cd "$SRCDIR"
###
### Update the Ubuntu (latest) packages
###
- echo "-- Installing dependencies"
- apt update
- apt install -y curl dpkg-dev gpg git python3 python3-pip
- name: update-ubuntu-packages
image: ubuntu:latest
volumes:
- name: repos
path: /repos
- echo "--- Parsing metadata"
- git config --global --add safe.directory "$PWD"
- git pull --rebase origin master --tags
- export VERSION=$(python3 setup.py --version)
- export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
- export GIT_BUILD_DIR="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all"
- export GIT_DEB="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all.deb"
- export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
environment:
DEB_VERSION: ubuntu
WORKDIR: /tmp/workdir
APT_ROOT: /repos/apt
PKG_NAME: platypush
- echo "--- Building git package"
- pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
- |
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
base="$(dirname "$dir")"
mv "$dir" "$base/dist-packages"
done
when:
branch:
- master
event:
- push
- mkdir -p "$GIT_BUILD_DIR/DEBIAN"
- |
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
Package: $PKG_NAME
Version: $GIT_VERSION
Maintainer: Fabio Manganiello <fabio@platypush.tech>
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
Architecture: all
Homepage: https://platypush.tech
Description: Universal command executor and automation hub.
EOF
- mkdir -p "$POOL_PATH"
- rm -f "$POOL_PATH/"*.deb
- dpkg --build "$GIT_BUILD_DIR"
depends_on:
- update-components-cache
- echo "--- Copying $GIT_DEB to $POOL_PATH"
- cp "$GIT_DEB" "$POOL_PATH"
# If main/all/Packages doesn't exist, then we should create the first main release
- |
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
- export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
- |
[ -z "$UPDATE_STABLE_PKG" ] &&
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
# If the published release version differs from the current one, then we should publish a new main release
- |
if [ -z "$UPDATE_STABLE_PKG" ]; then
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
fi
# Proceed and update the main release if the version number has changed
- |
if [ -n "$UPDATE_STABLE_PKG" ]; then
echo "--- Updating main package"
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-1_all.deb"
fi
commands:
- . .drone/update-deb-packages.sh
###
### Updates the APT repository after new packages have been pushed
@ -656,185 +249,10 @@ steps:
depends_on:
- update-debian-stable-packages
- update-debian-oldstable-packages
- update-ubuntu-packages
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Installing dependencies"
- apt update
- apt install -y dpkg-dev gpg
- echo "-- Creating a new apt root folder"
- export TMP_APT_ROOT="/tmp/apt"
- cp -r "$APT_ROOT" "$TMP_APT_ROOT"
- echo "-- Cleaning up older apt releases"
- |
find "$TMP_APT_ROOT/pool" -mindepth 2 -maxdepth 2 -type d | while read reldir; do
pkg_to_remove=$(( $(ls "$reldir"/*.deb | wc -l) - 1 ))
[ $pkg_to_remove -le 0 ] && continue
ls "$reldir"/*.deb | sort -V | head -n$pkg_to_remove | xargs rm -f
done
- echo "-- Updating Packages files"
- |
echo "stable\noldstable" | while read distro; do
echo "main\ndev" | while read branch; do
branch_dir="$TMP_APT_ROOT/pool/$distro/$branch"
echo "Checking pool folder: $branch_dir"
[ -d "$branch_dir" ] || mkdir -p "$branch_dir"
dist_dir="$TMP_APT_ROOT/dists/$distro/$branch/all"
mkdir -p "$dist_dir"
pkg_file="$dist_dir/Packages"
dpkg-scanpackages --arch all "$branch_dir" > "$pkg_file"
sed -i "$pkg_file" -re "s|^Filename: $TMP_APT_ROOT/|Filename: |"
cat "$pkg_file" | gzip -9 > "$pkg_file.gz"
echo "Generated Packages file: $pkg_file"
cat "$pkg_file"
done
done
- echo "-- Updating Release files"
- |
add_hashes() {
dist_dir=$1
hash_cmd=$2
hash_label=$3
echo "$hash_label:"
find "$dist_dir" -name 'Packages*' | while read file; do
basename="$(echo "$file" | sed -r -e "s|^$dist_dir/||")"
hash="$($hash_cmd "$file" | cut -d" " -f1)"
size="$(wc -c < $file)"
echo " $hash $size $basename"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-i386/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-amd64/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armel/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armhf/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-arm64/|')"
done
}
echo "stable\noldstable" | while read distro; do
dist_dir="$TMP_APT_ROOT/dists/$distro"
components=$(find "$dist_dir" -name Packages | awk -F '/' '{print $(NF-2)}' | uniq | tr '\n' ' ')
release_file="$dist_dir/Release"
cat <<EOF > "$release_file"
Origin: Platypush repository
Label: Platypush
Suite: $distro
Codename: $distro
Architectures: i386 amd64 armel armhf arm64
Components: $components
Description: The official APT repository for Platypush
Date: $(date -Ru)
EOF
add_hashes "$dist_dir" "md5sum" "MD5Sum" >> "$release_file"
add_hashes "$dist_dir" "sha1sum" "SHA1" >> "$release_file"
add_hashes "$dist_dir" "sha256sum" "SHA256" >> "$release_file"
done
- echo "-- Generating list files"
- mkdir -p "$TMP_APT_ROOT/lists"
- |
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-stable-main.list"
deb https://apt.platypush.tech/ stable main
EOF
- |
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-stable-dev.list"
deb https://apt.platypush.tech/ stable dev
EOF
- |
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-oldstable-main.list"
deb https://apt.platypush.tech/ oldstable main
EOF
- |
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-oldstable-dev.list"
deb https://apt.platypush.tech/ oldstable dev
EOF
- echo "-- Updating index file"
- |
cat <<EOF > "$TMP_APT_ROOT/index.txt"
Welcome to the Platypush APT repository!
Project homepage: https://platypush.tech
Source code: https://git.platypush.tech/platypush/platypush
Documentation / API reference: https://docs.platypush.tech
You can use this APT repository to install Platypush on Debian, Ubuntu or any
Debian-based distro.
Steps:
1. Add this repository's PGP key to your apt keyring
====================================================
$ sudo wget -q -O \\\
/etc/apt/trusted.gpg.d/platypush.asc \\\
https://apt.platypush.tech/pubkey.txt
2. Add the repository to your sources
=====================================
$ sudo wget -q -O \\\
/etc/apt/sources.list.d/platypush.list \\\
https://apt.platypush.tech/lists/platypush-<deb_version>-<branch>.list
Where:
- deb_version can be either *stable* (for the current Debian stable version) or
*oldstable* (for the previous Debian stable version)
- branch can be either *main* (for the latest releases) or *dev* (for a package
that is always in sync with the git version)
For example, to install the latest stable tags on Debian stable:
$ sudo wget -q -O \\\
/etc/apt/sources.list.d/platypush.list \\\
https://apt.platypush.tech/lists/platypush-stable-main.list
3. Update your repos
====================
$ sudo apt update
4. Install Platypush
====================
$ sudo apt install platypush
EOF
- echo "-- Importing and refreshing PGP key"
- echo "$PGP_PUBKEY" > "$TMP_APT_ROOT/pubkey.txt"
- export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
- |
cat <<EOF | gpg --import --armor
$PGP_PRIVKEY
EOF
- echo "-- Signing Release files"
- |
find "$TMP_APT_ROOT/dists" -type f -name Release | while read file; do
dirname="$(dirname "$file")"
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs > "$file.gpg"
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs --clearsign > "$dirname/InRelease"
done
- echo "-- Updating the apt repo root"
- export OLD_APT_ROOT="$REPOS_ROOT/oldapt"
- rm -rf "$OLD_APT_ROOT"
- mv "$APT_ROOT" "$OLD_APT_ROOT"
- mv "$TMP_APT_ROOT" "$APT_ROOT"
- chmod -R a+r "$APT_ROOT"
- chmod a+x "$APT_ROOT"
- . .drone/update-apt-repo.sh
###
### Update the RPM (stable) packages
@ -867,219 +285,14 @@ steps:
- update-components-cache
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Installing dependencies"
- yum install -y createrepo rpm-build rpm-sign gpg wget yum-utils git python python-pip
- echo "-- Copying source directory"
- mkdir -p "$WORKDIR"
- export SRCDIR="$WORKDIR/src"
- cp -r "$PWD" "$SRCDIR"
- cd "$SRCDIR"
- mkdir -p "$RPM_ROOT"
- echo "--- Parsing metadata"
- git config --global --add safe.directory $PWD
- git pull --rebase origin master --tags
- export VERSION=$(python3 setup.py --version)
- export RELNUM="$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
- export SPECFILE="$WORKDIR/$PKG_NAME.spec"
- export BUILD_DIR="$WORKDIR/build"
- export TMP_RPM_ROOT="$WORKDIR/repo"
- export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/master.tar.gz"
- echo "--- Creating git package spec"
- |
cat <<EOF > $SPECFILE
Summary: Universal command executor and automation hub.
Name: $PKG_NAME-git
Version: $VERSION
Release: $RELNUM
URL: https://platypush.tech
Group: System
License: MIT
Packager: Fabio Manganiello <fabio@platypush.tech>
Source: $SRC_URL
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
Conflicts: $PKG_NAME
Prefix: %{_prefix}
BuildRoot: %{_tmppath}/%{name}-root
%description
Universal command executor and automation hub.
%install
mkdir -p %{buildroot}/
cp -r "$BUILD_DIR"/* %{buildroot}/
%clean
%files
/usr/bin/*
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
%changelog
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
- [Automatic] Release $VERSION-$RELNUM
EOF
- echo "--- Building git package"
- mkdir -p "$BUILD_DIR"
- pip install --prefix="$BUILD_DIR/usr" --no-cache --no-deps .
- rpmbuild --target "noarch" -bb "$SPECFILE"
- echo "--- Copying the new RPM package"
- mkdir -p "$TMP_RPM_ROOT"
- cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-git-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
- echo "--- Checking the latest released stable version"
- export LATEST_STABLE_PKG=$(ls -rt "$RPM_ROOT/$PKG_NAME"*.rpm 2>/dev/null | grep -v "$PKG_NAME-git" | tail -1)
- |
if [ -z "$LATEST_STABLE_PKG" ]; then
# If not stable release is available, then create one
export UPDATE_STABLE_PKG=1
else
# Otherwise, create a new release if the reported version on the repo is different
# from the latest released version.
export LATEST_STABLE_VERSION=$(basename $LATEST_STABLE_PKG | cut -d- -f 2)
if [ "$VERSION" != "$LATEST_STABLE_VERSION" ]; then
export UPDATE_STABLE_PKG=1
else
# If the version has remained the same, then simply copy the existing RPM to the
# new repository directory.
echo "Copying the existing release $LATEST_STABLE_VERSION to the new repository"
cp "$LATEST_STABLE_PKG" "$TMP_RPM_ROOT"
fi
fi
# If a new stable release is required, build another RPM
- |
if [ -n "$UPDATE_STABLE_PKG" ]; then
export RELNUM=1
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
cat <<EOF > $SPECFILE
Summary: Universal command executor and automation hub.
Name: $PKG_NAME
Version: $VERSION
Release: $RELNUM
URL: https://platypush.tech
Group: System
License: MIT
Packager: Fabio Manganiello <fabio@platypush.tech>
Source: $SRC_URL
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
Conflicts: $PKG_NAME-git
Prefix: %{_prefix}
BuildRoot: %{_tmppath}/%{name}-root
%description
Universal command executor and automation hub.
%install
mkdir -p %{buildroot}/
cp -r "$BUILD_DIR"/* %{buildroot}/
%clean
%files
/usr/bin/*
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
%changelog
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
- [Automatic] Release $VERSION-$RELNUM
EOF
echo "--- Building package for stable release $VERSION"
rpmbuild --target "noarch" -bb "$SPECFILE"
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
fi
- echo "--- Importing the repository keys"
- |
cat <<EOF | gpg --import --armor
$PGP_PRIVKEY
EOF
- export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
- |
cat <<EOF > $HOME/.rpmmacros
%signature gpg
%_gpg_name $PGP_KEYID
EOF
- echo "--- Signing the new RPM packages"
- rpm --addsign "$TMP_RPM_ROOT"/*.rpm
- echo "--- Creating a new copy of the RPM repository"
- createrepo "$TMP_RPM_ROOT"
- gpg --detach-sign --armor "$TMP_RPM_ROOT/repodata/repomd.xml"
- |
cat <<EOF > "$TMP_RPM_ROOT/platypush.repo"
[platypush]
name=Platypush repository
baseurl=https://rpm.platypush.tech
enabled=1
type=rpm
gpgcheck=1
gpgkey=https://rpm.platypush.tech/pubkey.txt
EOF
- |
cat <<EOF > "$TMP_RPM_ROOT/index.txt"
Welcome to the Platypush RPM repository!
Project homepage: https://platypush.tech
Source code: https://git.platypush.tech/platypush/platypush
Documentation / API reference: https://docs.platypush.tech
You can use this RPM repository to install Platypush on Fedora or other
RPM-based distros - as long as they are compatible with the latest Fedora
release.
Steps:
1. Add the repository to your sources
=====================================
$ sudo yum config-manager --add-repo https://rpm.platypush.tech/platypush.repo
2. Install Platypush
====================
$ sudo yum install platypush
Or, if you want to install a version always up-to-date with the git repo:
$ sudo yum install platypush-git
EOF
- |
cat <<EOF > "$TMP_RPM_ROOT/pubkey.txt"
$PGP_PUBKEY
EOF
- echo "--- Updating the repository"
- export NEW_RPM_ROOT="$REPOS_ROOT/rpm_new"
- export OLD_RPM_ROOT="$REPOS_ROOT/rpm_old"
- cp -r "$TMP_RPM_ROOT" "$NEW_RPM_ROOT"
- rm -rf "$TMP_RPM_ROOT"
- mv "$RPM_ROOT" "$OLD_RPM_ROOT"
- mv "$NEW_RPM_ROOT" "$RPM_ROOT"
- rm -rf "$OLD_RPM_ROOT"
- . .drone/update-rpm-repo.sh
###
### Updates the pip package upon new releases
###
- name: update-pip-package
image: python:3.11-alpine
image: alpine
environment:
TWINE_USERNAME:
from_secret: pypi_user
@ -1095,9 +308,7 @@ steps:
- docs
commands:
- apk add --update --no-cache py3-twine
- python setup.py sdist bdist_wheel
- twine upload dist/platypush-$(python setup.py --version).tar.gz
- . .drone/update-pip-package.sh
###
### Checkpoint step that waits for all the package update

46
.drone/build-ui.sh Executable file
View File

@ -0,0 +1,46 @@
#!/bin/sh
export SRCDIR="$PWD"
export WEBAPP_DIR="$SRCDIR/platypush/backend/http/webapp"
export SKIPCI="$PWD/.skipci"
rm -rf "$SKIPCI"
. .drone/macros/configure-git.sh
cd "$WEBAPP_DIR"
if [ $(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE . | wc -l) -eq 0 ]; then
echo "No UI changes detected, skipping build"
exit 0
fi
if [ "$(git log --pretty=format:%s HEAD...HEAD~1 | head -1)" == "[Automatic] Updated UI files" ]; then
echo "UI changes have already been committed, skipping build"
exit 0
fi
rm -rf dist node_modules
npm install
npm run build
if [ $(git status --porcelain dist | wc -l) -eq 0 ]; then
echo "No build files have been changed"
exit 0
fi
# Create a .skipci file to mark the fact that the next steps should be skipped
# (we're going to do another push anyway, so another pipeline will be triggered)
touch "$SKIPCI"
cd "$SRCDIR"
. .drone/macros/configure-ssh.sh
. .drone/macros/configure-gpg.sh
git add "${WEBAPP_DIR}/dist"
git commit "${WEBAPP_DIR}/dist" -S -m "[Automatic] Updated UI files" --no-verify
git remote rm origin
git remote add origin git@git.platypush.tech:platypush/platypush.git
git push -f origin master
# Restore the original git configuration
mv "$TMP_GIT_CONF" "$GIT_CONF"

13
.drone/github-mirror.sh Executable file
View File

@ -0,0 +1,13 @@
#!/bin/sh
. .drone/macros/configure-git.sh
. .drone/macros/configure-ssh.sh
ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null
# Clone the repository
git remote add github git@github.com:/BlackLight/platypush.git
git pull --rebase github "$(git branch | head -1 | awk '{print $2}')" || echo "No such branch on Github"
# Push the changes to the GitHub mirror
git push --all -v github

29
.drone/macros/configure-git.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/sh
# Install git
if [ -z "$(which git)" ]; then
if [ -n "$(which apt-get)" ]; then
apt-get update
apt-get install -y git
elif [ -n "$(which apk)" ]; then
apk add --update --no-cache git
elif [ -n "$(which yum)" ]; then
yum install -y git
elif [ -n "$(which dnf)" ]; then
dnf install -y git
elif [ -n "$(which pacman)" ]; then
pacman -Sy --noconfirm git
else
echo "Could not find a package manager to install git"
exit 1
fi
fi
# Backup the original git configuration before changing attributes
export GIT_CONF="$PWD/.git/config"
export TMP_GIT_CONF=/tmp/git.config.orig
cp "$GIT_CONF" "$TMP_GIT_CONF"
git config --global --add safe.directory "$PWD"
git config user.name "Platypush CI/CD Automation"
git config user.email "admin@platypush.tech"

30
.drone/macros/configure-gpg.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/sh
[ -z "$PGP_KEY" ] && echo "PGP_KEY is not set" && exit 1
[ -z "$PGP_KEY_ID" ] && echo "PGP_KEY_ID is not set" && exit 1
# Install gpg
if [ -z "$(which gpg)" ]; then
if [ -n "$(which apt-get)" ]; then
apt-get update
apt-get install -y gnupg
elif [ -n "$(which apk)" ]; then
apk add --update --no-cache bash gnupg
elif [ -n "$(which yum)" ]; then
yum install -y gnupg
elif [ -n "$(which dnf)" ]; then
dnf install -y gnupg
elif [ -n "$(which pacman)" ]; then
pacman -Sy --noconfirm gnupg
else
echo "Could not find a package manager to install gnupg"
exit 1
fi
fi
cat <<EOF | gpg --import --armor
$PGP_KEY
EOF
git config commit.gpgsign true
git config user.signingkey "$PGP_KEY_ID"

35
.drone/macros/configure-ssh.sh Executable file
View File

@ -0,0 +1,35 @@
#!/bin/sh
if [ -z "$SSH_PUBKEY" ] || [ -z "$SSH_PRIVKEY" ]; then
echo "SSH_PUBKEY and SSH_PRIVKEY environment variables must be set"
exit 1
fi
# Install ssh
if [ -z "$(which ssh)" ]; then
if [ -n "$(which apt-get)" ]; then
apt-get update
apt-get install -y openssh
elif [ -n "$(which apk)" ]; then
apk add --update --no-cache openssh
elif [ -n "$(which yum)" ]; then
yum install -y openssh
elif [ -n "$(which dnf)" ]; then
dnf install -y openssh
elif [ -n "$(which pacman)" ]; then
pacman -Sy --noconfirm openssh
else
echo "Could not find a package manager to install openssh"
exit 1
fi
fi
mkdir -p ~/.ssh
echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
chmod 0600 ~/.ssh/id_rsa
ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null

27
.drone/rebuild-docs.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/sh
echo "Installing required build dependencies"
apk add --update --no-cache git make py3-sphinx py3-myst-parser py3-pip $(cat platypush/install/requirements/alpine.txt)
pip install -U sphinx-rtd-theme sphinx-book-theme --break-system-packages
pip install . --break-system-packages
mkdir -p /docs/current
export APPDIR="$PWD"
rm -rf "$APPDIR/docs/build"
echo "Building the updated documentation"
cd "$APPDIR/docs/source"
git clone 'https://git.platypush.tech/platypush/platypush.wiki.git' wiki
echo "Linking the wiki to the Sphinx index"
cd wiki
cd "$APPDIR/docs"
make html
rm -f config*.yaml
cd "$APPDIR"
echo "Copying the new documentation files to the target folder"
mv -v "$APPDIR/docs/build" /docs/new
cd /docs
mv current old
mv new current
rm -rf old

6
.drone/run-tests.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/sh
apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
pip install . --break-system-packages
pip install -r requirements-tests.txt --break-system-packages
pytest tests

169
.drone/update-apt-repo.sh Executable file
View File

@ -0,0 +1,169 @@
#!/bin/sh
[ -f .skipci ] && exit 0
echo "-- Installing dependencies"
apt update
apt install -y dpkg-dev gpg
echo "-- Creating a new apt root folder"
export TMP_APT_ROOT="/tmp/apt"
cp -r "$APT_ROOT" "$TMP_APT_ROOT"
echo "-- Cleaning up older apt releases"
find "$TMP_APT_ROOT/pool" -mindepth 2 -maxdepth 2 -type d | while read reldir; do
pkg_to_remove=$(( $(ls "$reldir"/*.deb | wc -l) - 1 ))
[ $pkg_to_remove -le 0 ] && continue
ls "$reldir"/*.deb | sort -V | head -n$pkg_to_remove | xargs rm -f
done
echo "-- Updating Packages files"
echo "stable\noldstable\nubuntu" | while read distro; do
echo "main\ndev" | while read branch; do
branch_dir="$TMP_APT_ROOT/pool/$distro/$branch"
echo "Checking pool folder: $branch_dir"
[ -d "$branch_dir" ] || mkdir -p "$branch_dir"
dist_dir="$TMP_APT_ROOT/dists/$distro/$branch/all"
mkdir -p "$dist_dir"
pkg_file="$dist_dir/Packages"
dpkg-scanpackages --arch all "$branch_dir" > "$pkg_file"
sed -i "$pkg_file" -re "s|^Filename: $TMP_APT_ROOT/|Filename: |"
cat "$pkg_file" | gzip -9 > "$pkg_file.gz"
echo "Generated Packages file: $pkg_file"
cat "$pkg_file"
done
done
echo "-- Updating Release files"
add_hashes() {
dist_dir=$1
hash_cmd=$2
hash_label=$3
echo "$hash_label:"
find "$dist_dir" -name 'Packages*' | while read file; do
basename="$(echo "$file" | sed -r -e "s|^$dist_dir/||")"
hash="$($hash_cmd "$file" | cut -d" " -f1)"
size="$(wc -c < $file)"
echo " $hash $size $basename"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-i386/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-amd64/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armel/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armhf/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-arm64/|')"
done
}
echo "stable\noldstable\nubuntu" | while read distro; do
dist_dir="$TMP_APT_ROOT/dists/$distro"
components=$(find "$dist_dir" -name Packages | awk -F '/' '{print $(NF-2)}' | uniq | tr '\n' ' ')
release_file="$dist_dir/Release"
cat <<EOF > "$release_file"
Origin: Platypush repository
Label: Platypush
Suite: $distro
Codename: $distro
Architectures: i386 amd64 armel armhf arm64
Components: $components
Description: The official APT repository for Platypush
Date: $(date -Ru)
EOF
add_hashes "$dist_dir" "md5sum" "MD5Sum" >> "$release_file"
add_hashes "$dist_dir" "sha1sum" "SHA1" >> "$release_file"
add_hashes "$dist_dir" "sha256sum" "SHA256" >> "$release_file"
done
echo "-- Generating list files"
mkdir -p "$TMP_APT_ROOT/lists"
for distro in stable oldstable ubuntu; do
for branch in main dev; do
echo "deb https://apt.platypush.tech/ $distro $branch" > "$TMP_APT_ROOT/lists/platypush-$distro-$branch.list"
done
done
echo "-- Updating index file"
cat <<EOF > "$TMP_APT_ROOT/index.txt"
Welcome to the Platypush APT repository!
Project homepage: https://platypush.tech
Source code: https://git.platypush.tech/platypush/platypush
Documentation / API reference: https://docs.platypush.tech
You can use this APT repository to install Platypush on Debian, Ubuntu or any
Debian-based distro.
Steps:
1. Add this repository's PGP key to your apt keyring
====================================================
# wget -q -O \\\
/etc/apt/trusted.gpg.d/platypush.asc \\\
https://apt.platypush.tech/pubkey.txt
2. Add the repository to your sources
=====================================
# wget -q -O \\\
/etc/apt/sources.list.d/platypush.list \\\
https://apt.platypush.tech/lists/platypush-<deb_version>-<branch>.list
Where:
- deb_version can be:
- *stable* - current Debian stable version
- *oldstable* - previous Debian stable version
- *ubuntu* - latest Ubuntu version
- branch can be either:
- *main* - latest stable release
- *dev* a package always in sync with the git version
For example, to install the latest stable tags on Debian stable:
# wget -q -O \\\
/etc/apt/sources.list.d/platypush.list \\\
https://apt.platypush.tech/lists/platypush-stable-main.list
3. Update your repos
====================
# apt update
4. Install Platypush
====================
# apt install platypush
EOF
echo "-- Importing and refreshing PGP key"
echo "$PGP_PUBKEY" > "$TMP_APT_ROOT/pubkey.txt"
export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
cat <<EOF | gpg --import --armor
$PGP_PRIVKEY
EOF
echo "-- Signing Release files"
find "$TMP_APT_ROOT/dists" -type f -name Release | while read file; do
dirname="$(dirname "$file")"
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs > "$file.gpg"
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs --clearsign > "$dirname/InRelease"
done
echo "-- Updating the apt repo root"
export OLD_APT_ROOT="$REPOS_ROOT/oldapt"
rm -rf "$OLD_APT_ROOT"
mv "$APT_ROOT" "$OLD_APT_ROOT"
mv "$TMP_APT_ROOT" "$APT_ROOT"
chmod -R a+r "$APT_ROOT"
chmod a+x "$APT_ROOT"

67
.drone/update-arch-packages.sh Executable file
View File

@ -0,0 +1,67 @@
#!/bin/sh
[ -f .skipci ] && exit 0
apk add --update --no-cache curl pacman sudo
. .drone/macros/configure-ssh.sh
. .drone/macros/configure-git.sh
git pull --rebase origin master --tags
export VERSION=$(python setup.py --version)
export HEAD=$(git log --pretty=format:%h HEAD...HEAD~1 | head -1)
export GIT_VERSION="$VERSION.r$(git log --pretty=oneline HEAD...v$VERSION | wc -l).g${HEAD}"
export TAG_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts 2>/dev/null
adduser -u 1000 -D build
mkdir -p "$WORKDIR"
echo "--- Updating Arch git version"
export PKGDIR=$WORKDIR/git
git clone ssh://aur@aur.archlinux.org/platypush-git.git "$PKGDIR"
git config --global --add safe.directory "$PKGDIR"
chown -R build "$PKGDIR"
cd "$PKGDIR"
sed -i 'PKGBUILD' -r \
-e "s/^pkgver=.*/pkgver=$GIT_VERSION/" \
-e "s/^pkgrel=.*/pkgrel=1/" \
sudo -u build makepkg --printsrcinfo > .SRCINFO
export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
if [ $FILES_CHANGED -gt 0 ]; then
echo "--- Pushing git package version $GIT_VERSION"
git commit -a -m '[Automatic] Package update'
git push origin master
fi
echo "--- Updating Arch stable version"
export PKGDIR="$WORKDIR/stable"
git clone ssh://aur@aur.archlinux.org/platypush.git "$PKGDIR"
git config --global --add safe.directory "$PKGDIR"
chown -R build "$PKGDIR"
cd "$PKGDIR"
export RELEASED_VERSION=$(grep -e '^pkgver=' PKGBUILD | sed -r -e 's/^pkgver=(.*)\s*/\1/')
if [ "$RELEASED_VERSION" == "$VERSION" ]; then
exit 0
fi
export TAG_CHECKSUM=$(curl --silent "$TAG_URL" | sha512sum | awk '{print $1}')
sed -i 'PKGBUILD' -r \
-e "s/^pkgver=.*/pkgver=$VERSION/" \
-e "s/^pkgrel=.*/pkgrel=1/" \
-e "s/^sha512sums=.*/sha512sums=('$TAG_CHECKSUM')/"
sudo -u build makepkg --printsrcinfo > .SRCINFO
export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
if [ $FILES_CHANGED -gt 0 ]; then
echo "--- Pushing stable package version $VERSION"
git commit -a -m '[Automatic] Package update'
git push origin master
fi

View File

@ -0,0 +1,46 @@
#!/bin/sh
export SKIPCI="$PWD/.skipci"
export CACHEFILE="$PWD/platypush/components.json.gz"
[ -f "$SKIPCI" ] && exit 0
# Backup the original git configuration before changing attributes
export GIT_CONF="$PWD/.git/config"
export TMP_GIT_CONF="/tmp/git.config.orig"
cp "$GIT_CONF" "$TMP_GIT_CONF"
. .drone/macros/configure-git.sh
# Only regenerate the components cache if either the plugins, backends,
# events or schemas folders have some changes (excluding the webapp files).
if [ -z "$(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE -- platypush/backend platypush/plugins platypush/schemas platypush/message/event ':(exclude)platypush/backend/http/webapp')" ]; then
echo 'No changes to the components file'
exit 0
fi
. .drone/macros/configure-ssh.sh
. .drone/macros/configure-gpg.sh
echo 'Updating components cache'
apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
pip install . --break-system-packages
python - <<EOF
from platypush import get_plugin
get_plugin('inspect').refresh_cache(force=True)
EOF
# Create a .skipci file to mark the fact that the next steps should be skipped
# (we're going to do another push anyway, so another pipeline will be triggered)
touch "$SKIPCI"
git add "$CACHEFILE"
git commit "$CACHEFILE" -S -m "[Automatic] Updated components cache" --no-verify
git remote rm origin
git remote add origin git@git.platypush.tech:platypush/platypush.git
git push -f origin master
# Restore the original git configuration
mv "$TMP_GIT_CONF" "$GIT_CONF"

103
.drone/update-deb-packages.sh Executable file
View File

@ -0,0 +1,103 @@
#!/bin/sh
[ -f .skipci ] && exit 0
echo "-- Copying source directory"
mkdir -p "$WORKDIR/src"
export SRCDIR="$WORKDIR/src/$DEB_VERSION"
cp -r "$PWD" "$SRCDIR"
cd "$SRCDIR"
echo "-- Installing dependencies"
export DEBIAN_FRONTEND=noninteractive
apt update
apt install -y curl dpkg-dev gpg git python3 python3-pip python3-setuptools
echo "--- Parsing metadata"
git config --global --add safe.directory "$PWD"
git pull --rebase origin master --tags
export VERSION=$(python3 setup.py --version)
export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
export GIT_BUILD_DIR="$WORKDIR/${PKG_NAME}_${GIT_VERSION}_all"
export GIT_DEB="$WORKDIR/${PKG_NAME}_${GIT_VERSION}_all.deb"
export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
echo "--- Building git package"
pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
base="$(dirname "$dir")"
mv "$dir" "$base/dist-packages"
done
install -m755 -d "${GIT_BUILD_DIR}/usr/lib/systemd/system"
install -m755 -d "${GIT_BUILD_DIR}/usr/lib/systemd/user"
install -m750 -d "${GIT_BUILD_DIR}/var/lib/platypush"
install -m750 -d "${GIT_BUILD_DIR}/etc/platypush/scripts"
install -m644 "${SRCDIR}/platypush/config/config.yaml" "${GIT_BUILD_DIR}/etc/platypush/config.yaml"
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${GIT_BUILD_DIR}/usr/lib/systemd/user/platypush.service"
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${GIT_BUILD_DIR}/usr/lib/systemd/system/platypush.service"
sed -i "${GIT_BUILD_DIR}/usr/lib/systemd/system/platypush.service" -r \
-e 's/^#\s*Requires=(.*)/Requires=\1/' \
-e 's/^\[Service\]$/\[Service\]\
User=platypush\
Group=platypush\
WorkingDirectory=\/var\/lib\/platypush\
Environment="PLATYPUSH_CONFIG=\/etc\/platypush\/config.yaml"\
Environment="PLATYPUSH_WORKDIR=\/var\/lib\/platypush"/'
mkdir -p "$GIT_BUILD_DIR/DEBIAN"
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
Package: $PKG_NAME
Version: $GIT_VERSION
Maintainer: Fabio Manganiello <fabio@platypush.tech>
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
Architecture: all
Homepage: https://platypush.tech
Description: Universal command executor and automation hub.
EOF
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/postinst" && chmod +x "$GIT_BUILD_DIR/DEBIAN/postinst"
#!/bin/sh
set -e
if [ "\$1" = "configure" ]; then
grep -e '^platypush:' /etc/passwd 2>/dev/null || useradd -U -r -s /bin/false -d /var/lib/platypush platypush
mkdir -p /var/lib/platypush
chown -R platypush:platypush /var/lib/platypush
chown -R platypush:platypush /etc/platypush
if which systemctl; then systemctl daemon-reload; fi
fi
EOF
mkdir -p "$POOL_PATH"
rm -f "$POOL_PATH/"*.deb
dpkg --build "$GIT_BUILD_DIR"
echo "--- Copying $GIT_DEB to $POOL_PATH"
cp "$GIT_DEB" "$POOL_PATH"
# If main/all/Packages doesn't exist, then we should create the first main release
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/${PKG_NAME}_${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
[ -z "$UPDATE_STABLE_PKG" ] &&
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
# If the published release version differs from the current one, then we should publish a new main release
if [ -z "$UPDATE_STABLE_PKG" ]; then
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
fi
# Proceed and update the main release if the version number has changed
if [ -n "$UPDATE_STABLE_PKG" ]; then
echo "--- Updating main package"
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/${PKG_NAME}_${VERSION}-1_all.deb"
fi

5
.drone/update-pip-package.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
apk add --update --no-cache py3-twine py3-setuptools py3-wheel py3-pip
python setup.py sdist bdist_wheel
twine upload dist/platypush-$(python setup.py --version).tar.gz

261
.drone/update-rpm-repo.sh Executable file
View File

@ -0,0 +1,261 @@
#!/bin/sh
[ -f .skipci ] && exit 0
echo "-- Installing dependencies"
yum install -y \
createrepo \
git \
gpg \
python \
python-pip \
python-setuptools \
rpm-build \
rpm-sign \
systemd-rpm-macros \
wget \
yum-utils \
echo "-- Copying source directory"
mkdir -p "$WORKDIR"
export SRCDIR="$WORKDIR/src"
cp -r "$PWD" "$SRCDIR"
cd "$SRCDIR"
mkdir -p "$RPM_ROOT"
echo "--- Parsing metadata"
git config --global --add safe.directory $PWD
git pull --rebase origin master --tags
export VERSION=$(python3 setup.py --version)
export RELNUM="$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
export SPECFILE="$WORKDIR/$PKG_NAME.spec"
export BUILD_DIR="$WORKDIR/build"
export TMP_RPM_ROOT="$WORKDIR/repo"
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/master.tar.gz"
echo "--- Creating git package spec"
cat <<EOF > $SPECFILE
Summary: Universal command executor and automation hub.
Name: $PKG_NAME-git
Version: $VERSION
Release: $RELNUM
URL: https://platypush.tech
Group: System
License: MIT
Packager: Fabio Manganiello <fabio@platypush.tech>
Source: $SRC_URL
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
Conflicts: $PKG_NAME
Prefix: %{_prefix}
BuildRoot: %{_tmppath}/%{name}-root
BuildRequires: systemd-rpm-macros
%{?sysusers_requires_compat}
%description
Universal command executor and automation hub.
%install
mkdir -p %{buildroot}/
cp -r "$BUILD_DIR"/* %{buildroot}/
install -p -Dm0644 "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf" %{buildroot}%{_sysusersdir}/platypush.conf
%pre
%sysusers_create_compat "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
%clean
%files
%defattr(750,platypush,platypush,750)
%dir /etc/platypush
/etc/platypush/*
/usr/bin/*
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
/usr/lib/systemd/system/*
/usr/lib/systemd/user/*
%defattr(750,platypush,platypush,750)
%dir /var/lib/platypush
%{_sysusersdir}/platypush.conf
%changelog
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
- [Automatic] Release $VERSION-$RELNUM
EOF
echo "--- Building git package"
mkdir -p "$BUILD_DIR"
pip install --prefix="$BUILD_DIR/usr" --no-cache --no-deps .
install -m755 -d "${BUILD_DIR}/usr/lib/systemd/system"
install -m755 -d "${BUILD_DIR}/usr/lib/systemd/user"
install -m755 -d "${BUILD_DIR}/usr/lib/sysusers.d"
install -m750 -d "${BUILD_DIR}/var/lib/platypush"
install -m750 -d "${BUILD_DIR}/etc/platypush/scripts"
install -m644 "${SRCDIR}/platypush/config/config.yaml" "${BUILD_DIR}/etc/platypush/config.yaml"
install -Dm644 "${SRCDIR}/platypush/config/systemd/platypush-sysusers.conf" "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${BUILD_DIR}/usr/lib/systemd/user/platypush.service"
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${BUILD_DIR}/usr/lib/systemd/system/platypush.service"
sed -i "${BUILD_DIR}/usr/lib/systemd/system/platypush.service" -r \
-e 's/^#\s*Requires=(.*)/Requires=\1/' \
-e 's/^\[Service\]$/\[Service\]\
User=platypush\
Group=platypush\
WorkingDirectory=\/var\/lib\/platypush\
Environment="PLATYPUSH_CONFIG=\/etc\/platypush\/config.yaml"\
Environment="PLATYPUSH_WORKDIR=\/var\/lib\/platypush"/'
rpmbuild --target "noarch" -bb "$SPECFILE"
echo "--- Copying the new RPM package"
mkdir -p "$TMP_RPM_ROOT"
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-git-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
echo "--- Checking the latest released stable version"
export LATEST_STABLE_PKG=$(ls -rt "$RPM_ROOT/$PKG_NAME"*.rpm 2>/dev/null | grep -v "$PKG_NAME-git" | tail -1)
if [ -z "$LATEST_STABLE_PKG" ]; then
# If not stable release is available, then create one
export UPDATE_STABLE_PKG=1
else
# Otherwise, create a new release if the reported version on the repo is different
# from the latest released version.
export LATEST_STABLE_VERSION=$(basename $LATEST_STABLE_PKG | cut -d- -f 2)
if [ "$VERSION" != "$LATEST_STABLE_VERSION" ]; then
export UPDATE_STABLE_PKG=1
else
# If the version has remained the same, then simply copy the existing RPM to the
# new repository directory.
echo "Copying the existing release $LATEST_STABLE_VERSION to the new repository"
cp "$LATEST_STABLE_PKG" "$TMP_RPM_ROOT"
fi
fi
# If a new stable release is required, build another RPM
if [ -n "$UPDATE_STABLE_PKG" ]; then
export RELNUM=1
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
cat <<EOF > $SPECFILE
Summary: Universal command executor and automation hub.
Name: $PKG_NAME
Version: $VERSION
Release: $RELNUM
URL: https://platypush.tech
Group: System
License: MIT
Packager: Fabio Manganiello <fabio@platypush.tech>
Source: $SRC_URL
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
Conflicts: $PKG_NAME-git
Prefix: %{_prefix}
BuildRoot: %{_tmppath}/%{name}-root
BuildRequires: systemd-rpm-macros
%{?sysusers_requires_compat}
%description
Universal command executor and automation hub.
%install
mkdir -p %{buildroot}/
cp -r "$BUILD_DIR"/* %{buildroot}/
install -p -Dm0644 "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf" %{buildroot}%{_sysusersdir}/platypush.conf
%pre
%sysusers_create_compat "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
%clean
%files
%defattr(750,platypush,platypush,750)
%dir /etc/platypush
/etc/platypush/*
/usr/bin/*
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
/usr/lib/systemd/system/*
/usr/lib/systemd/user/*
%defattr(750,platypush,platypush,750)
%dir /var/lib/platypush
%{_sysusersdir}/platypush.conf
%changelog
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
- [Automatic] Release $VERSION-$RELNUM
EOF
echo "--- Building package for stable release $VERSION"
rpmbuild --target "noarch" -bb "$SPECFILE"
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
fi
echo "--- Importing the repository keys"
cat <<EOF | gpg --import --armor
$PGP_PRIVKEY
EOF
export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
cat <<EOF > $HOME/.rpmmacros
%signature gpg
%_gpg_name $PGP_KEYID
EOF
echo "--- Signing the new RPM packages"
rpm --addsign "$TMP_RPM_ROOT"/*.rpm
echo "--- Creating a new copy of the RPM repository"
createrepo "$TMP_RPM_ROOT"
gpg --detach-sign --armor "$TMP_RPM_ROOT/repodata/repomd.xml"
cat <<EOF > "$TMP_RPM_ROOT/platypush.repo"
[platypush]
name=Platypush repository
baseurl=https://rpm.platypush.tech
enabled=1
type=rpm
gpgcheck=1
gpgkey=https://rpm.platypush.tech/pubkey.txt
EOF
cat <<EOF > "$TMP_RPM_ROOT/index.txt"
Welcome to the Platypush RPM repository!
Project homepage: https://platypush.tech
Source code: https://git.platypush.tech/platypush/platypush
Documentation / API reference: https://docs.platypush.tech
You can use this RPM repository to install Platypush on Fedora or other
RPM-based distros - as long as they are compatible with the latest Fedora
release.
Steps:
1. Add the repository to your sources
=====================================
# yum config-manager --add-repo https://rpm.platypush.tech/platypush.repo
2. Install Platypush
====================
# yum install platypush
Or, if you want to install a version always up-to-date with the git repo:
# yum install platypush-git
EOF
cat <<EOF > "$TMP_RPM_ROOT/pubkey.txt"
$PGP_PUBKEY
EOF
echo "--- Updating the repository"
export NEW_RPM_ROOT="$REPOS_ROOT/rpm_new"
export OLD_RPM_ROOT="$REPOS_ROOT/rpm_old"
cp -r "$TMP_RPM_ROOT" "$NEW_RPM_ROOT"
rm -rf "$TMP_RPM_ROOT"
mv "$RPM_ROOT" "$OLD_RPM_ROOT"
mv "$NEW_RPM_ROOT" "$RPM_ROOT"
rm -rf "$OLD_RPM_ROOT"

22
.env.example Normal file
View File

@ -0,0 +1,22 @@
# The device ID is the unique identifier for the device that runs Platypush.
# You should make sure that it's unique at least within your local network,
# as it is used to identify the device in the MQTT topics, on the HTTP API
# and on the published ZeroConf services.
PLATYPUSH_DEVICE_ID=platypush
# Use an external Redis server for the message queue. By default, the Platypush
# container will run a Redis server on the same container. Also remove the
# `--start-redis` option from the `docker run` command if you want to use an
# external Redis server.
# PLATYPUSH_REDIS_HOST=localhost
# PLATYPUSH_REDIS_PORT=6379
# Custom location for the Platypush configuration file.
# PLATYPUSH_CONFIG=/etc/platypush/config.yaml
# Custom location for the Platypush working directory.
# PLATYPUSH_WORKDIR=/var/lib/platypush
# SQLAlchemy database URL. By default, the Platypush container will run on a
# SQLite database installed under <WORKDIR>/main.db. If you want
# PLATYPUSH_DB=sqlite:////var/lib/platypush/main.db

1
.gitignore vendored
View File

@ -28,3 +28,4 @@ Session.vim
/docs/source/wiki
/.skipci
dump.rdb
.env

View File

@ -1,8 +1,180 @@
# Changelog
All notable changes to this project will be documented in this file.
Given the high speed of development in the first phase, changes are being
reported only starting from v0.20.2.
## [Unreleased]
- [[#281](https://git.platypush.tech/platypush/platypush/issues/281)]
replaced `warnings.warn` with `logging.warning`, as there is no easy and
reliable way of routing `warnings.warn` to `logging`.
## [1.1.0] - 2024-06-06
- [[#405](https://git.platypush.tech/platypush/platypush/issues/405)] Fixed
timezone/timestamp rendering issues for `calendar.ical` events.
- [[#403]((https://git.platypush.tech/platypush/platypush/issues/403))]
Included inherited actions in plugins docs.
## [1.0.7] - 2024-06-02
- [[#384]((https://git.platypush.tech/platypush/platypush/issues/384))] Added
`assistant.openai` and `tts.openai` plugins.
## [1.0.6] - 2024-06-01
- 🐛 Bug fix on one of the entities modules that prevented the application from
loading when `.` is part of `PYTHONPATH`.
## [1.0.5] - 2024-06-01
- A proper solution for the `utcnow()` issue.
It was a bit trickier than expected to solve, but now Platypush uses a
`utcnow()` facade that always returns a UTC datetime in a timezone-aware
representation.
The code should however also handle the case of timestamps stored on the db in
the old format.
## [1.0.4] - 2024-05-31
- Fixed regression introduced by
[c18768e61fef62924f4c1fac3089ecfb83666dab](https://git.platypush.tech/platypush/platypush/commit/c18768e61fef62924f4c1fac3089ecfb83666dab).
Python seems to have introduced a breaking change from the version 3.12 -
`datetime.utcnow()` is not deprecated, but `datetime.UTC`, the suggested
alternative, isn't available on older versions of Python. Added a workaround
that makes Platypush compatible with both the implementations.
## [1.0.3] - 2024-05-31
- [[#368](https://git.platypush.tech/platypush/platypush/issues/368)] Added
Ubuntu packages.
- Fixed bug that didn't get hooks to match events imported through the new
`platypush.events` symlinked module.
## [1.0.2] - 2024-05-26
- Fixed regression introduced by the support of custom names through the
`@procedure` decorator.
## [1.0.0] - 2024-05-26
Many, many changes for the first major release of Platypush after so many
years.
- [!3](https://git.platypush.tech/platypush/platypush/milestone/3) All
backends, except for `http`, `nodered`, `redis` and `tcp`, are gone. Many
were already deprecated a while ago, but the change now applies to all of
them. Backends should only be components that actively listen for application
messages to process, not generic daemon threads for integrations. This had
been a source of confusion for a long time. Backends and plugins are now
merged, meaning that you won't need to configure two different sections
instead of one for many integrations (one for the stateless plugin, and one
for the background state listener). Please check the
[documentation](https://docs.platypush.tech) to verify the configuration
changes required by your integrations. This has been a long process that has
involved the rewrite of most of the integrations, and many bugs have been
fixed.
- Improved Docker support - now with a default `docker-compose.yml`, multiple
Dockerfiles for
[Alpine](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/alpine.Dockerfile),
[Debian](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/debian.Dockerfile),
[Ubuntu](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/ubuntu.Dockerfile)
and
[Fedora](https://git.platypush.tech/platypush/platypush/src/branch/master/platypush/install/docker/fedora.Dockerfile)
base images. Many improvements on the `platydock` and `platyvenv` scripts
too, with better automated installation processes for optional dependencies.
- Added [official
packages](https://git.platypush.tech/platypush/platypush#system-package-manager-installation)
for
[Debian](https://git.platypush.tech/platypush/platypush#debian-ubuntu)
and [Fedora](https://git.platypush.tech/platypush/platypush#fedora).
- Added `--device-id`, `--workdir`, `--logsdir`, `--cachedir`, `--main-db`,
`--redis-host`, `--redis-port` and `--redis-queue` CLI arguments, along the
`PLATYPUSH_DEVICE_ID`, `PLATYPUSH_WORKDIR`, `PLATYPUSH_LOGSDIR`,
`PLATYPUSH_CACHEDIR`, `PLATYPUSH_DB`, `PLATYPUSH_REDIS_HOST`,
`PLATYPUSH_REDIS_PORT` and `PLATYPUSH_REDIS_QUEUE` environment variables.
- Added an _Extensions_ panel to the UI to dynamically:
- Install new dependencies directly from the Web view.
- Explore the documentation as well as the supported actions and events for
each plugin.
- Get ready-to-paste configuration snippets/templates.
- New, completely rewritten [documentation](https://docs.platypush.tech), which
now integrates the wiki, dynamically includes plugins configuration snippets
and dependencies, and adds a global filter bar for the integrations.
- [[#394](https://git.platypush.tech/platypush/platypush/issues/394)] A more
intuitive way of installing extra dependencies via `pip`. Instead of a static
list that the user should check inside of `setup.py`, the syntax `pip install
'platypush[plugin1,plugin2,...]'` is now supported.
- No more need to manually create `__init__.py` in each of the `scripts`
folders that you want to use to store your custom scripts. Automatic
discovery of scripts and creation of module files has been implemented. You
can now just drop a `.py` script with your procedures, hooks or crons in the
scripts folder and it should be picked up by the application.
- The _Execute_ Web panel now supports procedures too, as well as curl snippets.
- Removed all `Response` objects outside of the root type. They are now all
replaced by Marshmallow schemas with the structure automatically generated in
the documentation.
- [`alarm`] [[#340](https://git.platypush.tech/platypush/platypush/issues/340)]
Rewritten integration. It now includes a powerful UI panel to set up alarms
with custom procedures too.
- [`assistant.picovoice`]
[[#304](https://git.platypush.tech/platypush/platypush/issues/304)] New
all-in-one Picovoice integration that replaces the previous `stt.picovoice.*`
integrations.
- [`youtube`]
[[#337](https://git.platypush.tech/platypush/platypush/issues/337)] Full
rewrite of the plugin. It now supports Piped instances instead of the
official YouTube API. A new UI has also been designed to explore
subscriptions, playlists and channels.
- [`weather.*`]
[[#308](https://git.platypush.tech/platypush/platypush/issues/308)] Removed
the `weather.darksky` integration (it's now owned by Apple and the API is
basically dead) and enhanced the `weather.openweathermap` plugin instead.
- [`camera.pi*`] The old `camera.pi` integration based on the deprecated
`picamera` module has been moved to `camera.pi.legacy`. `camera.pi` is now a
new plugin which uses the new `picamera2` API (and it's so far only
compatible with recent versions on the Raspberry Pi OS).
- Dynamically auto-generate plugins documentation in the UI from the RST
docstrings.
- New design for the configuration panel.
- Better synchronization between processes on threads on application stop -
greatly reduced the risk of hanging processes on shutdown.
- Migrated all CI/CD pipelines to [Drone
CI](https://ci-cd.platypush.tech/platypush/platypush).
- Removed `google.fit` integration, as Google has deprecated the API.
- Removed `wiimote` integration: the `cwiid` library hasn't been updated in
years, it doesn't even work well with Python 3, and I'm not in the mood of
bringing it back from the dead.
- Removed `stt.deepspeech` integration. That project has been basically
abandoned by Mozilla, the libraries are very buggy and I don't think it's
going to see new developments any time soon.
- [[#297](https://git.platypush.tech/platypush/platypush/issues/297)] Removed
`spotify` backend integration based on Librespot. The project has gone
through a lot of changes, and I no longer have a Spotify premium account to
work on a new implementation. Open to contributions if somebody still wants
it.
## [0.50.3] - 2023-07-22

View File

@ -27,13 +27,9 @@ Guidelines:
you are changing some of the core entities (e.g. requests, events, procedures, hooks, crons
or the bus) then make sure to add tests and not to break the existing tests.
- If the feature requires an optional dependency then make sure to document it:
- In the class docstring (see other plugins and backends for examples).
- In [`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72) as
an `extras_require` entry.
- In the plugin/backend class pydoc string.
- In the `manifest.yaml` - refer to the Wiki (how to write
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
and [backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
for examples on how to write an extension manifest file.
- If the feature requires an optional dependency then make sure to document it
in the `manifest.json` - refer to the Wiki (how to write
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
and
[backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
for examples on how to write an extension manifest file.

1
Dockerfile.alpine Symbolic link
View File

@ -0,0 +1 @@
platypush/install/docker/alpine.Dockerfile

View File

@ -2,5 +2,6 @@ recursive-include platypush/backend/http/webapp/dist *
recursive-include platypush/install *
include platypush/plugins/http/webpage/mercury-parser.js
include platypush/config/*.yaml
global-include manifest.yaml
include platypush/config/systemd/*
global-include manifest.json
global-include components.json.gz

1711
README.md

File diff suppressed because it is too large Load Diff

46
docker-compose.yml Normal file
View File

@ -0,0 +1,46 @@
services:
platypush:
restart: "always"
command:
- platypush
# Comment --start-redis if you want to run an external Redis service
# In such case you'll also have to ensure that the appropriate Redis
# variables are set in the .env file, or the Redis configuration is
# passed in the config.yaml, or use the --redis-host and --redis-port
# command-line options
- --start-redis
# Custom list of host devices that should be accessible to the container -
# e.g. an Arduino, an ESP-compatible microcontroller, a joystick etc.
# devices:
# - /dev/ttyUSB0
# Uncomment if you need plugins that require access to low-level hardware
# (e.g. Bluetooth BLE or GPIO/SPI/I2C) if access to individual devices is
# not enough or isn't practical
# privileged: true
build:
context: .
# Alpine base image
dockerfile: ./platypush/install/docker/alpine.Dockerfile
# Debian base image
# dockerfile: ./platypush/install/docker/debian.Dockerfile
# Ubuntu base image
# dockerfile: ./platypush/install/docker/ubuntu.Dockerfile
# Fedora base image
# dockerfile: ./platypush/install/docker/fedora.Dockerfile
# Copy .env.example to .env and modify as needed
# env_file:
# - .env
ports:
# Comment if you don't have the HTTP backend enable or you don't want to
# expose it
- "8008:8008"
volumes:
- /path/to/your/config.yaml:/etc/platypush
- /path/to/a/workdir:/var/lib/platypush
# - /path/to/a/cachedir:/var/cache/platypush

View File

@ -159,7 +159,7 @@ class IntegrationEnricher:
base_path,
*doc.split(os.sep)[:-1],
*doc.split(os.sep)[-1].split('.'),
'manifest.yaml',
'manifest.json',
)
if not os.path.isfile(manifest_file):

View File

@ -152,7 +152,7 @@ const generateComponentsGrid = () => {
return
}
if (window.location.pathname.endsWith('/index.html')) {
if (window.location.pathname === '/' || window.location.pathname.endsWith('/index.html')) {
if (tocWrappers.length < 2) {
return
}
@ -188,9 +188,62 @@ const renderActionsList = () => {
})
}
const createFilterBar = () => {
const input = document.createElement('input')
const referenceSection = document.getElementById('reference')
input.type = 'text'
input.placeholder = 'Filter'
input.classList.add('filter-bar')
input.addEventListener('input', (event) => {
const filter = event.target.value.toLowerCase()
referenceSection.querySelectorAll('ul.grid li').forEach((li) => {
if (li.innerText.toLowerCase().includes(filter)) {
li.style.display = 'flex'
} else {
li.style.display = 'none'
}
})
})
return input
}
const addFilterBar = () => {
const container = document.querySelector('.bd-main')
if (!container)
return
const referenceSection = document.getElementById('reference')
if (!referenceSection)
return
const header = referenceSection.querySelector('h2')
if (!header)
return
const origInnerHTML = header.innerHTML
header.innerHTML = '<span class="header-content">' + origInnerHTML + '</span>'
const input = createFilterBar()
header.appendChild(input)
const headerOffsetTop = header.offsetTop
// Apply the fixed class if the header is above the viewport
document.addEventListener('scroll', () => {
if (headerOffsetTop < window.scrollY) {
header.classList.add('fixed')
} else {
header.classList.remove('fixed')
}
})
}
document.addEventListener("DOMContentLoaded", function() {
generateComponentsGrid()
convertDepsToTabs()
addClipboardToCodeBlocks()
renderActionsList()
addFilterBar()
})

View File

@ -29,15 +29,18 @@ a.grid-title {
ul.grid li {
display: flex;
background: linear-gradient(0deg, #fff, #f9f9f9);
align-items: center;
justify-content: space-between;
margin: 0 10px 10px 0;
padding: 10px;
padding: 20px;
border: 1px solid #ccc;
border-radius: 15px;
flex-direction: column;
}
ul.grid img {
width: 32px;
width: 48px;
margin-right: 5px;
}
@ -52,13 +55,20 @@ ul.grid li code .pre {
}
ul.grid li:hover {
background: linear-gradient(0deg, #e0ffe8, #e3ffff);
background: linear-gradient(0deg, #157765, #cbffd8) !important;
}
ul.grid li a {
width: calc(100% - 35px);
width: 100%;
display: flex;
justify-content: center;
text-align: center;
margin-top: 0.5em;
}
ul.grid li:hover a,
ul.grid li:hover a > code {
color: white !important;
}
ul.grid li a code {
@ -128,3 +138,51 @@ ul.grid .icon {
border-radius: 0 0 0.75em 0.75em;
}
.bd-article-container {
position: relative;
}
.filter-bar {
width: 100%;
display: block;
font-size: 0.6em;
border: 1px solid #ccc;
border-radius: 0.75em;
margin: 0.5em 0;
padding: 0.25em;
}
#reference h2.fixed {
position: fixed;
top: 0;
background: white;
z-index: 1;
}
#reference h2.fixed .header-content {
display: none;
}
@media screen and (max-width: 768px) {
#reference h2.fixed {
width: 100%;
margin-left: -0.5em;
padding: 0.5em 0.5em 0 0.5em;
}
}
@media screen and (max-width: 959px) {
#reference h2.fixed {
width: 100%;
margin-left: -1em;
padding: 0.5em 0.5em 0 0.5em;
}
}
@media screen and (min-width: 960px) {
#reference h2.fixed {
width: 75%;
max-width: 800px;
padding-top: 0.5em;
}
}

View File

@ -6,24 +6,7 @@ Backends
:maxdepth: 1
:caption: Backends:
platypush/backend/button.flic.rst
platypush/backend/camera.pi.rst
platypush/backend/chat.telegram.rst
platypush/backend/gps.rst
platypush/backend/http.rst
platypush/backend/mail.rst
platypush/backend/midi.rst
platypush/backend/music.mopidy.rst
platypush/backend/music.mpd.rst
platypush/backend/music.spotify.rst
platypush/backend/nfc.rst
platypush/backend/nodered.rst
platypush/backend/redis.rst
platypush/backend/scard.rst
platypush/backend/sensor.ir.zeroborg.rst
platypush/backend/sensor.leap.rst
platypush/backend/stt.deepspeech.rst
platypush/backend/stt.picovoice.hotword.rst
platypush/backend/stt.picovoice.speech.rst
platypush/backend/tcp.rst
platypush/backend/wiimote.rst

View File

@ -21,7 +21,7 @@ sys.path.insert(0, os.path.abspath("./_ext"))
# -- Project information -----------------------------------------------------
project = 'Platypush'
copyright = '2017-2023, Fabio Manganiello'
copyright = '2017-2024, Fabio Manganiello'
author = 'Fabio Manganiello <fabio@manganiello.tech>'
# The short X.Y version
@ -199,6 +199,7 @@ intersphinx_mapping = {'python': ('https://docs.python.org/3', None)}
autodoc_default_options = {
'members': True,
'show-inheritance': True,
'inherited-members': True,
}
sys.path.insert(0, os.path.abspath('../..'))

View File

@ -11,21 +11,19 @@ Events
platypush/events/application.rst
platypush/events/assistant.rst
platypush/events/bluetooth.rst
platypush/events/button.flic.rst
platypush/events/camera.rst
platypush/events/chat.slack.rst
platypush/events/chat.telegram.rst
platypush/events/clipboard.rst
platypush/events/custom.rst
platypush/events/dbus.rst
platypush/events/distance.rst
platypush/events/entities.rst
platypush/events/file.rst
platypush/events/flic.rst
platypush/events/foursquare.rst
platypush/events/geo.rst
platypush/events/github.rst
platypush/events/google.rst
platypush/events/google.fit.rst
platypush/events/google.pubsub.rst
platypush/events/gotify.rst
platypush/events/gpio.rst
@ -66,6 +64,7 @@ Events
platypush/events/sound.rst
platypush/events/stt.rst
platypush/events/sun.rst
platypush/events/telegram.rst
platypush/events/tensorflow.rst
platypush/events/torrent.rst
platypush/events/trello.rst
@ -74,7 +73,6 @@ Events
platypush/events/web.rst
platypush/events/web.widget.rst
platypush/events/websocket.rst
platypush/events/wiimote.rst
platypush/events/xmpp.rst
platypush/events/zeroborg.rst
platypush/events/zeroconf.rst

View File

@ -24,9 +24,8 @@ Useful links
============
* The `main page <https://platypush.tech>`_ of the project.
* The `Gitea page <https://git.platypush.tech/platypush/platypush>`_.
* The `blog <https://blog.platypush.tech>`_, for articles showing how to use
Platypush in real-world scenarios.
* The `source code <https://git.platypush.tech/platypush/platypush>`_.
* The `blog <https://blog.platypush.tech>`_.
Wiki
====
@ -34,11 +33,15 @@ Wiki
.. toctree::
:maxdepth: 3
wiki/index
wiki/Home
wiki/Quickstart
wiki/Installation
wiki/Plugins-installation
wiki/APIs
wiki/Variables
wiki/Entities
wiki/Configuration
wiki/Installing-extensions
wiki/A-configuration-example
wiki/A-full-configuration-example
wiki/The-Web-interface
Reference
@ -50,7 +53,6 @@ Reference
backends
plugins
events
responses
Indices and tables
==================

View File

@ -1,6 +0,0 @@
``button.flic``
=================================
.. automodule:: platypush.backend.button.flic
:members:

View File

@ -1,6 +0,0 @@
``camera.pi``
===============================
.. automodule:: platypush.backend.camera.pi
:members:

View File

@ -1,5 +0,0 @@
``chat.telegram``
===================================
.. automodule:: platypush.backend.chat.telegram
:members:

View File

@ -1,6 +0,0 @@
``gps``
=========================
.. automodule:: platypush.backend.gps
:members:

View File

@ -1,5 +0,0 @@
``mail``
==========================
.. automodule:: platypush.backend.mail
:members:

View File

@ -1,6 +0,0 @@
``midi``
==========================
.. automodule:: platypush.backend.midi
:members:

View File

@ -1,6 +0,0 @@
``music.mopidy``
==================================
.. automodule:: platypush.backend.music.mopidy
:members:

View File

@ -1,6 +0,0 @@
``music.mpd``
===============================
.. automodule:: platypush.backend.music.mpd
:members:

View File

@ -1,5 +0,0 @@
``music.spotify``
===================================
.. automodule:: platypush.backend.music.spotify
:members:

View File

@ -1,6 +0,0 @@
``nfc``
=========================
.. automodule:: platypush.backend.nfc
:members:

View File

@ -1,6 +0,0 @@
``scard``
===========================
.. automodule:: platypush.backend.scard
:members:

View File

@ -1,6 +0,0 @@
``sensor.ir.zeroborg``
========================================
.. automodule:: platypush.backend.sensor.ir.zeroborg
:members:

View File

@ -1,7 +0,0 @@
``sensor.leap``
=================================
.. automodule:: platypush.backend.sensor.leap
:members:

View File

@ -1,5 +0,0 @@
``stt.deepspeech``
====================================
.. automodule:: platypush.backend.stt.deepspeech
:members:

View File

@ -1,5 +0,0 @@
``stt.picovoice.hotword``
===========================================
.. automodule:: platypush.backend.stt.picovoice.hotword
:members:

View File

@ -1,5 +0,0 @@
``stt.picovoice.speech``
==========================================
.. automodule:: platypush.backend.stt.picovoice.speech
:members:

View File

@ -1,6 +0,0 @@
``wiimote``
=============================
.. automodule:: platypush.backend.wiimote
:members:

View File

@ -1,6 +0,0 @@
``button.flic``
=======================================
.. automodule:: platypush.message.event.button.flic
:members:

View File

@ -1,5 +0,0 @@
``chat.telegram``
=========================================
.. automodule:: platypush.message.event.chat.telegram
:members:

View File

@ -0,0 +1,5 @@
``flic``
========
.. automodule:: platypush.message.event.flic
:members:

View File

@ -1,6 +0,0 @@
``google.fit``
======================================
.. automodule:: platypush.message.event.google.fit
:members:

View File

@ -0,0 +1,5 @@
``telegram``
============
.. automodule:: platypush.message.event.telegram
:members:

View File

@ -1,6 +0,0 @@
``wiimote``
===================================
.. automodule:: platypush.message.event.wiimote
:members:

View File

@ -0,0 +1,5 @@
``assistant.openai``
====================
.. automodule:: platypush.plugins.assistant.openai
:members:

View File

@ -0,0 +1,5 @@
``assistant.picovoice``
=======================
.. automodule:: platypush.plugins.assistant.picovoice
:members:

View File

@ -0,0 +1,5 @@
``camera.pi.legacy``
====================
.. automodule:: platypush.plugins.camera.pi.legacy
:members:

View File

@ -1,5 +0,0 @@
``chat.irc``
============
.. automodule:: platypush.plugins.chat.irc
:members:

View File

@ -1,5 +0,0 @@
``chat.telegram``
===================================
.. automodule:: platypush.plugins.chat.telegram
:members:

View File

@ -0,0 +1,5 @@
``cups``
========
.. automodule:: platypush.plugins.cups
:members:

View File

@ -0,0 +1,5 @@
``flic``
========
.. automodule:: platypush.plugins.flic
:members:

View File

@ -1,6 +0,0 @@
``google.fit``
================================
.. automodule:: platypush.plugins.google.fit
:members:

View File

@ -0,0 +1,5 @@
``gps``
=======
.. automodule:: platypush.plugins.gps
:members:

View File

@ -1,7 +0,0 @@
``http.request``
==================================
.. automodule:: platypush.plugins.http.request
:members:

View File

@ -0,0 +1,5 @@
``http``
========
.. automodule:: platypush.plugins.http
:members:

View File

@ -0,0 +1,5 @@
``irc``
=======
.. automodule:: platypush.plugins.irc
:members:

View File

@ -0,0 +1,5 @@
``leap``
========
.. automodule:: platypush.plugins.leap
:members:

View File

@ -1,5 +0,0 @@
``mail.imap``
===============================
.. automodule:: platypush.plugins.mail.imap
:members:

View File

@ -0,0 +1,5 @@
``mail``
========
.. automodule:: platypush.plugins.mail
:members:

View File

@ -1,5 +0,0 @@
``mail.smtp``
===============================
.. automodule:: platypush.plugins.mail.smtp
:members:

View File

@ -0,0 +1,5 @@
``music.mopidy``
================
.. automodule:: platypush.plugins.music.mopidy
:members:

View File

@ -0,0 +1,5 @@
``nfc``
=======
.. automodule:: platypush.plugins.nfc
:members:

View File

@ -0,0 +1,5 @@
``openai``
==========
.. automodule:: platypush.plugins.openai
:members:

View File

@ -1,5 +0,0 @@
``printer.cups``
==================================
.. automodule:: platypush.plugins.printer.cups
:members:

View File

@ -1,5 +0,0 @@
``stt.deepspeech``
====================================
.. automodule:: platypush.plugins.stt.deepspeech
:members:

View File

@ -1,5 +0,0 @@
``stt.picovoice.hotword``
===========================================
.. automodule:: platypush.plugins.stt.picovoice.hotword
:members:

View File

@ -1,5 +0,0 @@
``stt.picovoice.speech``
==========================================
.. automodule:: platypush.plugins.stt.picovoice.speech
:members:

View File

@ -0,0 +1,5 @@
``telegram``
============
.. automodule:: platypush.plugins.telegram
:members:

View File

@ -0,0 +1,5 @@
``tts.openai``
==============
.. automodule:: platypush.plugins.tts.openai
:members:

View File

@ -0,0 +1,5 @@
``tts.picovoice``
=================
.. automodule:: platypush.plugins.tts.picovoice
:members:

View File

@ -1,6 +0,0 @@
``wiimote``
=============================
.. automodule:: platypush.plugins.wiimote
:members:

View File

@ -1,5 +0,0 @@
``camera.android``
=============================================
.. automodule:: platypush.message.response.camera.android
:members:

View File

@ -1,5 +0,0 @@
``camera``
=====================================
.. automodule:: platypush.message.response.camera
:members:

View File

@ -1,5 +0,0 @@
``chat.telegram``
============================================
.. automodule:: platypush.message.response.chat.telegram
:members:

View File

@ -1,5 +0,0 @@
``google.drive``
===========================================
.. automodule:: platypush.message.response.google.drive
:members:

View File

@ -1,5 +0,0 @@
``pihole``
=====================================
.. automodule:: platypush.message.response.pihole
:members:

View File

@ -1,5 +0,0 @@
``printer.cups``
===========================================
.. automodule:: platypush.message.response.printer.cups
:members:

View File

@ -1,5 +0,0 @@
``qrcode``
=====================================
.. automodule:: platypush.message.response.qrcode
:members:

View File

@ -1,5 +0,0 @@
``ssh``
==================================
.. automodule:: platypush.message.response.ssh
:members:

View File

@ -1,5 +0,0 @@
``stt``
==================================
.. automodule:: platypush.message.response.stt
:members:

View File

@ -1,5 +0,0 @@
``tensorflow``
=========================================
.. automodule:: platypush.message.response.tensorflow
:members:

View File

@ -1,5 +0,0 @@
``translate``
========================================
.. automodule:: platypush.message.response.translate
:members:

View File

@ -11,6 +11,8 @@ Plugins
platypush/plugins/application.rst
platypush/plugins/arduino.rst
platypush/plugins/assistant.google.rst
platypush/plugins/assistant.openai.rst
platypush/plugins/assistant.picovoice.rst
platypush/plugins/autoremote.rst
platypush/plugins/bluetooth.rst
platypush/plugins/calendar.rst
@ -21,11 +23,11 @@ Plugins
platypush/plugins/camera.gstreamer.rst
platypush/plugins/camera.ir.mlx90640.rst
platypush/plugins/camera.pi.rst
platypush/plugins/chat.irc.rst
platypush/plugins/chat.telegram.rst
platypush/plugins/camera.pi.legacy.rst
platypush/plugins/clipboard.rst
platypush/plugins/config.rst
platypush/plugins/csv.rst
platypush/plugins/cups.rst
platypush/plugins/db.rst
platypush/plugins/dbus.rst
platypush/plugins/dropbox.rst
@ -34,11 +36,11 @@ Plugins
platypush/plugins/ffmpeg.rst
platypush/plugins/file.rst
platypush/plugins/file.monitor.rst
platypush/plugins/flic.rst
platypush/plugins/foursquare.rst
platypush/plugins/github.rst
platypush/plugins/google.calendar.rst
platypush/plugins/google.drive.rst
platypush/plugins/google.fit.rst
platypush/plugins/google.mail.rst
platypush/plugins/google.maps.rst
platypush/plugins/google.pubsub.rst
@ -46,24 +48,26 @@ Plugins
platypush/plugins/gotify.rst
platypush/plugins/gpio.rst
platypush/plugins/gpio.zeroborg.rst
platypush/plugins/gps.rst
platypush/plugins/graphite.rst
platypush/plugins/hid.rst
platypush/plugins/http.request.rst
platypush/plugins/http.rst
platypush/plugins/http.webpage.rst
platypush/plugins/ifttt.rst
platypush/plugins/inspect.rst
platypush/plugins/irc.rst
platypush/plugins/joystick.rst
platypush/plugins/kafka.rst
platypush/plugins/lastfm.rst
platypush/plugins/lcd.gpio.rst
platypush/plugins/lcd.i2c.rst
platypush/plugins/leap.rst
platypush/plugins/light.hue.rst
platypush/plugins/linode.rst
platypush/plugins/log.http.rst
platypush/plugins/logger.rst
platypush/plugins/luma.oled.rst
platypush/plugins/mail.imap.rst
platypush/plugins/mail.smtp.rst
platypush/plugins/mail.rst
platypush/plugins/mailgun.rst
platypush/plugins/mastodon.rst
platypush/plugins/matrix.rst
@ -82,18 +86,20 @@ Plugins
platypush/plugins/ml.cv.rst
platypush/plugins/mobile.join.rst
platypush/plugins/mqtt.rst
platypush/plugins/music.mopidy.rst
platypush/plugins/music.mpd.rst
platypush/plugins/music.snapcast.rst
platypush/plugins/music.spotify.rst
platypush/plugins/music.tidal.rst
platypush/plugins/nextcloud.rst
platypush/plugins/nfc.rst
platypush/plugins/ngrok.rst
platypush/plugins/nmap.rst
platypush/plugins/ntfy.rst
platypush/plugins/openai.rst
platypush/plugins/otp.rst
platypush/plugins/pihole.rst
platypush/plugins/ping.rst
platypush/plugins/printer.cups.rst
platypush/plugins/pushbullet.rst
platypush/plugins/pwm.pca9685.rst
platypush/plugins/qrcode.rst
@ -115,15 +121,13 @@ Plugins
platypush/plugins/smartthings.rst
platypush/plugins/sound.rst
platypush/plugins/ssh.rst
platypush/plugins/stt.deepspeech.rst
platypush/plugins/stt.picovoice.hotword.rst
platypush/plugins/stt.picovoice.speech.rst
platypush/plugins/sun.rst
platypush/plugins/switch.tplink.rst
platypush/plugins/switch.wemo.rst
platypush/plugins/switchbot.rst
platypush/plugins/system.rst
platypush/plugins/tcp.rst
platypush/plugins/telegram.rst
platypush/plugins/tensorflow.rst
platypush/plugins/todoist.rst
platypush/plugins/torrent.rst
@ -131,6 +135,8 @@ Plugins
platypush/plugins/tts.rst
platypush/plugins/tts.google.rst
platypush/plugins/tts.mimic3.rst
platypush/plugins/tts.openai.rst
platypush/plugins/tts.picovoice.rst
platypush/plugins/tv.samsung.ws.rst
platypush/plugins/twilio.rst
platypush/plugins/udp.rst
@ -141,7 +147,6 @@ Plugins
platypush/plugins/weather.buienradar.rst
platypush/plugins/weather.openweathermap.rst
platypush/plugins/websocket.rst
platypush/plugins/wiimote.rst
platypush/plugins/xmpp.rst
platypush/plugins/youtube.rst
platypush/plugins/zeroconf.rst

View File

@ -1,19 +0,0 @@
Responses
=========
.. toctree::
:maxdepth: 1
:caption: Responses:
platypush/responses/camera.rst
platypush/responses/camera.android.rst
platypush/responses/chat.telegram.rst
platypush/responses/google.drive.rst
platypush/responses/pihole.rst
platypush/responses/printer.cups.rst
platypush/responses/qrcode.rst
platypush/responses/ssh.rst
platypush/responses/stt.rst
platypush/responses/tensorflow.rst
platypush/responses/translate.rst

View File

@ -1,15 +1,16 @@
# A more versatile way to define event hooks than the YAML format of `config.yaml` is through native Python scripts.
# You can define hooks as simple Python functions that use the `platypush.event.hook.hook` decorator to specify on
# which event type they should be called, and optionally on which event attribute values.
# A more versatile way to define event hooks than the YAML format of
# `config.yaml` is through native Python scripts. You can define hooks as simple
# Python functions that use the `platypush.event.hook.hook` decorator to specify
# on which event type they should be called, and optionally on which event
# attribute values.
#
# Event hooks should be stored in Python files under `~/.config/platypush/scripts`. All the functions that use the
# @hook decorator will automatically be discovered and imported as event hooks into the platform at runtime.
# Event hooks should be stored in Python files under
# `~/.config/platypush/scripts`. All the functions that use the @when decorator
# will automatically be discovered and imported as event hooks into the platform
# at runtime.
# `run` is a utility function that runs a request by name (e.g. `light.hue.on`).
from platypush.utils import run
# @hook decorator
from platypush.event.hook import hook
from platypush import when, run
# Event types that you want to react to
from platypush.message.event.assistant import (
@ -18,13 +19,15 @@ from platypush.message.event.assistant import (
)
@hook(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
def on_music_play_command(event, title=None, artist=None, **context):
@when(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
def on_music_play_command(event, title=None, artist=None):
"""
This function will be executed when a SpeechRecognizedEvent with `phrase="play the music"` is triggered.
`event` contains the event object and `context` any key-value info from the running context.
Note that in this specific case we can leverage the token-extraction feature of SpeechRecognizedEvent through
${} that operates on regex-like principles to extract any text that matches the pattern into context variables.
This function will be executed when a SpeechRecognizedEvent with
`phrase="play the music"` is triggered. `event` contains the event object
and `context` any key-value info from the running context. Note that in this
specific case we can leverage the token-extraction feature of
SpeechRecognizedEvent through ${} that operates on regex-like principles to
extract any text that matches the pattern into context variables.
"""
results = run(
'music.mpd.search',
@ -34,16 +37,17 @@ def on_music_play_command(event, title=None, artist=None, **context):
},
)
if results:
if results and results[0]:
run('music.mpd.play', results[0]['file'])
else:
run('tts.say', "I can't find any music matching your query")
@hook(ConversationStartEvent)
def on_conversation_start(event, **context):
@when(ConversationStartEvent)
def on_conversation_start():
"""
A simple hook that gets invoked when a new conversation starts with a voice assistant and simply pauses the music
to make sure that your speech is properly detected.
A simple hook that gets invoked when a new conversation starts with a voice
assistant and simply pauses the music to make sure that your speech is
properly detected.
"""
run('music.mpd.pause_if_playing')

View File

@ -1,22 +0,0 @@
# platypush systemd service example.
# Edit and copy this file to your systemd folder. It's usually
# /usr/lib/systemd/user for global installation or
# ~/.config/systemd/user for user installation. You can
# then control and monitor the service through
# systemd [--user] [start|stop|restart|status] platypush.service
[Unit]
Description=Platypush daemon
After=network.target redis.service
[Service]
# platypush installation path
ExecStart=/usr/bin/platypush
Restart=always
# How long should be waited before restarting the service
# in case of failure.
RestartSec=10
[Install]
WantedBy=default.target

View File

@ -0,0 +1 @@
../../platypush/config/systemd/platypush.service

View File

@ -8,7 +8,6 @@ import pkgutil
from platypush.backend import Backend
from platypush.message.event import Event
from platypush.message.response import Response
from platypush.plugins import Plugin
from platypush.utils.manifest import Manifests
from platypush.utils.mock import auto_mocks
@ -26,10 +25,6 @@ def get_all_events():
return _get_modules(Event)
def get_all_responses():
return _get_modules(Response)
def _get_modules(base_type: type):
ret = set()
base_dir = os.path.dirname(inspect.getfile(base_type))
@ -151,20 +146,11 @@ def generate_events_doc():
)
def generate_responses_doc():
_generate_components_doc(
index_name='responses',
package_name='message.response',
components=sorted(response for response in get_all_responses() if response),
)
def main():
with auto_mocks():
generate_plugins_doc()
generate_backends_doc()
generate_events_doc()
generate_responses_doc()
if __name__ == '__main__':

View File

@ -5,29 +5,42 @@ Platypush
.. license: MIT
"""
from .app import Application
from .app import Application, app
from .config import Config
from .context import get_backend, get_bus, get_plugin
from .context import Variable, get_backend, get_bus, get_plugin
from .cron import cron
from .event.hook import hook
from .message.event import Event
from .message.request import Request
from .message.response import Response
from .procedure import procedure
from .runner import main
from .utils import run
# Alias for platypush.event.hook.hook,
# see https://git.platypush.tech/platypush/platypush/issues/399
when = hook
__author__ = 'Fabio Manganiello <fabio@manganiello.tech>'
__version__ = '0.50.3'
__version__ = '1.1.0'
__all__ = [
'Application',
'Variable',
'Config',
'Event',
'Request',
'Response',
'app',
'cron',
'get_backend',
'get_bus',
'get_plugin',
'hook',
'main',
'procedure',
'run',
'when',
]

View File

@ -1,4 +1,4 @@
from ._app import Application, main
from ._app import Application, app, main
__all__ = ["Application", "main"]
__all__ = ["Application", "app", "main"]

View File

@ -1,9 +1,11 @@
from contextlib import contextmanager
import logging
import pathlib
import os
import signal
import subprocess
import sys
from textwrap import dedent
from typing import Optional, Sequence
from platypush.bus import Bus
@ -41,6 +43,7 @@ class Application:
self,
config_file: Optional[str] = None,
workdir: Optional[str] = None,
db: Optional[str] = None,
logsdir: Optional[str] = None,
cachedir: Optional[str] = None,
device_id: Optional[str] = None,
@ -56,30 +59,87 @@ class Application:
ctrl_sock: Optional[str] = None,
):
"""
:param config_file: Configuration file override (default: None).
:param workdir: Overrides the ``workdir`` setting in the configuration
file (default: None).
:param logsdir: Set logging directory. If not specified, the
``filename`` setting under the ``logging`` section of the
configuration file is used. If not set, logging will be sent to
stdout and stderr.
:param cachedir: Overrides the ``cachedir`` setting in the configuration
file (default: None).
:param device_id: Override the device ID used to identify this
instance. If not passed here, it is inferred from the configuration
(device_id field). If not present there either, it is inferred from
the hostname.
:param config_file: Configuration file. The order of precedence is:
- The ``config_file`` parameter (or the ``-c``/``--config`` command
line argument).
- The ``PLATYPUSH_CONFIG`` environment variable.
- ``./config.yaml``
- ``~/.config/platypush/config.yaml``
- ``/etc/platypush/config.yaml``
:param workdir: Working directory where the application will store its
data and integration plugins will store their data. The order of
precedence is:
- The ``workdir`` parameter (or the ``-w``/``--workdir`` command
line argument).
- The ``PLATYPUSH_WORKDIR`` environment variable.
- The ``workdir`` field in the configuration file.
- ``~/.local/share/platypush``
:param db: Main database engine for the application. Supports SQLAlchemy
engine strings. The order of precedence is:
- The ``db`` parameter (or the ``--main-db``/``--db`` command
line argument).
- The ``PLATYPUSH_DB`` environment variable.
- The ``db`` field in the configuration file.
- ``sqlite:///<workdir>/main.db``
:param logsdir: Logs directory where the application will store its logs.
The order of precedence is:
- The ``logsdir`` parameter (or the ``-l``/``--logsdir`` command
line argument).
- The ``PLATYPUSH_LOGSDIR`` environment variable.
- The ``logging`` -> ``filename`` field in the configuration
file (the ``format`` and ``level`` fields can be set as well
using Python logging configuration).
- stdout and stderr
:param cachedir: Directory where the application and the plugins will store
their cache data. The order of precedence is:
- The ``cachedir`` parameter (or the ``--cachedir`` command line
argument).
- The ``PLATYPUSH_CACHEDIR`` environment variable.
- The ``cachedir`` field in the configuration file.
- ``~/.cache/platypush``
:param device_id: Device ID used to identify this instance. The order
of precedence is:
- The ``device_id`` parameter (or the ``--device-id`` command
line argument).
- The ``PLATYPUSH_DEVICE_ID`` environment variable.
- The ``device_id`` field in the configuration file.
- The hostname of the machine.
:param pidfile: File where platypush will store its PID upon launch,
useful if you're planning to integrate the application within a
service or a launcher script (default: None).
service or a launcher script. Order of precedence:
- The ``pidfile`` parameter (or the ``-P``/``--pidfile`` command
line argument).
- The ``PLATYPUSH_PIDFILE`` environment variable.
- No PID file.
:param requests_to_process: Exit after processing the specified
number of requests (default: None, loop forever).
number of requests (default: None, loop forever). This is usually
useful for testing purposes.
:param no_capture_stdout: Set to true if you want to disable the
stdout capture by the logging system (default: False).
:param no_capture_stderr: Set to true if you want to disable the
stderr capture by the logging system (default: False).
:param redis_queue: Name of the (Redis) queue used for dispatching
messages (default: platypush/bus).
messages. Order of precedence:
- The ``redis_queue`` parameter (or the ``--redis-queue`` command
line argument).
- The ``PLATYPUSH_REDIS_QUEUE`` environment variable.
- ``platypush/bus``
:param verbose: Enable debug/verbose logging, overriding the stored
configuration (default: False).
:param start_redis: If set, it starts a managed Redis instance upon
@ -87,34 +147,57 @@ class Application:
server). This is particularly useful when running the application
inside of Docker containers, without relying on ``docker-compose``
to start multiple containers, and in tests (default: False).
:param redis_host: Host of the Redis server to be used. It overrides
the settings in the ``redis`` section of the configuration file.
:param redis_port: Port of the local Redis server. It overrides the
settings in the ``redis`` section of the configuration file.
:param redis_host: Host of the Redis server to be used. The order of
precedence is:
- The ``redis_host`` parameter (or the ``--redis-host`` command
line argument).
- The ``PLATYPUSH_REDIS_HOST`` environment variable.
- The ``redis`` -> ``host`` field in the configuration file.
- The ``backend.redis`` -> ``redis_args`` -> ``host`` field in
the configuration file.
- ``localhost``
:param redis_port: Port of the Redis server to be used. The order of
precedence is:
- The ``redis_port`` parameter (or the ``--redis-port`` command
line argument).
- The ``PLATYPUSH_REDIS_PORT`` environment variable.
- The ``redis`` -> ``port`` field in the configuration file.
- The ``backend.redis`` -> ``redis_args`` -> ``port`` field in
the configuration file.
- ``6379``
:param ctrl_sock: If set, it identifies a path to a UNIX domain socket
that the application can use to send control messages (e.g. STOP
and RESTART) to its parent.
"""
self.pidfile = pidfile
self.pidfile = pidfile or os.environ.get('PLATYPUSH_PIDFILE')
self.bus: Optional[Bus] = None
self.redis_queue = redis_queue or RedisBus.DEFAULT_REDIS_QUEUE
self.config_file = config_file
self._verbose = verbose
self._logsdir = (
os.path.abspath(os.path.expanduser(logsdir)) if logsdir else None
self.redis_queue = (
redis_queue
or os.environ.get('PLATYPUSH_REDIS_QUEUE')
or RedisBus.DEFAULT_REDIS_QUEUE
)
self.config_file = config_file or os.environ.get('PLATYPUSH_CONFIG')
self.verbose = verbose
self.db_engine = db or os.environ.get('PLATYPUSH_DB')
self.device_id = device_id or os.environ.get('PLATYPUSH_DEVICE_ID')
self.logsdir = self.expand_path(logsdir or os.environ.get('PLATYPUSH_LOGSDIR'))
self.workdir = self.expand_path(workdir or os.environ.get('PLATYPUSH_WORKDIR'))
self.cachedir = self.expand_path(
cachedir or os.environ.get('PLATYPUSH_CACHEDIR')
)
Config.init(
self.config_file,
device_id=device_id,
workdir=os.path.abspath(os.path.expanduser(workdir)) if workdir else None,
cachedir=os.path.abspath(os.path.expanduser(cachedir))
if cachedir
else None,
ctrl_sock=os.path.abspath(os.path.expanduser(ctrl_sock))
if ctrl_sock
else None,
device_id=self.device_id,
workdir=self.workdir,
db=self.db_engine,
cachedir=self.cachedir,
ctrl_sock=self.expand_path(ctrl_sock),
)
self.no_capture_stdout = no_capture_stdout
@ -125,24 +208,25 @@ class Application:
self.processed_requests = 0
self.cron_scheduler = None
self.start_redis = start_redis
self.redis_host = redis_host
self.redis_port = redis_port
self.redis_conf = {}
self.redis_host = redis_host or os.environ.get('PLATYPUSH_REDIS_HOST')
self.redis_port = redis_port or os.environ.get('PLATYPUSH_REDIS_PORT')
self._redis_conf = {
'host': self.redis_host or 'localhost',
'port': self.redis_port or self._default_redis_port,
}
self._redis_proc: Optional[subprocess.Popen] = None
self.cmd_stream = CommandStream(ctrl_sock)
self._init_bus()
self._init_logging()
@staticmethod
def expand_path(path: Optional[str]) -> Optional[str]:
return os.path.abspath(os.path.expanduser(path)) if path else None
def _init_bus(self):
self._redis_conf = get_redis_conf()
self._redis_conf['port'] = self.redis_port or self._redis_conf.get(
'port', self._default_redis_port
)
if self.redis_host:
self._redis_conf['host'] = self.redis_host
self._redis_conf = {**self._redis_conf, **get_redis_conf()}
Config.set('redis', self._redis_conf)
self.bus = RedisBus(
redis_queue=self.redis_queue,
@ -152,12 +236,18 @@ class Application:
def _init_logging(self):
logging_conf = Config.get('logging') or {}
if self._verbose:
if self.verbose:
logging_conf['level'] = logging.DEBUG
if self._logsdir:
logging_conf['filename'] = os.path.join(self._logsdir, 'platypush.log')
if self.logsdir:
logging_conf['filename'] = os.path.join(self.logsdir, 'platypush.log')
logging_conf.pop('stream', None)
if logging_conf.get('filename'):
pathlib.Path(os.path.dirname(logging_conf['filename'])).mkdir(
parents=True, exist_ok=True
)
Config.set('logging', logging_conf)
logging.basicConfig(**logging_conf)
@ -214,6 +304,7 @@ class Application:
workdir=opts.workdir,
cachedir=opts.cachedir,
logsdir=opts.logsdir,
db=opts.db_engine,
device_id=opts.device_id,
pidfile=opts.pidfile,
no_capture_stdout=opts.no_capture_stdout,
@ -274,6 +365,10 @@ class Application:
backend.stop()
for plugin in runnable_plugins:
# This is required because some plugins may redefine the `stop` method.
# In that case, at the very least the _should_stop event should be
# set to notify the plugin to stop.
plugin._should_stop.set() # pylint: disable=protected-access
plugin.stop()
for backend in backends:
@ -326,7 +421,21 @@ class Application:
if not self.no_capture_stderr:
sys.stderr = Logger(log.warning)
log.info('---- Starting platypush v.%s', __version__)
log.info(
dedent(
r'''
_____ _ _ _
| __ \| | | | | |
| |__) | | __ _| |_ _ _ _ __ _ _ ___| |__
| ___/| |/ _` | __| | | | '_ \| | | / __| '_ \
| | | | (_| | |_| |_| | |_) | |_| \__ \ | | |
|_| |_|\__,_|\__|\__, | .__/ \__,_|___/_| |_|
__/ | |
|___/|_|
'''
)
)
log.info('---- Starting Platypush v.%s', __version__)
# Start the local Redis service if required
if self.start_redis:
@ -370,10 +479,15 @@ class Application:
self._run()
app: Optional[Application] = None
def main(*args: str):
"""
Application entry point.
"""
global app
app = Application.from_cmdline(args)
try:

View File

@ -402,6 +402,13 @@ class Backend(Thread, EventGenerator, ExtensionWithManifest):
)
return
if self.zeroconf:
self.logger.info(
'Zeroconf service already registered for %s, removing the previous instance',
self.__class__.__name__,
)
self.unregister_service()
self.zeroconf = Zeroconf()
srv_desc = {
'name': 'Platypush',

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