Merge pull request #30 from mwilliamson/non-finite-float-errors

Add tox/py.test and raise error when dump is called with non-finite floats
diff --git a/.gitignore b/.gitignore
index 4347bb8..6317d70 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,6 @@
 venv/
 .idea/
 __pycache__/
+.tox/
+*.pyc
+.cache/
diff --git a/.travis.yml b/.travis.yml
index 5db1b2d..c76dcfb 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,3 +1,4 @@
+sudo: false
 language: python
 python:
     - "2.6"
@@ -5,4 +6,5 @@
     - "3.3"
     - "3.4"
     - "3.5"
-script: python ./setup.py install && python ./test/test.py
+install: pip install tox-travis
+script: tox
diff --git a/dev-requirements.txt b/dev-requirements.txt
new file mode 100644
index 0000000..bd253fe
--- /dev/null
+++ b/dev-requirements.txt
@@ -0,0 +1 @@
+pytest==3.0.7
diff --git a/pytoml/writer.py b/pytoml/writer.py
index 7380350..31fee2f 100644
--- a/pytoml/writer.py
+++ b/pytoml/writer.py
@@ -1,5 +1,5 @@
 from __future__ import unicode_literals
-import io, datetime, sys
+import io, datetime, math, sys
 
 if sys.version_info[0] == 3:
     long = int
@@ -61,7 +61,10 @@
     if isinstance(v, int) or isinstance(v, long):
         return unicode(v)
     if isinstance(v, float):
-        return repr(v)
+        if math.isnan(v) or math.isinf(v):
+            raise ValueError("{0} is not a valid TOML value".format(v))
+        else:
+            return repr(v)
     elif isinstance(v, unicode) or isinstance(v, bytes):
         return _escape_string(v)
     elif isinstance(v, datetime.datetime):
diff --git a/test/test_parser.py b/test/test_parser.py
new file mode 100644
index 0000000..f0fc792
--- /dev/null
+++ b/test/test_parser.py
@@ -0,0 +1,24 @@
+from __future__ import unicode_literals
+
+import sys
+if sys.version_info < (2, 7):
+    from StringIO import StringIO
+else:
+    from io import StringIO
+    
+import pytest
+
+import pytoml as toml
+
+
+def test_name_of_fileobj_is_used_in_errors():
+    source = StringIO("[")
+    source.name = "<source>"
+    error = pytest.raises(toml.TomlError, lambda: toml.load(source))
+    assert error.value.filename == "<source>"
+
+
+def test_when_fileobj_has_no_name_attr_then_repr_of_fileobj_is_used_in_errors():
+    source = StringIO("[")
+    error = pytest.raises(toml.TomlError, lambda: toml.load(source))
+    assert error.value.filename == repr(source)
diff --git a/test/test_writer.py b/test/test_writer.py
new file mode 100644
index 0000000..a0c7434
--- /dev/null
+++ b/test/test_writer.py
@@ -0,0 +1,15 @@
+from __future__ import unicode_literals
+
+import pytest
+
+import pytoml as toml
+
+
+@pytest.mark.parametrize("value", [
+    float("NaN"),
+    float("Inf"),
+    -float("Inf"),
+])
+def test_attempting_to_write_non_number_floats_raises_error(value):
+    error = pytest.raises(ValueError, lambda: toml.dumps({"value": value}))
+    assert str(error.value) == "{0} is not a valid TOML value".format(value)
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..2adf554
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,7 @@
+[tox]
+envlist = py26,py27,py33,py34,py35
+[testenv]
+deps = -r{toxinidir}/dev-requirements.txt
+commands=
+    python ./test/test.py
+    py.test test