From 179e143537445e470c79a212b19176effabc3d27 Mon Sep 17 00:00:00 2001 From: "Community Hass.io Add-ons Bot" Date: Fri, 5 Feb 2021 17:35:00 +0000 Subject: [PATCH] :arrow_up: Updating add-on JupyterLab to ba3db18 --- README.md | 23 ++ jupyterlab/CHANGELOG.md | 484 ++++++++++++++++++++++++++++++++++++++++ jupyterlab/DOCS.md | 171 ++++++++++++++ jupyterlab/README.md | 59 +++++ jupyterlab/config.json | 34 +++ jupyterlab/icon.png | Bin 0 -> 4678 bytes jupyterlab/logo.png | Bin 0 -> 17809 bytes 7 files changed, 771 insertions(+) create mode 100644 jupyterlab/CHANGELOG.md create mode 100644 jupyterlab/DOCS.md create mode 100644 jupyterlab/README.md create mode 100644 jupyterlab/config.json create mode 100644 jupyterlab/icon.png create mode 100644 jupyterlab/logo.png diff --git a/README.md b/README.md index 4d442b449..99fd0b4bc 100644 --- a/README.md +++ b/README.md @@ -248,6 +248,19 @@ Scalable datastore for metrics, events, and real-time analytics [:books: InfluxDB add-on documentation][addon-doc-influxdb] +### ✓ [JupyterLab][addon-jupyterlab] + +![Latest Version][jupyterlab-version-shield] +![Supports armhf Architecture][jupyterlab-armhf-shield] +![Supports armv7 Architecture][jupyterlab-armv7-shield] +![Supports aarch64 Architecture][jupyterlab-aarch64-shield] +![Supports amd64 Architecture][jupyterlab-amd64-shield] +![Supports i386 Architecture][jupyterlab-i386-shield] + +Create documents containing live code, equations, visualizations, and explanatory text + +[:books: JupyterLab add-on documentation][addon-doc-jupyterlab] + ### ✓ [Log Viewer][addon-log-viewer] ![Latest Version][log-viewer-version-shield] @@ -675,6 +688,7 @@ on the correct GitHub repository matching the add-on. - [Open an issue for the add-on: Grocy][grocy-issue] - [Open an issue for the add-on: Home Panel][home-panel-issue] - [Open an issue for the add-on: InfluxDB][influxdb-issue] +- [Open an issue for the add-on: JupyterLab][jupyterlab-issue] - [Open an issue for the add-on: Log Viewer][log-viewer-issue] - [Open an issue for the add-on: Lutron Certificate][lutron-cert-issue] - [Open an issue for the add-on: MQTT Server & Web client][mqtt-issue] @@ -896,6 +910,15 @@ SOFTWARE. [influxdb-armhf-shield]: https://img.shields.io/badge/armhf-no-red.svg [influxdb-armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg [influxdb-i386-shield]: https://img.shields.io/badge/i386-yes-green.svg +[addon-jupyterlab]: https://github.com/hassio-addons/addon-jupyterlab/tree/ba3db18 +[addon-doc-jupyterlab]: https://github.com/hassio-addons/addon-jupyterlab/blob/ba3db18/README.md +[jupyterlab-issue]: https://github.com/hassio-addons/addon-jupyterlab/issues +[jupyterlab-version-shield]: https://img.shields.io/badge/version-ba3db18-blue.svg +[jupyterlab-aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg +[jupyterlab-amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg +[jupyterlab-armhf-shield]: https://img.shields.io/badge/armhf-no-red.svg +[jupyterlab-armv7-shield]: https://img.shields.io/badge/armv7-no-red.svg +[jupyterlab-i386-shield]: https://img.shields.io/badge/i386-no-red.svg [addon-log-viewer]: https://github.com/hassio-addons/addon-log-viewer/tree/fade46f [addon-doc-log-viewer]: https://github.com/hassio-addons/addon-log-viewer/blob/fade46f/README.md [log-viewer-issue]: https://github.com/hassio-addons/addon-log-viewer/issues diff --git a/jupyterlab/CHANGELOG.md b/jupyterlab/CHANGELOG.md new file mode 100644 index 000000000..f678af8dd --- /dev/null +++ b/jupyterlab/CHANGELOG.md @@ -0,0 +1,484 @@ +# Changelog since v0.3.1 +- Tweak badges in documentation (#235) +- ⬆️ Bump actionshub/markdownlint from 2.0.0 to 2.0.2 (#233) + +Bumps [actionshub/markdownlint](https://github.com/actionshub/markdownlint) from 2.0.0 to 2.0.2. +- [Release notes](https://github.com/actionshub/markdownlint/releases) +- [Changelog](https://github.com/actionshub/markdownlint/blob/master/CHANGELOG.md) +- [Commits](https://github.com/actionshub/markdownlint/compare/2.0.0...4668c0321d5e398f4776e88e0f87d203dec0fd99) + +Signed-off-by: dependabot[bot] + +Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +- ⬆️ Bump actions/cache from v2.1.3 to v2.1.4 (#234) + +Bumps [actions/cache](https://github.com/actions/cache) from v2.1.3 to v2.1.4. +- [Release notes](https://github.com/actions/cache/releases) +- [Commits](https://github.com/actions/cache/compare/v2.1.3...26968a09c0ea4f3e233fdddbafd1166051a095f6) + +Signed-off-by: dependabot[bot] + +Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +- Refactor add-on (#232) + +* Refactor add-on + +* Replace NGinx Configuration + +* Ingress!!! + +* More tweaks, renames and other touches + +* Revert accidental upgrade of JupyterLab +- ⬆️ Bump frenck/action-addon-linter from v1.3.1 to v1.4 (#229) + +Bumps [frenck/action-addon-linter](https://github.com/frenck/action-addon-linter) from v1.3.1 to v1.4. +- [Release notes](https://github.com/frenck/action-addon-linter/releases) +- [Commits](https://github.com/frenck/action-addon-linter/compare/v1.3.1...c82c5e9ca0ce5fc9b15756f1c0e39531b95d11b0) + +Signed-off-by: dependabot[bot] + +Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +- ⬆️ Bump frenck/action-yamllint from v1.0.2 to v1.1 (#231) + +Bumps [frenck/action-yamllint](https://github.com/frenck/action-yamllint) from v1.0.2 to v1.1. +- [Release notes](https://github.com/frenck/action-yamllint/releases) +- [Commits](https://github.com/frenck/action-yamllint/compare/v1.0.2...e21bcc770907b7207a05453ca9f1eb7129c945d1) + +Signed-off-by: dependabot[bot] + +Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +- ⬆ Updates pandas to v1.2.1 (#224) + +Co-authored-by: Renovate Bot +- ⬆️ Bump actions/stale from v3.0.14 to v3.0.15 (#230) + +Bumps [actions/stale](https://github.com/actions/stale) from v3.0.14 to v3.0.15. +- [Release notes](https://github.com/actions/stale/releases) +- [Commits](https://github.com/actions/stale/compare/v3.0.14...86561461b92875de77a8b2d2e75f004c826e8f45) + +Signed-off-by: dependabot[bot] + +Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +- Add new repository workflow (#228) + +* Add new repository workflow + +* Prettified Code! + +* Migrate Docker build arguments + +* Documentation tweaks + +* Address add-on lint errors + +Co-authored-by: frenck +- Upgrade Code of Conduct (#227) +- Happy New Year (#226) +- Cleanup repository (#225) +- ⬆ Updates ipywidgets to v7.6.3 (#223) + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.19.5 (#222) + +Co-authored-by: Renovate Bot +- ⬆ Updates mysqlclient to v2.0.3 (#221) + +Co-authored-by: Renovate Bot +- ⬆ Updates ipywidgets to v7.6.2 (#219) + +Co-authored-by: Renovate Bot +- ⬆ Updates geopy to v2.1.0 (#220) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.2.0 (#218) + +Co-authored-by: Renovate Bot +- ⬆ Updates ipywidgets to v7.6.1 (#217) + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.22 (#215) + +Co-authored-by: Renovate Bot +- ⬆ Updates mysqlclient to v2.0.2 (#214) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.1.5 (#213) + +Co-authored-by: Renovate Bot +- ⬆ Updates scrapy to v2.4.1 (#211) + +Co-authored-by: Renovate Bot +- ⬆ Updates matplotlib to v3.3.3 (#210) + +Co-authored-by: Renovate Bot +- ⬆ Updates influxdb to v5.3.1 (#209) + +Co-authored-by: Renovate Bot +- 🚑 Fix hadolint flag +- 👕 Workaround hadolint for now +- 🚑 Pin pandoc more loose to address armel build issue: +- 🔨 Replace armv7 with armhf +- ⬆ Updates HASS-data-detective to v2.4 (#208) + +Co-authored-by: Renovate Bot +- ⬆ Upgrades nodejs to 12.19.0-1nodesource1 +- ⬆ Upgrades numpy to 1.19.4 +- ⬆ Upgrades add-on base image to v3.2.3 +- ⬆ Upgrades libzmq5 to 4.3.1-4+deb10u2 +- ⬆ Upgrades nginx to 1.14.2-2+deb10u3 +- ⬆ Upgrades libmariadb3 to 1:10.3.25-0+deb10u1 +- ⬆ Updates nbconvert to v6 (#194) + +Co-authored-by: Renovate Bot +- Fix uploading larger files than 1 mb (#171) + +fix uploading larger files than 1 mb leading to +[error] 524#524: *31 client intended to send too large body +according to https://github.com/jupyterlab/jupyterlab/issues/4214 +- ⬆ Updates HASS-data-detective to v2.3 (#189) + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.19.4 (#206) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.1.4 (#199) + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.19.3 (#205) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.2.9 (#204) + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v2.2.3 (#203) + +Co-authored-by: Renovate Bot +- ⬆ Updates scrapy to v2.4.0 (#200) + +Co-authored-by: Renovate Bot +- ⬆ Updates beautifulsoup4 to v4.9.3 (#198) + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.20 (#202) + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v2.2.2 (#201) + +Co-authored-by: Renovate Bot +- ⬆ Updates matplotlib to v3.3.2 (#197) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.2.8 (#196) + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.19.2 (#195) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.1.2 (#192) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.2.7 (#193) + +Co-authored-by: Renovate Bot +- ⬆ Updates psycopg2 to v2.8.6 (#191) + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v2.2.1 (#190) + +Co-authored-by: Renovate Bot +- ⬆ Upgrades NodeJS to 12.18.2-1nodesource1 (#178) +- ⬆ Updates numpy to v1.19.1 (#167) + +Co-authored-by: Renovate Bot +- ⬆ Updates scrapy to v2.3.0 (#183) + +Co-authored-by: Renovate Bot +- ⬆ Updates mysqlclient to v2 (#175) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.1.1 (#187) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.2.6 (#184) + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v2.2.0 (#188) + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.19 (#186) + +Co-authored-by: Renovate Bot +- ⬆ Updates matplotlib to v3.3.1 (#185) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.1.0 (#182) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.2.2 (#177) + +Co-authored-by: Renovate Bot +- ⬆ Updates scrapy to v2.2.1 (#180) + +Co-authored-by: Renovate Bot +- ⬆ Updates matplotlib to v3.3.0 (#179) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas-datareader to v0.9.0 (#176) + +Co-authored-by: Renovate Bot +- ⬆ Updates geopy to v2 (#174) + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.18 (#172) + +Co-authored-by: Renovate Bot +- ⬆ Updates scrapy to v2.2.0 (#170) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.1.5 (#169) + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v2.1.1 (#168) + +Co-authored-by: Renovate Bot +- ⬆ Updates matplotlib to v3.2.2 (#165) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.0.5 (#166) + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v2.1.0 (#164) + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.18.5 (#163) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.1.4 (#162) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.0.4 (#161) + +Co-authored-by: Renovate Bot +- 🚑 Fix jupyter_bokeh extension +- ⬆ Upgrades nodejs to 12.17.0-1nodesource1 +- ✏ Split add-on documentation +- 🔨 Implement OCI image specification on labels +- ⬆ Upgrades libssl-dev to 1.1.1d-0+deb10u3 +- ⬆ Upgrades git to 1:2.20.1-2+deb10u3 +- ⬆ Upgrades add-on base image to v3.2.0 +- ⬆ Updates jupyterlab to v2.1.3 (#160) +- ⬆ Updates beautifulsoup4 to v4.9.1 (#159) +- ⬆ Updates SQLAlchemy to v1.3.17 (#158) +- ⬆ Updates geopy to v1.22.0 (#157) +- ⬆ Updates jupyterlab to v2.1.2 (#156) +- ⬆ Updates numpy to v1.18.4 (#155) +- ⬆ Updates jupyterlab to v2.1.1 (#153) +- ⬆ Updates scrapy to v2.1.0 (#154) +- ⬆ Updates bokeh to v2.0.2 (#152) + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.18.3 (#151) + +Co-authored-by: Renovate Bot +- ⬆ Updates influxdb to v5.3.0 (#149) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.1.0 (#147) + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.16 (#148) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.0.2 (#146) + +Co-authored-by: Renovate Bot +- ⬆ Updates psycopg2 to v2.8.5 (#145) + +Co-authored-by: Renovate Bot +- ⬆ Updates beautifulsoup4 to v4.9.0 (#144) + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v2.0.1 (#143) + +Co-authored-by: Renovate Bot +- ⬆ Updates matplotlib to v3.2.1 (#142) + +Co-authored-by: Renovate Bot +- ⬆ Updates scrapy to v2.0.1 (#141) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.0.3 (#140) + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.18.2 (#139) + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas to v1.0.2 (#138) + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.15 (#137) + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.14 (#136) + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v2 (#135) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v2.0.1 (#133) + +Co-authored-by: Renovate Bot +- ⬆ Upgrades jupyterlab-manager to 2.0.0 +- ⬆ Updates matplotlib to v3.2.0 (#132) + +Co-authored-by: WhiteSource Renovate +- ⬆ Updates jupyterlab_github to v2 (#131) + +Co-authored-by: WhiteSource Renovate +- ⬆ Updates scrapy to v2 (#130) + +Co-authored-by: WhiteSource Renovate +- ⬆ Updates jupyterlab to v2 (#129) + +Co-authored-by: WhiteSource Renovate +- 🔥 Drop i386 support +- ⬆ Upgrades nodejs to 12.16.1-1nodesource1 +- 🚀 Leverage PiWheels for some build speed +- 🔨 Update community forum links +- ✏ Replace some Hass.io occurances +- ⬆ Upgrades nodejs to 10.19.0-1nodesource1 +- ⬆ Upgrades libtiff5-dev to 4.1.0+git191117-2~deb10u1 +- ⬆ Upgrades libpq5 to 11.7-0+deb10u1 +- ⬆ Upgrades libmariadb3 to 1:10.3.22-0+deb10u1 +- ⬆ Updates jupyterlab to v1.2.6 (#125) + +Co-authored-by: WhiteSource Renovate +- ⬆ Updates pandas to v1 (#126) + +Co-authored-by: WhiteSource Renovate +- ⬆ Updates geopy to v1.21.0 (#127) + +Co-authored-by: WhiteSource Renovate +- ⬆ Updates matplotlib to v3.1.3 (#128) + +Co-authored-by: WhiteSource Renovate +- ⬆ Upgrades add-on base image to v3.0.1 +- 🔨 Updates for upstream Supervisor changes +- 🔨 Update add-on config with new password & list features +- 🔨 Re-branding +- 📚 Update add-on documentation to use new YAML configuration format +- ⬆ Upgrades add-on base image to v3.0.0 +- ⬆ Updates SQLAlchemy to v1.3.13 (#124) + +Co-authored-by: WhiteSource Renovate +- ⬆ Updates jupyterlab to v1.2.5 (#123) + +Co-authored-by: WhiteSource Renovate +- ✨ Adds jupyterlab_sql +- 🔨 Migrate add-on from Ubuntu to Debian +- ⬆ Upgrades numpy to 1.18.1 +- ⬆ Upgrades lua-resty-http to 0.15-0 +- ⬆ Upgrades nodejs to 8.17.0-1nodesource1 +- ✏ Fixes some spelling and grammar +- ✏ Funding adjustments +- 🎆 Updates maintenance/license year to 2020 +- ⬆ Updates numpy to v1.18.1 (#120) + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v1.2.4 (#115) + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.12 (#116) + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.18.0 (#117) + +Co-authored-by: Renovate Bot +- ⬆ Updates beautifulsoup4 to v4.8.2 (#118) + +Co-authored-by: Renovate Bot +- ⬆ Updates HASS-data-detective to v2 (#119) + +Co-authored-by: Renovate Bot +- 👕 Fixes Markdownlint warnings +- 📚 Update add-on installation instructions +- ⬆ Upgrades add-on base image to v4.0.2 +- ⬆ Updates mysqlclient to v1.4.6 (#112) +- ⬆ Updates matplotlib to v3.1.2 (#113) +- ⬆ Upgrades jupyterlab-manager to 1.1 +- ⬆ Upgrades numpy= to =1.17.4 +- ⬆ Upgrades nodejs to 8.16.2-1nodesource1 +- ⬆ Upgrades python3-distutils to 3.6.9-1~18.04 +- ⬆ Upgrades libtiff5-dev to 4.0.9-5ubuntu0.3 +- ⬆ Upgrades libssl-dev to 1.1.1-1ubuntu2.1~18.04.5 +- ⬆ Upgrades libmysqlclient to 5.7.28-0ubuntu0.18.04.4 +- ⬆ Upgrades libjpeg-turbo8 to 1.5.2-0ubuntu5.18.04.3 +- ⬆ Upgrades add-on base image to v4.0.1 +- ⬆ Updates pandas to v0.25.3 (#103) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates pandas-datareader to v0.8.1 (#99) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates psycopg2 to v2.8.4 (#104) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates SQLAlchemy to v1.3.11 (#100) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates numpy to v1.17.4 (#102) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates python-dateutil to v2.8.1 (#109) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates nbconvert to v5.6.1 (#106) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates beautifulsoup4 to v4.8.1 (#101) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates mysqlclient to v1.4.5 (#111) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates bokeh to v1.4.0 (#110) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates jupyterlab to v1.2.3 (#108) + + + +Co-authored-by: Renovate Bot +- ⬆ Updates scrapy to v1.8.0 (#105) + + + +Co-authored-by: Renovate Bot +- 📚 Component > Integration (#107) +- ⬆ Updates jupyterlab to v1.1.4 (#97) +- ⬆ Updates pandas-datareader to v0.8.0 (#98) +- ⬆ Updates influxdb to v5.2.3 (#91) +- ⬆ Updates numpy to v1.17.2 (#92) +- ⬆ Updates SQLAlchemy to v1.3.8 (#93) +- ⬆ Updates jupyterlab to v1.1.3 (#94) diff --git a/jupyterlab/DOCS.md b/jupyterlab/DOCS.md new file mode 100644 index 000000000..9af340dfc --- /dev/null +++ b/jupyterlab/DOCS.md @@ -0,0 +1,171 @@ +# Home Assistant Community Add-on: JupyterLab + +JupyterLab is an open-source web application that allows you to create and share +documents that contain live code, equations, visualizations and narrative text. +Uses include: data cleaning and transformation, numerical simulation, +statistical modeling, data visualization, machine learning, and much more. + +This add-on runs JupyterLab, which is the next-generation user interface for +Project Jupyter. It is an extensible environment for interactive and +reproducible computing, based on the Jupyter Notebook and Architecture. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Home Assistant add-on. + +1. Search for the "JupyterLab" add-on in the Supervisor add-on store + and install it. +1. Start the "JupyterLab" add-on +1. Check the logs of the "JupyterLab" add-on to see if everything went well. + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```yaml +log_level: info +github_access_token: abcdef1234567890abcdef0123456789abcdef01 +system_packages: + - ffmpeg +init_commands: + - pip install virtualenv + - pip install yamllint +``` + +**Note**: _This is just an example, don't copy and past it! Create your own!_ + +### Option: `log_level` + +The `log_level` option controls the level of log output by the addon and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +### Option: `github_access_token` + +Sets an GitHub access token. When making unauthenticated requests to GitHub +(as we must do to get repository data), GitHub imposes fairly strict rate-limits +on how many requests we can make. As such, you are likely to hit that limit +within a few minutes of work. + +There is a chapter in this document with instruction on obtaining such a token. + +**Note**: _This option support secrets, e.g., `!secret github_token`._ + +### Option: `system_packages` + +Allows you to specify additional [Alpine packages][alpine-packages] to be +installed to your JupyterLab setup (e.g., `g++`. `make`, `ffmpeg`). + +**Note**: _Adding many packages will result in a longer start-up time +for the add-on._ + +#### Option: `init_commands` + +Customize your environment even more with the `init_commands` option. +Add one or more shell commands to the list, and they will be executed every +single time this add-on starts. + +## Getting a GitHub access token + +You can get an access token by following these steps: + +1. [Verify][github-verify] your email address with GitHub. +1. Go to your account settings on GitHub and select "Developer Settings" + from the left panel. +1. On the left, select "Personal access tokens" +1. Click the "Generate new token" button, and enter your password. +1. Give the token a description, and check the "**repo**" scope box. +1. Click "Generate token" +1. You should be given a string which will be your access token. + +Remember that this token is effectively a password for your GitHub account. +_Do not_ share it online or check the token into version control, +as people can use it to access all of your data on GitHub. + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. + +Releases are based on [Semantic Versioning][semver], and use the format +of `MAJOR.MINOR.PATCH`. In a nutshell, the version will be incremented +based on the following: + +- `MAJOR`: Incompatible or major changes. +- `MINOR`: Backwards-compatible new features and enhancements. +- `PATCH`: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Home Assistant Community Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Authors & contributors + +The original setup of this repository is by [Franck Nijhof][frenck]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## License + +MIT License + +Copyright (c) 2018-2021 Franck Nijhof + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[alpine-packages]: https://pkgs.alpinelinux.org/packages +[contributors]: https://github.com/hassio-addons/addon-jupyterlab/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord]: https://discord.me/hassioaddons +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/t/home-assistant-community-add-on-jupyterlab/87337?u=frenck +[frenck]: https://github.com/frenck +[github-verify]: https://help.github.com/articles/verifying-your-email-address +[issue]: https://github.com/hassio-addons/addon-jupyterlab/issues +[python-packages]: https://pypi.org/ +[reddit]: https://reddit.com/r/homeassistant +[releases]: https://github.com/hassio-addons/addon-jupyterlab/releases +[semver]: http://semver.org/spec/v2.0.0.htm diff --git a/jupyterlab/README.md b/jupyterlab/README.md new file mode 100644 index 000000000..765ef7d2a --- /dev/null +++ b/jupyterlab/README.md @@ -0,0 +1,59 @@ +# Home Assistant Community Add-on: JupyterLab + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Sponsor Frenck via GitHub Sponsors][github-sponsors-shield]][github-sponsors] + +[![Support Frenck on Patreon][patreon-shield]][patreon] + +Create documents containing live code, equations, visualizations, +and explanatory text. + +![The JupyterLab add-on][screenshot] + +## About + +JupyterLab is an open-source web application that allows you to create and share +documents that contain live code, equations, visualizations and narrative text. +Uses include: data cleaning and transformation, numerical simulation, +statistical modeling, data visualization, machine learning, and much more. + +This add-on runs JupyterLab, which is the next-generation user interface for +Project Jupyter. It is an extensible environment for interactive and +reproducible computing, based on the Jupyter Notebook and Architecture. + +## WARNING! THIS IS AN EDGE VERSION! + +This Home Assistant Add-ons repository contains edge builds of add-ons. +Edge builds add-ons are based upon the latest development version. + +- They may not work at all. +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. +- Developers. + +If you are more interested in stable releases of our add-ons: + + + + +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/t/home-assistant-community-add-on-jupyterlab-lite/87337?u=frenck +[github-sponsors-shield]: https://frenck.dev/wp-content/uploads/2019/12/github_sponsor.png +[github-sponsors]: https://github.com/sponsors/frenck +[maintenance-shield]: https://img.shields.io/maintenance/yes/2021.svg +[patreon-shield]: https://frenck.dev/wp-content/uploads/2019/12/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[release-shield]: https://img.shields.io/badge/version-ba3db18-blue.svg +[release]: https://github.com/hassio-addons/addon-jupyterlab/tree/ba3db18 +[screenshot]: https://github.com/hassio-addons/addon-jupyterlab/raw/main/images/screenshot.png \ No newline at end of file diff --git a/jupyterlab/config.json b/jupyterlab/config.json new file mode 100644 index 000000000..8b64cce3a --- /dev/null +++ b/jupyterlab/config.json @@ -0,0 +1,34 @@ +{ + "name": "JupyterLab", + "version": "ba3db18", + "slug": "jupyterlablite", + "description": "Create documents containing live code, equations, visualizations, and explanatory text", + "url": "https://github.com/hassio-addons/addon-jupyterlab", + "ingress": true, + "panel_icon": "mdi:flask-outline", + "arch": [ + "aarch64", + "amd64" + ], + "homeassistant_api": true, + "map": [ + "config:rw", + "share:rw" + ], + "options": { + "github_access_token": "", + "system_packages": [], + "init_commands": [] + }, + "schema": { + "log_level": "list(trace|debug|info|notice|warning|error|fatal)?", + "github_access_token": "password", + "system_packages": [ + "str" + ], + "init_commands": [ + "str" + ] + }, + "image": "ghcr.io/hassio-addons/jupyterlab/{arch}" +} \ No newline at end of file diff --git a/jupyterlab/icon.png b/jupyterlab/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..20e4baec6c4865be8f6c358fce599e8e00bd6316 GIT binary patch literal 4678 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 literal 0 HcmV?d00001