diff options
author | Adam Hupp <adam@hupp.org> | 2020-05-05 19:23:19 -0700 |
---|---|---|
committer | Adam Hupp <adam@hupp.org> | 2020-05-05 19:23:19 -0700 |
commit | 06258071f511db9d28960fb3613d624147ec5151 (patch) | |
tree | 490a2f7363e28c4e31c55424dac2be0bff6df97e | |
parent | d022a14201ab18e5e9adaed813286d63f8b214ea (diff) | |
download | python-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.py | 39 | ||||
-rwxr-xr-x | test/test.py | 24 |
2 files changed, 43 insertions, 20 deletions
@@ -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() |