From b23b9151a20b422e335bee17c7f0579994e35496 Mon Sep 17 00:00:00 2001 From: Luis Moreno Date: Mon, 4 May 2020 12:23:12 -0400 Subject: [PATCH 1/2] Add python 3.8 tests Upgrade requirements Fix quality issues Import Sequence from collections.abc https://docs.python.org/3.8/library/collections.abc.html#collections.abc.Sequence New release --- .travis.yml | 7 +-- CHANGELOG | 3 + bok_choy/a11y/a11y_audit.py | 11 ++-- bok_choy/browser.py | 117 +++++++++++++++++------------------ bok_choy/javascript.py | 20 +++--- bok_choy/page_object.py | 5 +- bok_choy/promise.py | 5 +- bok_choy/query.py | 2 +- requirements/constraints.txt | 6 -- requirements/dev.txt | 60 ++++++++---------- requirements/doc.txt | 19 +++--- requirements/needle.txt | 44 ++++++------- requirements/pip-tools.txt | 7 ++- requirements/test.txt | 40 +++++------- requirements/travis.txt | 26 +++----- setup.py | 6 +- tests/test_accessibility.py | 4 +- tests/test_browser.py | 2 +- tests/test_page_object.py | 3 - tox.ini | 3 +- 20 files changed, 170 insertions(+), 220 deletions(-) diff --git a/.travis.yml b/.travis.yml index beba176e..e7a787bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,11 @@ language: python python: - - '2.7' - - '3.5' - - '3.6' + - 3.5 + - 3.8 env: - TOXENV=core - TOXENV=needle + - TOXENV=doc sudo: false branches: only: @@ -23,7 +23,6 @@ install: - pip install -r requirements/travis.txt script: - tox -- -n 2 --durations=10 -- tox -e doc after_success: - codecov deploy: diff --git a/CHANGELOG b/CHANGELOG index f2330179..af062ea4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +V1.1.0 (05/04/2020) +* Drop support for python 2.7 +* Python 3.8 support v1.0.1 (10/25/19) * Fix saving of test failure artifacts under Python 3 * Make the saving of page source more robust to missing directories, log problems doing it diff --git a/bok_choy/a11y/a11y_audit.py b/bok_choy/a11y/a11y_audit.py index 643db83e..c20351c4 100644 --- a/bok_choy/a11y/a11y_audit.py +++ b/bok_choy/a11y/a11y_audit.py @@ -13,18 +13,16 @@ class AccessibilityError(Exception): """ The page violates one or more accessibility rules. """ - pass class A11yAuditConfigError(Exception): """ An error in A11yAuditConfig. """ - pass @six.add_metaclass(ABCMeta) -class A11yAuditConfig(object): +class A11yAuditConfig: """ The `A11yAuditConfig` object defines the options available in an accessibility ruleset. @@ -93,7 +91,7 @@ def customize_ruleset(self, custom_ruleset_file=None): @six.add_metaclass(ABCMeta) -class A11yAudit(object): +class A11yAudit: """ Allows auditing of a page for accessibility issues. @@ -138,9 +136,8 @@ def _get_rules_js(self): self.config.rules_file) raise RuntimeError(msg) - else: - with io.open(self.config.rules_file, "r", encoding="utf-8") as rules_file: - return rules_file.read() + with io.open(self.config.rules_file, "r", encoding="utf-8") as rules_file: + return rules_file.read() def do_audit(self): """ diff --git a/bok_choy/browser.py b/bok_choy/browser.py index a2eaceb1..32094f71 100644 --- a/bok_choy/browser.py +++ b/bok_choy/browser.py @@ -73,7 +73,6 @@ class BrowserConfigError(Exception): """ Misconfiguration error in the environment variables. """ - pass def save_source(driver, name): @@ -130,7 +129,7 @@ def save_screenshot(driver, name): if not screenshot_dir: LOGGER.warning('The SCREENSHOT_DIR environment variable was not set; not saving a screenshot') return - elif not os.path.exists(screenshot_dir): + if not os.path.exists(screenshot_dir): os.makedirs(screenshot_dir) image_name = os.path.join(screenshot_dir, name + '.png') driver.save_screenshot(image_name) @@ -164,7 +163,7 @@ def save_driver_logs(driver, prefix): if not log_dir: LOGGER.warning('The SELENIUM_DRIVER_LOG_DIR environment variable was not set; not saving logs') return - elif not os.path.exists(log_dir): + if not os.path.exists(log_dir): os.makedirs(log_dir) if browser_name == 'firefox': # Firefox doesn't yet provide logs to Selenium, but does log to a separate file @@ -325,15 +324,14 @@ def _firefox_profile(): raise BrowserConfigError( u"Firefox profile directory {env_var}={profile_dir} does not exist".format( env_var=FIREFOX_PROFILE_ENV_VAR, profile_dir=profile_dir)) - elif err.errno == errno.EACCES: + if err.errno == errno.EACCES: raise BrowserConfigError( u"Firefox profile directory {env_var}={profile_dir} has incorrect permissions. It must be \ readable and executable.".format(env_var=FIREFOX_PROFILE_ENV_VAR, profile_dir=profile_dir)) - else: - # Some other OSError: - raise BrowserConfigError( - u"Problem with firefox profile directory {env_var}={profile_dir}: {msg}" - .format(env_var=FIREFOX_PROFILE_ENV_VAR, profile_dir=profile_dir, msg=str(err))) + # Some other OSError: + raise BrowserConfigError( + u"Problem with firefox profile directory {env_var}={profile_dir}: {msg}" + .format(env_var=FIREFOX_PROFILE_ENV_VAR, profile_dir=profile_dir, msg=str(err))) else: LOGGER.info("Using default firefox profile") firefox_profile = webdriver.FirefoxProfile() @@ -388,59 +386,56 @@ def _local_browser_class(browser_name): raise BrowserConfigError( u"Invalid browser name {name}. Options are: {options}".format( name=browser_name, options=", ".join(list(BROWSERS.keys())))) + if browser_name == 'firefox': + # Remove geckodriver log data from previous test cases + log_path = os.path.join(os.getcwd(), 'geckodriver.log') + if os.path.exists(log_path): + os.remove(log_path) + + firefox_options = FirefoxOptions() + firefox_options.log.level = 'trace' + if headless: + firefox_options.headless = True + browser_args = [] + browser_kwargs = { + 'firefox_profile': _firefox_profile(), + 'options': firefox_options, + } + + firefox_path = os.environ.get('SELENIUM_FIREFOX_PATH') + firefox_log = os.environ.get('SELENIUM_FIREFOX_LOG') + if firefox_path and firefox_log: + browser_kwargs.update({ + 'firefox_binary': FirefoxBinary( + firefox_path=firefox_path, log_file=firefox_log) + }) + elif firefox_path: + browser_kwargs.update({ + 'firefox_binary': FirefoxBinary(firefox_path=firefox_path) + }) + elif firefox_log: + browser_kwargs.update({ + 'firefox_binary': FirefoxBinary(log_file=firefox_log) + }) + + elif browser_name == 'chrome': + chrome_options = ChromeOptions() + if headless: + chrome_options.headless = True + + # Emulate webcam and microphone for testing purposes + chrome_options.add_argument('--use-fake-device-for-media-stream') + + # Bypasses the security prompt displayed by the browser when it attempts to + # access a media device (e.g., a webcam) + chrome_options.add_argument('--use-fake-ui-for-media-stream') + browser_args = [] + browser_kwargs = { + 'options': chrome_options, + } else: - if browser_name == 'firefox': - # Remove geckodriver log data from previous test cases - log_path = os.path.join(os.getcwd(), 'geckodriver.log') - if os.path.exists(log_path): - os.remove(log_path) - - firefox_options = FirefoxOptions() - firefox_options.log.level = 'trace' - if headless: - firefox_options.headless = True - browser_args = [] - browser_kwargs = { - 'firefox_profile': _firefox_profile(), - 'options': firefox_options, - } - - firefox_path = os.environ.get('SELENIUM_FIREFOX_PATH') - firefox_log = os.environ.get('SELENIUM_FIREFOX_LOG') - if firefox_path and firefox_log: - browser_kwargs.update({ - 'firefox_binary': FirefoxBinary( - firefox_path=firefox_path, log_file=firefox_log) - }) - elif firefox_path: - browser_kwargs.update({ - 'firefox_binary': FirefoxBinary(firefox_path=firefox_path) - }) - elif firefox_log: - browser_kwargs.update({ - 'firefox_binary': FirefoxBinary(log_file=firefox_log) - }) - - elif browser_name == 'chrome': - chrome_options = ChromeOptions() - if headless: - chrome_options.headless = True - - # Emulate webcam and microphone for testing purposes - chrome_options.add_argument('--use-fake-device-for-media-stream') - - # Bypasses the security prompt displayed by the browser when it attempts to - # access a media device (e.g., a webcam) - chrome_options.add_argument('--use-fake-ui-for-media-stream') - - browser_args = [] - browser_kwargs = { - 'options': chrome_options, - } - else: - browser_args, browser_kwargs = [], {} - - return browser_class, browser_args, browser_kwargs + browser_args, browser_kwargs = [], {} + return browser_class, browser_args, browser_kwargs def _remote_browser_class(env_vars, tags=None): diff --git a/bok_choy/javascript.py b/bok_choy/javascript.py index 9257afca..18a2c7f4 100644 --- a/bok_choy/javascript.py +++ b/bok_choy/javascript.py @@ -62,17 +62,16 @@ def wrapper(*args, **kwargs): # pylint: disable=missing-docstring return function(*args, **kwargs) # Otherwise, retrieve `self` as the first arg - else: - self = args[0] + self = args[0] - # If the class has been decorated by one of the - # JavaScript dependency decorators, it should have - # a `wait_for_js` method - if hasattr(self, 'wait_for_js'): - self.wait_for_js() + # If the class has been decorated by one of the + # JavaScript dependency decorators, it should have + # a `wait_for_js` method + if hasattr(self, 'wait_for_js'): + self.wait_for_js() - # Call the function - return function(*args, **kwargs) + # Call the function + return function(*args, **kwargs) return wrapper @@ -154,8 +153,7 @@ def _are_js_vars_defined(browser, js_vars): except WebDriverException as exc: if "is not defined" in exc.msg or "is undefined" in exc.msg: return False - else: - raise + raise def _are_requirejs_deps_loaded(browser, deps): diff --git a/bok_choy/page_object.py b/bok_choy/page_object.py index 42dec0d9..e152b2f4 100644 --- a/bok_choy/page_object.py +++ b/bok_choy/page_object.py @@ -44,21 +44,18 @@ class WrongPageError(WebDriverException): """ The page object reports that we're on the wrong page! """ - pass class PageLoadError(WebDriverException): """ An error occurred while loading the page. """ - pass class XSSExposureError(Exception): """ An XSS issue has been found on the current page. """ - pass def no_selenium_errors(func): @@ -173,7 +170,7 @@ def __new__(mcs, cls_name, cls_bases, cls_attrs, **kwargs): # pylint: disable=a @six.add_metaclass(_PageObjectMetaclass) -class PageObject(object): +class PageObject: """ Encapsulates user interactions with a specific part of a web application. diff --git a/bok_choy/promise.py b/bok_choy/promise.py index a38d5e10..b932a4d3 100644 --- a/bok_choy/promise.py +++ b/bok_choy/promise.py @@ -30,7 +30,7 @@ def __str__(self): return "Promise not satisfied: {0}".format(self._promise) -class Promise(object): +class Promise: """ Check that an asynchronous action completed, blocking until it does or timeout / try limits are reached. @@ -102,8 +102,7 @@ def fulfill(self): if is_fulfilled: return result - else: - raise BrokenPromise(self) + raise BrokenPromise(self) def __str__(self): return str(self._description) diff --git a/bok_choy/query.py b/bok_choy/query.py index 364d9c63..32532985 100644 --- a/bok_choy/query.py +++ b/bok_choy/query.py @@ -6,7 +6,7 @@ import logging from copy import copy -from collections import Sequence +from collections.abc import Sequence from itertools import islice from selenium.common.exceptions import WebDriverException import six diff --git a/requirements/constraints.txt b/requirements/constraints.txt index c4d60469..ff13904f 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -8,12 +8,6 @@ # pin when possible. Writing an issue against the offending project and # linking to it here is good. -# more-itertools 6.0.0 dropped Python 2.7 support -more-itertools<6.0.0 - -# Newer versions of pylint-plugin-utils drop Python 2.7 support -pylint-plugin-utils<0.4 - # requests only supports urllib 1.24: https://github.com/kennethreitz/requests/issues/5067 urllib3<1.25 diff --git a/requirements/dev.txt b/requirements/dev.txt index 8f85b02e..1ebf40b0 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -2,68 +2,62 @@ # This file is autogenerated by pip-compile # To update, run: # -# make upgrade +# pip-compile --output-file=requirements/dev.txt requirements/dev.in # apipkg==1.5 # via -r requirements/needle.txt, execnet appdirs==1.4.3 # via -r requirements/travis.txt, virtualenv -astroid==1.6.6 # via -r requirements/needle.txt, pylint, pylint-celery -atomicwrites==1.3.0 # via -r requirements/needle.txt, pytest +astroid==2.3.3 # via -r requirements/needle.txt, pylint, pylint-celery attrs==19.3.0 # via -r requirements/needle.txt, pytest -backports.functools-lru-cache==1.6.1 # via -r requirements/needle.txt, astroid, isort, pylint -certifi==2019.11.28 # via -r requirements/travis.txt, requests +certifi==2020.4.5.1 # via -r requirements/travis.txt, requests chardet==3.0.4 # via -r requirements/travis.txt, requests click-log==0.3.2 # via -r requirements/needle.txt, edx-lint -click==7.1.1 # via -r requirements/needle.txt, -r requirements/pip-tools.txt, click-log, edx-lint, pip-tools -codecov==2.0.16 # via -r requirements/travis.txt -configparser==4.0.2 # via -r requirements/needle.txt, -r requirements/travis.txt, importlib-metadata, pylint -contextlib2==0.6.0.post1 # via -r requirements/needle.txt, -r requirements/travis.txt, importlib-metadata, importlib-resources, virtualenv, zipp -coverage==5.0.3 # via -r requirements/needle.txt, -r requirements/travis.txt, codecov, pytest-cov +click==7.1.2 # via -r requirements/needle.txt, -r requirements/pip-tools.txt, click-log, edx-lint, pip-tools +codecov==2.0.22 # via -r requirements/travis.txt +coverage==5.1 # via -r requirements/needle.txt, -r requirements/travis.txt, codecov, pytest-cov distlib==0.3.0 # via -r requirements/travis.txt, virtualenv edx-lint==1.4.1 # via -r requirements/needle.txt -enum34==1.1.10 # via -r requirements/needle.txt, astroid execnet==1.7.1 # via -r requirements/needle.txt, pytest-xdist filelock==3.0.12 # via -r requirements/travis.txt, tox, virtualenv -funcsigs==1.0.2 # via -r requirements/needle.txt, mock, pytest -futures==3.3.0 ; python_version == "2.7" # via -r requirements/needle.txt, isort idna==2.9 # via -r requirements/travis.txt, requests -importlib-metadata==1.5.0 # via -r requirements/needle.txt, -r requirements/travis.txt, importlib-resources, pluggy, pytest, tox, virtualenv -importlib-resources==1.3.1 # via -r requirements/travis.txt, virtualenv +importlib-metadata==1.6.0 # via -r requirements/needle.txt, -r requirements/travis.txt, importlib-resources, pluggy, pytest, tox, virtualenv +importlib-resources==1.5.0 # via -r requirements/travis.txt, virtualenv isort==4.3.21 # via -r requirements/needle.txt, pylint lazy-object-proxy==1.4.3 # via -r requirements/needle.txt, astroid lazy==1.4 # via -r requirements/needle.txt mccabe==0.6.1 # via -r requirements/needle.txt, pylint mock==3.0.5 # via -r requirements/needle.txt -more-itertools==5.0.0 # via -c requirements/constraints.txt, -r requirements/needle.txt, pytest +more-itertools==8.2.0 # via -r requirements/needle.txt, pytest needle==0.5.0 # via -r requirements/needle.txt nose==1.3.7 # via -r requirements/needle.txt, needle packaging==20.3 # via -r requirements/needle.txt, -r requirements/travis.txt, pytest, tox -pathlib2==2.3.5 # via -r requirements/needle.txt, -r requirements/travis.txt, importlib-metadata, importlib-resources, pytest, virtualenv -pillow==6.2.2 # via -r requirements/needle.txt, needle -pip-tools==4.5.1 # via -r requirements/pip-tools.txt +pathlib2==2.3.5 # via -r requirements/needle.txt, pytest +pillow==7.1.2 # via -r requirements/needle.txt, needle +pip-tools==5.1.1 # via -r requirements/pip-tools.txt pluggy==0.13.1 # via -r requirements/needle.txt, -r requirements/travis.txt, pytest, tox py==1.8.1 # via -r requirements/needle.txt, -r requirements/travis.txt, pytest, tox pycodestyle==2.5.0 # via -r requirements/needle.txt pylint-celery==0.3 # via -r requirements/needle.txt, edx-lint -pylint-django==0.11.1 # via -r requirements/needle.txt, edx-lint -pylint-plugin-utils==0.3 # via -c requirements/constraints.txt, -r requirements/needle.txt, pylint-celery, pylint-django -pylint==1.9.5 # via -r requirements/needle.txt, edx-lint, pylint-celery, pylint-django, pylint-plugin-utils -pyparsing==2.4.6 # via -r requirements/needle.txt, -r requirements/travis.txt, packaging +pylint-django==2.0.11 # via -r requirements/needle.txt, edx-lint +pylint-plugin-utils==0.6 # via -r requirements/needle.txt, pylint-celery, pylint-django +pylint==2.4.2 # via -r requirements/needle.txt, edx-lint, pylint-celery, pylint-django, pylint-plugin-utils +pyparsing==2.4.7 # via -r requirements/needle.txt, -r requirements/travis.txt, packaging pytest-cov==2.8.1 # via -r requirements/needle.txt pytest-forked==1.1.3 # via -r requirements/needle.txt, pytest-xdist -pytest-xdist==1.31.0 # via -r requirements/needle.txt -pytest==4.6.9 # via -r requirements/needle.txt, pytest-cov, pytest-forked, pytest-xdist +pytest-xdist==1.32.0 # via -r requirements/needle.txt +pytest==5.4.1 # via -r requirements/needle.txt, pytest-cov, pytest-forked, pytest-xdist requests==2.23.0 # via -r requirements/travis.txt, codecov -scandir==1.10.0 # via -r requirements/needle.txt, -r requirements/travis.txt, pathlib2 selenium==3.141.0 # via -r requirements/needle.txt, needle -singledispatch==3.4.0.3 # via -r requirements/needle.txt, -r requirements/travis.txt, astroid, importlib-resources, pylint -six==1.14.0 # via -r requirements/needle.txt, -r requirements/pip-tools.txt, -r requirements/travis.txt, astroid, edx-lint, mock, more-itertools, packaging, pathlib2, pip-tools, pylint, pytest, pytest-xdist, singledispatch, tox, virtualenv +six==1.14.0 # via -r requirements/needle.txt, -r requirements/pip-tools.txt, -r requirements/travis.txt, astroid, edx-lint, mock, packaging, pathlib2, pip-tools, pytest-xdist, tox, virtualenv toml==0.10.0 # via -r requirements/travis.txt, tox tox-battery==0.5.2 # via -r requirements/travis.txt tox-travis==0.12 # via -r requirements/travis.txt -tox==3.14.5 # via -r requirements/travis.txt, tox-battery, tox-travis -typing==3.7.4.1 # via -r requirements/travis.txt, importlib-resources +tox==3.15.0 # via -r requirements/travis.txt, tox-battery, tox-travis +typed-ast==1.4.1 # via -r requirements/needle.txt, astroid urllib3==1.24.3 # via -c requirements/constraints.txt, -r requirements/needle.txt, -r requirements/travis.txt, requests, selenium -virtualenv==20.0.10 # via -r requirements/travis.txt, tox -wcwidth==0.1.8 # via -r requirements/needle.txt, pytest -wrapt==1.12.1 # via -r requirements/needle.txt, astroid +virtualenv==20.0.20 # via -r requirements/travis.txt, tox +wcwidth==0.1.9 # via -r requirements/needle.txt, pytest +wrapt==1.11.2 # via -r requirements/needle.txt, astroid zipp==1.2.0 # via -r requirements/needle.txt, -r requirements/travis.txt, importlib-metadata, importlib-resources + +# The following packages are considered to be unsafe in a requirements file: +# pip diff --git a/requirements/doc.txt b/requirements/doc.txt index 0c5cac76..e9486fdd 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -6,28 +6,27 @@ # alabaster==0.7.12 # via sphinx babel==2.8.0 # via sphinx -bleach==3.1.1 # via readme-renderer -certifi==2019.11.28 # via requests +bleach==3.1.5 # via readme-renderer +certifi==2020.4.5.1 # via requests chardet==3.0.4 # via requests docutils==0.16 # via readme-renderer, sphinx edx-sphinx-theme==1.5.0 # via -r requirements/doc.in idna==2.9 # via requests imagesize==1.2.0 # via sphinx -jinja2==2.11.1 # via sphinx +jinja2==2.11.2 # via sphinx lazy==1.4 # via -r requirements/base.txt markupsafe==1.1.1 # via jinja2 -packaging==20.3 # via sphinx -pygments==2.5.2 # via readme-renderer, sphinx -pyparsing==2.4.6 # via packaging -pytz==2019.3 # via babel -readme-renderer==25.0 # via -r requirements/doc.in +packaging==20.3 # via bleach, sphinx +pygments==2.6.1 # via readme-renderer, sphinx +pyparsing==2.4.7 # via packaging +pytz==2020.1 # via babel +readme-renderer==26.0 # via -r requirements/doc.in requests==2.23.0 # via sphinx selenium==3.141.0 # via -r requirements/base.txt six==1.14.0 # via -r requirements/base.txt, bleach, edx-sphinx-theme, packaging, readme-renderer, sphinx snowballstemmer==2.0.0 # via sphinx sphinx==1.8.4 # via -c requirements/constraints.txt, -r requirements/doc.in, edx-sphinx-theme -sphinxcontrib-websupport==1.1.2 # via sphinx -typing==3.7.4.1 # via sphinx +sphinxcontrib-websupport==1.2.2 # via sphinx urllib3==1.24.3 # via -c requirements/constraints.txt, -r requirements/base.txt, requests, selenium webencodings==0.5.1 # via bleach diff --git a/requirements/needle.txt b/requirements/needle.txt index 5b33b403..92cb62f6 100644 --- a/requirements/needle.txt +++ b/requirements/needle.txt @@ -2,52 +2,44 @@ # This file is autogenerated by pip-compile # To update, run: # -# make upgrade +# pip-compile --output-file=requirements/needle.txt requirements/needle.in # apipkg==1.5 # via -r requirements/test.txt, execnet -astroid==1.6.6 # via -r requirements/test.txt, pylint, pylint-celery -atomicwrites==1.3.0 # via -r requirements/test.txt, pytest +astroid==2.3.3 # via -r requirements/test.txt, pylint, pylint-celery attrs==19.3.0 # via -r requirements/test.txt, pytest -backports.functools-lru-cache==1.6.1 # via -r requirements/test.txt, astroid, isort, pylint click-log==0.3.2 # via -r requirements/test.txt, edx-lint -click==7.1.1 # via -r requirements/test.txt, click-log, edx-lint -configparser==4.0.2 # via -r requirements/test.txt, importlib-metadata, pylint -contextlib2==0.6.0.post1 # via -r requirements/test.txt, importlib-metadata, zipp -coverage==5.0.3 # via -r requirements/test.txt, pytest-cov +click==7.1.2 # via -r requirements/test.txt, click-log, edx-lint +coverage==5.1 # via -r requirements/test.txt, pytest-cov edx-lint==1.4.1 # via -r requirements/test.txt -enum34==1.1.10 # via -r requirements/test.txt, astroid execnet==1.7.1 # via -r requirements/test.txt, pytest-xdist -funcsigs==1.0.2 # via -r requirements/test.txt, mock, pytest -futures==3.3.0 ; python_version == "2.7" # via -r requirements/test.txt, isort -importlib-metadata==1.5.0 # via -r requirements/test.txt, pluggy, pytest +importlib-metadata==1.6.0 # via -r requirements/test.txt, pluggy, pytest isort==4.3.21 # via -r requirements/test.txt, pylint lazy-object-proxy==1.4.3 # via -r requirements/test.txt, astroid lazy==1.4 # via -r requirements/test.txt mccabe==0.6.1 # via -r requirements/test.txt, pylint mock==3.0.5 # via -r requirements/test.txt -more-itertools==5.0.0 # via -c requirements/constraints.txt, -r requirements/test.txt, pytest +more-itertools==8.2.0 # via -r requirements/test.txt, pytest needle==0.5.0 # via -r requirements/needle.in nose==1.3.7 # via needle packaging==20.3 # via -r requirements/test.txt, pytest -pathlib2==2.3.5 # via -r requirements/test.txt, importlib-metadata, pytest -pillow==6.2.2 # via needle +pathlib2==2.3.5 # via -r requirements/test.txt, pytest +pillow==7.1.2 # via needle pluggy==0.13.1 # via -r requirements/test.txt, pytest py==1.8.1 # via -r requirements/test.txt, pytest pycodestyle==2.5.0 # via -r requirements/test.txt pylint-celery==0.3 # via -r requirements/test.txt, edx-lint -pylint-django==0.11.1 # via -r requirements/test.txt, edx-lint -pylint-plugin-utils==0.3 # via -c requirements/constraints.txt, -r requirements/test.txt, pylint-celery, pylint-django -pylint==1.9.5 # via -r requirements/test.txt, edx-lint, pylint-celery, pylint-django, pylint-plugin-utils -pyparsing==2.4.6 # via -r requirements/test.txt, packaging +pylint-django==2.0.11 # via -r requirements/test.txt, edx-lint +pylint-plugin-utils==0.6 # via -r requirements/test.txt, pylint-celery, pylint-django +pylint==2.4.2 # via -r requirements/test.txt, edx-lint, pylint-celery, pylint-django, pylint-plugin-utils +pyparsing==2.4.7 # via -r requirements/test.txt, packaging pytest-cov==2.8.1 # via -r requirements/test.txt pytest-forked==1.1.3 # via -r requirements/test.txt, pytest-xdist -pytest-xdist==1.31.0 # via -r requirements/test.txt -pytest==4.6.9 # via -r requirements/test.txt, pytest-cov, pytest-forked, pytest-xdist -scandir==1.10.0 # via -r requirements/test.txt, pathlib2 +pytest-xdist==1.32.0 # via -r requirements/test.txt +pytest==5.4.1 # via -r requirements/test.txt, pytest-cov, pytest-forked, pytest-xdist selenium==3.141.0 # via -r requirements/test.txt, needle -singledispatch==3.4.0.3 # via -r requirements/test.txt, astroid, pylint -six==1.14.0 # via -r requirements/test.txt, astroid, edx-lint, mock, more-itertools, packaging, pathlib2, pylint, pytest, pytest-xdist, singledispatch +six==1.14.0 # via -r requirements/test.txt, astroid, edx-lint, mock, packaging, pathlib2, pytest-xdist +typed-ast==1.4.1 # via -r requirements/test.txt, astroid urllib3==1.24.3 # via -c requirements/constraints.txt, -r requirements/test.txt, selenium -wcwidth==0.1.8 # via -r requirements/test.txt, pytest -wrapt==1.12.1 # via -r requirements/test.txt, astroid +wcwidth==0.1.9 # via -r requirements/test.txt, pytest +wrapt==1.11.2 # via -r requirements/test.txt, astroid zipp==1.2.0 # via -r requirements/test.txt, importlib-metadata diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index a99fe207..b35bff23 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -4,6 +4,9 @@ # # make upgrade # -click==7.1.1 # via pip-tools -pip-tools==4.5.1 # via -r requirements/pip-tools.in +click==7.1.2 # via pip-tools +pip-tools==5.1.1 # via -r requirements/pip-tools.in six==1.14.0 # via pip-tools + +# The following packages are considered to be unsafe in a requirements file: +# pip diff --git a/requirements/test.txt b/requirements/test.txt index 5e0c93ee..cde8bf7c 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -5,46 +5,38 @@ # make upgrade # apipkg==1.5 # via execnet -astroid==1.6.6 # via pylint, pylint-celery -atomicwrites==1.3.0 # via pytest +astroid==2.3.3 # via pylint, pylint-celery attrs==19.3.0 # via pytest -backports.functools-lru-cache==1.6.1 # via astroid, isort, pylint click-log==0.3.2 # via edx-lint -click==7.1.1 # via click-log, edx-lint -configparser==4.0.2 # via importlib-metadata, pylint -contextlib2==0.6.0.post1 # via importlib-metadata -coverage==5.0.3 # via pytest-cov +click==7.1.2 # via click-log, edx-lint +coverage==5.1 # via pytest-cov edx-lint==1.4.1 # via -r requirements/test.in -enum34==1.1.10 # via astroid execnet==1.7.1 # via pytest-xdist -funcsigs==1.0.2 # via mock, pytest -futures==3.3.0 ; python_version == "2.7" # via -r requirements/test.in, isort -importlib-metadata==1.5.0 # via pluggy, pytest +importlib-metadata==1.6.0 # via pluggy, pytest isort==4.3.21 # via pylint lazy-object-proxy==1.4.3 # via astroid lazy==1.4 # via -r requirements/base.txt mccabe==0.6.1 # via pylint mock==3.0.5 # via -r requirements/test.in -more-itertools==5.0.0 # via -c requirements/constraints.txt, pytest +more-itertools==8.2.0 # via pytest packaging==20.3 # via -r requirements/test.in, pytest -pathlib2==2.3.5 # via importlib-metadata, pytest +pathlib2==2.3.5 # via pytest pluggy==0.13.1 # via pytest py==1.8.1 # via pytest pycodestyle==2.5.0 # via -r requirements/test.in pylint-celery==0.3 # via edx-lint -pylint-django==0.11.1 # via edx-lint -pylint-plugin-utils==0.3 # via -c requirements/constraints.txt, pylint-celery, pylint-django -pylint==1.9.5 # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils -pyparsing==2.4.6 # via packaging +pylint-django==2.0.11 # via edx-lint +pylint-plugin-utils==0.6 # via pylint-celery, pylint-django +pylint==2.4.2 # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils +pyparsing==2.4.7 # via packaging pytest-cov==2.8.1 # via -r requirements/test.in pytest-forked==1.1.3 # via pytest-xdist -pytest-xdist==1.31.0 # via -r requirements/test.in -pytest==4.6.9 # via pytest-cov, pytest-forked, pytest-xdist -scandir==1.10.0 # via pathlib2 +pytest-xdist==1.32.0 # via -r requirements/test.in +pytest==5.4.1 # via pytest-cov, pytest-forked, pytest-xdist selenium==3.141.0 # via -r requirements/base.txt -singledispatch==3.4.0.3 # via astroid, pylint -six==1.14.0 # via -r requirements/base.txt, astroid, edx-lint, mock, more-itertools, packaging, pathlib2, pylint, pytest, pytest-xdist, singledispatch +six==1.14.0 # via -r requirements/base.txt, astroid, edx-lint, mock, packaging, pathlib2, pytest-xdist +typed-ast==1.4.1 # via astroid urllib3==1.24.3 # via -c requirements/constraints.txt, -r requirements/base.txt, selenium -wcwidth==0.1.8 # via pytest -wrapt==1.12.1 # via astroid +wcwidth==0.1.9 # via pytest +wrapt==1.11.2 # via astroid zipp==1.2.0 # via importlib-metadata diff --git a/requirements/travis.txt b/requirements/travis.txt index 45e8005c..9c677159 100644 --- a/requirements/travis.txt +++ b/requirements/travis.txt @@ -2,34 +2,28 @@ # This file is autogenerated by pip-compile # To update, run: # -# make upgrade +# pip-compile --output-file=requirements/travis.txt requirements/travis.in # appdirs==1.4.3 # via virtualenv -certifi==2019.11.28 # via requests +certifi==2020.4.5.1 # via requests chardet==3.0.4 # via requests -codecov==2.0.16 # via -r requirements/travis.in -configparser==4.0.2 # via importlib-metadata -contextlib2==0.6.0.post1 # via importlib-metadata, importlib-resources, virtualenv, zipp -coverage==5.0.3 # via codecov +codecov==2.0.22 # via -r requirements/travis.in +coverage==5.1 # via codecov distlib==0.3.0 # via virtualenv filelock==3.0.12 # via tox, virtualenv idna==2.9 # via requests -importlib-metadata==1.5.0 # via importlib-resources, pluggy, tox, virtualenv -importlib-resources==1.3.1 # via virtualenv +importlib-metadata==1.6.0 # via importlib-resources, pluggy, tox, virtualenv +importlib-resources==1.5.0 # via virtualenv packaging==20.3 # via tox -pathlib2==2.3.5 # via importlib-metadata, importlib-resources, virtualenv pluggy==0.13.1 # via tox py==1.8.1 # via tox -pyparsing==2.4.6 # via packaging +pyparsing==2.4.7 # via packaging requests==2.23.0 # via codecov -scandir==1.10.0 # via pathlib2 -singledispatch==3.4.0.3 # via importlib-resources -six==1.14.0 # via packaging, pathlib2, tox, virtualenv +six==1.14.0 # via packaging, tox, virtualenv toml==0.10.0 # via tox tox-battery==0.5.2 # via -r requirements/travis.in tox-travis==0.12 # via -r requirements/travis.in -tox==3.14.5 # via -r requirements/travis.in, tox-battery, tox-travis -typing==3.7.4.1 # via importlib-resources +tox==3.15.0 # via -r requirements/travis.in, tox-battery, tox-travis urllib3==1.24.3 # via -c requirements/constraints.txt, requests -virtualenv==20.0.10 # via tox +virtualenv==20.0.20 # via tox zipp==1.2.0 # via importlib-metadata, importlib-resources diff --git a/setup.py b/setup.py index ce84d5a3..c7cbcb69 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ import sys from setuptools import setup -VERSION = '1.0.1' +VERSION = '1.1.0' DESCRIPTION = 'UI-level acceptance test framework' @@ -63,11 +63,9 @@ def is_requirement(line): 'License :: OSI Approved :: Apache Software License', 'Operating System :: OS Independent', 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Software Development :: Testing', diff --git a/tests/test_accessibility.py b/tests/test_accessibility.py index 45918c41..3b0d6dcf 100644 --- a/tests/test_accessibility.py +++ b/tests/test_accessibility.py @@ -12,7 +12,7 @@ from .pages import AccessibilityPage -class GoogleAxsAccessibilityTestMixin(object): +class GoogleAxsAccessibilityTestMixin: """ Test cases for axs ruleset accessibility audit integration. """ @@ -258,7 +258,7 @@ def setUp(self): super(GoogleAxsAccessibilityFirefoxTest, self).setUp() -class AxeCoreTestMixin(object): +class AxeCoreTestMixin: """ Test cases for axe-core ruleset accessibility audit integration. """ diff --git a/tests/test_browser.py b/tests/test_browser.py index bdd2b958..c1225490 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -193,7 +193,7 @@ def test_empty_string_custom_ff_log(self): self.verify_config() -class TestSaveFiles(object): +class TestSaveFiles: """ Tests for saving files from the browser (including logs, page source, and screenshots). diff --git a/tests/test_page_object.py b/tests/test_page_object.py index 1514247f..1346aa1f 100644 --- a/tests/test_page_object.py +++ b/tests/test_page_object.py @@ -54,20 +54,17 @@ def wait_for_page(self, timeout=30): def _private_method(self): """Example of a no-op private method.""" - pass def guarded_method(self): """ A no-op method which waits for the page to finish loading. """ - pass @unguarded def unguarded_method(self): """ A no-op method which does not wait for the page to finish loading. """ - pass @property def guarded_property(self): diff --git a/tox.ini b/tox.ini index d419c3ea..5873d4c6 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,5 @@ [tox] -# pylint 1.7.1 doesn't support Python 3.7, astroid 1.5.2 doesn't support pypy3 -envlist = py{27,35,36,py}-{core,needle} +envlist = py{35,38}-{core,needle} [pytest] addopts = --cov bok_choy --cov-report term-missing From dd3f56f832a6050470ec7a4decdb21384c797927 Mon Sep 17 00:00:00 2001 From: Luis Moreno Date: Thu, 7 May 2020 12:54:12 -0400 Subject: [PATCH 2/2] Fix test --- docs/code/round_3/pages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code/round_3/pages.py b/docs/code/round_3/pages.py index 592600b0..bd635745 100644 --- a/docs/code/round_3/pages.py +++ b/docs/code/round_3/pages.py @@ -21,7 +21,7 @@ def search_results(self): """ Return a list of results returned from a search """ - return self.q(css='ul.repo-list > li > div > h3 > a').text + return self.q(css='ul.repo-list > li > div > div > a').text class GitHubSearchPage(PageObject):