summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Hupp <adam@hupp.org>2020-05-05 19:23:19 -0700
committerAdam Hupp <adam@hupp.org>2020-05-05 19:23:19 -0700
commit06258071f511db9d28960fb3613d624147ec5151 (patch)
tree490a2f7363e28c4e31c55424dac2be0bff6df97e
parentd022a14201ab18e5e9adaed813286d63f8b214ea (diff)
downloadpython-magic-06258071f511db9d28960fb3613d624147ec5151.tar.gz
Make magic_[version|setparam|getparam] optional
These aren't present in ancient versions of libmagic, so only fetch optionally and throw NotImplementedError if called.
-rw-r--r--magic.py39
-rwxr-xr-xtest/test.py24
2 files changed, 43 insertions, 20 deletions
diff --git a/magic.py b/magic.py
index a9cab37..4828148 100644
--- a/magic.py
+++ b/magic.py
@@ -72,7 +72,8 @@ class Magic:
# by bumping the limit up. It's not clear if this is a general solution
# or whether other internal limits should be increased, but given
# the lack of other reports I'll assume this is rare.
- self.setparam(MAGIC_PARAM_NAME_MAX, 64)
+ if _has_param:
+ self.setparam(MAGIC_PARAM_NAME_MAX, 64)
def from_buffer(self, buf):
"""
@@ -301,32 +302,42 @@ magic_compile = libmagic.magic_compile
magic_compile.restype = c_int
magic_compile.argtypes = [magic_t, c_char_p]
-_magic_setparam = libmagic.magic_setparam
-_magic_setparam.restype = c_int
-_magic_setparam.argtypes = [magic_t, c_int, POINTER(c_size_t)]
-_magic_setparam.errcheck = errorcheck_negative_one
+_has_param = False
+if hasattr(libmagic, 'magic_setparam') and hasattr(libmagic, 'magic_getparam'):
+ _has_param = True
+ _magic_setparam = libmagic.magic_setparam
+ _magic_setparam.restype = c_int
+ _magic_setparam.argtypes = [magic_t, c_int, POINTER(c_size_t)]
+ _magic_setparam.errcheck = errorcheck_negative_one
+ _magic_getparam = libmagic.magic_getparam
+ _magic_getparam.restype = c_int
+ _magic_getparam.argtypes = [magic_t, c_int, POINTER(c_size_t)]
+ _magic_getparam.errcheck = errorcheck_negative_one
def magic_setparam(cookie, param, val):
+ if not _has_param:
+ raise NotImplementedError("magic_setparam not implemented")
v = c_size_t(val)
return _magic_setparam(cookie, param, byref(v))
-_magic_getparam = libmagic.magic_getparam
-_magic_getparam.restype = c_int
-_magic_getparam.argtypes = [magic_t, c_int, POINTER(c_size_t)]
-_magic_getparam.errcheck = errorcheck_negative_one
-
-
def magic_getparam(cookie, param):
+ if not _has_param:
+ raise NotImplementedError("magic_getparam not implemented")
val = c_size_t()
_magic_getparam(cookie, param, byref(val))
return val.value
-magic_version = libmagic.magic_version
-magic_version.restype = c_int
-magic_version.argtypes = []
+_has_version = False
+if hasattr(libmagic, "magic_version"):
+ _has_version = True
+ magic_version = libmagic.magic_version
+ magic_version.restype = c_int
+ magic_version.argtypes = []
def version():
+ if not _has_version:
+ raise NotImplementedError("magic_version not implemented")
return magic_version()
MAGIC_NONE = 0x000000 # No flags
diff --git a/test/test.py b/test/test.py
index 86a06e4..dffefd6 100755
--- a/test/test.py
+++ b/test/test.py
@@ -18,7 +18,10 @@ class MagicTest(unittest.TestCase):
TESTDATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'testdata')
def test_version(self):
- self.assertTrue(magic.version() > 0)
+ try:
+ self.assertTrue(magic.version() > 0)
+ except NotImplementedError:
+ pass
def test_fs_encoding(self):
self.assertEqual('utf-8', sys.getfilesystemencoding().lower())
@@ -145,9 +148,15 @@ class MagicTest(unittest.TestCase):
m = magic.Magic(mime=True)
self.assertEqual(m.from_file(filename), 'image/jpeg')
- m = magic.Magic(mime=True, keep_going=True)
- self.assertEqual(m.from_file(filename),
- 'image/jpeg\\012- application/octet-stream')
+ try:
+ # this will throw if you have an "old" version of the library
+ # I'm otherwise not sure how to query if keep_going is supported
+ magic.version()
+ m = magic.Magic(mime=True, keep_going=True)
+ self.assertEqual(m.from_file(filename),
+ 'image/jpeg\\012- application/octet-stream')
+ except NotImplementedError:
+ pass
def test_rethrow(self):
old = magic.magic_buffer
@@ -163,8 +172,11 @@ class MagicTest(unittest.TestCase):
def test_getparam(self):
m = magic.Magic(mime=True)
- m.setparam(magic.MAGIC_PARAM_INDIR_MAX, 1)
- self.assertEqual(m.getparam(magic.MAGIC_PARAM_INDIR_MAX), 1)
+ try:
+ m.setparam(magic.MAGIC_PARAM_INDIR_MAX, 1)
+ self.assertEqual(m.getparam(magic.MAGIC_PARAM_INDIR_MAX), 1)
+ except NotImplementedError:
+ pass
def test_name_count(self):
m = magic.Magic()