Skip to content

Commit

Permalink
Merge pull request #26 from jmbowman/jmbowman/PLAT-1998
Browse files Browse the repository at this point in the history
PLAT-1998 Update test runner and dependency management
  • Loading branch information
Jeremy Bowman authored Mar 29, 2018
2 parents 138e6fa + aa3afbc commit 1efbb08
Show file tree
Hide file tree
Showing 23 changed files with 490 additions and 57 deletions.
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

0 comments on commit 1efbb08

Please sign in to comment.