[buildout]

extends =
# versions pins from zope, vendored with:
#   curl https://zopefoundation.github.io/Zope/releases/4.8.9/versions-prod.cfg > zope-versions.cfg
# When updating, keep in mind that some versions are defined in other places,
# for example component/ZEO , component/ZODB and stack/slapos
  zope-versions.cfg
  ../slapos.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/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/pytracemalloc/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/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/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
  ../../component/selenium/buildout.cfg
  ../../stack/caucase/buildout.cfg
  ../../software/neoppod/software-common.cfg
# keep neoppod extends last

parts +=
  erp5-util-develop
  slapos-cookbook
  mroonga-mariadb
  tesseract
  .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_list erp5-defaults:cloudooo-connection-url-list
    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 with_max_rlimit_nofile_enable_default erp5-defaults:with-max-rlimit-nofile-enable-default
    key kumo_location kumo:location
    key local_bt5_repository local-bt5-repository:list
    key default_bt5 default-bt5: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:exe
    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
  ${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
  ${coreutils:location}/bin/shuf
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

[default-bt5]
list =
  erp5_full_text_mroonga_catalog
  erp5_configurator_standard
  erp5_configurator_maxma_demo
  erp5_configurator_run_my_doc

[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]
# Default cloudooo is https://cloudooo.erp5.net/ and  https://cloudooo1.erp5.net/ in random order.
# The random order is applied in instance profile
cloudooo-connection-url-list =
  https://cloudooo.erp5.net/
  https://cloudooo1.erp5.net/
# Jupyter is by default disabled in ERP5
jupyter-enable-default = false
# WCFS is by default disabled in ERP5
wcfs-enable-default = false
# with-max-rlimit-nofile option of zopewsgi is disabled in ERP5
with-max-rlimit-nofile-enable-default = false

[erp5]
recipe = slapos.recipe.build:gitclone
repository = https://lab.nexedi.com/nexedi/erp5.git
branch = master
git-executable = ${git:location}/bin/git

[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
eggs +=
  jupyter_client
  jupyter_core
  ipython_genutils
  ipykernel
  ipywidgets
  requests


[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}
  ${python-PyYAML: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
  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:egg}
  pytesseract
  decorator
  networkx
# Needed for checking ZODB Components source code
  ${astroid:egg}
  ${pylint:egg}
  jedi
  yapf
  typing
# Used for Python 2 only
  ${pytracemalloc:egg}
  xlrd
  pydot

# 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.DCWorkflow

# Other products
  Products.MimetypesRegistry
  Products.TIDStorage

# 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
  Zope

entry-points =
  runwsgi=Products.ERP5.bin.zopewsgi:runwsgi
scripts =
  apachedex
  performance_tester_erp5
  runwsgi
  runzeo
  tidstoraged
  tidstorage_repozo
  wcfs
  web_checker_utility

extra-paths =
  ${erp5:location}

# patches for eggs
patch-binary = ${patch:location}/bin/patch
Acquisition-patches = ${:_profile_base_location_}/../../component/egg-patch/Acquisition/aq_dynamic-4.7.patch#85b0090e216cead0fc86c5c274450d96
Acquisition-patch-options = -p1
DateTime-patches =
  ${:_profile_base_location_}/../../component/egg-patch/DateTime/0001-Cast-int-to-float-in-compare-methods.patch#9898a58ce90dd31c884a7183aeec4361
  ${:_profile_base_location_}/../../component/egg-patch/DateTime/0002-Fix-compare-methods-between-DateTime-0-and-None-fix-.patch#733903a564c8b14df65c45c4f2eec262
  ${:_profile_base_location_}/../../component/egg-patch/DateTime/0003-Make-it-possible-to-pickle-datetimes-returned-by-asd.patch#e94a71ef40de130720e621e296537000
  ${:_profile_base_location_}/../../component/egg-patch/DateTime/0004-Repair-equality-comparison-between-DateTime-instance.patch#ea146c00dfbc31c7d96af8abc6f0b301
DateTime-patch-options = -p1
Products.BTreeFolder2-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.BTreeFolder2/0001-Add-a-confirmation-prompt-on-Delete-All-Objects-butt.patch#44de3abf382e287b8766c2f29ec1cf74
Products.BTreeFolder2-patch-options = -p1
Products.CMFCore-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.CMFCore/portal_skins_ZMI_find.patch#19ec05c0477c50927ee1df6eb75d1e7f
Products.CMFCore-patch-options = -p1
Products.DCWorkflow-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.DCWorkflow/workflow_method-2.4.1.patch#ec7bb56a9f1d37fcbf960cd1e96e6e6d
Products.DCWorkflow-patch-options = -p1
PyPDF2-patches =
  ${:_profile_base_location_}/../../component/egg-patch/PyPDF2/0001-Custom-implementation-of-warnings.formatwarning-remo.patch#d25bb0f5dde7f3337a0a50c2f986f5c8
  ${:_profile_base_location_}/../../component/egg-patch/PyPDF2/0002-fix-pdf-reader-getting-stuck-when-trying-to-read-lar.patch#c06a29b6b6a5df612ae36731b938fb95
PyPDF2-patch-options = -p1
python-magic-patches = ${:_profile_base_location_}/../../component/egg-patch/python_magic/magic.patch#de0839bffac17801e39b60873a6c2068
python-magic-patch-options = -p1
RestrictedPython-patches = ${:_profile_base_location_}/../../component/egg-patch/RestrictedPython/0001-compile-implicitly-enable-__future__.print_function-.patch#f746dccbf3b462e67386490b898512e4
RestrictedPython-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
Zope-patches =
  ${:_profile_base_location_}/../../component/egg-patch/Zope/0001-WSGIPublisher-set-REMOTE_USER-even-in-case-of-error-.patch#a437f4da28975f94dd07db0b02954111
  ${:_profile_base_location_}/../../component/egg-patch/Zope/0001-Fix-redirections-to-URLS-with-host-given-as-IP-litte.patch#093ad5755094d537c6a4deadc959ade0
Zope-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}

[versions]
# See ../../software/neoppod/software-common.cfg for versions common with NEO:
#  neoppod, mysqlclient, slapos.recipe.template

# patched eggs
Acquisition = 4.7+SlapOSPatched001
DateTime = 4.9+SlapOSPatched004
Products.DCWorkflow = 2.4.1+SlapOSPatched001
ocropy = 1.0+SlapOSPatched001
PyPDF2 = 1.26.0+SlapOSPatched002
pysvn = 1.9.15+SlapOSPatched001
python-ldap = 2.4.32+SlapOSPatched001
python-magic = 0.4.12+SlapOSPatched001
RestrictedPython = 5.4+SlapOSPatched001
waitress = 1.4.4+SlapOSPatched006
Zope = 4.8.9+SlapOSPatched002
## 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

# modified version that works fine for buildout installation
SOAPpy = 0.12.0nxd001


# Pinned versions
alabaster = 0.7.12
APacheDEX = 1.8
Beaker = 1.11.0
cloudpickle = 0.5.3
cookies = 2.2.1
dask = 0.18.1
deepdiff = 3.3.0
docutils = 0.17.1
erp5-coverage-plugin = 0.0.1
erp5diff = 0.8.1.9
facebook-sdk = 2.0.0
five.formlib = 1.0.4
fpconst = 0.7.2
future = 0.18.2
google-api-python-client = 1.6.1
graphviz = 0.5.2
haufe.requestmonitoring = 0.6.0
html5lib = 1.1
huBarcode = 1.0.0
interval = 1.0.0
ipdb = 0.10.2
jdcal = 1.3
jedi = 0.15.1
jsonpickle = 0.9.6
jsonpointer = 2.2
logilab-common = 1.3.0
Mako = 1.1.4
mechanize = 0.4.8
mpmath = 0.19
munnel = 0.3
networkx = 2.1
nt-svcutils = 2.13.0
numpy = 1.13.1
oauth2client = 4.0.0
oauthlib = 3.1.0
objgraph = 3.1.0
oic = 0.15.1
olefile = 0.44
openpyxl = 2.4.8
parso = 0.5.1
Pillow = 6.2.2
polib = 1.0.8
pprofile = 2.0.4
Products.BTreeFolder2 = 4.4+SlapOSPatched001
Products.CMFCore = 2.7.0+SlapOSPatched001
Products.ExternalMethod = 4.7
Products.GenericSetup = 2.3.0
Products.MailHost = 4.13
Products.MimetypesRegistry = 2.1.8
Products.PluggableAuthService = 2.8.1
Products.PluginRegistry = 1.11
Products.PythonScripts = 4.15
Products.Sessions = 4.15
Products.SiteErrorLog = 5.7
Products.StandardCacheManagers = 4.2
Products.TIDStorage = 5.5.0
Products.ZODBMountPoint = 1.3
Products.ZSQLMethods = 3.16
pyasn1-modules = 0.0.8
pycountry = 17.1.8
pycrypto = 2.6.1
pycryptodomex = 3.10.1
pydot = 1.4.2
pyflakes = 1.5.0
pyjwkest = 1.4.2
Pympler = 0.4.3
pyPdf = 1.13
PyStemmer = 1.3.0
pytesseract = 0.2.2
python-gettext = 4.1
python-libmilter = 1.0.3
python-memcached = 1.58
pytracemalloc = 1.2
PyWavelets = 0.5.2
qrcode = 5.3
responses = 0.10.6
rfc3987 = 1.3.8
rsa = 3.4.2
scikit-image = 0.14.0
scipy = 0.19.0
spyne = 2.12.14
strict-rfc3339 = 0.7
StructuredText = 2.11.1
suds = 0.4
toolz = 0.9.0
typing = 3.10.0.0
unidiff = 0.5.5
urlnorm = 1.1.4
uuid = 1.30
validictory = 1.1.0
webcolors = 1.10
webencodings = 0.5.1
WebOb = 1.8.5
WebTest = 2.0.33
WSGIProxy2 = 0.4.6
WSGIUtils = 0.7
xfw = 0.10
xupdate-processor = 0.5
yapf = 0.28.0
z3c.etestbrowser = 3.0.1
zbarlight = 2.3
zLOG = 3.1
zope.app.appsetup = 4.2.0
zope.app.debug = 3.4.1
zope.app.dependable = 3.5.1
zope.app.form = 5.1.0
zope.app.publication = 4.5
zope.app.testing = 4.0.0
zope.authentication = 5.0
zope.error = 4.6
zope.minmax = 2.3
zope.password = 4.4
zope.session = 4.5
zope.testbrowser = 5.5.1
