fonttools / fontbakery

🧁 A font quality assurance tool for everyone
https://fontbakery.readthedocs.io
Apache License 2.0
546 stars 99 forks source link

pip3 installation takes a long time #3854

Closed davelab6 closed 7 months ago

davelab6 commented 2 years ago

Observed behaviour

Screen Shot 2022-08-10 at 11 45 36 AM

Expected behaviour

Fontbakery pip installs quickly

felipesanches commented 2 years ago

I think that the time it takes to install is longer than usual because lxml is built from C sources. On a second installation it goes faster because the built package is saved on the local pip cache.

This issue does not seem to be specific to fontbakery, as the lxml module is also a dependency of a few other projects that are also among fontbakery's dependencies, such as:

This is our current dependency tree, as listed out using the johnnydep tool:

name                                                     summary
-------------------------------------------------------  -------------------------------------------------------------------------------------------------------
fontbakery                                               Well designed Font QA tool, written in Python 3
├── PyYAML                                               YAML parser and emitter for Python
├── axisregistry                                         A python API to access data from the Google Fonts variable fonts axis registry.
│   ├── fonttools                                        Tools to manipulate font files
│   └── protobuf==3.19.4                                 Protocol Buffers
├── beautifulsoup4                                       Screen-scraping library
│   └── soupsieve>1.2                                    A modern CSS selector implementation for Beautiful Soup.
├── beziers                                              Bezier curve manipulation library
│   └── pyclipper                                        Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)
├── cmarkgfm                                             Minimal bindings to GitHub's fork of cmark
│   └── cffi>=1.15.0                                     Foreign Function Interface for Python calling C code.
│       └── pycparser                                    C parser in Python
├── collidoscope>=0.4.1                                  Brute force detection of glyph collisions
│   ├── beziers>=0.0.3                                   Bezier curve manipulation library
│   │   └── pyclipper                                    Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)
│   ├── fonttools                                        Tools to manipulate font files
│   ├── glyphtools                                       Routines for extracting information from fontTools glyphs
│   │   ├── babelfont>0.2.0                              Abstract interface to font source files based on fontParts
│   │   │   ├── defcon                                   A set of flexible objects for representing UFO data.
│   │   │   │   └── fonttools[ufo,unicode]>=4.10.0       Tools to manipulate font files
│   │   │   │       ├── fs<3,>=2.2.0                     Python's filesystem abstraction layer
│   │   │   │       │   ├── appdirs~=1.4.3               A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │   │       │   ├── setuptools                   Easily download, build, install, upgrade, and uninstall Python packages
│   │   │   │       │   └── six~=1.10                    Python 2 and 3 compatibility utilities
│   │   │   │       └── unicodedata2>=14.0.0             Unicodedata backport updated to the latest Unicode version.
│   │   │   ├── fontParts                                An API for interacting with the parts of fonts during the font development process.
│   │   │   │   ├── FontTools[lxml,ufo,unicode]>=3.32.0  Tools to manipulate font files
│   │   │   │   │   ├── fs<3,>=2.2.0                     Python's filesystem abstraction layer
│   │   │   │   │   │   ├── appdirs~=1.4.3               A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │   │   │   │   ├── setuptools                   Easily download, build, install, upgrade, and uninstall Python packages
│   │   │   │   │   │   └── six~=1.10                    Python 2 and 3 compatibility utilities
│   │   │   │   │   ├── lxml<5,>=4.0                     Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.
│   │   │   │   │   └── unicodedata2>=14.0.0             Unicodedata backport updated to the latest Unicode version.
│   │   │   │   ├── booleanOperations>=0.9.0             Boolean operations on paths.
│   │   │   │   │   ├── fonttools>=4.0.2                 Tools to manipulate font files
│   │   │   │   │   └── pyclipper>=1.1.0.post1           Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)
│   │   │   │   ├── defcon[pens]>=0.6.0                  A set of flexible objects for representing UFO data.
│   │   │   │   │   ├── fontPens>=0.1.0                  A collection of classes implementing the pen protocol for manipulating glyphs.
│   │   │   │   │   │   └── FontTools>=3.32.0            Tools to manipulate font files
│   │   │   │   │   └── fonttools[ufo,unicode]>=4.10.0   Tools to manipulate font files
│   │   │   │   │       ├── fs<3,>=2.2.0                 Python's filesystem abstraction layer
│   │   │   │   │       │   ├── appdirs~=1.4.3           A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │   │   │       │   ├── setuptools               Easily download, build, install, upgrade, and uninstall Python packages
│   │   │   │   │       │   └── six~=1.10                Python 2 and 3 compatibility utilities
│   │   │   │   │       └── unicodedata2>=14.0.0         Unicodedata backport updated to the latest Unicode version.
│   │   │   │   └── fontMath>=0.4.8                      A set of objects for performing math operations on font data.
│   │   │   │       └── fonttools>=3.32.0                Tools to manipulate font files
│   │   │   ├── fontTools[ufo]                           Tools to manipulate font files
│   │   │   │   └── fs<3,>=2.2.0                         Python's filesystem abstraction layer
│   │   │   │       ├── appdirs~=1.4.3                   A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │   │       ├── setuptools                       Easily download, build, install, upgrade, and uninstall Python packages
│   │   │   │       └── six~=1.10                        Python 2 and 3 compatibility utilities
│   │   │   └── glyphsLib                                A bridge from Glyphs source files (.glyphs) to UFOs
│   │   │       ├── fonttools[ufo,unicode]>=4.27.1       Tools to manipulate font files
│   │   │       │   ├── fs<3,>=2.2.0                     Python's filesystem abstraction layer
│   │   │       │   │   ├── appdirs~=1.4.3               A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │       │   │   ├── setuptools                   Easily download, build, install, upgrade, and uninstall Python packages
│   │   │       │   │   └── six~=1.10                    Python 2 and 3 compatibility utilities
│   │   │       │   └── unicodedata2>=14.0.0             Unicodedata backport updated to the latest Unicode version.
│   │   │       ├── openstep-plist>=0.3.0                ASCII plist parser written in Cython
│   │   │       └── ufoLib2>=0.6.2                       ufoLib2 is a UFO font processing library.
│   │   │           ├── attrs>=20.1.0                    Classes Without Boilerplate
│   │   │           └── fonttools[ufo]>=4.0.0            Tools to manipulate font files
│   │   │               └── fs<3,>=2.2.0                 Python's filesystem abstraction layer
│   │   │                   ├── appdirs~=1.4.3           A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │                   ├── setuptools               Easily download, build, install, upgrade, and uninstall Python packages
│   │   │                   └── six~=1.10                Python 2 and 3 compatibility utilities
│   │   ├── beziers                                      Bezier curve manipulation library
│   │   │   └── pyclipper                                Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)
│   │   ├── glyphsLib                                    A bridge from Glyphs source files (.glyphs) to UFOs
│   │   │   ├── fonttools[ufo,unicode]>=4.27.1           Tools to manipulate font files
│   │   │   │   ├── fs<3,>=2.2.0                         Python's filesystem abstraction layer
│   │   │   │   │   ├── appdirs~=1.4.3                   A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │   │   │   ├── setuptools                       Easily download, build, install, upgrade, and uninstall Python packages
│   │   │   │   │   └── six~=1.10                        Python 2 and 3 compatibility utilities
│   │   │   │   └── unicodedata2>=14.0.0                 Unicodedata backport updated to the latest Unicode version.
│   │   │   ├── openstep-plist>=0.3.0                    ASCII plist parser written in Cython
│   │   │   └── ufoLib2>=0.6.2                           ufoLib2 is a UFO font processing library.
│   │   │       ├── attrs>=20.1.0                        Classes Without Boilerplate
│   │   │       └── fonttools[ufo]>=4.0.0                Tools to manipulate font files
│   │   │           └── fs<3,>=2.2.0                     Python's filesystem abstraction layer
│   │   │               ├── appdirs~=1.4.3               A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │               ├── setuptools                   Easily download, build, install, upgrade, and uninstall Python packages
│   │   │               └── six~=1.10                    Python 2 and 3 compatibility utilities
│   │   └── numpy                                        NumPy is the fundamental package for array computing with Python.
│   └── uharfbuzz                                        Streamlined Cython bindings for the harfbuzz shaping engine
├── defcon                                               A set of flexible objects for representing UFO data.
│   └── fonttools[ufo,unicode]>=4.10.0                   Tools to manipulate font files
│       ├── fs<3,>=2.2.0                                 Python's filesystem abstraction layer
│       │   ├── appdirs~=1.4.3                           A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│       │   ├── setuptools                               Easily download, build, install, upgrade, and uninstall Python packages
│       │   └── six~=1.10                                Python 2 and 3 compatibility utilities
│       └── unicodedata2>=14.0.0                         Unicodedata backport updated to the latest Unicode version.
├── dehinter>=3.1.0                                      A tool for the removal of TrueType instruction sets (hints) in fonts
│   └── fontTools                                        Tools to manipulate font files
├── font-v                                               Font version reporting and modification tool
│   ├── fonttools                                        Tools to manipulate font files
│   └── gitpython                                        GitPython is a python library used to interact with Git repositories
│       └── gitdb<5,>=4.0.1                              Git Object Database
│           └── smmap<6,>=3.0.1                          A pure Python implementation of a sliding window memory map manager
├── fontTools[lxml,ufo,unicode]>=3.34                    Tools to manipulate font files
│   ├── fs<3,>=2.2.0                                     Python's filesystem abstraction layer
│   │   ├── appdirs~=1.4.3                               A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   ├── setuptools                                   Easily download, build, install, upgrade, and uninstall Python packages
│   │   └── six~=1.10                                    Python 2 and 3 compatibility utilities
│   ├── lxml<5,>=4.0                                     Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.
│   └── unicodedata2>=14.0.0                             Unicodedata backport updated to the latest Unicode version.
├── gflanguages>=0.3.0                                   A python API for evaluating language support in the Google Fonts collection.
│   └── protobuf
├── glyphsets>=0.5.0                                     A python API for evaluating coverage of glyph sets in font projects.
│   ├── FontTools[ufo]                                   Tools to manipulate font files
│   │   └── fs<3,>=2.2.0                                 Python's filesystem abstraction layer
│   │       ├── appdirs~=1.4.3                           A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │       ├── setuptools                               Easily download, build, install, upgrade, and uninstall Python packages
│   │       └── six~=1.10                                Python 2 and 3 compatibility utilities
│   ├── defcon                                           A set of flexible objects for representing UFO data.
│   │   └── fonttools[ufo,unicode]>=4.10.0               Tools to manipulate font files
│   │       ├── fs<3,>=2.2.0                             Python's filesystem abstraction layer
│   │       │   ├── appdirs~=1.4.3                       A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │       │   ├── setuptools                           Easily download, build, install, upgrade, and uninstall Python packages
│   │       │   └── six~=1.10                            Python 2 and 3 compatibility utilities
│   │       └── unicodedata2>=14.0.0                     Unicodedata backport updated to the latest Unicode version.
│   ├── glyphsLib                                        A bridge from Glyphs source files (.glyphs) to UFOs
│   │   ├── fonttools[ufo,unicode]>=4.27.1               Tools to manipulate font files
│   │   │   ├── fs<3,>=2.2.0                             Python's filesystem abstraction layer
│   │   │   │   ├── appdirs~=1.4.3                       A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │   │   │   ├── setuptools                           Easily download, build, install, upgrade, and uninstall Python packages
│   │   │   │   └── six~=1.10                            Python 2 and 3 compatibility utilities
│   │   │   └── unicodedata2>=14.0.0                     Unicodedata backport updated to the latest Unicode version.
│   │   ├── openstep-plist>=0.3.0                        ASCII plist parser written in Cython
│   │   └── ufoLib2>=0.6.2                               ufoLib2 is a UFO font processing library.
│   │       ├── attrs>=20.1.0                            Classes Without Boilerplate
│   │       └── fonttools[ufo]>=4.0.0                    Tools to manipulate font files
│   │           └── fs<3,>=2.2.0                         Python's filesystem abstraction layer
│   │               ├── appdirs~=1.4.3                   A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │               ├── setuptools                       Easily download, build, install, upgrade, and uninstall Python packages
│   │               └── six~=1.10                        Python 2 and 3 compatibility utilities
│   └── setuptools                                       Easily download, build, install, upgrade, and uninstall Python packages
├── lxml                                                 Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.
├── opentype-sanitizer>=7.1.9                            Python wrapper for the OpenType Sanitizer
├── opentypespec                                         Data derived from the OpenType specification
├── pip-api                                              An unofficial, importable pip API
│   └── pip                                              The PyPA recommended tool for installing Python packages.
├── protobuf>=3.7.0
├── requests                                             Python HTTP for Humans.
│   ├── certifi>=2017.4.17                               Python package for providing Mozilla's CA Bundle.
│   ├── charset-normalizer<3,>=2                         The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.
│   ├── idna<4,>=2.5                                     Internationalized Domain Names in Applications (IDNA)
│   └── urllib3<1.27,>=1.21.1                            HTTP library with thread-safe connection pooling, file post, and more.
├── rich                                                 Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal
│   ├── commonmark<0.10.0,>=0.9.0                        Python parser for the CommonMark Markdown spec
│   └── pygments<3.0.0,>=2.6.0                           Pygments is a syntax highlighting package written in Python.
├── stringbrewer                                         Generate random strings matching a pattern
│   ├── rstr                                             Generate random strings in Python
│   └── sre-yield                                        Expands a regular expression to its possible matches
├── toml                                                 Python Library for Tom's Obvious, Minimal Language
├── ufo2ft>=2.25.2                                       A bridge between UFOs and FontTools.
│   ├── booleanOperations>=0.9.0                         Boolean operations on paths.
│   │   ├── fonttools>=4.0.2                             Tools to manipulate font files
│   │   └── pyclipper>=1.1.0.post1                       Cython wrapper for the C++ translation of the Angus Johnson's Clipper library (ver. 6.4.2)
│   ├── cffsubr>=0.2.8                                   Standalone CFF subroutinizer based on the AFDKO tx tool
│   │   └── fontTools>=4.10.2                            Tools to manipulate font files
│   ├── cu2qu>=1.6.7                                     Cubic-to-quadratic bezier curve conversion
│   │   └── fonttools[ufo]>=3.32.0                       Tools to manipulate font files
│   │       └── fs<3,>=2.2.0                             Python's filesystem abstraction layer
│   │           ├── appdirs~=1.4.3                       A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│   │           ├── setuptools                           Easily download, build, install, upgrade, and uninstall Python packages
│   │           └── six~=1.10                            Python 2 and 3 compatibility utilities
│   └── fonttools[ufo]>=4.34.0                           Tools to manipulate font files
│       └── fs<3,>=2.2.0                                 Python's filesystem abstraction layer
│           ├── appdirs~=1.4.3                           A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│           ├── setuptools                               Easily download, build, install, upgrade, and uninstall Python packages
│           └── six~=1.10                                Python 2 and 3 compatibility utilities
├── ufolint                                              UFO source file linter
│   ├── commandlines                                     Command line argument to object parsing library for command line application development
│   └── fontTools[ufo]>=4.18.0                           Tools to manipulate font files
│       └── fs<3,>=2.2.0                                 Python's filesystem abstraction layer
│           ├── appdirs~=1.4.3                           A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
│           ├── setuptools                               Easily download, build, install, upgrade, and uninstall Python packages
│           └── six~=1.10                                Python 2 and 3 compatibility utilities
├── unicodedata2                                         Unicodedata backport updated to the latest Unicode version.
└── vharfbuzz                                            A user-friendlier way to use Harfbuzz in Python
    ├── fontTools                                        Tools to manipulate font files
    └── uharfbuzz                                        Streamlined Cython bindings for the harfbuzz shaping engine
justvanrossum commented 2 years ago

For reference:

simoncozens commented 7 months ago

Moving to #3874 for the final "remove lxml" piece.