From 377e48918d9006a17e880c1bce4616f18afc5d42 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Sun, 7 Jul 2019 20:07:59 +0200 Subject: [PATCH 1/2] Create galaxy-selenium package. This is *not* the tests, it is the components for interacting with Galaxy via Selenium that can be used in any Galaxy UI automation context - not just tests. This includes a tiny CLI framework for building apps that drive Galaxy this way. --- .../galaxy/selenium}/__init__.py | 0 .../galaxy/selenium}/cli.py | 0 .../galaxy/selenium}/components.py | 4 +- .../galaxy/selenium}/data.py | 0 .../galaxy/selenium}/driver_factory.py | 0 .../galaxy/selenium}/has_driver.py | 0 .../galaxy/selenium}/navigates_galaxy.py | 0 .../galaxy/selenium}/navigation-data.yml | 0 .../galaxy/selenium}/navigation.yml | 0 .../galaxy/selenium}/sizzle.py | 0 .../galaxy/selenium}/smart_components.py | 2 +- packages/selenium/HISTORY.rst | 12 +++ packages/selenium/LICENSE | 1 + packages/selenium/MANIFEST.in | 2 + packages/selenium/Makefile | 1 + packages/selenium/README.rst | 15 +++ packages/selenium/dev-requirements.txt | 1 + packages/selenium/galaxy/__init__.py | 1 + .../galaxy/project_galaxy_selenium.py | 13 +++ packages/selenium/galaxy/selenium | 1 + packages/selenium/requirements.txt | 2 + packages/selenium/scripts | 1 + packages/selenium/setup.cfg | 1 + packages/selenium/setup.py | 101 ++++++++++++++++++ test/selenium_tests/framework.py | 4 +- test/selenium_tests/test_navigates_galaxy.py | 3 +- test/selenium_tests/test_tool_form.py | 2 +- 27 files changed, 159 insertions(+), 8 deletions(-) rename {test/galaxy_selenium => lib/galaxy/selenium}/__init__.py (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/cli.py (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/components.py (96%) rename {test/galaxy_selenium => lib/galaxy/selenium}/data.py (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/driver_factory.py (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/has_driver.py (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/navigates_galaxy.py (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/navigation-data.yml (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/navigation.yml (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/sizzle.py (100%) rename {test/galaxy_selenium => lib/galaxy/selenium}/smart_components.py (97%) create mode 100644 packages/selenium/HISTORY.rst create mode 120000 packages/selenium/LICENSE create mode 100644 packages/selenium/MANIFEST.in create mode 120000 packages/selenium/Makefile create mode 100644 packages/selenium/README.rst create mode 120000 packages/selenium/dev-requirements.txt create mode 100644 packages/selenium/galaxy/__init__.py create mode 100644 packages/selenium/galaxy/project_galaxy_selenium.py create mode 120000 packages/selenium/galaxy/selenium create mode 100644 packages/selenium/requirements.txt create mode 120000 packages/selenium/scripts create mode 120000 packages/selenium/setup.cfg create mode 100644 packages/selenium/setup.py diff --git a/test/galaxy_selenium/__init__.py b/lib/galaxy/selenium/__init__.py similarity index 100% rename from test/galaxy_selenium/__init__.py rename to lib/galaxy/selenium/__init__.py diff --git a/test/galaxy_selenium/cli.py b/lib/galaxy/selenium/cli.py similarity index 100% rename from test/galaxy_selenium/cli.py rename to lib/galaxy/selenium/cli.py diff --git a/test/galaxy_selenium/components.py b/lib/galaxy/selenium/components.py similarity index 96% rename from test/galaxy_selenium/components.py rename to lib/galaxy/selenium/components.py index 10760bb90ab..16fa64012dd 100644 --- a/test/galaxy_selenium/components.py +++ b/lib/galaxy/selenium/components.py @@ -98,7 +98,7 @@ class SelectorTemplate(Target): if name in self._children: return self._children[name](**{"_": self.selector}) else: - raise KeyError("Could not find child [%s] in %s" % (name, self._children)) + raise AttributeError("Could not find child [%s] in %s" % (name, self._children)) __getitem__ = __getattr__ @@ -193,7 +193,7 @@ class Component(object): elif attr in self._text: return self._text[attr] else: - raise Exception("Failed to find referenced sub-component/selector/label/text [%s]" % attr) + raise KeyError("Failed to find referenced sub-component/selector/label/text [%s]" % attr) __getitem__ = __getattr__ diff --git a/test/galaxy_selenium/data.py b/lib/galaxy/selenium/data.py similarity index 100% rename from test/galaxy_selenium/data.py rename to lib/galaxy/selenium/data.py diff --git a/test/galaxy_selenium/driver_factory.py b/lib/galaxy/selenium/driver_factory.py similarity index 100% rename from test/galaxy_selenium/driver_factory.py rename to lib/galaxy/selenium/driver_factory.py diff --git a/test/galaxy_selenium/has_driver.py b/lib/galaxy/selenium/has_driver.py similarity index 100% rename from test/galaxy_selenium/has_driver.py rename to lib/galaxy/selenium/has_driver.py diff --git a/test/galaxy_selenium/navigates_galaxy.py b/lib/galaxy/selenium/navigates_galaxy.py similarity index 100% rename from test/galaxy_selenium/navigates_galaxy.py rename to lib/galaxy/selenium/navigates_galaxy.py diff --git a/test/galaxy_selenium/navigation-data.yml b/lib/galaxy/selenium/navigation-data.yml similarity index 100% rename from test/galaxy_selenium/navigation-data.yml rename to lib/galaxy/selenium/navigation-data.yml diff --git a/test/galaxy_selenium/navigation.yml b/lib/galaxy/selenium/navigation.yml similarity index 100% rename from test/galaxy_selenium/navigation.yml rename to lib/galaxy/selenium/navigation.yml diff --git a/test/galaxy_selenium/sizzle.py b/lib/galaxy/selenium/sizzle.py similarity index 100% rename from test/galaxy_selenium/sizzle.py rename to lib/galaxy/selenium/sizzle.py diff --git a/test/galaxy_selenium/smart_components.py b/lib/galaxy/selenium/smart_components.py similarity index 97% rename from test/galaxy_selenium/smart_components.py rename to lib/galaxy/selenium/smart_components.py index 9f4304f0f74..8c085ebfc12 100644 --- a/test/galaxy_selenium/smart_components.py +++ b/lib/galaxy/selenium/smart_components.py @@ -8,7 +8,7 @@ class SmartComponent(object): """Wrap a Component with driver aware methods. Allows smarter selectors that know how to wait for themselves, test themselves, - click themselvers, etc.... More "magic", but much cleaner usage. + click themselves, etc.... More "magic", but much cleaner usage. """ def __init__(self, component, has_driver): diff --git a/packages/selenium/HISTORY.rst b/packages/selenium/HISTORY.rst new file mode 100644 index 00000000000..ec2f0e746e9 --- /dev/null +++ b/packages/selenium/HISTORY.rst @@ -0,0 +1,12 @@ +.. :changelog: + +History +------- + +.. to_doc + +--------------------- +19.9.0.dev0 +--------------------- + +* Initial import from dev branch of Galaxy during 19.09 development cycle. diff --git a/packages/selenium/LICENSE b/packages/selenium/LICENSE new file mode 120000 index 00000000000..1ef648f64b3 --- /dev/null +++ b/packages/selenium/LICENSE @@ -0,0 +1 @@ +../../LICENSE.txt \ No newline at end of file diff --git a/packages/selenium/MANIFEST.in b/packages/selenium/MANIFEST.in new file mode 100644 index 00000000000..99afa949c6c --- /dev/null +++ b/packages/selenium/MANIFEST.in @@ -0,0 +1,2 @@ +include *.rst LICENSE +include galaxy/selenium/*yml diff --git a/packages/selenium/Makefile b/packages/selenium/Makefile new file mode 120000 index 00000000000..37af8bae5ba --- /dev/null +++ b/packages/selenium/Makefile @@ -0,0 +1 @@ +../package.Makefile \ No newline at end of file diff --git a/packages/selenium/README.rst b/packages/selenium/README.rst new file mode 100644 index 00000000000..b66238cd3b1 --- /dev/null +++ b/packages/selenium/README.rst @@ -0,0 +1,15 @@ + +.. image:: https://badge.fury.io/py/galaxy-selenium.svg + :target: https://pypi.org/project/galaxy-selenium/ + + + +Overview +-------- + +The Galaxy_ selenium framework. + +* Free software: Academic Free License version 3.0 +* Code: https://github.com/galaxyproject/galaxy + +.. _Galaxy: http://galaxyproject.org/ diff --git a/packages/selenium/dev-requirements.txt b/packages/selenium/dev-requirements.txt new file mode 120000 index 00000000000..467b90d7a23 --- /dev/null +++ b/packages/selenium/dev-requirements.txt @@ -0,0 +1 @@ +../package-dev-requirements.txt \ No newline at end of file diff --git a/packages/selenium/galaxy/__init__.py b/packages/selenium/galaxy/__init__.py new file mode 100644 index 00000000000..69e3be50dac --- /dev/null +++ b/packages/selenium/galaxy/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/packages/selenium/galaxy/project_galaxy_selenium.py b/packages/selenium/galaxy/project_galaxy_selenium.py new file mode 100644 index 00000000000..73ec5c1cf31 --- /dev/null +++ b/packages/selenium/galaxy/project_galaxy_selenium.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +__version__ = '19.9.0.dev0' + +PROJECT_NAME = "galaxy-selenium" +PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" +PROJECT_URL = "https://github.com/galaxyproject/galaxy" +PROJECT_AUTHOR = 'Galaxy Project and Community' +PROJECT_DESCRIPTION = 'Galaxy Selenium Interaction Framework' +PROJECT_EMAIL = 'galaxy-committers@lists.galaxyproject.org' +RAW_CONTENT_URL = "https://raw.github.com/%s/%s/master/" % ( + PROJECT_USERAME, PROJECT_NAME +) diff --git a/packages/selenium/galaxy/selenium b/packages/selenium/galaxy/selenium new file mode 120000 index 00000000000..60a2948815b --- /dev/null +++ b/packages/selenium/galaxy/selenium @@ -0,0 +1 @@ +../../../lib/galaxy/selenium/ \ No newline at end of file diff --git a/packages/selenium/requirements.txt b/packages/selenium/requirements.txt new file mode 100644 index 00000000000..ea07fcb13dc --- /dev/null +++ b/packages/selenium/requirements.txt @@ -0,0 +1,2 @@ +galaxy-util +selenium diff --git a/packages/selenium/scripts b/packages/selenium/scripts new file mode 120000 index 00000000000..9aec9dc5a06 --- /dev/null +++ b/packages/selenium/scripts @@ -0,0 +1 @@ +../build_scripts \ No newline at end of file diff --git a/packages/selenium/setup.cfg b/packages/selenium/setup.cfg new file mode 120000 index 00000000000..eb7cf09393f --- /dev/null +++ b/packages/selenium/setup.cfg @@ -0,0 +1 @@ +../../setup.cfg \ No newline at end of file diff --git a/packages/selenium/setup.py b/packages/selenium/setup.py new file mode 100644 index 00000000000..38720afe67f --- /dev/null +++ b/packages/selenium/setup.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import ast +import os +import re +try: + from setuptools import setup +except ImportError: + from distutils.core import setup + +SOURCE_DIR = "galaxy" + +_version_re = re.compile(r'__version__\s+=\s+(.*)') + +project_short_name = os.path.basename(os.path.dirname(os.path.realpath(__file__))) +with open('%s/project_galaxy_%s.py' % (SOURCE_DIR, project_short_name), 'rb') as f: + init_contents = f.read().decode('utf-8') + + def get_var(var_name): + pattern = re.compile(r'%s\s+=\s+(.*)' % var_name) + match = pattern.search(init_contents).group(1) + return str(ast.literal_eval(match)) + + version = get_var("__version__") + PROJECT_NAME = get_var("PROJECT_NAME") + PROJECT_URL = get_var("PROJECT_URL") + PROJECT_AUTHOR = get_var("PROJECT_AUTHOR") + PROJECT_EMAIL = get_var("PROJECT_EMAIL") + PROJECT_DESCRIPTION = get_var("PROJECT_DESCRIPTION") + +TEST_DIR = 'tests' +PACKAGES = [ + 'galaxy', + 'galaxy.selenium', +] +ENTRY_POINTS = ''' + [console_scripts] +''' +PACKAGE_DATA = { + # Be sure to update MANIFEST.in for source dist. + 'galaxy': [ + 'selenium/*yml', + ], +} +PACKAGE_DIR = { + SOURCE_DIR: SOURCE_DIR, +} + +readme = open('README.rst').read() +history = open('HISTORY.rst').read().replace('.. :changelog:', '') + +if os.path.exists("requirements.txt"): + requirements = open("requirements.txt").read().split("\n") +else: + # In tox, it will cover them anyway. + requirements = [] + + +test_requirements = [ + # TODO: put package test requirements here +] + + +setup( + name=PROJECT_NAME, + version=version, + description=PROJECT_DESCRIPTION, + long_description=readme + '\n\n' + history, + long_description_content_type='text/x-rst', + author=PROJECT_AUTHOR, + author_email=PROJECT_EMAIL, + url=PROJECT_URL, + packages=PACKAGES, + entry_points=ENTRY_POINTS, + package_data=PACKAGE_DATA, + package_dir=PACKAGE_DIR, + include_package_data=True, + install_requires=requirements, + license="AFL", + zip_safe=False, + keywords='galaxy', + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'Environment :: Console', + 'License :: OSI Approved :: Academic Free License (AFL)', + 'Operating System :: POSIX', + 'Topic :: Software Development', + 'Topic :: Software Development :: Code Generators', + 'Topic :: Software Development :: Testing', + 'Natural Language :: English', + "Programming Language :: Python :: 2", + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + ], + test_suite=TEST_DIR, + tests_require=test_requirements +) diff --git a/test/selenium_tests/framework.py b/test/selenium_tests/framework.py index 853c2a04ad1..3ad89b820c5 100644 --- a/test/selenium_tests/framework.py +++ b/test/selenium_tests/framework.py @@ -24,10 +24,10 @@ from base import populators # noqa: I100,I202 from base.api import UsesApiTestCaseMixin # noqa: I100 from base.driver_util import classproperty, DEFAULT_WEB_HOST, get_ip_address # noqa: I100 from base.testcase import FunctionalTestCase # noqa: I100 -from galaxy_selenium import ( # noqa: I100,I201 +from galaxy.selenium import ( # noqa: I100,I201 driver_factory, ) -from galaxy_selenium.navigates_galaxy import ( # noqa: I100 +from galaxy.selenium.navigates_galaxy import ( # noqa: I100 NavigatesGalaxy, retry_during_transitions ) diff --git a/test/selenium_tests/test_navigates_galaxy.py b/test/selenium_tests/test_navigates_galaxy.py index 5fa9c3355ff..c7906791ac2 100644 --- a/test/selenium_tests/test_navigates_galaxy.py +++ b/test/selenium_tests/test_navigates_galaxy.py @@ -1,8 +1,7 @@ -from galaxy_selenium.navigates_galaxy import ( +from galaxy.selenium.navigates_galaxy import ( exception_indicates_not_clickable, exception_seems_to_indicate_transition, ) - from .framework import ( selenium_test, SeleniumTestCase, diff --git a/test/selenium_tests/test_tool_form.py b/test/selenium_tests/test_tool_form.py index cf2c909a3da..f8aef81abf2 100644 --- a/test/selenium_tests/test_tool_form.py +++ b/test/selenium_tests/test_tool_form.py @@ -2,8 +2,8 @@ import json from base import rules_test_data from base.populators import flakey, load_data_dict -from galaxy_selenium.navigates_galaxy import retry_call_during_transitions +from galaxy.selenium.navigates_galaxy import retry_call_during_transitions from .framework import ( managed_history, retry_assertion_during_transitions, From 753a151c7636b679e84375719ad3b812a3c17a49 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Mon, 8 Jul 2019 12:36:36 +0200 Subject: [PATCH 2/2] Add dump tour script to galaxy-selenium package. --- lib/galaxy/selenium/components.py | 2 +- lib/galaxy/selenium/scripts/__init__.py | 0 {scripts => lib/galaxy/selenium/scripts}/dump_tour.py | 4 +--- packages/selenium/setup.py | 2 ++ 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 lib/galaxy/selenium/scripts/__init__.py rename {scripts => lib/galaxy/selenium/scripts}/dump_tour.py (91%) diff --git a/lib/galaxy/selenium/components.py b/lib/galaxy/selenium/components.py index 16fa64012dd..2eac23ad8ae 100644 --- a/lib/galaxy/selenium/components.py +++ b/lib/galaxy/selenium/components.py @@ -193,7 +193,7 @@ class Component(object): elif attr in self._text: return self._text[attr] else: - raise KeyError("Failed to find referenced sub-component/selector/label/text [%s]" % attr) + raise AttributeError("Failed to find referenced sub-component/selector/label/text [%s]" % attr) __getitem__ = __getattr__ diff --git a/lib/galaxy/selenium/scripts/__init__.py b/lib/galaxy/selenium/scripts/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/scripts/dump_tour.py b/lib/galaxy/selenium/scripts/dump_tour.py similarity index 91% rename from scripts/dump_tour.py rename to lib/galaxy/selenium/scripts/dump_tour.py index b13020581cb..5ce5f6c2a31 100755 --- a/scripts/dump_tour.py +++ b/lib/galaxy/selenium/scripts/dump_tour.py @@ -5,9 +5,7 @@ import os import sys import time -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'test'))) - -from galaxy_selenium import cli +from galaxy.selenium import cli DESCRIPTION = "Walk a Galaxy tour and dump screenshots." diff --git a/packages/selenium/setup.py b/packages/selenium/setup.py index 38720afe67f..a53fe8e6602 100644 --- a/packages/selenium/setup.py +++ b/packages/selenium/setup.py @@ -33,9 +33,11 @@ TEST_DIR = 'tests' PACKAGES = [ 'galaxy', 'galaxy.selenium', + 'galaxy.selenium.scripts', ] ENTRY_POINTS = ''' [console_scripts] + gx-dump-tour=galaxy.selenium.scripts.dump_tour:main ''' PACKAGE_DATA = { # Be sure to update MANIFEST.in for source dist.