⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286576 in webkit


Ignore:
Timestamp:
Dec 6, 2021, 4:18:20 PM (5 years ago)
Author:
Jonathan Bedard
Message:

[reporelaypy] Add implementation of commits.webkit.org
https://bugs.webkit.org/show_bug.cgi?id=233734
<rdar://problem/85945101>

Reviewed by Dewei Zhu.

As commits.webkit.org becomes more important to WebKit development, we need to apply
our normal robust testing and review to the code backing it.

  • Tools/Scripts/libraries/reporelaypy/reporelaypy/init.py: Add entrypoint to library.
  • Tools/Scripts/libraries/reporelaypy/reporelaypy/checkout.py: Added.

(Checkout): Abstraction managing local repository checkout.

  • Tools/Scripts/libraries/reporelaypy/reporelaypy/checkoutroute.py: Added.

(Redirector): Generates redirects for certain SCM services.
(CheckoutRoute): http routes returning information based on a checkout.

  • Tools/Scripts/libraries/reporelaypy/reporelaypy/database.py: Added.

(Database): A connection to a true Redis or TinyRedis database.

  • Tools/Scripts/libraries/reporelaypy/reporelaypy/tests/checkout_unittest.py:

(CheckoutUnittest):

  • Tools/Scripts/libraries/reporelaypy/reporelaypy/tests/checkoutroute_unittest.py: Added.

(RedirectorUnittest):
(CheckoutRouteUnittest):

  • Tools/Scripts/libraries/reporelaypy/reporelaypy/tests/database_unittest.py: Added.

(DatabaseUnittest):

  • Tools/Scripts/libraries/reporelaypy/reporelaypy/webserver.py: Copied from Tools/Scripts/libraries/webkitflaskpy/setup.py.

(health):

  • Tools/Scripts/libraries/reporelaypy/run: Added.
  • Tools/Scripts/libraries/reporelaypy/setup.py: Added.
  • Tools/Scripts/libraries/resultsdbpy/resultsdbpy/init.py: Bump version.
  • Tools/Scripts/libraries/resultsdbpy/resultsdbpy/flask_support/flask_testcase.py:

(FlaskTestCase.run_with_mock_webserver.decorator.real_method):
(FlaskRequestsResponse): Moved to webkitflaskpy.

  • Tools/Scripts/libraries/webkitflaskpy/setup.py: Bump version, update library description.
  • Tools/Scripts/libraries/webkitflaskpy/webkitflaskpy/init.py: Bump version.
  • Tools/Scripts/libraries/webkitflaskpy/webkitflaskpy/mock_app.py: Added.

(mock_app): Setup a flask app for testing.

  • Tools/Scripts/libraries/webkitflaskpy/webkitflaskpy/response.py: Added.

(Response): Move FlaskRequestsResponse to more generic location.

  • Tools/Scripts/webkitpy/init.py: Include reporelaypy for testing.
  • Tools/Scripts/webkitpy/test/main.py:

(main): Include reporelaypy for testing.
(Tester._run_tests): Ditto.

Canonical link: https://commits.webkit.org/244901@main

Location:
trunk/Tools
Files:
9 added
8 edited
6 copied

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r286569 r286576  
     12021-12-04  Jonathan Bedard  <jbedard@apple.com>
     2
     3        [reporelaypy] Add implementation of commits.webkit.org
     4        https://bugs.webkit.org/show_bug.cgi?id=233734
     5        <rdar://problem/85945101>
     6
     7        Reviewed by Dewei Zhu.
     8
     9        As commits.webkit.org becomes more important to WebKit development, we need to apply
     10        our normal robust testing and review to the code backing it.
     11
     12        * Scripts/libraries/reporelaypy/reporelaypy/__init__.py: Add entrypoint to library.
     13        * Scripts/libraries/reporelaypy/reporelaypy/checkout.py: Added.
     14        (Checkout): Abstraction managing local repository checkout.
     15        * Scripts/libraries/reporelaypy/reporelaypy/checkoutroute.py: Added.
     16        (Redirector): Generates redirects for certain SCM services.
     17        (CheckoutRoute): http routes returning information based on a checkout.
     18        * Scripts/libraries/reporelaypy/reporelaypy/database.py: Added.
     19        (Database): A connection to a true Redis or TinyRedis database.
     20        * Scripts/libraries/reporelaypy/reporelaypy/tests/checkout_unittest.py:
     21        (CheckoutUnittest):
     22        * Scripts/libraries/reporelaypy/reporelaypy/tests/checkoutroute_unittest.py: Added.
     23        (RedirectorUnittest):
     24        (CheckoutRouteUnittest):
     25        * Scripts/libraries/reporelaypy/reporelaypy/tests/database_unittest.py: Added.
     26        (DatabaseUnittest):
     27        * Scripts/libraries/reporelaypy/reporelaypy/webserver.py: Copied from Tools/Scripts/libraries/webkitflaskpy/setup.py.
     28        (health):
     29        * Scripts/libraries/reporelaypy/run: Added.
     30        * Scripts/libraries/reporelaypy/setup.py: Added.
     31        * Scripts/libraries/resultsdbpy/resultsdbpy/__init__.py: Bump version.
     32        * Scripts/libraries/resultsdbpy/resultsdbpy/flask_support/flask_testcase.py:
     33        (FlaskTestCase.run_with_mock_webserver.decorator.real_method):
     34        (FlaskRequestsResponse): Moved to webkitflaskpy.
     35        * Scripts/libraries/webkitflaskpy/setup.py: Bump version, update library description.
     36        * Scripts/libraries/webkitflaskpy/webkitflaskpy/__init__.py: Bump version.
     37        * Scripts/libraries/webkitflaskpy/webkitflaskpy/mock_app.py: Added.
     38        (mock_app): Setup a flask app for testing.
     39        * Scripts/libraries/webkitflaskpy/webkitflaskpy/response.py: Added.
     40        (Response): Move FlaskRequestsResponse to more generic location.
     41        * Scripts/webkitpy/__init__.py: Include reporelaypy for testing.
     42        * Scripts/webkitpy/test/main.py:
     43        (main): Include reporelaypy for testing.
     44        (Tester._run_tests): Ditto.
     45
    1462021-12-06  Ryan Haddad  <ryanhaddad@apple.com>
    247
  • trunk/Tools/Scripts/libraries/reporelaypy/reporelaypy/__init__.py

    r286574 r286576  
    1 # Copyright (C) 2020 Apple Inc. All rights reserved.
     1# Copyright (C) 2021 Apple Inc. All rights reserved.
    22#
    33# Redistribution and use in source and binary forms, with or without
     
    2525
    2626
    27 def _maybe_add_webkitcorepy_path():
    28     # Hopefully we're beside webkitcorepy, otherwise webkitcorepy will need to be installed.
     27def _maybe_add_webkit_python_library_paths():
     28    # Hopefully we're beside webkit*py libraries, otherwise webkit*py will need to be installed.
    2929    libraries_path = os.path.dirname(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
    30     webkitcorepy_path = os.path.join(libraries_path, 'webkitcorepy')
    31     if os.path.isdir(webkitcorepy_path) and os.path.isdir(os.path.join(webkitcorepy_path, 'webkitcorepy')) and webkitcorepy_path not in sys.path:
    32         sys.path.insert(0, webkitcorepy_path)
     30    for library in ['webkitcorepy', 'webkitscmpy', 'webkitflaskpy']:
     31        library_path = os.path.join(libraries_path, library)
     32        if os.path.isdir(library_path) and os.path.isdir(os.path.join(library_path, library)) and library_path not in sys.path:
     33            sys.path.insert(0, library_path)
    3334
    3435
    35 _maybe_add_webkitcorepy_path()
     36_maybe_add_webkit_python_library_paths()
    3637
    3738try:
     
    4445    )
    4546
    46 version = Version(0, 2, 0)
     47version = Version(0, 1, 0)
    4748
    48 AutoInstall.register(Package('click', Version(7, 1, 2)))
    49 AutoInstall.register(Package('flask', Version(1, 1, 2)))
    50 AutoInstall.register(Package('itsdangerous', Version(1, 1, 0)))
    51 AutoInstall.register(Package('jinja2', Version(2, 11, 3)))
    52 AutoInstall.register(Package('markupsafe', Version(1, 1, 1)))
    53 AutoInstall.register(Package('werkzeug', Version(1, 0, 1)))
     49import webkitflaskpy
    5450
    55 from webkitflaskpy.authed_blueprint import AuthedBlueprint  # noqa: E402
     51from reporelaypy.checkout import Checkout
     52from reporelaypy.database import Database
     53from reporelaypy.checkoutroute import CheckoutRoute, Redirector
    5654
    57 name = 'webkitflaskpy'
     55AutoInstall.register(Package('fakeredis', Version(1, 5, 2)))
     56AutoInstall.register(Package('hiredis', Version(1, 1, 0)))
     57AutoInstall.register(Package('redis', Version(3, 5, 3)))
     58
     59name = 'reporelaypy'
  • trunk/Tools/Scripts/libraries/reporelaypy/reporelaypy/tests/checkout_unittest.py

    r286574 r286576  
    1 # Copyright (C) 2020 Apple Inc. All rights reserved.
     1# Copyright (C) 2021 Apple Inc. All rights reserved.
    22#
    33# Redistribution and use in source and binary forms, with or without
     
    2121# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2222
    23 from setuptools import setup
     23import os
     24import unittest
     25
     26from reporelaypy import Checkout
     27from webkitcorepy import testing, OutputCapture
     28from webkitscmpy import mocks
    2429
    2530
    26 def readme():
    27     with open('README.md') as f:
    28         return f.read()
     31class CheckoutUnittest(testing.PathTestCase):
     32    basepath = 'mock/repository'
    2933
     34    def setUp(self):
     35        super(CheckoutUnittest, self).setUp()
     36        os.mkdir(os.path.join(self.path, '.git'))
    3037
    31 setup(
    32     name='webkitflaskpy',
    33     version='0.2.0',
    34     description='Library for visualizing, processing and storing test results.',
    35     long_description=readme(),
    36     classifiers=[
    37         'Development Status :: 4 - Beta',
    38         'Framework :: Flask',
    39         'Intended Audience :: Developers',
    40         'License :: OSI Approved :: BSD License',
    41         'Operating System :: MacOS',
    42         'Natural Language :: English',
    43         'Programming Language :: Python :: 3 :: Only',
    44         'Topic :: Software Development :: Libraries :: Python Modules',
    45         'Topic :: Software Development :: Testing',
    46     ],
    47     keywords='web javascript webkit',
    48     url='https://github.com/WebKit/WebKit/tree/main/Tools/Scripts/libraries/webkitflaskpy',
    49     author='Jonathan Bedard',
    50     author_email='jbedard@apple.com',
    51     license='Modified BSD',
    52     packages=[
    53         'webkitflaskpy',
    54     ],
    55     install_requires=[
    56         'Flask',
    57         'Flask-Cors',
    58         'gunicorn',
    59         'webkitcorepy',
    60     ],
    61     include_package_data=True,
    62     zip_safe=False,
    63 )
     38    def test_constructor_sentinal(self):
     39        with mocks.local.Git(self.path) as repo, OutputCapture():
     40            with open(os.path.join(os.path.dirname(self.path), 'cloned'), 'w') as sentinal:
     41                sentinal.write('yes\n')
     42            Checkout(path=self.path, url=repo.remote, sentinal=True)
     43
     44    def test_constructor_no_sentinal(self):
     45        with mocks.local.Git(self.path) as repo:
     46            Checkout(path=self.path, url=repo.remote, sentinal=False)
     47
     48            with self.assertRaises(Checkout.Exception):
     49                Checkout(path=self.path, url=None, sentinal=True)
  • trunk/Tools/Scripts/libraries/reporelaypy/reporelaypy/webserver.py

    r286574 r286576  
    1 # Copyright (C) 2020 Apple Inc. All rights reserved.
     1# Copyright (C) 2021 Apple Inc. All rights reserved.
    22#
    33# Redistribution and use in source and binary forms, with or without
     
    2121# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2222
    23 from setuptools import setup
     23import os
     24
     25autoinstall_path = os.environ.get('AUTOINSTALL_PATH')
     26if autoinstall_path:
     27    from webkitcorepy import AutoInstall
     28    AutoInstall.set_directory(autoinstall_path)
     29
     30from flask import Flask, current_app, json as fjson
     31from reporelaypy import Checkout, CheckoutRoute, Database, Redirector
     32
     33app = Flask(__name__)
     34
     35database = Database()
     36checkout = Checkout.from_json(os.environ.get('CHECKOUT', '{}'))
     37checkout_routes = CheckoutRoute(
     38    checkout, redirectors=Redirector.from_json(os.environ.get('REDIRECTORS', '[]')),
     39    import_name=__name__, database=database,
     40)
    2441
    2542
    26 def readme():
    27     with open('README.md') as f:
    28         return f.read()
     43@app.route('/__health')
     44def health():
     45    return 'ready' if checkout.repository else 'cloning'
    2946
    3047
    31 setup(
    32     name='webkitflaskpy',
    33     version='0.2.0',
    34     description='Library for visualizing, processing and storing test results.',
    35     long_description=readme(),
    36     classifiers=[
    37         'Development Status :: 4 - Beta',
    38         'Framework :: Flask',
    39         'Intended Audience :: Developers',
    40         'License :: OSI Approved :: BSD License',
    41         'Operating System :: MacOS',
    42         'Natural Language :: English',
    43         'Programming Language :: Python :: 3 :: Only',
    44         'Topic :: Software Development :: Libraries :: Python Modules',
    45         'Topic :: Software Development :: Testing',
    46     ],
    47     keywords='web javascript webkit',
    48     url='https://github.com/WebKit/WebKit/tree/main/Tools/Scripts/libraries/webkitflaskpy',
    49     author='Jonathan Bedard',
    50     author_email='jbedard@apple.com',
    51     license='Modified BSD',
    52     packages=[
    53         'webkitflaskpy',
    54     ],
    55     install_requires=[
    56         'Flask',
    57         'Flask-Cors',
    58         'gunicorn',
    59         'webkitcorepy',
    60     ],
    61     include_package_data=True,
    62     zip_safe=False,
    63 )
     48app.register_blueprint(checkout_routes)
     49
     50
     51if __name__ == '__main__':
     52    port = int(os.environ.get('PORT', 5000))
     53    app.run(host='0.0.0.0', port=port)
  • trunk/Tools/Scripts/libraries/reporelaypy/setup.py

    r286574 r286576  
    1 # Copyright (C) 2020 Apple Inc. All rights reserved.
     1# Copyright (C) 2021 Apple Inc. All rights reserved.
    22#
    33# Redistribution and use in source and binary forms, with or without
     
    3030
    3131setup(
    32     name='webkitflaskpy',
    33     version='0.2.0',
     32    name='reporelaypy',
     33    version='0.1.0',
    3434    description='Library for visualizing, processing and storing test results.',
    3535    long_description=readme(),
     
    4343        'Programming Language :: Python :: 3 :: Only',
    4444        'Topic :: Software Development :: Libraries :: Python Modules',
    45         'Topic :: Software Development :: Testing',
     45        'Topic :: Software Development :: Version Control :: Git',
    4646    ],
    47     keywords='web javascript webkit',
    48     url='https://github.com/WebKit/WebKit/tree/main/Tools/Scripts/libraries/webkitflaskpy',
     47    keywords='git hook mirror webkit',
     48    url='https://github.com/WebKit/WebKit/tree/main/Tools/Scripts/libraries/reporelaypy',
    4949    author='Jonathan Bedard',
    5050    author_email='jbedard@apple.com',
    5151    license='Modified BSD',
    5252    packages=[
    53         'webkitflaskpy',
     53        'reporelaypy',
     54        'reporelaypy.test',
    5455    ],
    5556    install_requires=[
    56         'Flask',
    57         'Flask-Cors',
    58         'gunicorn',
     57        'fakeredis',
     58        'redis',
     59        'xmltodict',
    5960        'webkitcorepy',
     61        'webkitscmpy',
     62        'webkitflaskpy',
    6063    ],
    6164    include_package_data=True,
  • trunk/Tools/Scripts/libraries/resultsdbpy/resultsdbpy/__init__.py

    r286074 r286576  
    4545    )
    4646
    47 version = Version(3, 1, 5)
     47version = Version(3, 1, 6)
    4848
    4949import webkitflaskpy
  • trunk/Tools/Scripts/libraries/resultsdbpy/resultsdbpy/flask_support/flask_testcase.py

    r273834 r286576  
    2222
    2323import atexit
    24 import json
    2524import os
    2625import requests
     
    2827
    2928from flask import Flask
    30 from flask.wrappers import Response
    3129from selenium import webdriver
    3230from selenium.common.exceptions import WebDriverException
    3331from resultsdbpy.flask_support.flask_test_context import FlaskTestContext
    34 
    35 
    36 class FlaskRequestsResponse(Response):
    37     @property
    38     def text(self):
    39         return self.data.decode('utf-8')
    40 
    41     @property
    42     def content(self):
    43         return self.data
    44 
    45     def json(self):
    46         return json.loads(self.text)
     32from webkitflaskpy import Response
    4733
    4834
     
    10591            def real_method(val, method=method, **kwargs):
    10692                app = Flask('testing')
    107                 app.response_class = FlaskRequestsResponse
     93                app.response_class = Response
    10894                app.config['TESTING'] = True
    10995                val.setup_webserver(app, **kwargs)
  • trunk/Tools/Scripts/libraries/resultsdbpy/setup.py

    r286074 r286576  
    3131setup(
    3232    name='resultsdbpy',
    33     version='3.1.5',
     33    version='3.1.6',
    3434    description='Library for visualizing, processing and storing test results.',
    3535    long_description=readme(),
  • trunk/Tools/Scripts/libraries/webkitflaskpy/setup.py

    r286074 r286576  
    3131setup(
    3232    name='webkitflaskpy',
    33     version='0.2.0',
    34     description='Library for visualizing, processing and storing test results.',
     33    version='0.3.0',
     34    description="Library supporting the WebKit Team's flask based web services.",
    3535    long_description=readme(),
    3636    classifiers=[
  • trunk/Tools/Scripts/libraries/webkitflaskpy/webkitflaskpy/__init__.py

    r286217 r286576  
    4444    )
    4545
    46 version = Version(0, 2, 0)
     46version = Version(0, 3, 0)
    4747
    4848AutoInstall.register(Package('click', Version(7, 1, 2)))
     
    5454
    5555from webkitflaskpy.authed_blueprint import AuthedBlueprint  # noqa: E402
     56from webkitflaskpy.response import Response
     57from webkitflaskpy.mock_app import mock_app
    5658
    5759name = 'webkitflaskpy'
  • trunk/Tools/Scripts/libraries/webkitflaskpy/webkitflaskpy/mock_app.py

    r286574 r286576  
    1 # Copyright (C) 2020 Apple Inc. All rights reserved.
     1# Copyright (C) 2021 Apple Inc. All rights reserved.
    22#
    33# Redistribution and use in source and binary forms, with or without
     
    2121# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2222
    23 from setuptools import setup
     23from flask import Flask
     24
     25from .response import Response
    2426
    2527
    26 def readme():
    27     with open('README.md') as f:
    28         return f.read()
     28def mock_app(method):
     29    def real_method(val, method=method, **kwargs):
     30        app = Flask('testing')
     31        app.response_class = Response
     32        app.config['TESTING'] = True
     33        app.add_url_rule('/__health', 'health', lambda: 'ok', methods=('GET',))
     34        return method(val, app=app, client=app.test_client(), **kwargs)
    2935
    30 
    31 setup(
    32     name='webkitflaskpy',
    33     version='0.2.0',
    34     description='Library for visualizing, processing and storing test results.',
    35     long_description=readme(),
    36     classifiers=[
    37         'Development Status :: 4 - Beta',
    38         'Framework :: Flask',
    39         'Intended Audience :: Developers',
    40         'License :: OSI Approved :: BSD License',
    41         'Operating System :: MacOS',
    42         'Natural Language :: English',
    43         'Programming Language :: Python :: 3 :: Only',
    44         'Topic :: Software Development :: Libraries :: Python Modules',
    45         'Topic :: Software Development :: Testing',
    46     ],
    47     keywords='web javascript webkit',
    48     url='https://github.com/WebKit/WebKit/tree/main/Tools/Scripts/libraries/webkitflaskpy',
    49     author='Jonathan Bedard',
    50     author_email='jbedard@apple.com',
    51     license='Modified BSD',
    52     packages=[
    53         'webkitflaskpy',
    54     ],
    55     install_requires=[
    56         'Flask',
    57         'Flask-Cors',
    58         'gunicorn',
    59         'webkitcorepy',
    60     ],
    61     include_package_data=True,
    62     zip_safe=False,
    63 )
     36    real_method.__name__ = method.__name__
     37    return real_method
  • trunk/Tools/Scripts/libraries/webkitflaskpy/webkitflaskpy/response.py

    r286574 r286576  
    1 # Copyright (C) 2020 Apple Inc. All rights reserved.
     1# Copyright (C) 2021 Apple Inc. All rights reserved.
    22#
    33# Redistribution and use in source and binary forms, with or without
     
    2121# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2222
    23 from setuptools import setup
     23import json
     24
     25from flask.wrappers import Response as FlaskResponse
    2426
    2527
    26 def readme():
    27     with open('README.md') as f:
    28         return f.read()
     28class Response(FlaskResponse):
     29    @property
     30    def text(self):
     31        return self.data.decode('utf-8')
    2932
     33    @property
     34    def content(self):
     35        return self.data
    3036
    31 setup(
    32     name='webkitflaskpy',
    33     version='0.2.0',
    34     description='Library for visualizing, processing and storing test results.',
    35     long_description=readme(),
    36     classifiers=[
    37         'Development Status :: 4 - Beta',
    38         'Framework :: Flask',
    39         'Intended Audience :: Developers',
    40         'License :: OSI Approved :: BSD License',
    41         'Operating System :: MacOS',
    42         'Natural Language :: English',
    43         'Programming Language :: Python :: 3 :: Only',
    44         'Topic :: Software Development :: Libraries :: Python Modules',
    45         'Topic :: Software Development :: Testing',
    46     ],
    47     keywords='web javascript webkit',
    48     url='https://github.com/WebKit/WebKit/tree/main/Tools/Scripts/libraries/webkitflaskpy',
    49     author='Jonathan Bedard',
    50     author_email='jbedard@apple.com',
    51     license='Modified BSD',
    52     packages=[
    53         'webkitflaskpy',
    54     ],
    55     install_requires=[
    56         'Flask',
    57         'Flask-Cors',
    58         'gunicorn',
    59         'webkitcorepy',
    60     ],
    61     include_package_data=True,
    62     zip_safe=False,
    63 )
     37    def json(self):
     38        return json.loads(self.text)
  • trunk/Tools/Scripts/webkitpy/__init__.py

    r284964 r286576  
    8181AutoInstall.register(Package('zope.interface', Version(5, 1, 0), aliases=['zope'], pypi_name='zope-interface'))
    8282
     83if sys.version_info > (3, 0):
     84    AutoInstall.register(Package('reporelaypy', Version(0, 1, 0)), local=True)
     85
     86AutoInstall.register(Package('webkitflaskpy', Version(0, 1, 1)), local=True)
    8387AutoInstall.register(Package('webkitscmpy', Version(0, 12, 5)), local=True)
    8488
  • trunk/Tools/Scripts/webkitpy/test/main.py

    r276434 r286576  
    6666    tester.add_tree(os.path.join(_webkit_root, 'Tools', 'Scripts', 'libraries', 'webkitscmpy'), 'webkitscmpy')
    6767    tester.add_tree(os.path.join(_webkit_root, 'Tools', 'Scripts', 'libraries', 'webkitflaskpy'), 'webkitflaskpy')
     68    if sys.version_info > (3, 0):
     69        tester.add_tree(os.path.join(_webkit_root, 'Tools', 'Scripts', 'libraries', 'reporelaypy'), 'reporelaypy')
    6870
    6971    # AppleWin is the only platform that does not support Modern WebKit
     
    189191
    190192        from webkitcorepy import AutoInstall
     193
     194        # Force registration of all autoinstalled packages.
     195        if sys.version_info > (3, 0):
     196            import reporelaypy
     197        import webkitflaskpy
     198
    191199        AutoInstall.install_everything()
    192200
Note: See TracChangeset for help on using the changeset viewer.