error while installing

ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'
while trying to run "pip3 install -r requirements.txt"

You have to be in the same directory as the requirements.txt file or specify the full path to the file

I installed it but when I create an executable I get this

What python version are you using?

Phython 3.6

Could you try installing pygame with:
sudo apt-get install python3-pygame

now I get this when I run  pip3 install -r requirements.txt
Collecting notify2==0.3.1
Using cached notify2-0.3.1-py2.py3-none-any.whl (8.0 kB)
Collecting spotipy==2.4.4
Using cached spotipy-2.4.4.tar.gz (15 kB)
Collecting lyricsgenius==1.4.0
Using cached lyricsgenius-1.4.0-py3-none-any.whl (13 kB)
Collecting lxml==4.3.3
Using cached lxml-4.3.3.tar.gz (4.4 MB)
Collecting mutagen==1.41.0
Using cached mutagen-1.41.0.tar.gz (918 kB)
Collecting requests==2.21.0
Using cached requests-2.21.0-py2.py3-none-any.whl (57 kB)
Collecting moviepy==<IP_ADDRESS>
Using cached moviepy-<IP_ADDRESS>.tar.gz (372 kB)
Collecting imageio==2.3.0
Using cached imageio-2.3.0-py2.py3-none-any.whl (3.3 MB)
Collecting humanize==0.5.1
Using cached humanize-0.5.1.tar.gz (14 kB)
Requirement already satisfied: pygame==1.9.6 in /usr/lib/python3/dist-packages (from -r requirements.txt (line 10)) (1.9.6)
Collecting youtube_dl==2019.7.30
Downloading youtube_dl-2019.7.30-py2.py3-none-any.whl (1.8 MB)
|████████████████████████████████| 1.8 MB 558 kB/s
Collecting Flask==0.12.2
Downloading Flask-0.12.2-py2.py3-none-any.whl (83 kB)
|████████████████████████████████| 83 kB 487 kB/s
Collecting pytube==9.5.1
Downloading pytube-9.5.1-py3-none-any.whl (30 kB)
Collecting PyQt5==5.13.0
Downloading PyQt5-5.13.0-5.13.0-cp35.cp36.cp37.cp38-abi3-manylinux1_x86_64.whl (62.1 MB)
|████████████████████████████████| 62.1 MB 9.8 kB/s
Collecting beautifulsoup4==4.8.0
Downloading beautifulsoup4-4.8.0-py3-none-any.whl (97 kB)
|████████████████████████████████| 97 kB 1.2 MB/s
Requirement already satisfied: idna<2.9,>=2.5 in /usr/lib/python3/dist-packages (from requests==2.21.0->-r requirements.txt (line 6)) (2.8)
Requirement already satisfied: certifi>=2017.4.17 in /usr/lib/python3/dist-packages (from requests==2.21.0->-r requirements.txt (line 6)) (2019.11.28)
Collecting urllib3<1.25,>=1.21.1
Downloading urllib3-1.24.3-py2.py3-none-any.whl (118 kB)
|████████████████████████████████| 118 kB 3.7 MB/s
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/lib/python3/dist-packages (from requests==2.21.0->-r requirements.txt (line 6)) (3.0.4)
Collecting decorator<5.0,>=4.0.2
Downloading decorator-4.4.2-py2.py3-none-any.whl (9.2 kB)
Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (from moviepy==<IP_ADDRESS>->-r requirements.txt (line 7)) (1.17.4)
Requirement already satisfied: tqdm<5.0,>=4.11.2 in /home/oliver/.local/lib/python3.8/site-packages (from moviepy==<IP_ADDRESS>->-r requirements.txt (line 7)) (4.48.0)
Requirement already satisfied: pillow in /usr/lib/python3/dist-packages (from imageio==2.3.0->-r requirements.txt (line 8)) (7.0.0)
Requirement already satisfied: click>=2.0 in /usr/lib/python3/dist-packages (from Flask==0.12.2->-r requirements.txt (line 12)) (7.0)
Collecting Jinja2>=2.4
Downloading Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
|████████████████████████████████| 125 kB 3.0 MB/s
Collecting itsdangerous>=0.21
Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Werkzeug>=0.7
Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
|████████████████████████████████| 298 kB 3.5 MB/s
Requirement already satisfied: PyQt5_sip<13,>=4.19.14 in /home/oliver/.local/lib/python3.8/site-packages (from PyQt5==5.13.0->-r requirements.txt (line 14)) (12.8.0)
Requirement already satisfied: soupsieve>=1.2 in /home/oliver/.local/lib/python3.8/site-packages (from beautifulsoup4==4.8.0->-r requirements.txt (line 15)) (2.0.1)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/lib/python3/dist-packages (from Jinja2>=2.4->Flask==0.12.2->-r requirements.txt (line 12)) (1.1.0)
Building wheels for collected packages: spotipy, lxml, mutagen, moviepy, humanize
Building wheel for spotipy (setup.py) ... done
Created wheel for spotipy: filename=spotipy-2.4.4-py3-none-any.whl size=12333 sha256=4269ca88c1d92f43627dfb76a7fe0bb7856b24acf21abb4da23e3f5db09d6ed4
Stored in directory: /home/oliver/.cache/pip/wheels/59/cb/a3/c2acd48718d6e25ba7d7e1948663af5ddf2a8864beecb46672
Building wheel for lxml (setup.py) ... error
ERROR: Command errored out with exit status 1:
command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-lv0falvc/lxml/setup.py'"'"'; file='"'"'/tmp/pip-install-lv0falvc/lxml/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-_ktazduu
cwd: /tmp/pip-install-lv0falvc/lxml/
Complete output (96 lines):
Building lxml version 4.3.3.
Building without Cython.
ERROR: b'/bin/sh: 1: xslt-config: not found\n'
** make sure the development packages of libxml2 and libxslt are installed **
Using build configuration of libxslt
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.8
creating build/lib.linux-x86_64-3.8/lxml
copying src/lxml/builder.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/pyclasslookup.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/cssselect.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/init.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/doctestcompare.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/sax.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/ElementInclude.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/usedoctest.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/_elementpath.py -> build/lib.linux-x86_64-3.8/lxml
creating build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/init.py -> build/lib.linux-x86_64-3.8/lxml/includes
creating build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/ElementSoup.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/builder.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_setmixin.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/init.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/html5parser.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/clean.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_diffcommand.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/usedoctest.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/defs.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/formfill.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/soupparser.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_html5builder.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/diff.py -> build/lib.linux-x86_64-3.8/lxml/html
creating build/lib.linux-x86_64-3.8/lxml/isoschematron
copying src/lxml/isoschematron/init.py -> build/lib.linux-x86_64-3.8/lxml/isoschematron
copying src/lxml/etree.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/etree_api.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/lxml.etree.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/lxml.etree_api.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/includes/config.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/c14n.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/relaxng.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlparser.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/tree.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/schematron.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/etreepublic.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/dtdvalid.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xpath.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlschema.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/uri.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xslt.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xinclude.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlerror.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/init.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/htmlparser.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/etree_defs.h -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/lxml-version.h -> build/lib.linux-x86_64-3.8/lxml/includes
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/rng
copying src/lxml/isoschematron/resources/rng/iso-schematron.rng -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/rng
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
copying src/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
copying src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
running build_ext
building 'lxml.etree' extension
creating build/temp.linux-x86_64-3.8
creating build/temp.linux-x86_64-3.8/src
creating build/temp.linux-x86_64-3.8/src/lxml
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DCYTHON_CLINE_IN_TRACEBACK=0 -Isrc -Isrc/lxml/includes -I/usr/include/python3.8 -c src/lxml/etree.c -o build/temp.linux-x86_64-3.8/src/lxml/etree.o -w
In file included from src/lxml/etree.c:687:
src/lxml/includes/etree_defs.h:14:10: fatal error: libxml/xmlversion.h: No such file or directory
14 | #include "libxml/xmlversion.h"
|          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Compile failed: command 'x86_64-linux-gnu-gcc' failed with exit status 1
creating tmp
cc -I/usr/include/libxml2 -c /tmp/xmlXPathInitv830ha8x.c -o tmp/xmlXPathInitv830ha8x.o
/tmp/xmlXPathInitv830ha8x.c:1:10: fatal error: libxml/xpath.h: No such file or directory
1 | #include "libxml/xpath.h"
|          ^~~~~~~~~~~~~~~~
compilation terminated.

Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?

error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
ERROR: Failed building wheel for lxml
Running setup.py clean for lxml
Building wheel for mutagen (setup.py) ... done
Created wheel for mutagen: filename=mutagen-1.41.0-py3-none-any.whl size=207893 sha256=ef11b2654db7f3933f7cb9536df3bd5d3cd8762b43f6c5369aaef0733d7e2cc8
Stored in directory: /home/oliver/.cache/pip/wheels/54/f3/6f/2df6cf00c51de610c9719f39928bce86a088d25daf0571ec76
Building wheel for moviepy (setup.py) ... done
Created wheel for moviepy: filename=moviepy-<IP_ADDRESS>-py3-none-any.whl size=130201 sha256=cf1bd7218cb7112938003b81a929bcf60a655a867db977bbfc39b2fefcb6a80b
Stored in directory: /home/oliver/.cache/pip/wheels/4e/aa/6e/778ebdc231a362a82b4369f7e7b33d8cadfafe40efc09e3f86
Building wheel for humanize (setup.py) ... done
Created wheel for humanize: filename=humanize-0.5.1-py3-none-any.whl size=17902 sha256=8f6fb76219fa9e3e53ac7ef0518f7f6f2cab4daa4718862f42ac0f42a147ea5a
Stored in directory: /home/oliver/.cache/pip/wheels/7a/d2/96/2977fbb58cc1d62be4c4a49be204f977728bd30797e5396105
Successfully built spotipy mutagen moviepy humanize
Failed to build lxml
ERROR: spotdl 2.2.2 has requirement mutagen>=1.41.1, but you'll have mutagen 1.41.0 which is incompatible.
ERROR: spotdl 2.2.2 has requirement spotipy>=2.12.0, but you'll have spotipy 2.4.4 which is incompatible.
ERROR: pyqtwebengine 5.15.0 has requirement PyQt5>=5.15, but you'll have pyqt5 5.13.0 which is incompatible.
ERROR: lyricsgenius 1.4.0 has requirement beautifulsoup4==4.6.0, but you'll have beautifulsoup4 4.8.0 which is incompatible.
Installing collected packages: notify2, urllib3, requests, spotipy, beautifulsoup4, lyricsgenius, lxml, mutagen, decorator, imageio, moviepy, humanize, youtube-dl, Jinja2, itsdangerous, Werkzeug, Flask, pytube, PyQt5
Attempting uninstall: spotipy
Found existing installation: spotipy 2.13.0
Uninstalling spotipy-2.13.0:
Successfully uninstalled spotipy-2.13.0
Attempting uninstall: beautifulsoup4
Found existing installation: beautifulsoup4 4.9.1
Uninstalling beautifulsoup4-4.9.1:
Successfully uninstalled beautifulsoup4-4.9.1
Running setup.py install for lxml ... error
ERROR: Command errored out with exit status 1:
command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-lv0falvc/lxml/setup.py'"'"'; file='"'"'/tmp/pip-install-lv0falvc/lxml/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-mfhty1m3/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/oliver/.local/include/python3.8/lxml
cwd: /tmp/pip-install-lv0falvc/lxml/
Complete output (95 lines):
Building lxml version 4.3.3.
Building without Cython.
ERROR: b'/bin/sh: 1: xslt-config: not found\n'
** make sure the development packages of libxml2 and libxslt are installed **
Using build configuration of libxslt
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.8
creating build/lib.linux-x86_64-3.8/lxml
copying src/lxml/builder.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/pyclasslookup.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/cssselect.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/__init__.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/doctestcompare.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/sax.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/ElementInclude.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/usedoctest.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/_elementpath.py -> build/lib.linux-x86_64-3.8/lxml
creating build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/__init__.py -> build/lib.linux-x86_64-3.8/lxml/includes
creating build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/ElementSoup.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/builder.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_setmixin.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/__init__.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/html5parser.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/clean.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_diffcommand.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/usedoctest.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/defs.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/formfill.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/soupparser.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_html5builder.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/diff.py -> build/lib.linux-x86_64-3.8/lxml/html
creating build/lib.linux-x86_64-3.8/lxml/isoschematron
copying src/lxml/isoschematron/__init__.py -> build/lib.linux-x86_64-3.8/lxml/isoschematron
copying src/lxml/etree.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/etree_api.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/lxml.etree.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/lxml.etree_api.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/includes/config.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/c14n.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/relaxng.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlparser.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/tree.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/schematron.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/etreepublic.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/dtdvalid.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xpath.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlschema.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/uri.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xslt.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xinclude.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlerror.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/__init__.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/htmlparser.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/etree_defs.h -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/lxml-version.h -> build/lib.linux-x86_64-3.8/lxml/includes
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/rng
copying src/lxml/isoschematron/resources/rng/iso-schematron.rng -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/rng
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
copying src/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
copying src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
running build_ext
building 'lxml.etree' extension
creating build/temp.linux-x86_64-3.8
creating build/temp.linux-x86_64-3.8/src
creating build/temp.linux-x86_64-3.8/src/lxml
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DCYTHON_CLINE_IN_TRACEBACK=0 -Isrc -Isrc/lxml/includes -I/usr/include/python3.8 -c src/lxml/etree.c -o build/temp.linux-x86_64-3.8/src/lxml/etree.o -w
In file included from src/lxml/etree.c:687:
src/lxml/includes/etree_defs.h:14:10: fatal error: libxml/xmlversion.h: No such file or directory
   14 | #include "libxml/xmlversion.h"
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Compile failed: command 'x86_64-linux-gnu-gcc' failed with exit status 1
cc -I/usr/include/libxml2 -c /tmp/xmlXPathInitfiblm9ji.c -o tmp/xmlXPathInitfiblm9ji.o
/tmp/xmlXPathInitfiblm9ji.c:1:10: fatal error: libxml/xpath.h: No such file or directory
    1 | #include "libxml/xpath.h"
      |          ^~~~~~~~~~~~~~~~
compilation terminated.
*********************************************************************************
Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
*********************************************************************************
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------

ERROR: Command errored out with exit status 1: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-lv0falvc/lxml/setup.py'"'"'; file='"'"'/tmp/pip-install-lv0falvc/lxml/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-mfhty1m3/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/oliver/.local/include/python3.8/lxml Check the logs for full command output.

You could again try installing with apt-get
sudo apt-get install python3-lxml

Requirement already satisfied: notify2==0.3.1 in /home/oliver/.local/lib/python3.8/site-packages (from -r requirements.txt (line 1)) (0.3.1)
Requirement already satisfied: spotipy==2.4.4 in /home/oliver/.local/lib/python3.8/site-packages (from -r requirements.txt (line 2)) (2.4.4)
Requirement already satisfied: lyricsgenius==1.4.0 in /home/oliver/.local/lib/python3.8/site-packages (from -r requirements.txt (line 3)) (1.4.0)
Collecting lxml==4.3.3
Using cached lxml-4.3.3.tar.gz (4.4 MB)
Processing /home/oliver/.cache/pip/wheels/54/f3/6f/2df6cf00c51de610c9719f39928bce86a088d25daf0571ec76/mutagen-1.41.0-py3-none-any.whl
Requirement already satisfied: requests==2.21.0 in /home/oliver/.local/lib/python3.8/site-packages (from -r requirements.txt (line 6)) (2.21.0)
Processing /home/oliver/.cache/pip/wheels/4e/aa/6e/778ebdc231a362a82b4369f7e7b33d8cadfafe40efc09e3f86/moviepy-<IP_ADDRESS>-py3-none-any.whl
Collecting imageio==2.3.0
Using cached imageio-2.3.0-py2.py3-none-any.whl (3.3 MB)
Processing /home/oliver/.cache/pip/wheels/7a/d2/96/2977fbb58cc1d62be4c4a49be204f977728bd30797e5396105/humanize-0.5.1-py3-none-any.whl
Requirement already satisfied: pygame==1.9.6 in /usr/lib/python3/dist-packages (from -r requirements.txt (line 10)) (1.9.6)
Collecting youtube_dl==2019.7.30
Using cached youtube_dl-2019.7.30-py2.py3-none-any.whl (1.8 MB)
Collecting Flask==0.12.2
Using cached Flask-0.12.2-py2.py3-none-any.whl (83 kB)
Collecting pytube==9.5.1
Using cached pytube-9.5.1-py3-none-any.whl (30 kB)
Collecting PyQt5==5.13.0
Using cached PyQt5-5.13.0-5.13.0-cp35.cp36.cp37.cp38-abi3-manylinux1_x86_64.whl (62.1 MB)
Requirement already satisfied: beautifulsoup4==4.8.0 in /home/oliver/.local/lib/python3.8/site-packages (from -r requirements.txt (line 15)) (4.8.0)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/lib/python3/dist-packages (from requests==2.21.0->-r requirements.txt (line 6)) (3.0.4)
Requirement already satisfied: idna<2.9,>=2.5 in /usr/lib/python3/dist-packages (from requests==2.21.0->-r requirements.txt (line 6)) (2.8)
Requirement already satisfied: certifi>=2017.4.17 in /usr/lib/python3/dist-packages (from requests==2.21.0->-r requirements.txt (line 6)) (2019.11.28)
Requirement already satisfied: urllib3<1.25,>=1.21.1 in /home/oliver/.local/lib/python3.8/site-packages (from requests==2.21.0->-r requirements.txt (line 6)) (1.24.3)
Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (from moviepy==<IP_ADDRESS>->-r requirements.txt (line 7)) (1.17.4)
Requirement already satisfied: tqdm<5.0,>=4.11.2 in /home/oliver/.local/lib/python3.8/site-packages (from moviepy==<IP_ADDRESS>->-r requirements.txt (line 7)) (4.48.0)
Collecting decorator<5.0,>=4.0.2
Using cached decorator-4.4.2-py2.py3-none-any.whl (9.2 kB)
Requirement already satisfied: pillow in /usr/lib/python3/dist-packages (from imageio==2.3.0->-r requirements.txt (line 8)) (7.0.0)
Collecting Werkzeug>=0.7
Using cached Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting itsdangerous>=0.21
Using cached itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Jinja2>=2.4
Using cached Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
Requirement already satisfied: click>=2.0 in /usr/lib/python3/dist-packages (from Flask==0.12.2->-r requirements.txt (line 12)) (7.0)
Requirement already satisfied: PyQt5_sip<13,>=4.19.14 in /home/oliver/.local/lib/python3.8/site-packages (from PyQt5==5.13.0->-r requirements.txt (line 14)) (12.8.0)
Requirement already satisfied: soupsieve>=1.2 in /home/oliver/.local/lib/python3.8/site-packages (from beautifulsoup4==4.8.0->-r requirements.txt (line 15)) (2.0.1)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/lib/python3/dist-packages (from Jinja2>=2.4->Flask==0.12.2->-r requirements.txt (line 12)) (1.1.0)
Building wheels for collected packages: lxml
Building wheel for lxml (setup.py) ... error
ERROR: Command errored out with exit status 1:
command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-_t15n02u/lxml/setup.py'"'"'; file='"'"'/tmp/pip-install-_t15n02u/lxml/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-tqauqvxf
cwd: /tmp/pip-install-_t15n02u/lxml/
Complete output (96 lines):
Building lxml version 4.3.3.
Building without Cython.
ERROR: b'/bin/sh: 1: xslt-config: not found\n'
** make sure the development packages of libxml2 and libxslt are installed **
Using build configuration of libxslt
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.8
creating build/lib.linux-x86_64-3.8/lxml
copying src/lxml/builder.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/pyclasslookup.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/cssselect.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/init.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/doctestcompare.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/sax.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/ElementInclude.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/usedoctest.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/_elementpath.py -> build/lib.linux-x86_64-3.8/lxml
creating build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/init.py -> build/lib.linux-x86_64-3.8/lxml/includes
creating build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/ElementSoup.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/builder.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_setmixin.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/init.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/html5parser.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/clean.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_diffcommand.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/usedoctest.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/defs.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/formfill.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/soupparser.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_html5builder.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/diff.py -> build/lib.linux-x86_64-3.8/lxml/html
creating build/lib.linux-x86_64-3.8/lxml/isoschematron
copying src/lxml/isoschematron/init.py -> build/lib.linux-x86_64-3.8/lxml/isoschematron
copying src/lxml/etree.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/etree_api.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/lxml.etree.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/lxml.etree_api.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/includes/config.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/c14n.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/relaxng.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlparser.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/tree.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/schematron.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/etreepublic.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/dtdvalid.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xpath.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlschema.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/uri.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xslt.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xinclude.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlerror.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/init.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/htmlparser.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/etree_defs.h -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/lxml-version.h -> build/lib.linux-x86_64-3.8/lxml/includes
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/rng
copying src/lxml/isoschematron/resources/rng/iso-schematron.rng -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/rng
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
copying src/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
copying src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
running build_ext
building 'lxml.etree' extension
creating build/temp.linux-x86_64-3.8
creating build/temp.linux-x86_64-3.8/src
creating build/temp.linux-x86_64-3.8/src/lxml
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DCYTHON_CLINE_IN_TRACEBACK=0 -Isrc -Isrc/lxml/includes -I/usr/include/python3.8 -c src/lxml/etree.c -o build/temp.linux-x86_64-3.8/src/lxml/etree.o -w
In file included from src/lxml/etree.c:687:
src/lxml/includes/etree_defs.h:14:10: fatal error: libxml/xmlversion.h: No such file or directory
14 | #include "libxml/xmlversion.h"
|          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Compile failed: command 'x86_64-linux-gnu-gcc' failed with exit status 1
creating tmp
cc -I/usr/include/libxml2 -c /tmp/xmlXPathInitk21wlr20.c -o tmp/xmlXPathInitk21wlr20.o
/tmp/xmlXPathInitk21wlr20.c:1:10: fatal error: libxml/xpath.h: No such file or directory
1 | #include "libxml/xpath.h"
|          ^~~~~~~~~~~~~~~~
compilation terminated.

Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?

error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
ERROR: Failed building wheel for lxml
Running setup.py clean for lxml
Failed to build lxml
ERROR: spotdl 2.2.2 has requirement mutagen>=1.41.1, but you'll have mutagen 1.41.0 which is incompatible.
ERROR: spotdl 2.2.2 has requirement spotipy>=2.12.0, but you'll have spotipy 2.4.4 which is incompatible.
ERROR: pyqtwebengine 5.15.0 has requirement PyQt5>=5.15, but you'll have pyqt5 5.13.0 which is incompatible.
Installing collected packages: lxml, mutagen, decorator, imageio, moviepy, humanize, youtube-dl, Werkzeug, itsdangerous, Jinja2, Flask, pytube, PyQt5
Running setup.py install for lxml ... error
ERROR: Command errored out with exit status 1:
command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-_t15n02u/lxml/setup.py'"'"'; file='"'"'/tmp/pip-install-_t15n02u/lxml/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-a6mnx8s9/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/oliver/.local/include/python3.8/lxml
cwd: /tmp/pip-install-_t15n02u/lxml/
Complete output (95 lines):
Building lxml version 4.3.3.
Building without Cython.
ERROR: b'/bin/sh: 1: xslt-config: not found\n'
** make sure the development packages of libxml2 and libxslt are installed **
Using build configuration of libxslt
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.8
creating build/lib.linux-x86_64-3.8/lxml
copying src/lxml/builder.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/pyclasslookup.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/cssselect.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/__init__.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/doctestcompare.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/sax.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/ElementInclude.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/usedoctest.py -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/_elementpath.py -> build/lib.linux-x86_64-3.8/lxml
creating build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/__init__.py -> build/lib.linux-x86_64-3.8/lxml/includes
creating build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/ElementSoup.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/builder.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_setmixin.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/__init__.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/html5parser.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/clean.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_diffcommand.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/usedoctest.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/defs.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/formfill.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/soupparser.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/_html5builder.py -> build/lib.linux-x86_64-3.8/lxml/html
copying src/lxml/html/diff.py -> build/lib.linux-x86_64-3.8/lxml/html
creating build/lib.linux-x86_64-3.8/lxml/isoschematron
copying src/lxml/isoschematron/__init__.py -> build/lib.linux-x86_64-3.8/lxml/isoschematron
copying src/lxml/etree.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/etree_api.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/lxml.etree.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/lxml.etree_api.h -> build/lib.linux-x86_64-3.8/lxml
copying src/lxml/includes/config.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/c14n.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/relaxng.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlparser.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/tree.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/schematron.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/etreepublic.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/dtdvalid.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xpath.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlschema.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/uri.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xslt.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xinclude.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/xmlerror.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/__init__.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/htmlparser.pxd -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/etree_defs.h -> build/lib.linux-x86_64-3.8/lxml/includes
copying src/lxml/includes/lxml-version.h -> build/lib.linux-x86_64-3.8/lxml/includes
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/rng
copying src/lxml/isoschematron/resources/rng/iso-schematron.rng -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/rng
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
copying src/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
copying src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl
creating build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
copying src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt -> build/lib.linux-x86_64-3.8/lxml/isoschematron/resources/xsl/iso-schematron-xslt1
running build_ext
building 'lxml.etree' extension
creating build/temp.linux-x86_64-3.8
creating build/temp.linux-x86_64-3.8/src
creating build/temp.linux-x86_64-3.8/src/lxml
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DCYTHON_CLINE_IN_TRACEBACK=0 -Isrc -Isrc/lxml/includes -I/usr/include/python3.8 -c src/lxml/etree.c -o build/temp.linux-x86_64-3.8/src/lxml/etree.o -w
In file included from src/lxml/etree.c:687:
src/lxml/includes/etree_defs.h:14:10: fatal error: libxml/xmlversion.h: No such file or directory
   14 | #include "libxml/xmlversion.h"
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Compile failed: command 'x86_64-linux-gnu-gcc' failed with exit status 1
cc -I/usr/include/libxml2 -c /tmp/xmlXPathInitfsq9zia7.c -o tmp/xmlXPathInitfsq9zia7.o
/tmp/xmlXPathInitfsq9zia7.c:1:10: fatal error: libxml/xpath.h: No such file or directory
    1 | #include "libxml/xpath.h"
      |          ^~~~~~~~~~~~~~~~
compilation terminated.
*********************************************************************************
Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
*********************************************************************************
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------

ERROR: Command errored out with exit status 1: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-_t15n02u/lxml/setup.py'"'"'; file='"'"'/tmp/pip-install-_t15n02u/lxml/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-a6mnx8s9/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/oliver/.local/include/python3.8/lxml Check the logs for full command output.

What OS are you using?

Ubuntu 20.04

Install virtualenv
then do
virtualenv -p python3.6 venv
source venv/bin/activate

And then do the installation instructions

I got the exact same issues, tried the above steps then tried to do the same on venv.
now pip says there's a requirement conflict:
root@kali:/home/kali/CSC/smd# source venv/bin/activate
(venv) root@kali:/home/kali/CSC/smd# pip3 install -r requirements.txt
Collecting beautifulsoup4==4.8.0
  Using cached beautifulsoup4-4.8.0-py3-none-any.whl (97 kB)
Collecting Flask==0.12.2
  Using cached Flask-0.12.2-py2.py3-none-any.whl (83 kB)
Collecting humanize==0.5.1
  Using cached humanize-0.5.1-py3-none-any.whl
Collecting imageio==2.3.0
  Using cached imageio-2.3.0-py2.py3-none-any.whl (3.3 MB)
Collecting lxml==4.3.3
  Using cached lxml-4.3.3.tar.gz (4.4 MB)
Collecting lyricsgenius==1.4.0
  Using cached lyricsgenius-1.4.0-py3-none-any.whl (13 kB)
INFO: pip is looking at multiple versions of lxml to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of imageio to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of humanize to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of flask to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of beautifulsoup4 to determine which version is compatible with other requirements. This could take a while.
ERROR: Cannot install -r requirements.txt (line 3) and beautifulsoup4==4.8.0 because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested beautifulsoup4==4.8.0
    lyricsgenius 1.4.0 depends on beautifulsoup4==4.6.0

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies
WARNING: You are using pip version 20.3.1; however, version 20.3.3 is available.
You should consider upgrading via the '/home/kali/CSC/smd/venv/bin/python -m pip install --upgrade pip' command.

I got the exact same issues, tried the above steps then tried to do the same on venv.
now pip says there's a requirement conflict:
root@kali:/home/kali/CSC/smd# source venv/bin/activate
(venv) root@kali:/home/kali/CSC/smd# pip3 install -r requirements.txt
Collecting beautifulsoup4==4.8.0
  Using cached beautifulsoup4-4.8.0-py3-none-any.whl (97 kB)
Collecting Flask==0.12.2
  Using cached Flask-0.12.2-py2.py3-none-any.whl (83 kB)
Collecting humanize==0.5.1
  Using cached humanize-0.5.1-py3-none-any.whl
Collecting imageio==2.3.0
  Using cached imageio-2.3.0-py2.py3-none-any.whl (3.3 MB)
Collecting lxml==4.3.3
  Using cached lxml-4.3.3.tar.gz (4.4 MB)
Collecting lyricsgenius==1.4.0
  Using cached lyricsgenius-1.4.0-py3-none-any.whl (13 kB)
INFO: pip is looking at multiple versions of lxml to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of imageio to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of humanize to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of flask to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of beautifulsoup4 to determine which version is compatible with other requirements. This could take a while.
ERROR: Cannot install -r requirements.txt (line 3) and beautifulsoup4==4.8.0 because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested beautifulsoup4==4.8.0
    lyricsgenius 1.4.0 depends on beautifulsoup4==4.6.0

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies
WARNING: You are using pip version 20.3.1; however, version 20.3.3 is available.
You should consider upgrading via the '/home/kali/CSC/smd/venv/bin/python -m pip install --upgrade pip' command.

I fixed the issue i had to install these packages
sudo apt-get install libxml2-dev
sudo apt-get install libxslt-dev
sudo apt-get install python3-pygame
sudo apt-get install python3-lxml

I fixed the issue i had to install these packages
sudo apt-get install libxml2-dev
sudo apt-get install libxslt-dev
sudo apt-get install python3-pygame
sudo apt-get install python3-lxml

but new problem occured when running ./main.py
Traceback (most recent call last):   File "./main.py", line 3, in <module>     from youtube import Youtube   File "/home/hunter_killer024/smd/youtube.py", line 16, in <module>     from moviepy.editor import *   File "/home/hunter_killer024/.local/lib/python3.8/site-packages/moviepy/editor.py", line 26, in <module>     imageio.plugins.ffmpeg.download()   File "/home/hunter_killer024/.local/lib/python3.8/site-packages/imageio/plugins/ffmpeg.py", line 71, in download     get_remote_file(fname=fname,   File "/home/hunter_killer024/.local/lib/python3.8/site-packages/imageio/core/fetching.py", line 127, in get_remote_file     _fetch_file(url, filename)   File "/home/hunter_killer024/.local/lib/python3.8/site-packages/imageio/core/fetching.py", line 181, in _fetch_file     raise IOError('Unable to download %r. Perhaps there is a no internet ' OSError: Unable to download 'ffmpeg-linux64-v3.3.1'. Perhaps there is a no internet connection? If there is, please report this problem.

but new problem occured when running ./main.py
Traceback (most recent call last):   File "./main.py", line 3, in <module>     from youtube import Youtube   File "/home/hunter_killer024/smd/youtube.py", line 16, in <module>     from moviepy.editor import *   File "/home/hunter_killer024/.local/lib/python3.8/site-packages/moviepy/editor.py", line 26, in <module>     imageio.plugins.ffmpeg.download()   File "/home/hunter_killer024/.local/lib/python3.8/site-packages/imageio/plugins/ffmpeg.py", line 71, in download     get_remote_file(fname=fname,   File "/home/hunter_killer024/.local/lib/python3.8/site-packages/imageio/core/fetching.py", line 127, in get_remote_file     _fetch_file(url, filename)   File "/home/hunter_killer024/.local/lib/python3.8/site-packages/imageio/core/fetching.py", line 181, in _fetch_file     raise IOError('Unable to download %r. Perhaps there is a no internet ' OSError: Unable to download 'ffmpeg-linux64-v3.3.1'. Perhaps there is a no internet connection? If there is, please report this problem.


Implement documents with multiple files

Add title to files
upadte docs

Codecov Report

Merging #51 into develop will increase coverage by 1.01%.
The diff coverage is 98%.

@@             Coverage Diff             @@
##           develop      #51      +/-   ##
===========================================
+ Coverage    95.59%   96.61%   +1.01%
===========================================
  Files           21       21
  Lines          409      472      +63
===========================================
+ Hits           391      456      +65
+ Misses          18       16       -2

Impacted Files
Coverage Δ

src/routes/azureRoutes.js
100% <ø> (ø)
:arrow_up:

src/config.js
100% <ø> (ø)
:arrow_up:

src/HealthCloud.js
100% <100%> (ø)
:arrow_up:

src/services/FhirService.js
100% <100%> (ø)
:arrow_up:

src/routes/documentRoutes.js
76.92% <100%> (ø)
:arrow_up:

src/services/DocumentService.js
97.56% <96.96%> (-2.44%)
:arrow_down:

src/services/ZeroKitAdapter.js
96.39% <0%> (+5.37%)
:arrow_up:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 2c7b69c...fefc63e. Read the comment docs.


#743

done

wrong implementation. The card should be placed before the workshop-details and workshop images, right under the header


fix EXACT synonyms for some BS terms [sf#120]

Reported by batchelorc on 2008-09-11 13:34 UTC
"motif", "domain", "variant" and "signal" are EXACT for some BS terms when they should be BROAD.
Colin.

Updated by batchelorc on 2008-09-11 15:21 UTC

status: open --> closed


Receiving AttributeError: 'Tensor' object has no attribute 'numpy' in keras backend.

Okay, so... I'm trying to implement a custom loss function in tf-keras.
My tf version is 1.13.1, my keras version is 2.2.4, my OS is Linux Mint Ubuntu 16.04, and my python version is Anaconda Python 3.6.8
Basically, this loss function is a Keras dense siamese neural network that I'm trying to get to learn a loss between y_true and y_pred. However I receive the above error every time the model above this loss func. compiles. The input_shape param is (1, 1920), and the code is as follows:
Siamese Net Code:
class SiameseNetwork:
    def __init__(self, input_shape):
        self.input_shape = input_shape
        self.true_input = (1,) + input_shape

        self.base_net = self.build_base()
        self.input_one = Input(shape=self.input_shape)
        self.input_two = Input(shape=self.input_shape)

        self.processed_one = self.base_net(self.input_one)
        self.processed_two = self.base_net(self.input_two)

        self.distance = Lambda(self.euclidean_distance)([self.processed_one, self.processed_two])
        self.together = Dense(1, activation=self.reverse_sigmoid)(self.distance)

        self.siamese_net = Model([self.input_one, self.input_two], self.together)
        self.siamese_net.summary()

        loss = self.contrastive_meta_loss
        optimizer = RMSprop()

        self.siamese_net.compile(loss=loss, optimizer=optimizer)

        self.loss = 1.0

        self.random_input = np.random.random_sample(self.true_input)

        print("Random input shape", self.random_input.shape)

        self.y_pred = self.random_input
        self.y_true = self.random_input

        print('debugging: y_true shape:',   self.y_true.shape)

    def reverse_sigmoid(self, x):
        return K.sigmoid(-x)

    def contrastive_meta_loss(self, y_true, y_pred):
        margin = 1

        square_pred = K.square(y_pred)
        margin_square = K.square(K.maximum(margin - y_pred, 0))
        return K.mean(y_true * square_pred + (1 - y_true) * margin_square)

    def build_base(self):
        inputs = Input(shape=self.input_shape)
        x = Flatten()(inputs)
        x = tf.layers.Dense(1024, activation='relu')(x)
        x = tf.layers.Dropout(.1)(x)
        x = tf.layers.Dense(1024, activation='relu')(x)
        x = tf.layers.Dropout(.1)(x)
        x = tf.layers.Dense(1024, activation='relu')(x)
        model = Model(inputs, x)
        print("Debugging: 110XA25B:")
        model.summary()
        return model

    def euclidean_distance(self, vects):
        x, y = vects
        sum_sq = K.sum(K.square(x - y), axis = 1, keepdims=True)
        return K.sqrt(K.maximum(sum_sq, K.epsilon()))

    def siamese_loss(self, fake_y_true, fake_y_pred):

        print("Debugging: 110XA1SS:", self.y_true.shape, self.y_pred.shape)

        self.loss = self.siamese_net.predict([self.y_true, self.y_pred])

        self.siamese_net.fit(x=[y_true, y_pred], y=self.loss, epochs=1, verbose=0)
        return self.loss

Error + Traceback:
Traceback (most recent call last):
  File "run_mouse_rewards.py", line 109, in <module>
    run()
  File "run_mouse_rewards.py", line 45, in run
    dqn.initialize()
  File "/home/ai/Downloads/ScreenMouse/Organized/ba2c.py", line 232, in initialize
    self.actor.compile(loss=self.actor_loss, optimizer = self.optimizer)
  File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/training/checkpointable/base.py", line 442, in _method_wrapper
    method(self, *args, **kwargs)
  File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 449, in compile
    output_loss = weighted_loss(y_true, y_pred, sample_weight, mask)
  File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py", line 647, in weighted
    score_array = fn(y_true, y_pred)
  File "/home/ai/Downloads/ScreenMouse/Organized/ba2c.py", line 87, in siamese_loss
    self.loss = self.siamese_net.predict([self.y_true, self.y_pred])
  File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1113, in predict
    self, x, batch_size=batch_size, verbose=verbose, steps=steps)
  File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_arrays.py", line 329, in model_iteration
    batch_outs = f(ins_batch)
  File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3168, in __call__
    [x.numpy() for x in outputs])
  File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3168, in <listcomp>
    [x.numpy() for x in outputs])
AttributeError: 'Tensor' object has no attribute 'numpy'

@ZeroMaxinumXZ Please provide a standalone code to reproduce the issue. Thanks!

@jvishnuvardhan, I fixed this issue by adding a tensorflow Session, and using the backend. Closing this.


Styling for legal sections

Styling for legal pages:

https://careers.audemarspiguet.com/en/privacy-policy
https://careers.audemarspiguet.com/en/terms-of-use
https://careers.audemarspiguet.com/en/cookie-policy
https://careers.audemarspiguet.com/en/accessibility

These sections have a template metadata set to legal in franklin to help with styling.

Header for legal sections was styled in #4


Final release 1.1

/lgtm

@utka: The following test failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

prow/release-e2e-pilot-no_auth
3565c3a35231f5524dfcae0e45f1593f00dbddc6
link
/test release-e2e-pilot-no_auth

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@utka: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

prow/release-e2e-pilot-no_auth
3565c3a35231f5524dfcae0e45f1593f00dbddc6
link
/test release-e2e-pilot-no_auth

prow/release-e2e-stackdriver
3565c3a35231f5524dfcae0e45f1593f00dbddc6
link
/test release-e2e-stackdriver

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

/test release-e2e-pilot-no_auth


A mildly simple approach at introducing the 'combined diff format'

This adds in a new diff format parser based on the combined diff format:
https://git-scm.com/docs/git-diff
Git generates this when you perform a 'git diff --cc' or 'git diff -c' invocation.  It shows the differences when the file had more than 1 parent.  Without this fix, such differences are ignored.
This is to help support fixing issue 1028 in GitLeaks.  GitLeaks will also need to add the '--cc' argument, as mentioned by that issue.
There are a few limitations with this.  A big one is in the file header termination detection.  For now, it only scans for the 1-parent style ('@@ -') and the 2-parent style ('@@@ -').  The combined diff format allows for having many more than just 2 parents, so this will skip those cases.  I've updated the README to note about this limitation.
This includes some unit test coverage.  It's not exhaustive, but it does lend some credibility to the code.

@groboclown thanks for this PR, is it in draft or is this ready for a review?

I finally gave this the attention it needs.  I found the bug - it's the parsing of multiple empty commits; I have a test case for it.  I'm looking into where the parser gets it wrong now.

This latest commit includes the handler for the empty commits.  The test still fails due to some minor issue with the expected data, but the answer eludes me at the moment - a simple text diff of the output shows no differences.  I'll need to look at this in more detail, or someone with sharper eyes may give it a go.


feat(go/adbc/pkg): catch panics at interface boundary

Fixes #718.

cc @zeroshade for first opinions
For testing, I plan to create a dummy Go driver that just panics, and then exercise it from Python (though without a way to 'reset' the driver we'll have to see what we can do there)

Hmm, atomic.Bool is go 1.19

@lidavidm Personally I'm fine with ADBC being go1.19+ (N-1 versions of Go would be go1.19 + go1.20) if you want to use the atomic.Bool


Adding allegro hands (left and right)

Python api: example-robot-data.load("allegro_right_hand" or "allegro_left_hand") .

Hi ! This project doesn't usually accept pull requests on the main branch.
If this wasn't intentionnal, you can change the base branch of this PR to devel
(No need to close it for that). Best, a bot.

Btw the allegro hand looks like:


Change type ident by feature

What problem does this solve or what need does it fill?
Get from dynamic plugin resource/components from another dynamic plugin
What solution would you like?
Change TypeId to UniTypeId
enum UniTypeId {
    TypeId(TypeId),
    TypeName(u128)
}

And if feature "type_name" on, UniTypeId generated from TypeName and if off it generated from TypeId

I looked at #32 and realized that maybe I could do something like this instead of the first sentence:
struct BevyTypeId(u128);

trait BevyAny {
// ...
}

According to the standard, this will be a wrapper over TypeId and Any. But in the future it will be possible to change this, for example to https://github.com/BERADQ/stable-typeid, or make the TypeId change according to the feature.
But I think you can immediately make a feature to change the standard TypeId to a more stable one. This would be appropriate because in order to change the TypeId and be sure that everything will be fine you need to test the new implementation well, which takes a lot of time.


Move to "level" org?

I'm a bottleneck and it's holding this project up and I know there are people here who could be pushing it forward if it weren't for me being both the figurehead that people feel they need to look to for permission and also the one with the ability to npm publish.
Is it time we moved this to github/level an put everyone who's a collaborator here on the Owners team there? It would also mean moving leveldown and abstract-leveldown, possibly also lmdb--it's not so core but it could do with some of the love that comes from shared ownership. There's some other modules that I could transfer if others think it's a good idea, for instance I recently handed over publish responsibility for level-ttl to @ralphtheninja and it's in wide use.
Thoughts from collaborators?

Admirable move @rvagg. You have been a hell of a leader in getting this community together and grow as much as it did. I think its quite fitting to make the next step if you truly feel you are holding it back. I know its tough when you are juggling ALL THE THINGS. I'm :+1: on this.

@rvagg You will always be my hero! :)
:+1: Moving stuff to Level organization and having more publishers is a good move.

Also :+1:
The fact you have the option to give it to the community is vindication of OPEN open source.
Choosing to do so is yet another example of how well you have led our little soirée

Thanks

:+1:

Yes, I agree this is a wise and noble move. The level culture has been well established, and everyone understands how to make decisions by consensus. I don't think it would have worked out as well as it has without your guidance @rvagg and I for one have learnt a lot about collaboration by being involved in level. Excited to see this enter the next phase!

:+1: Rod Vagg you are the levelup community biological dad. v nice.

:+1: I agree too! Thank so much @rvagg for creating this awesome community, and for proving that OPEN Open Source can actually work :). I am not active myself, and my last contributions are in the leveldown side: @rvagg is the one that said to me "we need more maintainers for the C++ part, you should learn it". So I did, thanks @rvagg :).

:+1: I couldn't agree more with what Dominic said!

@rvagg When can you start moving the repositories?

+1

@Level/owners I've moved this repo as well as abstract-leveldown and node-leveldown to the level org. While I was at it I also transferred memdown and level-ttl which are effectively maintained by others at the moment as well.
I've added @ralphtheninja to npm so he can publish things and not have me hold things up. I'm not necessarily proposing that he be the release master for all of these packages but he's currently very active here and has obvious concern for these projects so he's a good interm hand-off at least and we can get more organised later on.
I'm sorry to have been such a bottleneck recently, it's not that I've lost interest in this ecosystem and its projects it's that that (a) I'm busy with work and (b) io.js is sucking up all of the remaining time I have and I view that project as vital for the future health of the entire Node ecosystem so it's worth a bit of focus at least for the short term and apparently I have something to add there for now. Perhaps that'll change as things settle down in some form. The node/io.js reconciliation looks to be coming together and if that occurs then the organisational structure will change and the type of activity will too and I don't know where my slot will be there.
Feel free to pull me into GitHub discussions but I'm also trying to control the torrent of GitHub notifications and if you don't hear from me then a direct email or Twitter DM may be a better bet!

:beers:

:dancer: thanks rod :)


Could someone explain min_distance, min_prominence, and n_quantized?

I don't see any documentation explaining these things but see them as options when I look at the extrac_colors function in the code. I see that the colors extracted are changing when I set these options, but I have no idea what I'm doing with them or why the colors are changing.
Thanks.

These have to do with the specifics of how colorific determines the palette. Here's the steps involved and how the knobs help tune things.
1. Mass color reduction
Colorific reduces the image firstly from it's full spectrum of colors to just n_quantized (100 by default), as a kind of optimization step. To be honest, image processing is normally done in C not Python, so this step is about making the later, more interesting stuff fast enough.
Increase n_quantized to get a slower but more accurate result.
Decrease n_quantized to get a faster, less accurate palette. The result becomes less accurate because minor colors become averaged and blended in to the major colors you want to keep.
Step 2: collapse similar colors together
After step one we may have 100 colors left. Many of those "different" colors are actually the same to the human eye. Color distances are measured in units of ∆E, and according to Wikipedia: Color difference "the same" means ∆E < 2.3. We go beyond that and say by default that ∆E <= min_distance (default: 10) is more or less the same color, and merge them together.
So min_distance tunes this sameness test. Make it smaller to allow colors which are more alike. Make it larger to avoid noisy palettes with multiple copies of nearly-the-same color.
Step 3: how many colors to keep?
max_colors is clear, and defaults to 5. So, keep up to 5 colors. But we could return less. A pure red image should only return one color. How many colors are worth keeping?
We keep colors that are within min_prominence of the frequency of the major color. So if the most prominent color is 50% of the image, and min_prominence is 0.01, we'll keep the first 5 colors that are at least 50% * 0.01 = 0.5% of the image.
Decrease min_prominence to fill out your palette more often with more minor colors, which can include more noise.
Increase min_prominence to get fewer, more prominent colors in each palette.
Hope all that helps!

Thank you. That makes a lot more sense now! So, is there any threshold for how high you should make these numbers? For example, in my testing for the last hour or so, I've found that this gives me about as accurate of results as I can get (seemingly):
extract_colors(image, max_colors=5, min_distance=15, min_prominence=.05, n_quantized=200)

I did fine that if I went above 200 for the n_quantized value, that some images would error out on me. Keeping it 200 or below seems to work 100% of the time.
So, are there limits to how high the numbers should go? I assume there probably isn't except for the fact that setting higher numbers typically would just return less colors which kind of defeats the purpose of extracting colors from an image.

The algorithm for quantizing colors might use an 8-bit integer in its calculations. It's total speculation, but I'm guessing the algorithm is there for GIF image support, and GIFs use 8-bit per pixel. Then the max for n_quantized would end up being 256.
min_prominence would max out at 1.0, which should result in only the most prominent color being returned each time
min_distance would max out at whatever the largest ∆E is between the farthest two colors. Even before then, it would start collapsing increasingly different colors together as it gets bigger, only showing one of them. For example only showing either a light blue or a dark blue, when in fact both colors were important and complementary parts of the palette.
The kind of manual tuning you're doing is basically what we did to come up with our thresholds. There's no special magic behind them, they're just what seemed to work best on our library of graphic designs.

Great. Thanks so much for taking the time to reply and help out!


Add anyComponentScript to budgets in angular.json

🚀 feature request
Relevant Package
Maybe cli but I am not sure which package handles the budget feature.
Description
Budget feature is cool but it is not possible to limit the component sizes since using bundle type vendor and anyScript together will always test vendor with anyScript and therefore setting anyScript low will always print an error for vendor.
              "budgets": [
                {
                  "type": "bundle",
                  "name": "main",
                  "maximumWarning": "10kb",
                  "maximumError": "15kb"
                },
                {
                  "type": "bundle",
                  "name": "polyfills",
                  "maximumWarning": "40kb",
                  "maximumError": "70kb"
                },
                {
                  "type": "bundle",
                  "name": "styles",
                  "maximumWarning": "50kb",
                  "maximumError": "100kb"
                },
                {
                  "type": "bundle",
                  "name": "vendor",
                  "baseline": "400kb",
                  "maximumWarning": "100kb",
                  "maximumError": "150kb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumError": "6kb"
                },
                {
                  "type": "anyScript",
                  "maximumWarning": "100kb",
                  "maximumError": "150kb"
                }
              ]

Result:
chunk {} runtime.e772bc65b2af9e99c1ee.js (runtime) 2.49 kB [entry] [rendered]
chunk {1} 1.a5fc9c20980d9951ff60.js () 91.9 kB  [rendered]
chunk {2} common.1ee965b4d2876b815594.js (common) 1.5 kB  [rendered]
chunk {3} 3.a6a9f949f3dd098ae3b6.js () 22.2 kB  [rendered]
chunk {4} 4.c6567bebe63581a306d3.js () 79.2 kB  [rendered]
chunk {5} 5.d3dad6f41426fcca8afc.js () 47.7 kB  [rendered]
chunk {6} main.5696fb0a7e865f60a76a.js (main) 5.35 kB [initial] [rendered]
chunk {7} polyfills.f546300ad6c2ec9ddb69.js (polyfills) 36.1 kB [initial] [rendered]
chunk {8} styles.57c4e806b9d984501a87.css (styles) 11.3 kB [initial] [rendered]
chunk {9} vendor.b38628b2815959eb1e83.js (vendor) 399 kB [initial] [rendered]
chunk {10} 10.afc77e53d9411a9d1a8d.js () 16.3 kB  [rendered]
chunk {11} 11.1b5b29fed06c656fbb29.js () 49.5 kB  [rendered]
chunk {12} 12.03df42d75cd1b7840830.js () 4.51 kB  [rendered]
chunk {13} 13.6372db319c894cfe1771.js () 80.9 kB  [rendered]
chunk {14} 14.5385f2b39faf73e68e6c.js () 1.14 kB  [rendered]
chunk {15} 15.93ef0e98cf22f6d95c4d.js () 2 kB  [rendered]
Date: 2020-07-01T08:49:04.006Z - Hash: f5e4fc3e03db926ce6b4 - Time: 27694ms

WARNING in budgets: Exceeded maximum budget for vendor.b38628b2815959eb1e83.js. Budget 100 kB was not met by 299 kB with a total of 399 kB.

ERROR in budgets: Exceeded maximum budget for vendor.b38628b2815959eb1e83.js. Budget 150 kB was not met by 249 kB with a total of 399 kB.

Describe the solution you'd like
 If you have a solution in mind, please describe it.
A new bundle type name anyComponentScript.
Describe alternatives you've considered
 Have you considered any alternative solutions or workarounds?
Maybe an excluding path prop for a budget, e.g. exclude: "{vendor,main}.*"

Hi @muuvmuuv, the reasons for this request are very similar to https://github.com/angular/angular-cli/issues/11521
Adding a new budget for component scripts is rather tricky, because it's very unlikely that a script will contain only a single component.

Ah yes, you are right but somehow it should be possible to only "budget" the scripts that are not bundles or anything else. I mean those with numbers especially. Maybe anyScript could only check those or if any other budget already points to a script exclude it from anyScript.

I think we should consider this in the future, if this is something that the community wants and desires. At the moment though this is not part of the CLI roadmap especially considering the little traction the original issue (#11521) for super seeding budgets got.
Budgets are already rather confusing to configure, so adding more options or types will probably make this feature more hard to use. Thus, probably before adding more options this require some re-design.

Hi, thanks for this feature request.
However, currently this doesn't fall within the Angular CLI roadmap.
Thanks.


Add registerSounds method declaration

SoundJS 0.6 provides a new method called registerSounds to replace the now-deprecated registerManifest method.

@jsaelhof thanks mate!

note
https://github.com/CreateJS/SoundJS/blob/9a2ebdeb73e562ae63837deadd64ca9713ef841c/src/soundjs/Sound.js#L989


When using custom parameters root config page is available but all other config pages are blank.

I am willing to contribute. I just need to know where to add the custom parameters. In your documentation you don't say where to add them. I tried to add them in the same place as your example (loop, after the instantiation of ESPAsync_wifiManager), however the web page /wifi becomes blank after adding the custom parameter via copy paste exactly as it is in the example file.
So, if you will elaborate I will amend the documentation and pull request. I will also amend any other parts that were difficult for me to figure out and make it clear in the documentation where to add and why.
```

//
// START WEB SERVER LOOP
//
// is configuration portal requested?
if ((digitalRead(TRIGGER_PIN) == LOW))
{
Serial.println("\nConfiguration portal requested.");
digitalWrite(LED_BUILTIN, LED_ON); // turn the LED on by making the voltage LOW to tell us we are in configuration mode.
    //Local intialization. Once its business is done, there is no need to keep it around
    ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, "AsyncCP-ParamsOnSW");

    char customhtml[24] = "type=\"checkbox\""; //<--This is where I copied from
    bool sensorDht22 = true;
    if (sensorDht22)
    {
        strcat(customhtml, " checked");
    }
    ESPAsync_WMParameter p_sensorDht22("DHT-22", "DHT-22 Sensor", "T", 2, customhtml, WFM_LABEL_AFTER);
    ESPAsync_wifiManager.addParameter(&p_sensorDht22); //<-- This is the end of the copy/paste

    //Check if there is stored WiFi router/password credentials.
    //If not found, device will remain in configuration mode until switched off via webserver.
    Serial.print("Opening configuration portal. ");

    Router_SSID = ESPAsync_wifiManager.WiFi_SSID();
    Router_Pass = ESPAsync_wifiManager.WiFi_Pass();

    // From v1.1.0, Don't permit NULL password
    if ( (Router_SSID != "") && (Router_Pass != "") )
    {
    ESPAsync_wifiManager.setConfigPortalTimeout(120); //If no access point name has been previously entered disable timeout.
    Serial.println("Got stored Credentials. Timeout 120s");
    }
    else
    Serial.println("No stored Credentials. No timeout");

    // Extra parameters to be configured
    // After connecting, parameter.getValue() will get you the configured value
    // Format: <ID> <Placeholder text> <default value> <length> <custom HTML>

    // Config Portal SSID - this is a straight forward string parameter
    ESPAsync_WMParameter p_PortalSSID(PortalSSID_Label, "Portal_SSID", PortalSSID, SSID_MAX_LENGTH + 1);

    // Config Portal SSID - this is a straight forward string parameter
    ESPAsync_WMParameter p_PortalPassword(PortalPassword_Label, "Portal_Password", PortalPassword, PASSWORD_MAX_LENGTH + 1);

    //add all parameters here
    ESPAsync_wifiManager.addParameter(&p_PortalSSID);
    ESPAsync_wifiManager.addParameter(&p_PortalPassword);

    // Sets timeout in seconds until configuration portal gets turned off.
    // If not specified device will remain in configuration mode until
    // switched off via webserver or device is restarted.
    //ESPAsync_wifiManager.setConfigPortalTimeout(120);

    ESPAsync_wifiManager.setMinimumSignalQuality(-1);

    // From v1.0.10 only
    // Set config portal channel, default = 1. Use 0 => random channel from 1-13
    ESPAsync_wifiManager.setConfigPortalChannel(0);
    //////

    //set custom ip for portal
    //ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192, 168, 100, 1), IPAddress(192, 168, 100, 1), IPAddress(255, 255, 255, 0));

#if !USE_DHCP_IP
#if USE_CONFIGURABLE_DNS
    // Set static IP, Gateway, Subnetmask, DNS1 and DNS2. New in v1.0.5
    ESPAsync_wifiManager.setSTAStaticIPConfig(stationIP, gatewayIP, netMask, dns1IP, dns2IP);
#else
    // Set static IP, Gateway, Subnetmask, Use auto DNS1 and DNS2.
    ESPAsync_wifiManager.setSTAStaticIPConfig(stationIP, gatewayIP, netMask);
#endif
#endif

// New from v1.1.0
#if USING_CORS_FEATURE
ESPAsync_wifiManager.setCORSHeader("Your Access-Control-Allow-Origin");
#endif

    // Start an access point and goes into a blocking loop awaiting configuration.
    // Once the user leaves the portal with the exit button
    // processing will continue

    static bool resultConfigPortal;
    if ( (PortalSSID[0] == 0) || (PortalPassword[0] == 0) )
    {
    resultConfigPortal = ESPAsync_wifiManager.startConfigPortal((const char *) DefaultPortalSSID.c_str(), DefaultPortalPassword.c_str());
    }
    else
    {
    resultConfigPortal = ESPAsync_wifiManager.startConfigPortal((const char *) PortalSSID, PortalPassword);
    }

    if (resultConfigPortal)
    {
    Serial.println("WiFi connected...yeey :)");
    Serial.print("Local IP: ");
    Serial.println(WiFi.localIP());
    }
    else
    Serial.println("Not connected to WiFi but continuing anyway.");

    // Only clear then save data if CP entered and with new valid Credentials
    // No CP => stored getSSID() = ""
    if ( String(ESPAsync_wifiManager.getSSID(0)) != "" && String(ESPAsync_wifiManager.getSSID(1)) != "" )
    {
    // Stored  for later usage, from v1.1.0, but clear first
    memset(&WM_config, 0, sizeof(WM_config));

    for (uint8_t i = 0; i < NUM_WIFI_CREDENTIALS; i++)
    {
        String tempSSID = ESPAsync_wifiManager.getSSID(i);
        String tempPW   = ESPAsync_wifiManager.getPW(i);

        if (strlen(tempSSID.c_str()) < sizeof(WM_config.WiFi_Creds[i].wifi_ssid) - 1)
        strcpy(WM_config.WiFi_Creds[i].wifi_ssid, tempSSID.c_str());
        else
        strncpy(WM_config.WiFi_Creds[i].wifi_ssid, tempSSID.c_str(), sizeof(WM_config.WiFi_Creds[i].wifi_ssid) - 1);

        if (strlen(tempPW.c_str()) < sizeof(WM_config.WiFi_Creds[i].wifi_pw) - 1)
        strcpy(WM_config.WiFi_Creds[i].wifi_pw, tempPW.c_str());
        else
        strncpy(WM_config.WiFi_Creds[i].wifi_pw, tempPW.c_str(), sizeof(WM_config.WiFi_Creds[i].wifi_pw) - 1);

        // Don't permit NULL SSID and password len < MIN_AP_PASSWORD_SIZE (8)
        if ( (String(WM_config.WiFi_Creds[i].wifi_ssid) != "") && (strlen(WM_config.WiFi_Creds[i].wifi_pw) >= MIN_AP_PASSWORD_SIZE) )
        {
        LOGERROR3(F("* Add SSID = "), WM_config.WiFi_Creds[i].wifi_ssid, F(", PW = "), WM_config.WiFi_Creds[i].wifi_pw );
        wifiMulti.addAP(WM_config.WiFi_Creds[i].wifi_ssid, WM_config.WiFi_Creds[i].wifi_pw);
        }
    }

    saveConfigData();
    }

    // Getting posted form values and overriding local variables parameters
    // Config file is written regardless the connection state
    strcpy(PortalSSID, p_PortalSSID.getValue());
    strcpy(PortalPassword, p_PortalPassword.getValue());

    // Writing JSON config file to flash for next boot
    writeConfigFile();

    digitalWrite(LED_BUILTIN, LED_OFF); // Turn LED off as we are not in configuration mode.
}
check_status();
//
// END WEB SERVER LOOP
//

When using the above code the root config page is available but all other pages are blank.

Where do the custom parameters need to be located in the loop to function properly?

This sounds much better and I'll have a look at that issue very soon when I have time as I'm currently working on something now. To be done within several days.
In the mean time, just explore some more the examples and post as much info as possible to save time for us to duplicate.
You'll benefit a good deal from that well-spent time.

Okay, thank you.
I also tried to use radio elements like this...
ESPAsync_WMParameter customField_C("<input name="tempMode" type="radio" id="celsius" value=1>Celsius");
ESPAsync_wifiManager.addParameter(&customField_C);

ESPAsync_WMParameter customField_F("<input name="tempMode" type="radio" id="fahrenheit" value=2>Fahrenheit");
ESPAsync_wifiManager.addParameter(&customField_F);

but this approach must be completely incorrect because the data in value=[1 or 2] is never stored in the FS key "tempMode".
I would like to add this radio button example to you documentation for pull once I get it working.
If you need help on your other project I can help.

I'm in final steps to test after finishing this to help a person on Arduino Forum. Only one more example to do.
TimerInterrupt for Arduino Nano 33 BLE
Do you have Nano-33-BLE to test?
If you're willing to participate, I'll coordinate with you to test new Libraries and Libraries' releases, to save me some time as I still have to do it mostly alone, sometimes with the help of Miguel Wisintainer, a Univ. Prof. in Brazil.
I believe you'll get a lot more experience thru that, and know a lot deeper details of many libraries. That'll very good to be used in the future.

No, I don't have that board. :(
I can order different boards for testing though. Yes, I'd like to help in any way I can.
I'm working on a way to iterate through all custom parameters added and save to file instead of having to add them in both writeConfig and readConfig functions like in your examples. Maybe core can be modified to array everything added with .addParameter and automatically save with a method like .saveParametersFS().
I'm very good at engineering improvements once I know how cores work.

The current way to add params is very clumsy, and I'll modify this ESPAsync_WiFiManager and ESP_WiFiManager very soon to use the solution similar to these libraries
Look at how I implemented dynamic params:

Blynk_WM
BlynkEthernet_WM
WiFiManager_NINA_Lite

Happy to see that you have engineering background. Me too but I'm retiree now.
and many more.

I'm done with and already posted new  NRF52_MBED_TimerInterrupt Library and on Arduino Forum as NRF52_MBED_TimerInterrupt Library for Nano-33-BLE
You're very welcome to test it whenever you have the Nano-33-BLE.
Will have a look at your issue late tomorrow.

Okay.
I like the way dynamic parameters work in those linked repos.
I just encountered a problem with adding option type inputs currently; They need the same name, but different IDs for label elements.
My solution is to implement .addParameter with the element ID value as an option, and it will default to the same value as element Name if unspecified. this way option elements work and keep the same name, with different IDs.
I'll pull request tomorrow when I get done amending ESPAsync_WiFiManager-Impl.h.

I don't think we'll make disruptive change to this library as many people are using and relying on it.
I'll create a new one to use the new and easy dynamic params configuration as you've seen. Already done that new lib halfway quite some time ago, then left it there to rust.
So don't make disruptive PR now to this lib, and wait for the new one to come.
Just concentrate on the documentation and bug for this lib and its twin ESP_WiFiManager now

Just invite you into Private Repo for later discussion about future projects, collaboration and tests.
Have a look at the first unfinished draft of  HOWTOAddDynamicParameters and modify as necessary.
Fresh outsiders always have better vision that insiders because of tunnel-vision.

The code you post at the beginning is running OK on all pages.


fix: improve stabilty of random failing tests

We're currently processing your upload.  This comment will be updated when the results are available.


Add collection assertions

Codecov Report
Base: 100.00% // Head: 100.00% // No change to project coverage :thumbsup:

Coverage data is based on head (a601a73) compared to base (e881e98).
Patch coverage: 100.00% of modified lines in pull request are covered.

Additional details and impacted files
@@             Coverage Diff             @@
##                main        #9   +/-   ##
===========================================
  Coverage     100.00%   100.00%
- Complexity        54        87   +33
===========================================
  Files              4         4
  Lines            116       189   +73
  Branches          14        28   +14
===========================================
+ Hits             116       189   +73

Impacted Files
Coverage Δ

src/main/java/me/sparky983/spark/Assertion.java
100.00% <100.00%> (ø)

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.


Project not loading on remote server in vscode insiders (working in other remote workspaces/ regular vs code)

VSCode Version: 1.47 insiders
OS Version: Ubuntu 18.04

I probably caused it somehow(..), but I cannot undo it, the window hangs indefinitely. I saw previous posts regarding hanging workspaces, all pointing to large files in the workspace, but there are none (and the settings of both the insiders and the regular are the same)
Other workspaces in the same remote server still open, and this workspace opens in regular (not insiders) vscode

@dvirginz how do youy connect to the remote. Using SSH?


Separate drivers to smaller packages

Drivers to split:

[ ] AMQP
[ ] Pheanstalk
[ ] Redis/Predis
[ ] Doctrine
[ ] Iron
[ ] SQS
[ ] Mongo
[ ] AppEngine

FlatFile does not rely on any external dependencies, also it's a sane default for playing around.

Initial comment:
Although I love the idea of having one single package for everything, I would consider having smaller packages for the drivers with actual dependencies. For example: pheanstalk-driver with a dependency on pda/pheanstalk instead of suggestion.
It would add more maintenance, but would make the main package a bit cleaner. WDYT?
I am willing to work on this one if you agree.

Have always been the idea.

Alright...should I start by creating a repo in my namespace, transfering it and opening a PR for removal in the main one?

Not sure what the right approach is, if we want to do like Symfony and have sub tree splits.

Well, we are basically talking about one or two classes per repo, so I am not sure it worth to have subtree splits. It requires special versioning strategy, and so on. We discussed this approach for HTTPlug and decided not doing it for HTTP clients and adapters, since they might evolve separately. Also subtree splitting makes dependency management a bit harder, so I am against it for a project like this.

I can create the repos and then ill give you write rights to them. is that ok ?

Sounds great.
Some more questions to clear:

Namespacing: Should it be Bernard\Driver or Bernard\[DriverName]? eg. Bernard\Driver, class name Pheanstalk or Bernard\Pheanstalk, class name PheanstalkDriver or maybe Bernard\Pheanstalk, class name Driver?
Package names: bernard/[driver_name]-driver?
Is it ok, if I write spec tests immediately for behaviour, unit tests for the rest?
Are you going to setup travis and packagist as well or I should (I think I cannot setup travis without organizational rights)?

Just realized this is a duplicate of #92

My vote goes to:
Repo: bernardphp/[driver_name]-driver
Namespace: Bernard\Driver\[DriverName]
Driver classname: Driver (+any other driver specific classes, like schema for doctrine)
Package name: bernard/[driver_name]-driver
If it's okay for you, I would create a boilerplate-driver repo/package first as a package boilerplate which then can be used later.

Lurker here would go for Bernard\Driver\PheanstalkDriver every time - less chance I'll have to waste time aliasing it.

Although it's simple, it has a few drawbacks:

Bernard\Driver would be the namespace for autoloading and it's not really a good idea to have the same namespace for multiple directories
If you need additional files for a driver (like in case of doctrine) it seems to be wrong to have it in a driver namespace

Also, if you import Bernard\Driver\[DriverName] namespace, you can use [DriverName]\Driver class.

Ping :)

Well, we are basically talking about one or two classes per repo, so I am not sure it worth to have subtree splits.

Funny, read this yesterday. Today on twitter: https://twitter.com/TobiasNyholm/status/810882518572564480

SubtreeSplit is a nice approach when you don't want to use the master repository or you want all from them. In case of an adapter-pattern like project I am not sure if it adds too much, but @Nyholm might have a few interesting thoughts here since he maintains two projects like that.

For the users:
A subtree split is a good idea for making smaller packages. It will remove the need for optional dependencies and you can version packages independent of each other. Ie if one driver have a BC break you do not have to bump all adapters.
For the maintainers:
I find subtree split a good approach when you share code between adapters. (Like PHP-cache.com). This organization is only sharing an interface which means maintainers will not see any major benefits, but then again, there is no drawback either.
Tests:
In your case you do not have to do anything special here.
Namespace:
Im not expert here. But doing Bernard\Driver\[DriverName]\Driver seams reasonable.

[Drivers] might evolve separately. Also subtree splitting makes dependency management a bit harder, so I am against it for a project like this.

I do not understand this argument. I think you mean that if we do like Symfony does an keep the same version on each driver, then yes. I agree. But if one configure the subtree split not to push tags then I do not think this is an issue.
I do not like to keep all the drivers in the same package because of the reasons above. I would go with a subtree split over completely separate repos since it is now way easier to get started with thanks to subtreesplit.com

I think you mean that if we do like Symfony does an keep the same version on each driver, then yes. I agree.

Yes
I think the main argument is that we have a central package here, which should hold some common code, and adapters/drivers should require it. From this point of view subtree split does not seem to be a good idea to me. Maybe having a separate drivers package would be better? And apply subtree split there? Would that be better?

Ah okey. The master repo https://github.com/bernardphp/bernard should not be a package you can download. It should only be for development.
If you want to keep the package bernard/bernard point to this repo you cannot have a subtree split form here. You have two options:
A)
Create a slave repo and point the package bernard/bernard to that new repo. And create slave repos and new packages for each driver. Now you may do a subtree split for this repo
B)
Create a new bernardphp/drivers repo and do a subtree split to new slaves.

Yeah, option B what I meant. That would actually be a good idea then, but somehow destroys the idea of subtree split, doesn't it?

That is what I am trying with https://github.com/php-translation/platform-adapter Adapters do not share anything and there is no shared code apart from the adapters in the master repository.
Having this setup does not bring many benefits. Just that it is nice if Im going to change many adapters at once and there are lot less repositories to supervise. I may include php-translation/common in this master repo since it is a shared dependency for all adapters.
So.. choosing option B is great because you get small packages, but a subtree split is barley needed.

I would like to pick this issue up and move drivers to a separate repo using subtree split. I will do some research and write down the plan here.

Maybe we can use https://www.subtreesplit.com/ from @Nyholm for the subtree split management. But indeed good idea to pick up this issue!

That's the plan, yes.

+1

@sagikazarmark what are the exact steps to do this? Do we just create the separate repo's by hand and move the code and then initialize subtreesplit or will the code moving part be done by the subtreesplit?
This way we can already do some preparations for the move!

You need to create separate repos and the tell subtreesplit what folder should be pushed to which repo.
You do not need to populate the new repos yourself.

So the plan is to create a separate drivers repo (already done) and move current drivers there.
Class name will be Bernard\Driver\[DriverName]\Driver (eg. Bernard\Driver\Pheanstalk\Driver) which is somewhat inconvenient, but easy to maintain and documentation should resolve the convenience issue.
Repo names: driver-[drivername]
Package names: bernard/driver-[drivername]
It worked quite well with php-http
We also need to improve the test suite a bit. I would like to create a unified integration test suite (if possible) and use the same set of tests for each driver, even if it is only a small set of tests. Each driver can have it's own set of tests as well. Also, tests needs to be somewhat separated based on the featureset (eg. not all queue backends support peeking, etc).
I would like to create a POC driver first (probably Pheanstalk), work on the test suite, set up subtree split, etc. If it works well, we can migrate the rest of the drivers.

Decided to go with an in-memory driver instead.

@Nyholm what's the current best practice: run the tests when pushing to the main repo or when subtree is done?
(The first one sounds better to me)

Yes. First one.
I also run Travis on individual driver to get the code coverage stats.
Have a look at php geocoder for a good Travis.yml

Thanks for the info @sagikazarmark! I will let you do the setup on the first driver to get all things right and then I will jump in and also do some drivers!

@sagikazarmark did you make any progress on the first driver? Or is there something I can do to start on this?

Yeah, I started to get my head around this, have some tests standardized locally. Will send some branches for review over the weekend.

Ok great!

I would be happy to help out with this as well.

Sorry to ping you again @sagikazarmark! Did you make any progress on this? Or can and somehow start some work on this (a single driver to test the whole implementation)?

I created #337 with an initial in memory driver implementation. I gave having a core test suite much thought and I realized that without ugly hacks we can't really have an interface for setting driver state, so as for tests we should just have a sane template to follow.
I'm also thinking about writing spec tests instead of/additional to unit tests.

I will also try to send a PR to the drivers package to have some ideas how migration would work.

Thanks will check it out!


Virtual Scroll fix: this.approxItemHeight is undefined when update(true) is called first

Short description of what this resolves:
this.approxItemHeight is undefined when update(true) is called first
see https://github.com/driftyco/ionic/issues/8311
Changes proposed in this pull request:

define this.approxItemHeight to default 40px before do this.update(true)

Ionic Version: 2.1.0
Fixes: https://github.com/driftyco/ionic/issues/8311

Hello @ckaeslin, thanks for the PR! How can I reproduce this? Is it random or is there something I can do to always get an error? :)

This one is pretty easy to reproduce, use the lates Ionic2 RC0 and create a virtual-scroll (without approxItemHeight="40px").
<ion-list [virtualScroll]="items">
    <ion-list-header>Follow us on Twitter</ion-list-header>
    <ion-item *virtualItem="let item">
      <ion-icon name="ionic" item-left></ion-icon>
      {{item}}
    </ion-item>
</ion-list>

Or checkout this repo https://github.com/jeromeXoo/ionic2.rc0.Virtual-Scroll-Not-Working and remove approxItemHeight="40px" here https://github.com/jeromeXoo/ionic2.rc0.Virtual-Scroll-Not-Working/blob/master/src/pages/contact/contact.html#L10
you will just get a blank page

Documentation says it's default set to 40px: http://ionicframework.com/docs/v2/api/components/virtual-scroll/VirtualScroll/#input-properties
But this default is not working with the current code.

Interestingly enough, this error goes away if you move the data out of the constructor into the ionViewDidEnter, like so:
export class ContactPage {

  public items: Array<any> = [];

  constructor(public navCtrl: NavController) {

  }

  ionViewDidEnter() {
    for(let i = 0; i < 100; i++)
    {
      this.items.push({id: i,
         name:'name' +i});
    }
  }
}

While we don't recommend loading data in the constructor of your component, throwing an error isn't a good alternative so I'll look into your PR. Thanks again!

@brandyscarney , sorry, it still happens.
  ionViewDidEnter() {
    this.showLoading('Retrieving Client details..');

    this.clientService.get(this.clientId).then((clientData) => {
      this.clientResponse = clientData;

      this.loading.dismiss().then(() => {
        this.buildings = clientData.buildings;
        this.stores    = clientData.stores;
        this.initClient();
      });
    }, (error) => {
      this.loading.dismiss().then(() => {
        console.log(error);
      });
    });
  }

      <ion-list [virtualScroll]="buildings">

        <button *virtualItem="let building" ion-item (click)="goToBuilding(building.id)" class="building-detail">

{{ building.name }}

{{ building.address }}

        </button>
      </ion-list>

The problem is that https://github.com/driftyco/ionic/blob/master/src/components/virtual-scroll/virtual-scroll.ts#L346 goes to https://github.com/driftyco/ionic/blob/master/src/components/virtual-scroll/virtual-util.ts#L569, where approxItemHeight is not defined, because it's currently done after this.update(true);

Look good! Thanks 👍