Skip to content

Commit

Permalink
Merge pull request #167 from EmbroidePy/silent-pass
Browse files Browse the repository at this point in the history
Throw errors on file read/write if errors occur
  • Loading branch information
tatarize authored Nov 6, 2023
2 parents 21a16d0 + 040d95d commit ee465a5
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 26 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,8 @@ The Gcode is intended for a number of hobbyist projects that use a gcode control
#### Reading from HUS:
The HUS format requires an obscure and defunct form of compression. The EmbCompress performs this decompression. It is written from the ground up in pure python. It does not require any compiled element or dll file. It has no obfuscation and is intended to be easily understood.

### IO
Starting in version 1.5.0, we no longer silently pass errors. Explicit IOErrors are raised if the writer is not supported, does not exist, or reading a file that does not exist.

### Reading

Expand Down
35 changes: 10 additions & 25 deletions pyembroidery/EmbPattern.py
Original file line number Diff line number Diff line change
Expand Up @@ -1479,19 +1479,11 @@ def read_embroidery(reader, f, settings=None, pattern=None):
except AttributeError:
pass
if text_mode:
try:
with open(f, "r") as stream:
reader.read(stream, pattern, settings)
stream.close()
except IOError:
pass
with open(f, "r") as stream:
reader.read(stream, pattern, settings)
else:
try:
with open(f, "rb") as stream:
reader.read(stream, pattern, settings)
stream.close()
except IOError:
pass
with open(f, "rb") as stream:
reader.read(stream, pattern, settings)
else:
reader.read(f, pattern, settings)
return pattern
Expand Down Expand Up @@ -1646,17 +1638,11 @@ def write_embroidery(writer, pattern, stream, settings=None):
except AttributeError:
pass
if text_mode:
try:
with open(stream, "w") as stream:
writer.write(pattern, stream, settings)
except IOError:
pass
with open(stream, "w") as stream:
writer.write(pattern, stream, settings)
else:
try:
with open(stream, "wb") as stream:
writer.write(pattern, stream, settings)
except IOError:
pass
with open(stream, "wb") as stream:
writer.write(pattern, stream, settings)
else:
writer.write(pattern, stream, settings)

Expand Down Expand Up @@ -1743,16 +1729,15 @@ def static_write(pattern, filename, settings=None):
supported_extensions = [file_type["extension"] for file_type in EmbPattern.supported_formats()]

if extension not in supported_extensions:
raise Exception(f"Conversion to file type '{extension}' is not supported")
raise IOError("Conversion to file type '{extension}' is not supported".format(extension=extension))

ext_to_file_type_lookup = {file_type["extension"]: file_type for file_type in EmbPattern.supported_formats()}
writer = ext_to_file_type_lookup[extension].get("writer")

if writer:
EmbPattern.write_embroidery(writer, pattern, filename, settings)
else:
# TODO: I don't think we should pass silently!
pass
raise IOError("No supported writer found.")

@staticmethod
def is_str(obj):
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setuptools.setup(
name="pyembroidery",
version="1.4.38",
version="1.5.0",
author="Tatarize",
author_email="tatarize@gmail.com",
description="Embroidery IO library",
Expand Down
31 changes: 31 additions & 0 deletions test/test_io.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import unittest

from test.pattern_for_tests import *


class TestExplicitIOErrors(unittest.TestCase):
def test_read_non_file(self):
"""
1.5.0 adds explicit error raising.
We test that now.
"""
file1 = "nosuchfile.dst"
self.assertRaises(IOError, lambda: EmbPattern(file1))

def test_write_non_supported(self):
"""
1.5.0 adds explicit error raising.
We test that now.
"""
pattern = get_simple_pattern()
file1 = "nosuchfile.pdf"
self.assertRaises(IOError, lambda: pattern.write(file1))

def test_write_no_writer(self):
"""
1.5.0 adds explicit error raising.
We test that now.
"""
pattern = get_simple_pattern()
file1 = "nosuchfile.dat"
self.assertRaises(IOError, lambda: pattern.write(file1))

0 comments on commit ee465a5

Please sign in to comment.