Commit 403dc446 by Martyn James

Merge pull request #16 from edx-solutions/mjevtic/SOL-299

pep8 and pylint should be supported and runable on Travis; changed the t... merging to run on travis
parents 86f99fc4 8f39a0b0
[pep8]
ignore=E501
max_line_length=119
exclude=settings
[MASTER]
# Specify a configuration file.
#rcfile=
# Python code to execute, usually for sys.path manipulation such as
# pygtk.require().
#init-hook=
# Profiled execution.
profile=no
# Add files or directories to the blacklist. They should be base names, not
# paths.
ignore=migrations
# Pickle collected data for later comparisons.
persistent=yes
# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
load-plugins=
[MESSAGES CONTROL]
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time. See also the "--disable" option for examples.
#enable=
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
# option multiple times (only on the command line, not in the configuration
# file where it should appear only once).You can also use "--disable=all" to
# disable everything first and then reenable specific checks. For example, if
# you want to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
# I0011 locally-disabled (module-level pylint overrides)
disable=I0011,W0232
[REPORTS]
# Set the output format. Available formats are text, parseable, colorized, msvs
# (visual studio) and html. You can also give a reporter class, eg
# mypackage.mymodule.MyReporterClass.
output-format=text
# Put messages in a separate file for each module / package specified on the
# command line instead of printing them on stdout. Reports (if any) will be
# written in a file name "pylint_global.[txt|html]".
files-output=no
# Tells whether to display a full report or only the messages
reports=yes
# Python expression which should return a note less than 10 (10 is the highest
# note). You have access to the variables errors warning, statement which
# respectively contain the number of errors / warnings messages and the total
# number of statements analyzed. This is used by the global evaluation report
# (RP0004).
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
# Add a comment according to your evaluation note. This is used by the global
# evaluation report (RP0004).
comment=no
[MISCELLANEOUS]
# List of note tags to take in consideration, separated by a comma.
notes=FIXME,XXX,TODO
[VARIABLES]
# Tells whether we should check for unused import in __init__ files.
init-import=no
# A regular expression matching the beginning of the name of dummy variables
# (i.e. not used).
dummy-variables-rgx=_|dummy
# List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible.
additional-builtins=
[TYPECHECK]
# Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive).
ignore-mixin-members=yes
# List of classes names for which member attributes should not be checked
# (useful for classes with attributes dynamically set).
ignored-classes=SQLObject
# When zope mode is activated, add a predefined set of Zope acquired attributes
# to generated-members.
zope=no
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E0201 when accessed. Python regular
# expressions are accepted.
generated-members=REQUEST,acl_users,aq_parent
[BASIC]
# Required attributes for module, separated by a comma
required-attributes=
# List of builtins function names that should not be used, separated by a comma
bad-functions=map,filter,apply,input
# Regular expression which should only match correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
# Regular expression which should only match correct module level names
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# Regular expression which should only match correct class names
class-rgx=[A-Z_][a-zA-Z0-9]+$
# Regular expression which should only match correct function names
function-rgx=[a-z_][a-z0-9_]{2,50}$
# Regular expression which should only match correct method names
method-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct instance attribute names
attr-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct argument names
argument-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct variable names
variable-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct list comprehension /
# generator expression variable names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_
# Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,baz,toto,tutu,tata
# Regular expression which should only match functions or classes name which do
# not require a docstring
no-docstring-rgx=__.*__
[SIMILARITIES]
# Minimum lines number of a similarity.
min-similarity-lines=4
# Ignore comments when computing similarities.
ignore-comments=yes
# Ignore docstrings when computing similarities.
ignore-docstrings=yes
# Ignore imports when computing similarities.
ignore-imports=no
[FORMAT]
# Maximum number of characters on a single line.
max-line-length=120
# Maximum number of lines in a module
max-module-lines=1000
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
indent-string=' '
[IMPORTS]
# Deprecated modules which should not be used, separated by a comma
deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
# Create a graph of every (i.e. internal and external) dependencies in the
# given file (report RP0402 must not be disabled)
import-graph=
# Create a graph of external dependencies in the given file (report RP0402 must
# not be disabled)
ext-import-graph=
# Create a graph of internal dependencies in the given file (report RP0402 must
# not be disabled)
int-import-graph=
[DESIGN]
# Maximum number of arguments for function / method
max-args=5
# Argument names that match this expression will be ignored. Default to name
# with leading underscore
ignored-argument-names=_.*
# Maximum number of locals for function / method body
max-locals=15
# Maximum number of return / yield for function / method body
max-returns=6
# Maximum number of branch for function / method body
max-branchs=12
# Maximum number of statements in function / method body
max-statements=50
# Maximum number of parents for a class (see R0901).
max-parents=7
# Maximum number of attributes for a class (see R0902).
max-attributes=7
# Minimum number of public methods for a class (see R0903).
min-public-methods=2
# Maximum number of public methods for a class (see R0904).
max-public-methods=20
[CLASSES]
# List of interface methods to ignore, separated by a comma. This is used for
# instance to not check methods defines in Zope's Interface base class.
ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
# List of method names used to declare (i.e. assign) instance attributes.
defining-attr-methods=__init__,__new__,setUp
# List of valid names for the first argument in a class method.
valid-classmethod-first-arg=cls
# List of valid names for the first argument in a metaclass class method.
valid-metaclass-classmethod-first-arg=mcs
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
overgeneral-exceptions=Exception
language: python language: python
python: python:
- "2.7" - "2.7"
install: pip install -r requirements.txt
script: DJANGO_SETTINGS_MODULE="settings" nosetests --with-coverage --with-django install:
- pip install -r requirements.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
after_success: coveralls
...@@ -64,7 +64,7 @@ $ DJANGO_SETTINGS_MODULE="settings" nosetests --with-django tests/unit ...@@ -64,7 +64,7 @@ $ DJANGO_SETTINGS_MODULE="settings" nosetests --with-django tests/unit
To see the coverage, run the tests using the following command: To see the coverage, run the tests using the following command:
```bash ```bash
$ DJANGO_SETTINGS_MODULE="settings" nosetests --with-coverage --with-django $ DJANGO_SETTINGS_MODULE="settings" nosetests --with-coverage --cover-package="google_drive" --with-django
``` ```
If you have not installed the xblock-sdk in the active virtualenv, If you have not installed the xblock-sdk in the active virtualenv,
......
...@@ -14,13 +14,13 @@ from xblock.fragment import Fragment ...@@ -14,13 +14,13 @@ from xblock.fragment import Fragment
from xblockutils.publish_event import PublishEventMixin from xblockutils.publish_event import PublishEventMixin
from xblockutils.resources import ResourceLoader from xblockutils.resources import ResourceLoader
log = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
RESOURCE_LOADER = ResourceLoader(__name__) RESOURCE_LOADER = ResourceLoader(__name__)
# Classes ########################################################### # Classes ###########################################################
class GoogleCalendarBlock(XBlock, PublishEventMixin): class GoogleCalendarBlock(XBlock, PublishEventMixin): # pylint: disable=too-many-ancestors
""" """
XBlock providing a google calendar view for a specific calendar XBlock providing a google calendar view for a specific calendar
""" """
......
...@@ -16,13 +16,13 @@ from xblock.fragment import Fragment ...@@ -16,13 +16,13 @@ from xblock.fragment import Fragment
from xblockutils.publish_event import PublishEventMixin from xblockutils.publish_event import PublishEventMixin
from xblockutils.resources import ResourceLoader from xblockutils.resources import ResourceLoader
log = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
RESOURCE_LOADER = ResourceLoader(__name__) RESOURCE_LOADER = ResourceLoader(__name__)
# Classes ########################################################### # Classes ###########################################################
class GoogleDocumentBlock(XBlock, PublishEventMixin): class GoogleDocumentBlock(XBlock, PublishEventMixin): # pylint: disable=too-many-ancestors
""" """
XBlock providing a google document embed link XBlock providing a google document embed link
""" """
...@@ -113,16 +113,16 @@ class GoogleDocumentBlock(XBlock, PublishEventMixin): ...@@ -113,16 +113,16 @@ class GoogleDocumentBlock(XBlock, PublishEventMixin):
# suffix argument is specified for xblocks, but we are not using herein # suffix argument is specified for xblocks, but we are not using herein
@XBlock.json_handler @XBlock.json_handler
def check_url(self, data, suffix=''): # pylint: disable=unused-argument def check_url(self, data, suffix=''): # pylint: disable=unused-argument,no-self-use
""" """
Checks that the given document url is accessible, and therfore assumed to be valid Checks that the given document url is accessible, and therefore assumed to be valid
""" """
test_url = data['url'] test_url = data['url']
try: try:
url_response = requests.head(test_url) url_response = requests.head(test_url)
# Catch wide range of errors # Catch wide range of errors
except requests.exceptions.RequestException as ex: except requests.exceptions.RequestException as ex:
log.debug("Unable to connect to %s - %s", test_url, unicode(ex)) LOG.debug("Unable to connect to %s - %s", test_url, unicode(ex))
return { return {
'status_code': 400, 'status_code': 400,
} }
......
...@@ -2,12 +2,13 @@ ...@@ -2,12 +2,13 @@
from xblockutils.base_test import SeleniumBaseTest from xblockutils.base_test import SeleniumBaseTest
class GoogleCalendarBaseTest(SeleniumBaseTest): class GoogleCalendarBaseTest(SeleniumBaseTest): # pylint: disable=too-many-ancestors,too-few-public-methods
""" Test class for google calendar """ """ Test class for google calendar """
module_name = __name__ module_name = __name__
default_css_selector = 'div.google-calendar-xblock-wrapper' default_css_selector = 'div.google-calendar-xblock-wrapper'
def test_calendar_publish_event(self): def test_calendar_publish_event(self):
""" Tests whether the publish event for calendar was triggered """
calendar = self.go_to_page('Calendar') calendar = self.go_to_page('Calendar')
load_event_complete = calendar.find_element_by_css_selector('.load_event_complete') load_event_complete = calendar.find_element_by_css_selector('.load_event_complete')
self.assertEqual( self.assertEqual(
......
...@@ -2,12 +2,13 @@ ...@@ -2,12 +2,13 @@
from xblockutils.base_test import SeleniumBaseTest from xblockutils.base_test import SeleniumBaseTest
class GoogleDocumentBaseTest(SeleniumBaseTest): class GoogleDocumentBaseTest(SeleniumBaseTest): # pylint: disable=too-many-ancestors
""" Test class for google document """ """ Test class for google document """
module_name = __name__ module_name = __name__
default_css_selector = 'div.google-docs-xblock-wrapper' default_css_selector = 'div.google-docs-xblock-wrapper'
def test_document_publish_event(self): def test_document_publish_event(self):
""" Tests whether the publish event for document was triggered """
document = self.go_to_page('Document') document = self.go_to_page('Document')
load_event_complete = document.find_element_by_css_selector('.load_event_complete') load_event_complete = document.find_element_by_css_selector('.load_event_complete')
self.assertEqual( self.assertEqual(
...@@ -16,6 +17,7 @@ class GoogleDocumentBaseTest(SeleniumBaseTest): ...@@ -16,6 +17,7 @@ class GoogleDocumentBaseTest(SeleniumBaseTest):
) )
def test_image_publish_event(self): def test_image_publish_event(self):
""" Tests whether the publish event for image was triggered """
image = self.go_to_page('Image') image = self.go_to_page('Image')
load_event_complete = image.find_element_by_css_selector('.load_event_complete') load_event_complete = image.find_element_by_css_selector('.load_event_complete')
self.assertEqual( self.assertEqual(
......
...@@ -42,12 +42,13 @@ class TestGoogleDocumentBlock(unittest.TestCase): ...@@ -42,12 +42,13 @@ class TestGoogleDocumentBlock(unittest.TestCase):
ids = generate_scope_ids(runtime, 'google_document') ids = generate_scope_ids(runtime, 'google_document')
return GoogleDocumentBlock(runtime, db_model, scope_ids=ids) return GoogleDocumentBlock(runtime, db_model, scope_ids=ids)
def test_document_templates_contents(self): def test_document_template_content(self): # pylint: disable=no-self-use
""" Test content of GoogleDocumentBlock's rendered views """ """ Test content of GoogleDocumentBlock's rendered views """
block = TestGoogleDocumentBlock.make_document_block() block = TestGoogleDocumentBlock.make_document_block()
block.usage_id = Mock() block.usage_id = Mock()
student_fragment = block.render('student_view', Mock()) student_fragment = block.render('student_view', Mock())
# pylint: disable=no-value-for-parameter
assert_in('<div class="google-docs-xblock-wrapper"', student_fragment.content) assert_in('<div class="google-docs-xblock-wrapper"', student_fragment.content)
assert_in('Google Document', student_fragment.content) assert_in('Google Document', student_fragment.content)
assert_in( assert_in(
...@@ -69,7 +70,7 @@ class TestGoogleDocumentBlock(unittest.TestCase): ...@@ -69,7 +70,7 @@ class TestGoogleDocumentBlock(unittest.TestCase):
assert_in('<div class="xblock-inputs editor_content_wrapper">', studio_fragment.content) assert_in('<div class="xblock-inputs editor_content_wrapper">', studio_fragment.content)
assert_in('<div class="xblock-actions">', studio_fragment.content) assert_in('<div class="xblock-actions">', studio_fragment.content)
def test_studio_document_submit(self): def test_studio_document_submit(self): # pylint: disable=no-self-use
""" Test studio submission of GoogleDocumentBlock """ """ Test studio submission of GoogleDocumentBlock """
block = TestGoogleDocumentBlock.make_document_block() block = TestGoogleDocumentBlock.make_document_block()
...@@ -79,14 +80,14 @@ class TestGoogleDocumentBlock(unittest.TestCase): ...@@ -79,14 +80,14 @@ class TestGoogleDocumentBlock(unittest.TestCase):
'alt_text': "This is alt text", 'alt_text': "This is alt text",
}) })
res = block.handle('studio_submit', make_request(body)) res = block.handle('studio_submit', make_request(body))
# pylint: disable=no-value-for-parameter
assert_equals(json.loads(res.body), {'result': 'success'}) assert_equals(json.loads(res.body), {'result': 'success'})
assert_equals(block.display_name, "Google Document") assert_equals(block.display_name, "Google Document")
assert_equals(block.embed_code, "<iframe>") assert_equals(block.embed_code, "<iframe>")
assert_equals(block.alt_text, "This is alt text") assert_equals(block.alt_text, "This is alt text")
def test_check_document_url(self): def test_check_document_url(self): # pylint: disable=no-self-use
""" Test verification of the provided Google Document URL""" """ Test verification of the provided Google Document URL"""
block = TestGoogleDocumentBlock.make_document_block() block = TestGoogleDocumentBlock.make_document_block()
...@@ -97,7 +98,7 @@ class TestGoogleDocumentBlock(unittest.TestCase): ...@@ -97,7 +98,7 @@ class TestGoogleDocumentBlock(unittest.TestCase):
) )
}) })
res = block.handle('check_url', make_request(data)) res = block.handle('check_url', make_request(data))
# pylint: disable=no-value-for-parameter
assert_equals(json.loads(res.body), {'status_code': 200}) assert_equals(json.loads(res.body), {'status_code': 200})
data = json.dumps({ data = json.dumps({
...@@ -117,7 +118,7 @@ class TestGoogleDocumentBlock(unittest.TestCase): ...@@ -117,7 +118,7 @@ class TestGoogleDocumentBlock(unittest.TestCase):
assert_equals(json.loads(res.body), {'status_code': 404}) assert_equals(json.loads(res.body), {'status_code': 404})
def test_document_publish_event(self): def test_document_publish_event(self): # pylint: disable=no-self-use
""" Test event publishing in GoogleDocumentBlock""" """ Test event publishing in GoogleDocumentBlock"""
block = TestGoogleDocumentBlock.make_document_block() block = TestGoogleDocumentBlock.make_document_block()
...@@ -130,7 +131,7 @@ class TestGoogleDocumentBlock(unittest.TestCase): ...@@ -130,7 +131,7 @@ class TestGoogleDocumentBlock(unittest.TestCase):
'event_type': 'edx.googlecomponent.document.displayed', 'event_type': 'edx.googlecomponent.document.displayed',
}) })
res = block.handle('publish_event', make_request(body)) res = block.handle('publish_event', make_request(body))
# pylint: disable=no-value-for-parameter
assert_equals(json.loads(res.body), {'result': 'success'}) assert_equals(json.loads(res.body), {'result': 'success'})
body = json.dumps({ body = json.dumps({
...@@ -168,12 +169,13 @@ class TestGoogleCalendarBlock(unittest.TestCase): ...@@ -168,12 +169,13 @@ class TestGoogleCalendarBlock(unittest.TestCase):
ids = generate_scope_ids(runtime, 'google_calendar') ids = generate_scope_ids(runtime, 'google_calendar')
return GoogleCalendarBlock(runtime, db_model, scope_ids=ids) return GoogleCalendarBlock(runtime, db_model, scope_ids=ids)
def test_calendar_templates_contents(self): def test_calendar_template_content(self): # pylint: disable=no-self-use
""" Test content of GoogleCalendarBlock's rendered views """ """ Test content of GoogleCalendarBlock's rendered views """
block = TestGoogleCalendarBlock.make_calendar_block() block = TestGoogleCalendarBlock.make_calendar_block()
block.usage_id = Mock() block.usage_id = Mock()
student_fragment = block.render('student_view', Mock()) student_fragment = block.render('student_view', Mock())
# pylint: disable=no-value-for-parameter
assert_in('<div class="google-calendar-xblock-wrapper">', student_fragment.content) assert_in('<div class="google-calendar-xblock-wrapper">', student_fragment.content)
assert_in( assert_in(
( (
...@@ -193,7 +195,7 @@ class TestGoogleCalendarBlock(unittest.TestCase): ...@@ -193,7 +195,7 @@ class TestGoogleCalendarBlock(unittest.TestCase):
assert_in('<div class="xblock-inputs editor_content_wrapper">', studio_fragment.content) assert_in('<div class="xblock-inputs editor_content_wrapper">', studio_fragment.content)
assert_in('<div class="xblock-actions">', studio_fragment.content) assert_in('<div class="xblock-actions">', studio_fragment.content)
def test_calendar_document_submit(self): def test_calendar_document_submit(self): # pylint: disable=no-self-use
""" Test studio submission of GoogleCalendarBlock """ """ Test studio submission of GoogleCalendarBlock """
block = TestGoogleCalendarBlock.make_calendar_block() block = TestGoogleCalendarBlock.make_calendar_block()
...@@ -203,14 +205,14 @@ class TestGoogleCalendarBlock(unittest.TestCase): ...@@ -203,14 +205,14 @@ class TestGoogleCalendarBlock(unittest.TestCase):
'default_view': 1 'default_view': 1
}) })
res = block.handle('studio_submit', make_request(body)) res = block.handle('studio_submit', make_request(body))
# pylint: disable=no-value-for-parameter
assert_equals(json.loads(res.body), {'result': 'success'}) assert_equals(json.loads(res.body), {'result': 'success'})
assert_equals(block.display_name, "Google Calendar") assert_equals(block.display_name, "Google Calendar")
assert_equals(block.calendar_id, "google1234") assert_equals(block.calendar_id, "google1234")
assert_equals(block.default_view, 1) assert_equals(block.default_view, 1)
def test_calendar_publish_event(self): def test_calendar_publish_event(self): # pylint: disable=no-self-use
""" Test event publishing in GoogleCalendarBlock""" """ Test event publishing in GoogleCalendarBlock"""
block = TestGoogleCalendarBlock.make_calendar_block() block = TestGoogleCalendarBlock.make_calendar_block()
...@@ -223,7 +225,7 @@ class TestGoogleCalendarBlock(unittest.TestCase): ...@@ -223,7 +225,7 @@ class TestGoogleCalendarBlock(unittest.TestCase):
'event_type': 'edx.googlecomponent.calendar.displayed' 'event_type': 'edx.googlecomponent.calendar.displayed'
}) })
res = block.handle('publish_event', make_request(body)) res = block.handle('publish_event', make_request(body))
# pylint: disable=no-value-for-parameter
assert_equals(json.loads(res.body), {'result': 'success'}) assert_equals(json.loads(res.body), {'result': 'success'})
body = json.dumps({ body = json.dumps({
......
...@@ -2,7 +2,10 @@ ...@@ -2,7 +2,10 @@
lxml lxml
mock mock
selenium selenium
pep8
pylint
coverage==3.7 coverage==3.7
coveralls
django==1.4.18 django==1.4.18
-e git+https://github.com/nosedjango/nosedjango.git@ed7d7f9aa969252ff799ec159f828eaa8c1cbc5a#egg=nosedjango-dev -e git+https://github.com/nosedjango/nosedjango.git@ed7d7f9aa969252ff799ec159f828eaa8c1cbc5a#egg=nosedjango-dev
-e git+https://github.com/edx-solutions/xblock-utils.git#egg=xblock-utils -e git+https://github.com/edx-solutions/xblock-utils.git#egg=xblock-utils
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment