Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PLAT-1998 Update test runner and dependency management #26

Merged
merged 1 commit into from
Mar 29, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
var/
xblock_google_drive.egg-info
*.log
*.pyc
*~

# Unit test / coverage reports
.cache/
.pytest_cache/
.coverage
.coverage.*
.tox
coverage.xml
htmlcov/

# IDEs and text editors
*~
*.swp
.idea/
.project
.pycharm_helpers/
.pydevproject
4 changes: 0 additions & 4 deletions .pep8

This file was deleted.

26 changes: 19 additions & 7 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,31 @@
language: python
sudo: false

python:
- "2.7"

env:
- TOXENV=django18
- TOXENV=django110
- TOXENV=django111
- TOXENV=quality

before_install:
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
- sleep 3 # give xvfb some time to start
- wget https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux64.tar.gz
- mkdir geckodriver
- tar -xzf geckodriver-v0.19.1-linux64.tar.gz -C geckodriver
- export PATH=$PATH:$PWD/geckodriver

addons:
firefox: '58.0.2'

install:
- "pip install -r requirements.txt"
- "pip uninstall -y xblock-google-drive && python setup.py sdist && pip install dist/xblock-google-drive-0.1.tar.gz"
- pip install -r requirements/travis.txt

script:
- DJANGO_SETTINGS_MODULE="settings" nosetests --with-coverage --cover-package="google_drive" --with-django
- pep8 --config=.pep8 google_drive
- pylint --rcfile=.pylintrc google_drive --report=no
- tox

after_success: coveralls
67 changes: 67 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
.PHONY: clean coverage docs help quality requirements selfcheck test test-all upgrade validate

.DEFAULT_GOAL := help

define BROWSER_PYSCRIPT
import os, webbrowser, sys
try:
from urllib import pathname2url
except:
from urllib.request import pathname2url

webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1])))
endef
export BROWSER_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"

help: ## display this help message
@echo "Please use \`make <target>' where <target> is one of"
@perl -nle'print $& if m{^[a-zA-Z_-]+:.*?## .*$$}' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m %-25s\033[0m %s\n", $$1, $$2}'

clean: ## remove generated byte code, coverage reports, and build artifacts
find . -name '__pycache__' -exec rm -rf {} +
find . -name '*.pyc' -exec rm -f {} +
find . -name '*.pyo' -exec rm -f {} +
find . -name '*~' -exec rm -f {} +
coverage erase
rm -fr build/
rm -fr dist/
rm -fr *.egg-info

coverage: clean ## generate and view HTML coverage report
pytest --cov-report html
$(BROWSER) htmlcov/index.html

upgrade: ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in
pip install -q pip-tools
pip-compile --upgrade -o requirements/dev.txt requirements/base.in requirements/dev.in requirements/quality.in requirements/test.in requirements/travis.in
pip-compile --upgrade -o requirements/quality.txt requirements/base.in requirements/quality.in requirements/test.in
pip-compile --upgrade -o requirements/test.txt requirements/base.in requirements/test.in
pip-compile --upgrade -o requirements/travis.txt requirements/travis.in
# Let tox control the Django version for tests
sed '/^django==/d' requirements/test.txt > requirements/test.tmp
mv requirements/test.tmp requirements/test.txt

quality: ## check coding style with pycodestyle and pylint
tox -e quality

requirements: ## install development environment requirements
pip install -qr requirements/dev.txt --exists-action w
pip-sync requirements/dev.txt requirements/private.*

test: clean ## run tests in the current virtualenv
mkdir -p var
pip install -e .
pytest

diff_cover: test ## find diff lines that need test coverage
diff-cover coverage.xml

test-all: ## run tests on every supported Python/Django combination
tox -e quality
tox

validate: quality test ## run tests and quality checks

selfcheck: ## check that the Makefile is well-formed
@echo "The Makefile is well-formed."
26 changes: 8 additions & 18 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ root folder:

.. code:: bash
$ pip install -r requirements.txt
$ make requirements
Enabling in Studio
------------------
Expand All @@ -36,7 +36,8 @@ form the google-drive repo root:

.. code:: bash
pip install -r requirements.txt
pip install -r requirements/base.in
pip install -e .
Running the workbench
---------------------
Expand All @@ -54,21 +55,22 @@ From google-drive directory, run the tests with the following command:

.. code:: bash
$ DJANGO_SETTINGS_MODULE="settings" nosetests --with-django tests/*
$ pytest
If you want to run only the integration or the unit tests, append the
directory to the command. You can also run separate modules in this
manner.

.. code:: bash
$ DJANGO_SETTINGS_MODULE="settings" nosetests --with-django tests/unit
$ pytest tests/unit
To see the coverage, run the tests using the following command:
To see the coverage report in HTML format, run the tests using the
following command:

.. code:: bash
$ DJANGO_SETTINGS_MODULE="settings" nosetests --with-coverage --cover-package="google_drive" --with-django
$ make coverage
If you have not installed the xblock-sdk in the active virtualenv, you
might also have to prepend ``PYTHONPATH=".:/path/to/xblock"`` to the
Expand Down Expand Up @@ -139,17 +141,5 @@ License
The Google Drive & Calendar XBlocks are available under the GNU Affero
General Public License (AGPLv3).

Installation Troubleshooting
----------------------------

On a Mac, some people have received errors when installing lxml, trying
to find a specific header file for the compiler

Try the following if you encounter a problem:

::

CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/libxml2 CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments pip install lxml

.. |Build Status| image:: https://travis-ci.org/edx-solutions/xblock-google-drive.svg?branch=master
:target: https://travis-ci.org/edx-solutions/xblock-google-drive
5 changes: 3 additions & 2 deletions google_drive/google_calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,11 @@ def studio_view(self, context): # pylint: disable=unused-argument
"""
fragment = Fragment()
# Need to access protected members of fields to get their default value
default_name = self.fields['display_name']._default # pylint: disable=protected-access,unsubscriptable-object
fragment.add_content(RESOURCE_LOADER.render_template(CALENDAR_EDIT_TEMPLATE, {
'self': self,
'defaultName': self.fields['display_name']._default, # pylint: disable=protected-access
'defaultID': self.fields['calendar_id']._default # pylint: disable=protected-access
'defaultName': default_name,
'defaultID': self.fields['calendar_id']._default # pylint: disable=protected-access,unsubscriptable-object
}))
fragment.add_javascript(RESOURCE_LOADER.load_unicode('public/js/google_calendar_edit.js'))
fragment.add_css(RESOURCE_LOADER.load_unicode('public/css/google_edit.css'))
Expand Down
3 changes: 2 additions & 1 deletion google_drive/google_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,10 @@ def studio_view(self, context): # pylint: disable=unused-argument
"""
fragment = Fragment()
# Need to access protected members of fields to get their default value
default_name = self.fields['display_name']._default # pylint: disable=protected-access,unsubscriptable-object
fragment.add_content(RESOURCE_LOADER.render_template(DOCUMENT_EDIT_TEMPLATE, {
'self': self,
'defaultName': self.fields['display_name']._default # pylint: disable=protected-access
'defaultName': default_name,
}))
fragment.add_javascript(RESOURCE_LOADER.load_unicode('public/js/google_docs_edit.js'))
fragment.add_css(RESOURCE_LOADER.load_unicode('public/css/google_edit.css'))
Expand Down
2 changes: 1 addition & 1 deletion google_drive/tests/integration/test_publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@


# Classes ###########################################################
class GoogleCalendarPublishTestCase(GoogleCalendarBaseTest): # pylint: disable=too-few-public-methods, too-many-ancestors
class GoogleCalendarPublishTestCase(GoogleCalendarBaseTest): # pylint: disable=too-many-ancestors
"""
Tests for Google Calendar event publishing functionality.
"""
Expand Down
12 changes: 7 additions & 5 deletions google_drive/tests/integration/test_studio.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@

# Imports ###########################################################
from ddt import ddt, unpack, data
from .base_test import GoogleCalendarBaseTest, GoogleDocumentBaseTest
from .studio_scenarios import CALENDAR_SCENARIOS, DOCUMENT_SCENARIOS, IMAGE_SCENARIOS

from google_drive.google_calendar import DEFAULT_CALENDAR_URL
from google_drive.google_docs import DEFAULT_DOCUMENT_URL
from google_drive.tests.test_const import TEST_IMAGE_URL

from .base_test import GoogleCalendarBaseTest, GoogleDocumentBaseTest
from .studio_scenarios import CALENDAR_SCENARIOS, DOCUMENT_SCENARIOS, IMAGE_SCENARIOS


# Classes ###########################################################
@ddt # pylint: disable=too-many-ancestors
Expand All @@ -23,7 +25,7 @@ def studio_save(self):
""" Save changes made in studio for Google Calendar """
self.browser.find_element_by_css_selector('#calendar-submit-options').click()

@data(*CALENDAR_SCENARIOS) # pylint: disable=star-args
@data(*CALENDAR_SCENARIOS)
@unpack
def test_save_calendar(self, page_name):
"""
Expand Down Expand Up @@ -74,7 +76,7 @@ def studio_save(self):
""" Save changes made in studio for Google Document """
self.browser.find_element_by_css_selector('#document-submit-options').click()

@data(*DOCUMENT_SCENARIOS) # pylint: disable=star-args
@data(*DOCUMENT_SCENARIOS)
@unpack
def test_save_document(self, page_name):
"""
Expand All @@ -99,7 +101,7 @@ def test_save_document(self, page_name):
# Expecting that the new display name is the title of the IFrame
self.assertEqual(document_iframe.get_attribute("title"), 'My Document')

@data(*IMAGE_SCENARIOS) # pylint: disable=star-args
@data(*IMAGE_SCENARIOS)
@unpack
def test_save_image(self, page_name):
"""
Expand Down
18 changes: 0 additions & 18 deletions requirements.txt

This file was deleted.

6 changes: 6 additions & 0 deletions requirements/base.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Core requirements for using this application

Django>=1.8,<2 # Web application framework
mako # Used by xblock-utils.resources, but not declared as a requirement for it
XBlock[django] # Courseware component architecture
-e git+https://github.com/edx/xblock-utils.git@v1.0.5#egg=xblock-utils==1.0.5 # Utility functions shared by many XBlocks
4 changes: 4 additions & 0 deletions requirements/dev.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Additional requirements for development of this application

diff-cover # Changeset diff test coverage
pip-tools # Requirements file management
Loading