Skip to content

Commit

Permalink
Add support for bytes and matrix multiplication.
Browse files Browse the repository at this point in the history
  • Loading branch information
hannosch committed May 12, 2017
1 parent aaef300 commit 8acaaf6
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 13 deletions.
1 change: 1 addition & 0 deletions CHANGES.rst
Expand Up @@ -4,6 +4,7 @@ Changelog
3.3 (unreleased)
----------------

- Add support for bytes and matrix multiplication.

3.2 (2017-04-26)
----------------
Expand Down
12 changes: 12 additions & 0 deletions src/Missing/__init__.py
Expand Up @@ -8,6 +8,12 @@
else:
PY3 = False

if sys.version_info >= (3, 5):
PY35 = True

else:
PY35 = False


class Missing(Base):

Expand All @@ -20,6 +26,9 @@ def __call__(self):
def __repr__(self):
return 'Missing.Value'

def __bytes__(self):
return b''

def __str__(self):
return ''

Expand Down Expand Up @@ -79,6 +88,9 @@ def _calc(self, other):
__lshift__ = __rshift__ = __rlshift__ = __rrshift__ = _calc
__and__ = __rand__ = __or__ = __ror__ = __xor__ = __rxor__ = _calc

if PY35:
__matmul__ = __rmatmul__ = _calc

def _change(self):
return self

Expand Down
52 changes: 39 additions & 13 deletions src/Missing/tests.py
@@ -1,15 +1,15 @@
import sys
import unittest

if sys.version_info >= (3, ):
from Missing import PY3
from Missing import PY35

if PY3:
def u(value):
return str(value, 'utf-8')
long = int
PY3 = True
else:
def u(value):
return unicode(value, 'utf-8')
PY3 = False
return unicode(value, 'utf-8') # NOQA: F821


class ValueTests(object):
Expand Down Expand Up @@ -73,6 +73,29 @@ def test_sub(self):
self.assertEqual(value, 1 - value)
self.assertEqual(value, value - 1)

@unittest.skipUnless(PY35, 'Python 3.5+ syntax')
def test_matmul(self):
value = self._make_one()

class Array(object):
def __init__(self, value):
self.value = value

def __matmul__(self, other):
return value

def __rmatmul__(self, other):
return value

def matmul(a, b):
# Don't use the @ operator to avoid SyntaxError's
return a.__matmul__(b)

self.assertEqual(matmul(Array(2), value), value)
self.assertEqual(matmul(value, Array(2)), value)
self.assertEqual(value, matmul(Array(2), value))
self.assertEqual(value, matmul(value, Array(2)))

def test_mul(self):
value = self._make_one()
self.assertEqual(2 * value, value)
Expand Down Expand Up @@ -175,17 +198,16 @@ def test_xor(self):
self.assertEqual(value, 2 ^ value)
self.assertEqual(value, value ^ 2)

@unittest.skipIf(PY3, 'Python 2 only.')
def test_coerce(self):
if PY3:
return
from Missing import notMissing
value = self._make_one()
self.assertEqual(coerce(value, 1), (value, notMissing))
self.assertEqual(coerce(1, value), (notMissing, value))
self.assertEqual(coerce(value, 1.0), (value, notMissing))
self.assertEqual(coerce(1.0, value), (notMissing, value))
self.assertEqual(coerce(value, 0x1), (value, notMissing))
self.assertEqual(coerce(0x1, value), (notMissing, value))
self.assertEqual(coerce(value, 1), (value, notMissing)) # NOQA: F821
self.assertEqual(coerce(1, value), (notMissing, value)) # NOQA: F821
self.assertEqual(coerce(value, 1.0), (value, notMissing)) # NOQA: F821
self.assertEqual(coerce(1.0, value), (notMissing, value)) # NOQA: F821
self.assertEqual(coerce(value, 0x1), (value, notMissing)) # NOQA: F821
self.assertEqual(coerce(0x1, value), (notMissing, value)) # NOQA: F821

def test_number_conversion(self):
value = self._make_one()
Expand Down Expand Up @@ -224,6 +246,10 @@ def test_repr(self):
value = self._make_one()
self.assertEqual(repr(value), 'Missing.Value')

def test_bytes(self):
value = self._make_one()
self.assertEqual(bytes(value), b'')

def test_str(self):
value = self._make_one()
self.assertEqual(str(value), '')
Expand Down

0 comments on commit 8acaaf6

Please sign in to comment.