[buildout] extends = # versions pins from zope, vendored with # curl https://zopefoundation.github.io/Zope/releases/4.8.5/versions.cfg | sed -e s/versions-prod.cfg/zope-versions.cfg/g > ztk-versions.cfg # curl https://zopefoundation.github.io/Zope/releases/4.8.5/versions-prod.cfg > zope-versions.cfg ztk-versions.cfg zope-versions.cfg buildout.hash.cfg ../../component/fonts/buildout.cfg ../../component/git/buildout.cfg ../../component/ghostscript/buildout.cfg ../../component/graphviz/buildout.cfg ../../component/gzip/buildout.cfg ../../component/xz-utils/buildout.cfg ../../component/haproxy/buildout.cfg ../../component/socat/buildout.cfg ../../component/rsyslogd/buildout.cfg ../../component/findutils/buildout.cfg ../../component/librsvg/buildout.cfg ../../component/imagemagick/buildout.cfg ../../component/jpegoptim/buildout.cfg ../../component/kumo/buildout.cfg ../../component/libdmtx/buildout.cfg ../../component/matplotlib/buildout.cfg ../../component/numpy/buildout.cfg ../../component/statsmodels/buildout.cfg ../../component/h5py/buildout.cfg ../../component/ocropy/buildout.cfg ../../component/optipng/buildout.cfg ../../component/pandas/buildout.cfg ../../component/percona-toolkit/buildout.cfg ../../component/patch/buildout.cfg ../../component/pillow/buildout.cfg ../../component/pycrypto-python/buildout.cfg ../../component/pysvn-python/buildout.cfg ../../component/python-ldap-python/buildout.cfg ../../component/scikit-learn/buildout.cfg ../../component/scikit-image/buildout.cfg ../../component/PyWavelets/buildout.cfg ../../component/subversion/buildout.cfg ../../component/tempstorage/buildout.cfg ../../component/tesseract/buildout.cfg ../../component/w3m/buildout.cfg ../../component/poppler/buildout.cfg ../../component/zabbix/buildout.cfg ../../component/sed/buildout.cfg ../../component/coreutils/buildout.cfg ../../component/grep/buildout.cfg ../../component/dash/buildout.cfg ../../component/bash/buildout.cfg ../../component/wget/buildout.cfg ../../component/aspell/buildout.cfg ../../component/jsl/buildout.cfg ../../component/6tunnel/buildout.cfg ../../component/userhosts/buildout.cfg ../../component/postfix/buildout.cfg ../../component/zbarlight/buildout.cfg ../../component/pylint/buildout.cfg ../../component/perl-Image-ExifTool/buildout.cfg ../../component/wendelin.core/buildout.cfg ../../component/jupyter-py2/buildout.cfg ../../component/pygolang/buildout.cfg ../../component/bcrypt/buildout.cfg ../../component/python-pynacl/buildout.cfg ../../component/python-xmlsec/buildout.cfg ../../stack/caucase/buildout.cfg ../../software/neoppod/software-common.cfg # keep neoppod extends last parts += erp5-util-develop slapos-cookbook mroonga-mariadb tesseract zabbix-agent .coveragerc # Buildoutish eggs-all-scripts testrunner test-suite-runner # get git repositories genbt5list # some additional utils zodbpack # Create instance template template # jupyter jupyter-notebook-initialized-scripts # override instance-jupyter-notebook not to render into default template.cfg [instance-jupyter-notebook] output = ${buildout:directory}/template-jupyter.cfg [download-base] <= download-base-neo url = ${:_profile_base_location_}/${:filename} [mariadb-start-clone-from-backup] <= download-base [mariadb-resiliency-after-import-script] <= download-base [mariadb-slow-query-report-script] <= download-base [template-mariadb] <= download-base link-binary = ${coreutils:location}/bin/basename ${coreutils:location}/bin/cat ${coreutils:location}/bin/cp ${coreutils:location}/bin/ls ${coreutils:location}/bin/tr ${coreutils:location}/bin/uname ${gettext:location}/lib/gettext/hostname ${grep:location}/bin/grep ${sed:location}/bin/sed ${mariadb:location}/bin/mysqlbinlog [template-kumofs] <= download-base [template-zope-conf] <= download-base [site-zcml] <= download-base [template-my-cnf] <= download-base [template-mariadb-initial-setup] <= download-base [template-postfix] < = download-base [template-postfix-master-cf] < = download-base [template-postfix-main-cf] < = download-base [template-postfix-aliases] < = download-base [template-run-zelenium] < = download-base [template] recipe = slapos.recipe.template:jinja2 # XXX: "template.cfg" is hardcoded in instanciation recipe output = ${buildout:directory}/template.cfg url = ${:_profile_base_location_}/${:filename} context = key mariadb_link_binary template-mariadb:link-binary key zope_link_binary template-zope:link-binary key zope_fonts template-zope:fonts key zope_fontconfig_includes template-zope:fontconfig-includes key apache_location apache:location key bin_directory buildout:bin-directory key buildout_bin_directory buildout:bin-directory key caucase_jinja2_library caucase-jinja2-library:target key coreutils_location coreutils:location key curl_location curl:location key cyrus_sasl_location cyrus-sasl:location key dash_location dash:location key bash_location bash:location key dcron_location dcron:location key default_cloudooo_url erp5-defaults:cloudooo-connection-url key erp5_location erp5:location key findutils_location findutils:location key gzip_location gzip:location key xz_utils_location xz-utils:location key haproxy_location haproxy:location key socat_location socat:location key rsyslogd_location rsyslogd:location key instance_common_cfg instance-common:output key jupyter_enable_default erp5-defaults:jupyter-enable-default key wcfs_enable_default erp5-defaults:wcfs-enable-default key kumo_location kumo:location key local_bt5_repository local-bt5-repository:list key logrotate_location logrotate:location key mariadb_location mariadb:location key mariadb_resiliency_after_import_script mariadb-resiliency-after-import-script:target key mariadb_slow_query_report_script mariadb-slow-query-report-script:target key mariadb_start_clone_from_backup mariadb-start-clone-from-backup:target key mroonga_mariadb_install_sql mroonga-mariadb:install-sql key mroonga_mariadb_plugin_dir mroonga-mariadb:plugin-dir key groonga_plugin_dir groonga:groonga-plugin-dir key groonga_mysql_normalizer_plugin_dir groonga-normalizer-mysql:groonga-plugin-dir key matplotlibrc_location matplotlibrc:location key parts_directory buildout:parts-directory key openssl_location openssl:location key percona_toolkit_location percona-toolkit:location key perl_dbd_mariadb_path perl-DBD-mariadb:perl-PATH key postfix_location postfix:location key root_common root-common:target key site_zcml site-zcml:target key sixtunnel_location 6tunnel:location key template_run_zelenium template-run-zelenium:target key egg_interpreter erp5-python-interpreter:interpreter key template_apache_conf template-apache-backend-conf:target key template_balancer template-balancer:target key template_erp5 template-erp5:target key template_haproxy_cfg template-haproxy-cfg:target key template_rsyslogd_cfg template-rsyslogd-cfg:target key template_jupyter_cfg instance-jupyter-notebook:output key template_kumofs template-kumofs:target key template_mariadb template-mariadb:target key template_mariadb_initial_setup template-mariadb-initial-setup:target key template_my_cnf template-my-cnf:target key template_mysqld_wrapper template-mysqld-wrapper:output key template_postfix template-postfix:target key template_postfix_aliases template-postfix-aliases:target key template_postfix_main_cf template-postfix-main-cf:target key template_postfix_master_cf template-postfix-master-cf:target key instance_wcfs_cfg_in instance-wcfs.cfg.in:target key template_zeo template-zeo:target key template_zodb_base template-zodb-base:target key template_zope template-zope:target key template_zope_conf template-zope-conf:target key template_fonts_conf template-fonts-conf:output key userhosts_location userhosts:location key unixodbc_location unixodbc:location key wget_location wget:location key extra_path_list eggs:extra-paths key python_executable_for_kernel erp5-python-interpreter-jupyter:interpreter_path key erp5_kernel_location erp5-kernel:location key erp5_kernel_filename erp5-kernel:filename key kernel_json_location kernel-json:location key kernel_json_filename kernel-json:filename [template-erp5] <= download-base [template-zeo] <= download-base [template-zodb-base] <= download-base [template-zope] <= download-base link-binary = ${aspell-en-dictionary:bin-aspell} ${dmtx-utils:location}/bin/dmtxwrite ${git:location}/bin/git ${graphviz:location}/bin/dot ${grep:location}/bin/grep ${imagemagick:location}/bin/convert ${ghostscript:location}/bin/gs ${imagemagick:location}/bin/identify ${jpegoptim:location}/bin/jpegoptim ${jsl:location}/bin/jsl ${librsvg:location}/bin/rsvg-convert ${mariadb:location}/bin/mysql ${mariadb:location}/bin/mysqldump ${openssl:location}/bin/openssl ${optipng:location}/bin/optipng ${perl-Image-ExifTool:location}/bin/exiftool ${poppler:location}/bin/pdfinfo ${poppler:location}/bin/pdftohtml ${poppler:location}/bin/pdftotext ${python2.7:location}/bin/2to3 ${sed:location}/bin/sed ${tesseract:location}/bin/tesseract ${w3m:location}/bin/w3m fonts = ${liberation-fonts:location} ${ipaex-fonts:location} ${ipa-fonts:location} ${ocrb-fonts:location} ${android-fonts:location} fontconfig-includes = ${fontconfig:location}/etc/fonts/conf.d [template-balancer] <= download-base [template-haproxy-cfg] <= download-base [template-rsyslogd-cfg] <= download-base [instance-wcfs.cfg.in] <= download-base [erp5-bin] <= erp5 repository = https://lab.nexedi.com/nexedi/erp5-bin.git branch = master [erp5-doc] <= erp5 repository = https://lab.nexedi.com/nexedi/erp5-doc.git branch = master [bt5-repository] # Format: # <url or path> [...] # # Use absolute paths for local repositories, and URLs for non-local otherwise. # list = ${local-bt5-repository:list} [local-bt5-repository] # Same as bt5-repository, but only local repository. # Used to generate bt5lists. list = ${erp5:location}/bt5 ${erp5:location}/product/ERP5/bootstrap ${erp5-bin:location}/bt5 ${erp5-doc:location}/bt5 [genbt5list] recipe = plone.recipe.command stop-on-error = true genbt5list = ${erp5:location}/product/ERP5/bin/genbt5list command = echo '${local-bt5-repository:list}' |xargs ${buildout:executable} ${:genbt5list} update-command = ${:command} [erp5_repository_list] repository_id_list = erp5 erp5-bin erp5-doc # ERP5 defaults, which can be overridden in inheriting recipes (e.g. wendelin) [erp5-defaults] cloudooo-connection-url = https://cloudooo.erp5.net/ # Jupyter is by default disabled in ERP5 jupyter-enable-default = false # WCFS is by default disabled in ERP5 wcfs-enable-default = false [erp5] recipe = slapos.recipe.build:gitclone repository = https://lab.nexedi.com/nexedi/erp5.git branch = zope4py2 git-executable = ${git:location}/bin/git develop = true [testrunner] # XXX: Workaround for fact ERP5Type is not an distribution and does not # expose entry point for test runner recipe = zc.recipe.egg eggs = ${eggs:eggs} extra-paths = ${eggs:extra-paths} entry-points = runUnitTest=runUnitTest:main scripts = runUnitTest initialization = import glob, os, sys, json buildout_directory = '''${buildout:directory}''' parts_directory = '''${buildout:parts-directory}''' repository_id_list = \ '''${erp5_repository_list:repository_id_list}'''.split()[::-1] # read testrunner configuration from slapos instance parameters to # configure coverage if enabled. with open(os.environ['ERP5_TEST_RUNNER_CONFIGURATION']) as f: test_runner_configuration = json.load(f) test_runner_configuration.setdefault('coverage', {}) test_runner_configuration['coverage'].setdefault('enabled', False) coverage_process = None if test_runner_configuration['coverage']['enabled']: test_runner_configuration['coverage'].setdefault( 'include', [os.path.join('parts', repo, '*') for repo in repository_id_list]) assets_directory = '' test_name = sys.argv[-1].replace(':', '_') if os.environ.get('SLAPOS_TEST_LOG_DIRECTORY'): assets_directory = os.path.join(os.environ['SLAPOS_TEST_LOG_DIRECTORY'], test_name) if not os.path.exists(assets_directory): os.makedirs(assets_directory) coverage_data_file = os.path.abspath( os.path.join(assets_directory, 'coverage.sqlite3')) curdir = os.path.abspath(os.curdir) # change current directory when importing coverage so that it considers paths # relative to the root of the software os.chdir(buildout_directory) import coverage coverage_process = coverage.Coverage( include=test_runner_configuration['coverage']['include'], data_file=coverage_data_file, branch=test_runner_configuration['coverage'].get('branch'), ) coverage_process.set_option('run:relative_files', 'true') coverage_process.set_option('run:plugins', ['erp5_coverage_plugin']) coverage_process.start() os.chdir(curdir) import Products Products.__path__[:0] = filter(None, os.getenv('INSERT_PRODUCTS_PATH', '').split(os.pathsep)) os.environ['ZOPE_SCRIPTS'] = '' os.environ['erp5_tests_bt5_path'] = ','.join( os.path.join(parts_directory, x, 'bt5') for x in repository_id_list) extra_path_list = '''${:extra-paths}'''.split() sys.path[:0] = sum(( glob.glob(os.path.join(x, 'tests')) for x in extra_path_list), []) sys.path[:0] = sum(( glob.glob(os.path.join(x, 'Products', '*', 'tests')) for x in extra_path_list), []) sys.path[:0] = sum(( glob.glob(os.path.join(x, 'Products', '*', 'tests')) for x in os.getenv('INSERT_PRODUCTS_PATH', '').split(os.pathsep)), []) import runUnitTest try: sys.exit(runUnitTest.main()) finally: if coverage_process: coverage_process.stop() coverage_process.save() # upload the coverage so that they can be combined from another machine upload_url = test_runner_configuration['coverage'].get('upload-url') if upload_url: import requests import time import uritemplate from six.moves.urllib.parse import urlparse auth_list = (None, ) parsed_url = urlparse(upload_url) if parsed_url.username: # try Digest and Basic authentication and retry 5 times to tolerate transiant errors auth_list = ( requests.auth.HTTPDigestAuth(parsed_url.username, parsed_url.password), requests.auth.HTTPBasicAuth(parsed_url.username, parsed_url.password), ) * 5 url = uritemplate.URITemplate(upload_url).expand( test_name=test_name, # Environment variables are set in parts/erp5/product/ERP5Type/tests/runTestSuite.py test_result_id=os.environ.get('ERP5_TEST_RESULT_ID', 'unknown_test_result_id'), test_result_revision=os.environ.get('ERP5_TEST_RESULT_REVISION', 'unknown_test_result_revision'), ) for auth in auth_list: with open(coverage_data_file, 'rb') as f: resp = requests.put(url, data=f, auth=auth) if resp.ok: # print just the hostname, not to include the auth part print('Uploaded coverage data to {parsed_url.hostname}'.format(parsed_url=parsed_url)) break print('Error {resp.status_code} uploading coverage data to {parsed_url.hostname} with {auth.__class__.__name__}'.format( resp=resp, parsed_url=parsed_url, auth=auth)) time.sleep(1) else: sys.stderr.write('Error uploading coverage data to {parsed_url.hostname}\n'.format(parsed_url=parsed_url)) [.coveragerc] recipe = slapos.recipe.template output = ${buildout:directory}/${:_buildout_section_name_} inline = # coverage configuration file, useful when making html report [run] plugins = erp5_coverage_plugin relative_files = true [test-suite-runner] # XXX: Workaround for fact ERP5Type is not an distribution and does not # expose entry point for test runner recipe = zc.recipe.egg eggs = ${eggs:eggs} extra-paths = ${eggs:extra-paths} entry-points = runTestSuite=Products.ERP5Type.tests.runTestSuite:main scripts = runTestSuite initialization = import os import sys import Products [Products.__path__.insert(0, p) for p in reversed(os.environ.get('INSERT_PRODUCTS_PATH', '').split(':')) if p] os.environ['ZOPE_SCRIPTS'] = '' repository_id_list = list(reversed('''${erp5_repository_list:repository_id_list}'''.split())) sys.path[0:0] = ['/'.join(['''${buildout:parts-directory}''', x]) for x in repository_id_list] [erp5-python-interpreter] <= python-interpreter # a python interpreter with all eggs available, usable for the software release but also # for external tools (such as python extension in theia). eggs += ${eggs:eggs} extra-paths += ${eggs:extra-paths} [erp5-python-interpreter-jupyter] <= erp5-python-interpreter interpreter = pythonwitheggs_jupyter interpreter_path = ${buildout:directory}/bin/${:interpreter} eggs += jupyter_client jupyter_core ipython_genutils ipykernel ipywidgets requests [zope-product-with-eggtestinfo] recipe = zc.recipe.egg:custom setup-eggs = eggtestinfo egg = ${:_buildout_section_name_} [Products.CMFUid] <= zope-product-with-eggtestinfo [Products.CMFActionIcons] <= zope-product-with-eggtestinfo [Products.CMFCalendar] <= zope-product-with-eggtestinfo [Products.CMFCore] <= zope-product-with-eggtestinfo [Products.CMFDefault] <= zope-product-with-eggtestinfo [Products.CMFTopic] <= zope-product-with-eggtestinfo [Products.DCWorkflow] <= zope-product-with-eggtestinfo Products.DCWorkflow-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.DCWorkflow/workflow_method-2.4.1.patch#ec7bb56a9f1d37fcbf960cd1e96e6e6d Products.DCWorkflow-patch-options = -p1 [Products.GenericSetup] <= zope-product-with-eggtestinfo [egg-with-zope-proxy] recipe = zc.recipe.egg:custom setup-eggs = zope.proxy egg = ${:_buildout_section_name_} [zope.security] <= egg-with-zope-proxy [zope.container] <= egg-with-zope-proxy setup-eggs += ${persistent:egg} [eggs] <= neoppod eggs = ${neoppod:eggs} ${caucase-eggs:eggs} ${wendelin.core:egg} ${numpy:egg} ${matplotlib:egg} ${lxml-python:egg} ${ocropy:egg} ${pandas:egg} ${pillow-python:egg} ${python-ldap-python:egg} ${python-xmlsec:egg} ${pysvn-python:egg} ${pycrypto-python:egg} ${scipy:egg} ${scikit-learn:egg} ${scikit-image:egg} sympy more-itertools ${h5py:egg} openpyxl ${statsmodels:egg} ${zbarlight:egg} lock_file astor APacheDEX PyStemmer Pympler SOAPpy chardet collective.recipe.template erp5diff interval ipdb Jinja2 jsonschema mechanize mock oauthlib objgraph ${python-pynacl:egg} ${bcrypt:egg} paramiko ply pyflakes PyPDF2 python-magic python-memcached pytz requests responses urlnorm uuid xml_marshaller xupdate_processor feedparser validictory erp5.util z3c.etestbrowser huBarcode qrcode spyne httplib2 suds pprofile pycountry xfw jsonschema selenium pytesseract decorator networkx # Needed for checking ZODB Components source code ${astroid:egg} ${pylint:egg} jedi yapf typing pytracemalloc xlrd # Zope ${zope.security:egg} ${zope.container:egg} Zope2 ${tempstorage:egg} # Zope acquisition patch Acquisition # for runzeo ${ZEO:egg} # Other Zope 2 packages Products.PluggableAuthService Products.PluginRegistry # CMF 2.3 ${Products.CMFCore:egg} ${Products.DCWorkflow:egg} ${Products.GenericSetup:egg} # Other products Products.MimetypesRegistry Products.TIDStorage # BBB: Temporarily keep zope.app.testing awaiting we use newer version of CMF # (for tests like testCookieCrumbler). zope.app.testing # Currently forked in our repository # Products.PortalTransforms # Dependency for our fork of PortalTransforms StructuredText # Needed for parsing .po files from our Localizer subset polib # Needed for Google OAuth google-api-python-client # Need for Facebook OAuth facebook-sdk # Used by ERP5 Jupyter backend ipykernel # Used by DiffTool deepdiff unidiff # WSGI server zope.globalrequest waitress # OpenId Connect oic # json schema validation strict-rfc3339 jsonschema[format] # Used by zope4 docutils zLOG Products.ZSQLMethods ZServer Products.ExternalMethod Products.SiteErrorLog tempstorage Products.DCWorkflow Products.Sessions Products.ZODBMountPoint Record haufe.requestmonitoring # StructuredText Zope # Python3 ${my2to3-dev:egg} entry-points = runwsgi=Products.ERP5.bin.zopewsgi:runwsgi scripts = apachedex performance_tester_erp5 runwsgi runzope runzeo tidstoraged tidstorage_repozo wcfs web_checker_utility extra-paths = ${erp5:location} # patches for eggs patch-binary = ${patch:location}/bin/patch PyPDF2-patches = ${:_profile_base_location_}/../../component/egg-patch/PyPDF2/0001-Custom-implementation-of-warnings.formatwarning-remo.patch#d25bb0f5dde7f3337a0a50c2f986f5c8 PyPDF2-patch-options = -p1 Acquisition-patches = ${:_profile_base_location_}/../../component/egg-patch/Acquisition/aq_dynamic-4.7.patch#85b0090e216cead0fc86c5c274450d96 Acquisition-patch-options = -p1 python-magic-patches = ${:_profile_base_location_}/../../component/egg-patch/python_magic/magic.patch#de0839bffac17801e39b60873a6c2068 python-magic-patch-options = -p1 # backported security patches for waitress-1.4.4 from Debian 1.4.4-1.1+deb11u1 package. waitress-patches = ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-1.patch#a0508880f24662e48a20ce3bcbf440c2 ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-2.patch#1ff77cede06d5bc39a9891d3647708a2 ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-3.patch#8bab78102e0c2966f6bcafde7819ea8e ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-4.patch#d752ca3ac251ebfaf36c667b28744c20 ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-5.patch#ad2765822397cd1e28e02a68a52d7768 ${:_profile_base_location_}/../../component/egg-patch/waitress/CVE-2022-24761-6.patch#85fc9c4105eabee3ff71c800b2ddf63b waitress-patch-options = -p1 # neoppod installs bin/coverage so we inject erp5 plugin here so that coverage script can use it in report [neoppod] eggs += erp5_coverage_plugin [eggs-all-scripts] recipe = zc.recipe.egg eggs = munnel patch-binary = ${eggs:patch-binary} # develop erp5.util from parts/erp5/ [erp5-util-develop] recipe = zc.recipe.egg:develop setup = ${erp5:location} [zodbpack] recipe = zc.recipe.egg eggs = slapos.toolbox[zodbpack] scripts = zodbpack depends = ${slapos-toolbox-dependencies:eggs} [my2to3-repository] recipe = slapos.recipe.build:gitclone repository = https://lab.nexedi.com/nexedi/my2to3.git branch = master git-executable = ${git:location}/bin/git develop = true [my2to3-dev] recipe = zc.recipe.egg:develop egg = my2to3 setup = ${my2to3-repository:location} [versions] # See ../../software/neoppod/software-common.cfg for versions common with NEO: # neoppod, mysqlclient, slapos.recipe.template # patched eggs Acquisition = 4.7+SlapOSPatched001 Products.DCWorkflow = 2.4.1+SlapOSPatched001 ocropy = 1.0+SlapOSPatched001 pysvn = 1.9.15+SlapOSPatched001 python-ldap = 2.4.32+SlapOSPatched001 python-magic = 0.4.12+SlapOSPatched001 PyPDF2 = 1.26.0+SlapOSPatched001 waitress = 1.4.4+SlapOSPatched006 ## https://lab.nexedi.com/nexedi/slapos/merge_requests/648 pylint = 1.4.4+SlapOSPatched002 # astroid 1.4.1 breaks testDynamicClassGeneration astroid = 1.3.8+SlapOSPatched001 argparse = 1.4.0 # modified version that works fine for buildout installation SOAPpy = 0.12.0nxd001 # CMF 2.3 is not yet supported. #Products.CMFCore = 2.2.10 # newer version requires zope.traversing>=4.0.0a2. zope.app.appsetup = 3.16.0 # newer version requires zope.i18n>=4.0.0a3 zope.app.publication = 3.14.0 # newer version requires zope.testbrowser>=4 zope.app.testing = 3.8.1 # Pinned versions APacheDEX = 1.8 Pillow = 6.2.2 Products.CMFActionIcons = 2.1.3 Products.GenericSetup = 1.8.6 haufe.requestmonitoring = 0.6.0 Products.MimetypesRegistry = 2.1.8 Products.PluggableAuthService = 2.3 Products.PluginRegistry = 1.6 Products.TIDStorage = 5.5.0 pyPdf = 1.13 PyStemmer = 1.3.0 Pympler = 0.4.3 StructuredText = 2.11.1 WSGIUtils = 0.7 erp5-coverage-plugin = 0.0.1 erp5diff = 0.8.1.8 five.formlib = 1.0.4 google-api-python-client = 1.6.1 httplib2 = 0.10.3 huBarcode = 1.0.0 interval = 1.0.0 ipdb = 0.10.2 logilab-common = 1.3.0 munnel = 0.3 nt-svcutils = 2.13.0 oauth2client = 4.0.0 oauthlib = 3.1.0 objgraph = 3.1.0 polib = 1.0.8 pprofile = 2.0.4 pyasn1-modules = 0.0.8 pycountry = 17.1.8 pycrypto = 2.6.1 pyflakes = 1.5.0 python-memcached = 1.58 pytracemalloc = 1.2 qrcode = 5.3 rsa = 3.4.2 spyne = 2.12.14 suds = 0.4 facebook-sdk = 2.0.0 urlnorm = 1.1.4 uuid = 1.30 validictory = 1.1.0 xfw = 0.10 xupdate-processor = 0.5 selenium = 3.14.1 scikit-image = 0.14.0 PyWavelets = 0.5.2 networkx = 2.1 pytesseract = 0.2.2 zbarlight = 2.3 cloudpickle = 0.5.3 dask = 0.18.1 toolz = 0.9.0 fpconst = 0.7.2 graphviz = 0.5.2 olefile = 0.44 python-libmilter = 1.0.3 zope.app.debug = 3.4.1 zope.app.dependable = 3.5.1 zope.app.form = 4.0.2 mpmath = 0.19 openpyxl = 2.4.8 jdcal = 1.3 deepdiff = 3.3.0 unidiff = 0.5.5 jsonpickle = 0.9.6 responses = 0.10.6 cookies = 2.2.1 jedi = 0.15.1 parso = 0.5.1 yapf = 0.28.0 z3c.etestbrowser = 3.0.1 zope.testbrowser = 5.5.1 WSGIProxy2 = 0.4.6 WebTest = 2.0.33 beautifulsoup4 = 4.8.2 WebOb = 1.8.5 soupsieve = 1.9.5 eggtestinfo = 0.3 oic = 0.15.1 Beaker = 1.11.0 Mako = 1.1.4 pyjwkest = 1.4.2 alabaster = 0.7.12 future = 0.18.2 pycryptodomex = 3.10.1 strict-rfc3339 = 0.7 webcolors = 1.10 rfc3987 = 1.3.8 jsonpointer = 2.2 pandas = 0.19.2 numpy = 1.13.1 scipy = 0.19.0 # WIP Zope 4 ⚠ Products.CMFCore = 2.6.0 Products.StandardCacheManagers = 4.1.0 Products.ExternalMethod = 4.5 Products.GenericSetup = 2.1.5 Products.PythonScripts = 4.13 Products.MailHost = 4.11 Products.Sessions = 4.14 Products.SiteErrorLog = 5.6 Products.ZSQLMethods = 3.14 Products.ZODBMountPoint = 1.2 html5lib = 1.1 zLOG = 3.1 zope.password = 4.4 zope.error = 4.6 zope.authentication = 4.5.0 zope.session = 4.5 zope.minmax = 2.3 # XXX do we need ? mechanize = 0.4.8 webencodings = 0.5.1