소스 검색

Merge a65357a535 into e5f17eea00

pull/60/merge
Márcio Faustino 10 년 전
부모
커밋
18519ee5f2
31개의 변경된 파일108개의 추가작업 그리고 59개의 파일을 삭제
  1. +1
    -0
      .travis.yml
  2. +1
    -0
      CHANGELOG
  3. +23
    -0
      discover_tests.py
  4. +1
    -0
      docs/changelog.rst
  5. +2
    -2
      mwparserfromhell/compat.py
  6. +1
    -1
      mwparserfromhell/parser/tokenizer.py
  7. +21
    -0
      mwparserfromhell/string_mixin.py
  8. +5
    -3
      setup.py
  9. +2
    -2
      tests/_test_tokenizer.py
  10. +1
    -1
      tests/_test_tree_equality.py
  11. +2
    -2
      tests/test_argument.py
  12. +2
    -2
      tests/test_attribute.py
  13. +2
    -2
      tests/test_builder.py
  14. +2
    -2
      tests/test_comment.py
  15. +4
    -4
      tests/test_ctokenizer.py
  16. +3
    -3
      tests/test_docs.py
  17. +2
    -2
      tests/test_external_link.py
  18. +2
    -2
      tests/test_heading.py
  19. +2
    -2
      tests/test_html_entity.py
  20. +2
    -2
      tests/test_parameter.py
  21. +2
    -2
      tests/test_parser.py
  22. +3
    -3
      tests/test_pytokenizer.py
  23. +3
    -3
      tests/test_smart_list.py
  24. +3
    -3
      tests/test_string_mixin.py
  25. +2
    -2
      tests/test_tag.py
  26. +2
    -2
      tests/test_template.py
  27. +3
    -3
      tests/test_text.py
  28. +3
    -3
      tests/test_tokens.py
  29. +2
    -2
      tests/test_utils.py
  30. +2
    -2
      tests/test_wikicode.py
  31. +2
    -2
      tests/test_wikilink.py

+ 1
- 0
.travis.yml 파일 보기

@@ -1,5 +1,6 @@
language: python
python:
- "2.6"
- "2.7"
- "3.2"
- "3.3"


+ 1
- 0
CHANGELOG 파일 보기

@@ -1,5 +1,6 @@
v0.4 (unreleased):

- Added support for Python 2.6.
- Template.has() is now passed 'ignore_empty=False' by default instead of True.
This fixes a bug when adding parameters to templates with empty fields, and
is a breaking change if you rely on the default behavior.


+ 23
- 0
discover_tests.py 파일 보기

@@ -0,0 +1,23 @@
# -*- coding: UTF-8 -*-


"""
Discover tests using ``unittest2`.

It appears the default distutils test suite doesn't play nice with
``setUpClass`` thereby making some tests fail. Using ``unittest2``
to load tests seems to work around that issue.

http://stackoverflow.com/a/17004409/753501
"""


# Standard:
import os.path

# External:
import unittest2


def additional_tests():
return unittest2.defaultTestLoader.discover(os.path.dirname(__file__))

+ 1
- 0
docs/changelog.rst 파일 보기

@@ -7,6 +7,7 @@ v0.4
Unreleased
(`changes <https://github.com/earwig/mwparserfromhell/compare/v0.3.2...develop>`__):

- Added support for Python 2.6.
- :py:meth:`.Template.has` is now passed *ignore_empty=False* by default
instead of *True*. This fixes a bug when adding parameters to templates with
empty fields, **and is a breaking change if you rely on the default


+ 2
- 2
mwparserfromhell/compat.py 파일 보기

@@ -10,8 +10,8 @@ types are meant to be imported directly from within the parser's modules.

import sys

py3k = sys.version_info.major == 3
py32 = py3k and sys.version_info.minor == 2
py3k = (sys.version_info[0] == 3)
py32 = py3k and (sys.version_info[1] == 2)

if py3k:
bytes = bytes


+ 1
- 1
mwparserfromhell/parser/tokenizer.py 파일 보기

@@ -620,7 +620,7 @@ class Tokenizer(object):
self._emit_first(tokens.TagAttrStart(pad_first=buf["first"],
pad_before_eq=buf["before_eq"], pad_after_eq=buf["after_eq"]))
self._emit_all(self._pop())
data.padding_buffer = {key: "" for key in data.padding_buffer}
data.padding_buffer = dict((key, "") for key in data.padding_buffer)

def _handle_tag_space(self, data, text):
"""Handle whitespace (*text*) inside of an HTML open tag."""


+ 21
- 0
mwparserfromhell/string_mixin.py 파일 보기

@@ -32,6 +32,15 @@ from .compat import bytes, py3k, str

__all__ = ["StringMixIn"]

def inheritdoc(method):
"""Set __doc__ of *method* to __doc__ of *method* in its parent class.

Since this is used on :py:class:`~.StringMixIn`, the "parent class" used is
``str``. This function can be used as a decorator.
"""
method.__doc__ = getattr(str, method.__name__).__doc__
return method

class StringMixIn(object):
"""Implement the interface for ``unicode``/``str`` in a dynamic manner.

@@ -99,8 +108,20 @@ class StringMixIn(object):
def __contains__(self, item):
return str(item) in self.__unicode__()

@inheritdoc
def encode(self, encoding=None, errors=None):
if encoding is None:
encoding = getdefaultencoding()
args = [encoding]
if errors is not None:
args.append(errors)
return self.__unicode__().encode(*args)

def __getattr__(self, attr):
return getattr(self.__unicode__(), attr)

if py3k:
maketrans = str.maketrans # Static method can't rely on __getattr__


del inheritdoc

+ 5
- 3
setup.py 파일 보기

@@ -23,9 +23,9 @@

import sys

if (sys.version_info[0] == 2 and sys.version_info[1] < 7) or \
if (sys.version_info[0] == 2 and sys.version_info[1] < 6) or \
(sys.version_info[1] == 3 and sys.version_info[1] < 2):
raise Exception('mwparserfromhell needs Python 2.7+ or 3.2+')
raise Exception('mwparserfromhell needs Python 2.6+ or 3.2+')

from setuptools import setup, find_packages, Extension

@@ -42,7 +42,8 @@ setup(
name = "mwparserfromhell",
packages = find_packages(exclude=("tests",)),
ext_modules = [tokenizer],
test_suite = "tests",
tests_require = ['unittest2py3k' if py3k else 'unittest2'],
test_suite = "discover_tests",
version = __version__,
author = "Ben Kurtovic",
author_email = "ben.kurtovic@gmail.com",
@@ -58,6 +59,7 @@ setup(
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.2",


+ 2
- 2
tests/_test_tokenizer.py 파일 보기

@@ -35,7 +35,7 @@ class _TestParseError(Exception):
class TokenizerTestCase(object):
"""A base test case for tokenizers, whose tests are loaded dynamically.

Subclassed along with unittest.TestCase to form TestPyTokenizer and
Subclassed along with unittest2.TestCase to form TestPyTokenizer and
TestCTokenizer. Tests are loaded dynamically from files in the 'tokenizer'
directory.
"""
@@ -121,7 +121,7 @@ class TokenizerTestCase(object):
if len(sys.argv) > 2 and sys.argv[1] == "--use":
for name in sys.argv[2:]:
load_file(path.join(directory, name + extension))
sys.argv = [sys.argv[0]] # So unittest doesn't try to load these
sys.argv = [sys.argv[0]] # So unittest2 doesn't try to load these
cls.skip_others = True
else:
for filename in listdir(directory):


+ 1
- 1
tests/_test_tree_equality.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
from unittest import TestCase
from unittest2 import TestCase

from mwparserfromhell.compat import range
from mwparserfromhell.nodes import (Argument, Comment, Heading, HTMLEntity,


+ 2
- 2
tests/test_argument.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import Argument, Text
@@ -99,4 +99,4 @@ class TestArgument(TreeEqualityTestCase):
self.assertIs(None, node2.default)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_attribute.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import Template
@@ -86,4 +86,4 @@ class TestAttribute(TreeEqualityTestCase):
self.assertRaises(ValueError, setattr, node, pad, True)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_builder.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.nodes import (Argument, Comment, ExternalLink, Heading,
HTMLEntity, Tag, Template, Text, Wikilink)
@@ -417,4 +417,4 @@ class TestBuilder(TreeEqualityTestCase):
self.assertWikicodeEqual(valid, self.builder.build(test))

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_comment.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import Comment
@@ -64,4 +64,4 @@ class TestComment(TreeEqualityTestCase):
self.assertEqual("barfoo", node.contents)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 4
- 4
tests/test_ctokenizer.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

try:
from mwparserfromhell.parser._tokenizer import CTokenizer
@@ -30,8 +30,8 @@ except ImportError:

from ._test_tokenizer import TokenizerTestCase

@unittest.skipUnless(CTokenizer, "C tokenizer not available")
class TestCTokenizer(TokenizerTestCase, unittest.TestCase):
@unittest2.skipUnless(CTokenizer, "C tokenizer not available")
class TestCTokenizer(TokenizerTestCase, unittest2.TestCase):
"""Test cases for the C tokenizer."""

@classmethod
@@ -45,4 +45,4 @@ class TestCTokenizer(TokenizerTestCase, unittest.TestCase):
self.assertTrue(CTokenizer().USES_C)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 3
- 3
tests/test_docs.py 파일 보기

@@ -22,14 +22,14 @@

from __future__ import print_function, unicode_literals
import json
import unittest
import unittest2

import mwparserfromhell
from mwparserfromhell.compat import py3k, str

from .compat import StringIO, urlencode, urlopen

class TestDocs(unittest.TestCase):
class TestDocs(unittest2.TestCase):
"""Integration test cases for mwparserfromhell's documentation."""

def assertPrint(self, input, output):
@@ -128,4 +128,4 @@ class TestDocs(unittest.TestCase):
self.assertEqual(expected, actual)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_external_link.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import ExternalLink, Text
@@ -122,4 +122,4 @@ class TestExternalLink(TreeEqualityTestCase):
self.assertEqual("http://example.com/", str(node2))

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_heading.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import Heading, Text
@@ -85,4 +85,4 @@ class TestHeading(TreeEqualityTestCase):
self.assertRaises(ValueError, setattr, node, "level", False)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_html_entity.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import HTMLEntity
@@ -165,4 +165,4 @@ class TestHTMLEntity(TreeEqualityTestCase):
self.assertEqual("\U0001F648", node4.normalize())

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_parameter.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import Text
@@ -72,4 +72,4 @@ class TestParameter(TreeEqualityTestCase):
self.assertFalse(node2.showkey)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_parser.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell import parser
from mwparserfromhell.compat import range
@@ -86,4 +86,4 @@ class TestParser(TreeEqualityTestCase):
parser.use_c = restore

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 3
- 3
tests/test_pytokenizer.py 파일 보기

@@ -21,13 +21,13 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.parser.tokenizer import Tokenizer

from ._test_tokenizer import TokenizerTestCase

class TestPyTokenizer(TokenizerTestCase, unittest.TestCase):
class TestPyTokenizer(TokenizerTestCase, unittest2.TestCase):
"""Test cases for the Python tokenizer."""

@classmethod
@@ -41,4 +41,4 @@ class TestPyTokenizer(TokenizerTestCase, unittest.TestCase):
self.assertFalse(Tokenizer().USES_C)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 3
- 3
tests/test_smart_list.py 파일 보기

@@ -21,12 +21,12 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import py3k, range
from mwparserfromhell.smart_list import SmartList, _ListProxy

class TestSmartList(unittest.TestCase):
class TestSmartList(unittest2.TestCase):
"""Test cases for the SmartList class and its child, _ListProxy."""

def _test_get_set_del_item(self, builder):
@@ -387,4 +387,4 @@ class TestSmartList(unittest.TestCase):
self.assertEqual([4, 3, 2, 1.9, 1.8], child2)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 3
- 3
tests/test_string_mixin.py 파일 보기

@@ -23,7 +23,7 @@
from __future__ import unicode_literals
from sys import getdefaultencoding
from types import GeneratorType
import unittest
import unittest2

from mwparserfromhell.compat import bytes, py3k, py32, range, str
from mwparserfromhell.string_mixin import StringMixIn
@@ -36,7 +36,7 @@ class _FakeString(StringMixIn):
return self._data


class TestStringMixIn(unittest.TestCase):
class TestStringMixIn(unittest2.TestCase):
"""Test cases for the StringMixIn class."""

def test_docs(self):
@@ -432,4 +432,4 @@ class TestStringMixIn(unittest.TestCase):
self.assertEqual("000123", str12.zfill(6))

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_tag.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import Tag, Template, Text
@@ -305,4 +305,4 @@ class TestTag(TreeEqualityTestCase):
self.assertEqual('<div/>', node)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_template.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import HTMLEntity, Template, Text
@@ -428,4 +428,4 @@ class TestTemplate(TreeEqualityTestCase):
self.assertEqual("{{foo|a=b|c=d|e=f|a=|a=b}}", node26)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 3
- 3
tests/test_text.py 파일 보기

@@ -21,12 +21,12 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import Text

class TestText(unittest.TestCase):
class TestText(unittest2.TestCase):
"""Test cases for the Text node."""

def test_unicode(self):
@@ -71,4 +71,4 @@ class TestText(unittest.TestCase):
self.assertIsInstance(node.value, str)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 3
- 3
tests/test_tokens.py 파일 보기

@@ -21,12 +21,12 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import py3k
from mwparserfromhell.parser import tokens

class TestTokens(unittest.TestCase):
class TestTokens(unittest2.TestCase):
"""Test cases for the Token class and its subclasses."""

def test_issubclass(self):
@@ -105,4 +105,4 @@ class TestTokens(unittest.TestCase):
self.assertEqual(token, eval(repr(token), vars(tokens)))

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_utils.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.nodes import Template, Text
from mwparserfromhell.utils import parse_anything
@@ -59,4 +59,4 @@ class TestUtils(TreeEqualityTestCase):
self.assertRaises(ValueError, parse_anything, ["foo", [object]])

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_wikicode.py 파일 보기

@@ -24,7 +24,7 @@ from __future__ import unicode_literals
from functools import partial
import re
from types import GeneratorType
import unittest
import unittest2

from mwparserfromhell.compat import py3k, str
from mwparserfromhell.nodes import (Argument, Comment, Heading, HTMLEntity,
@@ -432,4 +432,4 @@ class TestWikicode(TreeEqualityTestCase):
self.assertEqual(expected.expandtabs(4), code.get_tree())

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

+ 2
- 2
tests/test_wikilink.py 파일 보기

@@ -21,7 +21,7 @@
# SOFTWARE.

from __future__ import unicode_literals
import unittest
import unittest2

from mwparserfromhell.compat import str
from mwparserfromhell.nodes import Text, Wikilink
@@ -99,4 +99,4 @@ class TestWikilink(TreeEqualityTestCase):
self.assertIs(None, node2.text)

if __name__ == "__main__":
unittest.main(verbosity=2)
unittest2.main(verbosity=2)

불러오는 중...
취소
저장