Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-filetype for openSUSE:Factory 
checked in at 2022-11-08 11:48:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-filetype (Old)
 and      /work/SRC/openSUSE:Factory/.python-filetype.new.1597 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-filetype"

Tue Nov  8 11:48:09 2022 rev:5 rq:1034476 version:1.2.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-filetype/python-filetype.changes  
2022-03-28 17:01:31.161047476 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-filetype.new.1597/python-filetype.changes    
    2022-11-08 11:50:02.736482028 +0100
@@ -1,0 +2,87 @@
+Mon Nov  7 23:01:24 UTC 2022 - Yogalakshmi Arunachalam <yarunacha...@suse.com>
+
+- Update to 1.2.0 
+  * Merge pull request #147 from sayanarijit/fix-146
+  * Add tests for m4a
+  * Try matching audio before video
+  * Merge pull request #145 from RSabet/master
+  * update README to include avif
+  * added image filetype avif
+  * Update __init__.py
+  * Merge pull request #141 from ferstar/master
+  * test: remove unused imported(F401)
+  * refactor: duck-typing reading magic string and try to restore the reader 
position if possible
+  * test: fix E275 missing whitespace after keyword
+  * test: Use tox pipeline instead of pytest
+  * test: ignore E501 error for flake8 check
+  * fix: CLI params parser
+  * Merge pull request #137 from ferstar/master
+  * fix: guess ".docx" func and add another doc file test case
+  * fix: guess ".doc" func and add another doc file test case
+  * test: skip benchmark test in tox config
+  * fix: restore reader position after retrieving signature bytes
+  * Merge pull request #136 from ferstar/master
+  * test: no need to skip zstd test case
+  * Merge pull request #135 from ferstar/master
+  * fix: regression for file-like obj file type detection
+  * Merge pull request #134 from babenek/actions
+  * Merge pull request #129 from ferstar/master
+
+- Update to 1.1.0
+  * Merge branch 'master' into master
+  * Merge pull request #133 from magbyr/master
+  * Merge pull request #131 from babenek/master
+  * CI workflow in github actions
+  * Changed to if statements in matching method
+  * Changed return method because of coverage calculation problems
+  * Apply suggestions from code review
+  * README changes
+  * Linter changes
+  * Added document filetypes for doc, docx, odt, xls, xlsx, ods, ppt, pptx and 
odp. Added tests and sample documents for document filetypes
+  * Fix undocumented exception
+  * style: Simplify binary to integer method
+  * feat: add zstd skippable frames support
+  * test: fix the tox config and missing test sample files
+  * test: fix the zst test sample file
+  * fix(readme): rst syntax wtf
+
+- Update to 1.0.13
+  * feat(history): update changes
+
+- Update to 1.0.12
+  * Merge pull request #127 from ferstar/master
+  * Merge pull request #123 from levrik/patch-1
+  * Merge pull request #126 from babenek/master
+  * docs: add zstd type
+  * fix: remove unnecessary duck-typing try
+  * feat: add zst(d) type
+  * chore: fix lint errors
+  * test: fix memoryview test cases
+  * BugFix for uncaught exceptions
+  * Support PDF with BOM
+
+- Update to 1.0.11
+  * chore(version): bump patch
+  * chore(version): bump patch
+  * refactor(apng)
+  * refactor(apng)
+  * Merge pull request #120 from CatKasha/apng
+  * fix typo
+  * add APNG support (part 3)
+  *  add APNG support (part 2)
+  * add APNG support (part 1)
+  * chore(history): version notes
+  * Merge branch 'master' of https://github.com/h2non/filetype.py
+  * feat: version bump
+  * Merge pull request #118 from smasty/woff-flavors-support
+  * fix(font): minimum length check (woff)
+  * Update __init__.py
+  * Update setup.py
+  * Merge pull request #109 from fraang/master
+  * Add support for more WOFF/WOFF2 flavors
+  * Merge pull request #114 from andersk/m4a
+  * fix(base): remove property decorator
+  * Use correct audio/mp4 type for m4a.
+
+
+-------------------------------------------------------------------

Old:
----
  filetype-1.0.10.tar.gz

New:
----
  filetype-1.2.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-filetype.spec ++++++
--- /var/tmp/diff_new_pack.tcx5DT/_old  2022-11-08 11:50:03.164484191 +0100
+++ /var/tmp/diff_new_pack.tcx5DT/_new  2022-11-08 11:50:03.168484211 +0100
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-filetype
-Version:        1.0.10
+Version:        1.2.0
 Release:        0
 Summary:        Infer file type and MIME type of any file/buffer. No external 
dependencies
 License:        MIT

++++++ filetype-1.0.10.tar.gz -> filetype-1.2.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/History.md 
new/filetype-1.2.0/History.md
--- old/filetype-1.0.10/History.md      2022-02-03 20:34:19.000000000 +0100
+++ new/filetype-1.2.0/History.md       2022-11-02 18:30:57.000000000 +0100
@@ -1,4 +1,90 @@
 
+v1.2.0 / 2022-11-02
+===================
+
+  * chore(version): bump minor
+  * Merge pull request #147 from sayanarijit/fix-146
+  * Add tests for m4a
+  * Try matching audio before video
+  * Merge pull request #145 from RSabet/master
+  * update README to include avif
+  * added image filetype avif
+  * Update __init__.py
+  * Merge pull request #141 from ferstar/master
+  * test: remove unused imported(F401)
+  * refactor: duck-typing reading magic string and try to restore the reader 
position if possible
+  * test: fix E275 missing whitespace after keyword
+  * test: Use tox pipeline instead of pytest
+  * test: ignore E501 error for flake8 check
+  * fix: CLI params parser
+  * Merge pull request #137 from ferstar/master
+  * fix: guess ".docx" func and add another doc file test case
+  * fix: guess ".doc" func and add another doc file test case
+  * test: skip benchmark test in tox config
+  * fix: restore reader position after retrieving signature bytes
+  * Merge pull request #136 from ferstar/master
+  * test: no need to skip zstd test case
+  * Merge pull request #135 from ferstar/master
+  * fix: regression for file-like obj file type detection
+  * Merge pull request #134 from babenek/actions
+  * Merge pull request #129 from ferstar/master
+  * Merge branch 'master' into master
+  * Merge pull request #133 from magbyr/master
+  * Merge pull request #131 from babenek/master
+  * CI workflow in github actions
+  * Changed to if statements in matching method
+  * Changed return method because of coverage calculation problems
+  * Extra line at EOF
+  * Extra line at EOF
+  * Extra line at EOF
+  * Apply suggestions from code review
+  * README changes
+  * Linter changes
+  * Added document filetypes for doc, docx, odt, xls, xlsx, ods, ppt, pptx and 
odp. Added tests and sample documents for document filetypes
+  * Fix undocumented exception
+  * style: Simplify binary to integer method
+  * feat: add zstd skippable frames support
+  * test: fix the tox config and missing test sample files
+  * test: fix the zst test sample file
+  * fix(readme): rst syntax wtf
+
+v1.1.0 / 2022-07-12
+===================
+
+  * feat(version): bump minor
+  * Merge pull request #127 from ferstar/master
+  * Merge pull request #123 from levrik/patch-1
+  * Merge pull request #126 from babenek/master
+  * docs: add zstd type
+  * fix: remove unnecessary duck-typing try
+  * feat: add zst(d) type
+  * chore: fix lint errors
+  * test: fix memoryview test cases
+  * BugFix for uncaught exceptions
+  * Support PDF with BOM
+
+v1.0.13 / 2022-04-21
+====================
+
+  * chore(version): bump patch
+  * chore(version): bump patch
+  * refactor(apng)
+  * refactor(apng)
+  * Merge pull request #120 from CatKasha/apng
+  * fix typo
+  * add APNG support (part 3)
+  *  add APNG support (part 2)
+  * add APNG support (part 1)
+
+v1.0.12 / 2022-04-19
+====================
+
+  * Merge branch 'master' of https://github.com/h2non/filetype.py
+  * feat: version bump
+  * Merge pull request #118 from smasty/woff-flavors-support
+  * fix(font): minimum length check (woff)
+  * Add support for more WOFF/WOFF2 flavors
+
 v1.0.10 / 2022-02-03
 ====================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/PKG-INFO new/filetype-1.2.0/PKG-INFO
--- old/filetype-1.0.10/PKG-INFO        2022-02-03 20:35:45.000000000 +0100
+++ new/filetype-1.2.0/PKG-INFO 2022-11-02 18:33:56.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: filetype
-Version: 1.0.10
+Version: 1.2.0
 Summary: Infer file type and MIME type of any file/buffer. No external 
dependencies.
 Home-page: https://github.com/h2non/filetype.py
 Author: Tomas Aparicio
@@ -76,6 +76,7 @@
         -  **jpg** - ``image/jpeg``
         -  **jpx** - ``image/jpx``
         -  **png** - ``image/png``
+        -  **apng** - ``image/apng``
         -  **gif** - ``image/gif``
         -  **webp** - ``image/webp``
         -  **cr2** - ``image/x-canon-cr2``
@@ -85,6 +86,7 @@
         -  **psd** - ``image/vnd.adobe.photoshop``
         -  **ico** - ``image/x-icon``
         -  **heic** - ``image/heic``
+        -  **avif** - ``image/avif``
         
         Video
         ^^^^^
@@ -106,7 +108,7 @@
         -  **aac** - ``audio/aac``
         -  **mid** - ``audio/midi``
         -  **mp3** - ``audio/mpeg``
-        -  **m4a** - ``audio/m4a``
+        -  **m4a** - ``audio/mp4``
         -  **ogg** - ``audio/ogg``
         -  **flac** - ``audio/x-flac``
         -  **wav** - ``audio/x-wav``
@@ -130,7 +132,6 @@
         -  **pdf** - ``application/pdf``
         -  **exe** - ``application/x-msdownload``
         -  **swf** - ``application/x-shockwave-flash``
-        
         -  **rtf** - ``application/rtf``
         -  **eot** - ``application/octet-stream``
         -  **ps** - ``application/postscript``
@@ -144,6 +145,20 @@
         -  **lzo** - ``application/x-lzop``
         -  **lz** - ``application/x-lzip``
         -  **lz4** - ``application/x-lz4``
+        -  **zstd** - ``application/zstd``
+        
+        Document
+        ^^^^^^^^
+        
+        -  **doc** - ``application/msword``
+        -  **docx** - 
``application/vnd.openxmlformats-officedocument.wordprocessingml.document``
+        -  **odt** - ``application/vnd.oasis.opendocument.text``
+        -  **xls** - ``application/vnd.ms-excel``
+        -  **xlsx** - 
``application/vnd.openxmlformats-officedocument.spreadsheetml.sheet``
+        -  **ods** - ``application/vnd.oasis.opendocument.spreadsheet``
+        -  **ppt** - ``application/vnd.ms-powerpoint``
+        -  **pptx** - 
``application/vnd.openxmlformats-officedocument.presentationml.presentation``
+        -  **odp** - ``application/vnd.oasis.opendocument.presentation``
         
         Font
         ^^^^
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/README.rst 
new/filetype-1.2.0/README.rst
--- old/filetype-1.0.10/README.rst      2021-12-20 14:33:10.000000000 +0100
+++ new/filetype-1.2.0/README.rst       2022-11-02 18:33:53.000000000 +0100
@@ -67,6 +67,7 @@
 -  **jpg** - ``image/jpeg``
 -  **jpx** - ``image/jpx``
 -  **png** - ``image/png``
+-  **apng** - ``image/apng``
 -  **gif** - ``image/gif``
 -  **webp** - ``image/webp``
 -  **cr2** - ``image/x-canon-cr2``
@@ -76,6 +77,7 @@
 -  **psd** - ``image/vnd.adobe.photoshop``
 -  **ico** - ``image/x-icon``
 -  **heic** - ``image/heic``
+-  **avif** - ``image/avif``
 
 Video
 ^^^^^
@@ -97,7 +99,7 @@
 -  **aac** - ``audio/aac``
 -  **mid** - ``audio/midi``
 -  **mp3** - ``audio/mpeg``
--  **m4a** - ``audio/m4a``
+-  **m4a** - ``audio/mp4``
 -  **ogg** - ``audio/ogg``
 -  **flac** - ``audio/x-flac``
 -  **wav** - ``audio/x-wav``
@@ -121,7 +123,6 @@
 -  **pdf** - ``application/pdf``
 -  **exe** - ``application/x-msdownload``
 -  **swf** - ``application/x-shockwave-flash``
-
 -  **rtf** - ``application/rtf``
 -  **eot** - ``application/octet-stream``
 -  **ps** - ``application/postscript``
@@ -135,6 +136,20 @@
 -  **lzo** - ``application/x-lzop``
 -  **lz** - ``application/x-lzip``
 -  **lz4** - ``application/x-lz4``
+-  **zstd** - ``application/zstd``
+
+Document
+^^^^^^^^
+
+-  **doc** - ``application/msword``
+-  **docx** - 
``application/vnd.openxmlformats-officedocument.wordprocessingml.document``
+-  **odt** - ``application/vnd.oasis.opendocument.text``
+-  **xls** - ``application/vnd.ms-excel``
+-  **xlsx** - 
``application/vnd.openxmlformats-officedocument.spreadsheetml.sheet``
+-  **ods** - ``application/vnd.oasis.opendocument.spreadsheet``
+-  **ppt** - ``application/vnd.ms-powerpoint``
+-  **pptx** - 
``application/vnd.openxmlformats-officedocument.presentationml.presentation``
+-  **odp** - ``application/vnd.oasis.opendocument.presentation``
 
 Font
 ^^^^
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/__init__.py 
new/filetype-1.2.0/filetype/__init__.py
--- old/filetype-1.0.10/filetype/__init__.py    2022-02-03 20:34:06.000000000 
+0100
+++ new/filetype-1.2.0/filetype/__init__.py     2022-10-14 17:57:19.000000000 
+0200
@@ -7,4 +7,4 @@
 from .match import *  # noqa
 
 # Current package semver version
-__version__ = version = '1.0.10'
+__version__ = version = '1.2.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/__main__.py 
new/filetype-1.2.0/filetype/__main__.py
--- old/filetype-1.0.10/filetype/__main__.py    2021-09-22 18:50:21.000000000 
+0200
+++ new/filetype-1.2.0/filetype/__main__.py     2022-10-14 17:57:19.000000000 
+0200
@@ -1,3 +1,5 @@
+import sys
+
 import filetype
 
 
@@ -12,17 +14,23 @@
 def main():
     import argparse
 
-    parser = argparse.ArgumentParser(description='Determine type of FILEs.')
-    parser.add_argument("file", nargs='+')
-    parser.add_argument('-v', '--version', action='store_true',
-                        help='output version information and exit')
+    parser = argparse.ArgumentParser(
+        prog='filetype', description='Determine type of FILEs.'
+    )
+    parser.add_argument('-f', '--file', nargs='+')
+    parser.add_argument(
+        '-v', '--version', action='version',
+        version='%(prog)s ' + filetype.version,
+        help='output version information and exit'
+    )
+
     args = parser.parse_args()
+    if len(sys.argv) < 2:
+        parser.print_help()
+        sys.exit(1)
 
-    if args.version:
-        print(filetype.version)
-    else:
-        for i in args.file:
-            guess(i)
+    for i in args.file:
+        guess(i)
 
 
 if __name__ == '__main__':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/helpers.py 
new/filetype-1.2.0/filetype/helpers.py
--- old/filetype-1.0.10/filetype/helpers.py     2022-02-03 20:33:43.000000000 
+0100
+++ new/filetype-1.2.0/filetype/helpers.py      2022-10-14 17:57:19.000000000 
+0200
@@ -3,7 +3,7 @@
 from __future__ import absolute_import
 from .types import TYPES
 from .match import (
-    image_match, font_match,
+    image_match, font_match, document_match,
     video_match, audio_match, archive_match
 )
 
@@ -122,3 +122,19 @@
         TypeError: if obj is not a supported type.
     """
     return font_match(obj) is not None
+
+
+def is_document(obj):
+    """
+    Checks if a given input is a supported type document.
+
+    Args:
+        obj: path to file, bytes or bytearray.
+
+    Returns:
+        True if obj is a valid document. Otherwise False.
+
+    Raises:
+        TypeError: if obj is not a supported type.
+    """
+    return document_match(obj) is not None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/match.py 
new/filetype-1.2.0/filetype/match.py
--- old/filetype-1.0.10/filetype/match.py       2021-09-22 18:50:21.000000000 
+0200
+++ new/filetype-1.2.0/filetype/match.py        2022-10-14 17:57:19.000000000 
+0200
@@ -5,6 +5,7 @@
 from .types import ARCHIVE as archive_matchers
 from .types import AUDIO as audio_matchers
 from .types import APPLICATION as application_matchers
+from .types import DOCUMENT as document_matchers
 from .types import FONT as font_matchers
 from .types import IMAGE as image_matchers
 from .types import VIDEO as video_matchers
@@ -135,3 +136,20 @@
         TypeError: if obj is not a supported type.
     """
     return match(obj, application_matchers)
+
+
+def document_match(obj):
+    """
+    Matches the given input against the available
+    document type matchers.
+
+    Args:
+        obj: path to file, bytes or bytearray.
+
+    Returns:
+        Type instance if matches. Otherwise None.
+
+    Raises:
+        TypeError: if obj is not a supported type.
+    """
+    return match(obj, document_matchers)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/__init__.py 
new/filetype-1.2.0/filetype/types/__init__.py
--- old/filetype-1.0.10/filetype/types/__init__.py      2021-12-20 
14:33:10.000000000 +0100
+++ new/filetype-1.2.0/filetype/types/__init__.py       2022-11-02 
18:30:43.000000000 +0100
@@ -5,6 +5,7 @@
 from . import archive
 from . import audio
 from . import application
+from . import document
 from . import font
 from . import image
 from . import video
@@ -16,6 +17,7 @@
     image.Xcf(),
     image.Jpeg(),
     image.Jpx(),
+    image.Apng(),
     image.Png(),
     image.Gif(),
     image.Webp(),
@@ -27,6 +29,7 @@
     image.Ico(),
     image.Heic(),
     image.Dcm(),
+    image.Avif(),
 )
 
 # Supported video types
@@ -89,6 +92,7 @@
     archive.Lz(),
     archive.Elf(),
     archive.Lz4(),
+    archive.Zstd(),
 )
 
 # Supported archive container types
@@ -96,6 +100,19 @@
     application.Wasm(),
 )
 
+# Supported document types
+DOCUMENT = (
+    document.Doc(),
+    document.Docx(),
+    document.Odt(),
+    document.Xls(),
+    document.Xlsx(),
+    document.Ods(),
+    document.Ppt(),
+    document.Pptx(),
+    document.Odp(),
+)
+
 
 # Expose supported type matchers
-TYPES = list(VIDEO + IMAGE + AUDIO + FONT + ARCHIVE + APPLICATION)
+TYPES = list(IMAGE + AUDIO + VIDEO + FONT + DOCUMENT + ARCHIVE + APPLICATION)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/archive.py 
new/filetype-1.2.0/filetype/types/archive.py
--- old/filetype-1.0.10/filetype/types/archive.py       2021-09-22 
18:50:21.000000000 +0200
+++ new/filetype-1.2.0/filetype/types/archive.py        2022-10-14 
17:57:19.000000000 +0200
@@ -2,6 +2,8 @@
 
 from __future__ import absolute_import
 
+import struct
+
 from .base import Type
 
 
@@ -184,6 +186,13 @@
         )
 
     def match(self, buf):
+        # Detect BOM and skip first 3 bytes
+        if (len(buf) > 3 and
+            buf[0] == 0xEF and
+            buf[1] == 0xBB and
+            buf[2] == 0xBF):  # noqa E129
+            buf = buf[3:]
+
         return (len(buf) > 3 and
                 buf[0] == 0x25 and
                 buf[1] == 0x50 and
@@ -628,3 +637,51 @@
 
     def match(self, buf):
         return buf[:4] == bytearray([0xed, 0xab, 0xee, 0xdb])
+
+
+class Zstd(Type):
+    """
+    Implements the Zstd archive type matcher.
+    https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md
+    """
+    MIME = 'application/zstd'
+    EXTENSION = 'zst'
+    MAGIC_SKIPPABLE_START = 0x184D2A50
+    MAGIC_SKIPPABLE_MASK = 0xFFFFFFF0
+
+    def __init__(self):
+        super(Zstd, self).__init__(
+            mime=Zstd.MIME,
+            extension=Zstd.EXTENSION
+        )
+
+    @staticmethod
+    def _to_little_endian_int(buf):
+        # return int.from_bytes(buf, byteorder='little')
+        return struct.unpack('<L', buf)[0]
+
+    def match(self, buf):
+        # Zstandard compressed data is made of one or more frames.
+        # There are two frame formats defined by Zstandard:
+        # Zstandard frames and Skippable frames.
+        # See more details from
+        # 
https://tools.ietf.org/id/draft-kucherawy-dispatch-zstd-00.html#rfc.section.2
+        is_zstd = (
+            len(buf) > 3 and
+            buf[0] in (0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28) and
+            buf[1] == 0xb5 and
+            buf[2] == 0x2f and
+            buf[3] == 0xfd)
+        if is_zstd:
+            return True
+        # skippable frames
+        if len(buf) < 8:
+            return False
+        magic = self._to_little_endian_int(buf[:4]) & Zstd.MAGIC_SKIPPABLE_MASK
+        if magic == Zstd.MAGIC_SKIPPABLE_START:
+            user_data_len = self._to_little_endian_int(buf[4:8])
+            if len(buf) < 8 + user_data_len:
+                return False
+            next_frame = buf[8 + user_data_len:]
+            return self.match(next_frame)
+        return False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/audio.py 
new/filetype-1.2.0/filetype/types/audio.py
--- old/filetype-1.0.10/filetype/types/audio.py 2021-12-20 14:33:10.000000000 
+0100
+++ new/filetype-1.2.0/filetype/types/audio.py  2022-04-19 22:21:02.000000000 
+0200
@@ -56,7 +56,7 @@
     """
     Implements the M4A audio type matcher.
     """
-    MIME = 'audio/m4a'
+    MIME = 'audio/mp4'
     EXTENSION = 'm4a'
 
     def __init__(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/base.py 
new/filetype-1.2.0/filetype/types/base.py
--- old/filetype-1.0.10/filetype/types/base.py  2020-01-18 17:45:56.000000000 
+0100
+++ new/filetype-1.2.0/filetype/types/base.py   2022-04-19 22:21:02.000000000 
+0200
@@ -19,11 +19,9 @@
     def extension(self):
         return self.__extension
 
-    @property
     def is_extension(self, extension):
         return self.__extension is extension
 
-    @property
     def is_mime(self, mime):
         return self.__mime is mime
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/document.py 
new/filetype-1.2.0/filetype/types/document.py
--- old/filetype-1.0.10/filetype/types/document.py      1970-01-01 
01:00:00.000000000 +0100
+++ new/filetype-1.2.0/filetype/types/document.py       2022-10-14 
17:57:19.000000000 +0200
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import absolute_import
+
+from .base import Type
+
+
+class ZippedDocumentBase(Type):
+    def match(self, buf):
+        # start by checking for ZIP local file header signature
+        idx = self.search_signature(buf, 0, 6000)
+        if idx != 0:
+            return
+
+        return self.match_document(buf)
+
+    def match_document(self, buf):
+        raise NotImplementedError
+
+    def compare_bytes(self, buf, subslice, start_offset):
+        sl = len(subslice)
+
+        if start_offset + sl > len(buf):
+            return False
+
+        return buf[start_offset:start_offset + sl] == subslice
+
+    def search_signature(self, buf, start, rangeNum):
+        signature = b"PK\x03\x04"
+        length = len(buf)
+
+        end = start + rangeNum
+        end = length if end > length else end
+
+        if start >= end:
+            return -1
+
+        try:
+            return buf.index(signature, start, end)
+        except ValueError:
+            return -1
+
+
+class OpenDocument(ZippedDocumentBase):
+    def match_document(self, buf):
+        # Check if first file in archive is the identifying file
+        if not self.compare_bytes(buf, b"mimetype", 0x1E):
+            return
+
+        # Check content of mimetype file if it matches current mime
+        return self.compare_bytes(buf, bytes(self.mime, "ASCII"), 0x26)
+
+
+class OfficeOpenXml(ZippedDocumentBase):
+    def match_document(self, buf):
+        # Check if first file in archive is the identifying file
+        ft = self.match_filename(buf, 0x1E)
+        if ft:
+            return ft
+
+        # Otherwise check that the fist file is one of these
+        if (
+            not self.compare_bytes(buf, b"[Content_Types].xml", 0x1E)
+            and not self.compare_bytes(buf, b"_rels/.rels", 0x1E)
+            and not self.compare_bytes(buf, b"docProps", 0x1E)
+        ):
+            return
+
+        # Loop through next 3 files and check if they match
+        # NOTE: OpenOffice/Libreoffice orders ZIP entry differently, so check 
the 4th file
+        # 
https://github.com/h2non/filetype/blob/d730d98ad5c990883148485b6fd5adbdd378364a/matchers/document.go#L134
+        idx = 0
+        for i in range(4):
+            # Search for next file header
+            idx = self.search_signature(buf, idx + 4, 6000)
+            if idx == -1:
+                return
+
+            # Filename is at file header + 30
+            ft = self.match_filename(buf, idx + 30)
+            if ft:
+                return ft
+
+    def match_filename(self, buf, offset):
+        if self.compare_bytes(buf, b"word/", offset):
+            return (
+                self.mime
+                == 
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+            )
+        if self.compare_bytes(buf, b"ppt/", offset):
+            return (
+                self.mime
+                == 
"application/vnd.openxmlformats-officedocument.presentationml.presentation"
+            )
+        if self.compare_bytes(buf, b"xl/", offset):
+            return (
+                self.mime
+                == 
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+            )
+
+
+class Doc(Type):
+    """
+    Implements the Microsoft Word (Office 97-2003) document type matcher.
+    """
+
+    MIME = "application/msword"
+    EXTENSION = "doc"
+
+    def __init__(self):
+        super(Doc, self).__init__(mime=Doc.MIME, extension=Doc.EXTENSION)
+
+    def match(self, buf):
+        if len(buf) > 515 and buf[0:8] == b"\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1":
+            if buf[512:516] == b"\xEC\xA5\xC1\x00":
+                return True
+            if (
+                len(buf) > 2142
+                and 
b"\x00\x0A\x00\x00\x00MSWordDoc\x00\x10\x00\x00\x00Word.Document.8\x00\xF49\xB2q"
+                in buf[2075:2142]
+            ):
+                return True
+
+        return False
+
+
+class Docx(OfficeOpenXml):
+    """
+    Implements the Microsoft Word OOXML (Office 2007+) document type matcher.
+    """
+
+    MIME = 
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+    EXTENSION = "docx"
+
+    def __init__(self):
+        super(Docx, self).__init__(mime=Docx.MIME, extension=Docx.EXTENSION)
+
+
+class Odt(OpenDocument):
+    """
+    Implements the OpenDocument Text document type matcher.
+    """
+
+    MIME = "application/vnd.oasis.opendocument.text"
+    EXTENSION = "odt"
+
+    def __init__(self):
+        super(Odt, self).__init__(mime=Odt.MIME, extension=Odt.EXTENSION)
+
+
+class Xls(Type):
+    """
+    Implements the Microsoft Excel (Office 97-2003) document type matcher.
+    """
+
+    MIME = "application/vnd.ms-excel"
+    EXTENSION = "xls"
+
+    def __init__(self):
+        super(Xls, self).__init__(mime=Xls.MIME, extension=Xls.EXTENSION)
+
+    def match(self, buf):
+        if len(buf) > 520 and buf[0:8] == b"\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1":
+            if buf[512:516] == b"\xFD\xFF\xFF\xFF" and (
+                buf[518] == 0x00 or buf[518] == 0x02
+            ):
+                return True
+            if buf[512:520] == b"\x09\x08\x10\x00\x00\x06\x05\x00":
+                return True
+            if (
+                len(buf) > 2095
+                and b"\xE2\x00\x00\x00\x5C\x00\x70\x00\x04\x00\x00Calc"
+                in buf[1568:2095]
+            ):
+                return True
+
+        return False
+
+
+class Xlsx(OfficeOpenXml):
+    """
+    Implements the Microsoft Excel OOXML (Office 2007+) document type matcher.
+    """
+
+    MIME = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+    EXTENSION = "xlsx"
+
+    def __init__(self):
+        super(Xlsx, self).__init__(mime=Xlsx.MIME, extension=Xlsx.EXTENSION)
+
+
+class Ods(OpenDocument):
+    """
+    Implements the OpenDocument Spreadsheet document type matcher.
+    """
+
+    MIME = "application/vnd.oasis.opendocument.spreadsheet"
+    EXTENSION = "ods"
+
+    def __init__(self):
+        super(Ods, self).__init__(mime=Ods.MIME, extension=Ods.EXTENSION)
+
+
+class Ppt(Type):
+    """
+    Implements the Microsoft PowerPoint (Office 97-2003) document type matcher.
+    """
+
+    MIME = "application/vnd.ms-powerpoint"
+    EXTENSION = "ppt"
+
+    def __init__(self):
+        super(Ppt, self).__init__(mime=Ppt.MIME, extension=Ppt.EXTENSION)
+
+    def match(self, buf):
+        if len(buf) > 524 and buf[0:8] == b"\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1":
+            if buf[512:516] == b"\xA0\x46\x1D\xF0":
+                return True
+            if buf[512:516] == b"\x00\x6E\x1E\xF0":
+                return True
+            if buf[512:516] == b"\x0F\x00\xE8\x03":
+                return True
+            if buf[512:516] == b"\xFD\xFF\xFF\xFF" and buf[522:524] == 
b"\x00\x00":
+                return True
+            if (
+                len(buf) > 2096
+                and buf[2072:2096]
+                == b"\x00\xB9\x29\xE8\x11\x00\x00\x00MS PowerPoint 97"
+            ):
+                return True
+
+        return False
+
+
+class Pptx(OfficeOpenXml):
+    """
+    Implements the Microsoft PowerPoint OOXML (Office 2007+) document type 
matcher.
+    """
+
+    MIME = 
"application/vnd.openxmlformats-officedocument.presentationml.presentation"
+    EXTENSION = "pptx"
+
+    def __init__(self):
+        super(Pptx, self).__init__(mime=Pptx.MIME, extension=Pptx.EXTENSION)
+
+
+class Odp(OpenDocument):
+    """
+    Implements the OpenDocument Presentation document type matcher.
+    """
+
+    MIME = "application/vnd.oasis.opendocument.presentation"
+    EXTENSION = "odp"
+
+    def __init__(self):
+        super(Odp, self).__init__(mime=Odp.MIME, extension=Odp.EXTENSION)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/font.py 
new/filetype-1.2.0/filetype/types/font.py
--- old/filetype-1.0.10/filetype/types/font.py  2020-01-18 17:45:56.000000000 
+0100
+++ new/filetype-1.2.0/filetype/types/font.py   2022-04-19 22:25:27.000000000 
+0200
@@ -24,10 +24,18 @@
                 buf[1] == 0x4F and
                 buf[2] == 0x46 and
                 buf[3] == 0x46 and
-                buf[4] == 0x00 and
-                buf[5] == 0x01 and
-                buf[6] == 0x00 and
-                buf[7] == 0x00)
+                ((buf[4] == 0x00 and
+                  buf[5] == 0x01 and
+                  buf[6] == 0x00 and
+                  buf[7] == 0x00) or
+                 (buf[4] == 0x4F and
+                  buf[5] == 0x54 and
+                  buf[6] == 0x54 and
+                  buf[7] == 0x4F) or
+                 (buf[4] == 0x74 and
+                  buf[5] == 0x72 and
+                  buf[6] == 0x75 and
+                  buf[7] == 0x65)))
 
 
 class Woff2(Type):
@@ -49,10 +57,18 @@
                 buf[1] == 0x4F and
                 buf[2] == 0x46 and
                 buf[3] == 0x32 and
-                buf[4] == 0x00 and
-                buf[5] == 0x01 and
-                buf[6] == 0x00 and
-                buf[7] == 0x00)
+                ((buf[4] == 0x00 and
+                  buf[5] == 0x01 and
+                  buf[6] == 0x00 and
+                  buf[7] == 0x00) or
+                 (buf[4] == 0x4F and
+                  buf[5] == 0x54 and
+                  buf[6] == 0x54 and
+                  buf[7] == 0x4F) or
+                 (buf[4] == 0x74 and
+                  buf[5] == 0x72 and
+                  buf[6] == 0x75 and
+                  buf[7] == 0x65)))
 
 
 class Ttf(Type):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/image.py 
new/filetype-1.2.0/filetype/types/image.py
--- old/filetype-1.0.10/filetype/types/image.py 2021-09-22 18:50:21.000000000 
+0200
+++ new/filetype-1.2.0/filetype/types/image.py  2022-11-02 18:30:43.000000000 
+0100
@@ -48,6 +48,45 @@
         )
 
 
+class Apng(Type):
+    """
+    Implements the APNG image type matcher.
+    """
+    MIME = 'image/apng'
+    EXTENSION = 'apng'
+
+    def __init__(self):
+        super(Apng, self).__init__(
+            mime=Apng.MIME,
+            extension=Apng.EXTENSION
+        )
+
+    def match(self, buf):
+        if (len(buf) > 8 and
+           buf[:8] == bytearray([0x89, 0x50, 0x4e, 0x47,
+                                 0x0d, 0x0a, 0x1a, 0x0a])):
+            # cursor in buf, skip already readed 8 bytes
+            i = 8
+            while len(buf) > i:
+                data_length = int.from_bytes(buf[i:i+4], byteorder="big")
+                i += 4
+
+                chunk_type = buf[i:i+4].decode("ascii", errors='ignore')
+                i += 4
+
+                # acTL chunk in APNG should appears first than IDAT
+                # IEND is end of PNG
+                if (chunk_type == "IDAT" or chunk_type == "IEND"):
+                    return False
+                elif (chunk_type == "acTL"):
+                    return True
+
+                # move to the next chunk by skipping data and crc (4 bytes)
+                i += data_length + 4
+
+        return False
+
+
 class Png(Type):
     """
     Implements the PNG image type matcher.
@@ -152,12 +191,12 @@
         )
 
     def match(self, buf):
-        return (len(buf) > 3 and
+        return (len(buf) > 9 and
                 ((buf[0] == 0x49 and buf[1] == 0x49 and
                     buf[2] == 0x2A and buf[3] == 0x0) or
                 (buf[0] == 0x4D and buf[1] == 0x4D and
                     buf[2] == 0x0 and buf[3] == 0x2A))
-                and not(buf[8] == 0x43 and buf[9] == 0x52))
+                and not (buf[8] == 0x43 and buf[9] == 0x52))
 
 
 class Bmp(Type):
@@ -317,3 +356,28 @@
     def match(self, buf):
         return buf[:10] == bytearray([0x67, 0x69, 0x6d, 0x70, 0x20,
                                       0x78, 0x63, 0x66, 0x20, 0x76])
+
+
+class Avif(IsoBmff):
+    """
+    Implements the AVIF image type matcher.
+    """
+    MIME = 'image/avif'
+    EXTENSION = 'avif'
+
+    def __init__(self):
+        super(Avif, self).__init__(
+            mime=Avif.MIME,
+            extension=Avif.EXTENSION
+        )
+
+    def match(self, buf):
+        if not self._is_isobmff(buf):
+            return False
+
+        major_brand, minor_version, compatible_brands = self._get_ftyp(buf)
+        if major_brand == 'avif':
+            return True
+        if major_brand in ['mif1', 'msf1'] and 'avif' in compatible_brands:
+            return True
+        return False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/isobmff.py 
new/filetype-1.2.0/filetype/types/isobmff.py
--- old/filetype-1.0.10/filetype/types/isobmff.py       2020-01-18 
17:45:56.000000000 +0100
+++ new/filetype-1.2.0/filetype/types/isobmff.py        2022-10-14 
17:57:19.000000000 +0200
@@ -24,10 +24,10 @@
 
     def _get_ftyp(self, buf):
         ftyp_len = int(codecs.encode(buf[0:4], 'hex'), 16)
-        major_brand = buf[8:12].decode()
+        major_brand = buf[8:12].decode(errors='ignore')
         minor_version = int(codecs.encode(buf[12:16], 'hex'), 16)
         compatible_brands = []
         for i in range(16, ftyp_len, 4):
-            compatible_brands.append(buf[i:i+4].decode())
+            compatible_brands.append(buf[i:i+4].decode(errors='ignore'))
 
         return major_brand, minor_version, compatible_brands
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/types/video.py 
new/filetype-1.2.0/filetype/types/video.py
--- old/filetype-1.0.10/filetype/types/video.py 2021-09-22 18:50:21.000000000 
+0200
+++ new/filetype-1.2.0/filetype/types/video.py  2022-07-12 16:48:24.000000000 
+0200
@@ -67,20 +67,9 @@
         )
 
     def match(self, buf):
-        return ((len(buf) > 15 and
-                buf[0] == 0x1A and buf[1] == 0x45 and
-                buf[2] == 0xDF and buf[3] == 0xA3 and
-                buf[4] == 0x93 and buf[5] == 0x42 and
-                buf[6] == 0x82 and buf[7] == 0x88 and
-                buf[8] == 0x6D and buf[9] == 0x61 and
-                buf[10] == 0x74 and buf[11] == 0x72 and
-                buf[12] == 0x6F and buf[13] == 0x73 and
-                buf[14] == 0x6B and buf[15] == 0x61) or
-                (len(buf) > 38 and
-                    buf[31] == 0x6D and buf[32] == 0x61 and
-                    buf[33] == 0x74 and buf[34] == 0x72 and
-                    buf[35] == 0x6f and buf[36] == 0x73 and
-                    buf[37] == 0x6B and buf[38] == 0x61))
+        contains_ebml_element = buf.startswith(b'\x1A\x45\xDF\xA3')
+        contains_doctype_element = buf.find(b'\x42\x82\x88matroska') > -1
+        return contains_ebml_element and contains_doctype_element
 
 
 class Webm(Type):
@@ -97,11 +86,9 @@
         )
 
     def match(self, buf):
-        return (len(buf) > 3 and
-                buf[0] == 0x1A and
-                buf[1] == 0x45 and
-                buf[2] == 0xDF and
-                buf[3] == 0xA3)
+        contains_ebml_element = buf.startswith(b'\x1A\x45\xDF\xA3')
+        contains_doctype_element = buf.find(b'\x42\x82\x84webm') > -1
+        return contains_ebml_element and contains_doctype_element
 
 
 class Mov(IsoBmff):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype/utils.py 
new/filetype-1.2.0/filetype/utils.py
--- old/filetype-1.0.10/filetype/utils.py       2021-09-22 18:50:21.000000000 
+0200
+++ new/filetype-1.2.0/filetype/utils.py        2022-10-14 17:57:19.000000000 
+0200
@@ -7,19 +7,19 @@
     pass
 
 
-_NUM_SIGNATURE_BYTES = 262
+_NUM_SIGNATURE_BYTES = 8192
 
 
 def get_signature_bytes(path):
     """
-    Reads file from disk and returns the first 262 bytes
+    Reads file from disk and returns the first 8192 bytes
     of data representing the magic number header signature.
 
     Args:
         path: path string to file.
 
     Returns:
-        First 262 bytes of the file content as bytearray type.
+        First 8192 bytes of the file content as bytearray type.
     """
     with open(path, 'rb') as fp:
         return bytearray(fp.read(_NUM_SIGNATURE_BYTES))
@@ -27,14 +27,14 @@
 
 def signature(array):
     """
-    Returns the first 262 bytes of the given bytearray
+    Returns the first 8192 bytes of the given bytearray
     as part of the file header signature.
 
     Args:
         array: bytearray to extract the header signature.
 
     Returns:
-        First 262 bytes of the file content as bytearray type.
+        First 8192 bytes of the file content as bytearray type.
     """
     length = len(array)
     index = _NUM_SIGNATURE_BYTES if length > _NUM_SIGNATURE_BYTES else length
@@ -44,39 +44,41 @@
 
 def get_bytes(obj):
     """
-    Infers the input type and reads the first 262 bytes,
+    Infers the input type and reads the first 8192 bytes,
     returning a sliced bytearray.
 
     Args:
-        obj: path to readable, file, bytes or bytearray.
+        obj: path to readable, file-like object(with read() method), bytes,
+        bytearray or memoryview
 
     Returns:
-        First 262 bytes of the file content as bytearray type.
+        First 8192 bytes of the file content as bytearray type.
 
     Raises:
         TypeError: if obj is not a supported type.
     """
-    try:
-        obj = obj.read(_NUM_SIGNATURE_BYTES)
-    except AttributeError:
-        # duck-typing as readable failed - we'll try the other options
-        pass
-
-    kind = type(obj)
-
-    if kind is bytearray:
+    if isinstance(obj, bytearray):
         return signature(obj)
 
-    if kind is str:
+    if isinstance(obj, str):
         return get_signature_bytes(obj)
 
-    if kind is bytes:
+    if isinstance(obj, bytes):
         return signature(obj)
 
-    if kind is memoryview:
-        return signature(obj).tolist()
+    if isinstance(obj, memoryview):
+        return bytearray(signature(obj).tolist())
 
     if isinstance(obj, pathlib.PurePath):
         return get_signature_bytes(obj)
 
-    raise TypeError('Unsupported type as file input: %s' % kind)
+    if hasattr(obj, 'read'):
+        if hasattr(obj, 'tell') and hasattr(obj, 'seek'):
+            start_pos = obj.tell()
+            obj.seek(0)
+            magic_bytes = obj.read(_NUM_SIGNATURE_BYTES)
+            obj.seek(start_pos)
+            return get_bytes(magic_bytes)
+        return get_bytes(obj.read(_NUM_SIGNATURE_BYTES))
+
+    raise TypeError('Unsupported type as file input: %s' % type(obj))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype.egg-info/PKG-INFO 
new/filetype-1.2.0/filetype.egg-info/PKG-INFO
--- old/filetype-1.0.10/filetype.egg-info/PKG-INFO      2022-02-03 
20:35:45.000000000 +0100
+++ new/filetype-1.2.0/filetype.egg-info/PKG-INFO       2022-11-02 
18:33:56.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: filetype
-Version: 1.0.10
+Version: 1.2.0
 Summary: Infer file type and MIME type of any file/buffer. No external 
dependencies.
 Home-page: https://github.com/h2non/filetype.py
 Author: Tomas Aparicio
@@ -76,6 +76,7 @@
         -  **jpg** - ``image/jpeg``
         -  **jpx** - ``image/jpx``
         -  **png** - ``image/png``
+        -  **apng** - ``image/apng``
         -  **gif** - ``image/gif``
         -  **webp** - ``image/webp``
         -  **cr2** - ``image/x-canon-cr2``
@@ -85,6 +86,7 @@
         -  **psd** - ``image/vnd.adobe.photoshop``
         -  **ico** - ``image/x-icon``
         -  **heic** - ``image/heic``
+        -  **avif** - ``image/avif``
         
         Video
         ^^^^^
@@ -106,7 +108,7 @@
         -  **aac** - ``audio/aac``
         -  **mid** - ``audio/midi``
         -  **mp3** - ``audio/mpeg``
-        -  **m4a** - ``audio/m4a``
+        -  **m4a** - ``audio/mp4``
         -  **ogg** - ``audio/ogg``
         -  **flac** - ``audio/x-flac``
         -  **wav** - ``audio/x-wav``
@@ -130,7 +132,6 @@
         -  **pdf** - ``application/pdf``
         -  **exe** - ``application/x-msdownload``
         -  **swf** - ``application/x-shockwave-flash``
-        
         -  **rtf** - ``application/rtf``
         -  **eot** - ``application/octet-stream``
         -  **ps** - ``application/postscript``
@@ -144,6 +145,20 @@
         -  **lzo** - ``application/x-lzop``
         -  **lz** - ``application/x-lzip``
         -  **lz4** - ``application/x-lz4``
+        -  **zstd** - ``application/zstd``
+        
+        Document
+        ^^^^^^^^
+        
+        -  **doc** - ``application/msword``
+        -  **docx** - 
``application/vnd.openxmlformats-officedocument.wordprocessingml.document``
+        -  **odt** - ``application/vnd.oasis.opendocument.text``
+        -  **xls** - ``application/vnd.ms-excel``
+        -  **xlsx** - 
``application/vnd.openxmlformats-officedocument.spreadsheetml.sheet``
+        -  **ods** - ``application/vnd.oasis.opendocument.spreadsheet``
+        -  **ppt** - ``application/vnd.ms-powerpoint``
+        -  **pptx** - 
``application/vnd.openxmlformats-officedocument.presentationml.presentation``
+        -  **odp** - ``application/vnd.oasis.opendocument.presentation``
         
         Font
         ^^^^
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/filetype.egg-info/SOURCES.txt 
new/filetype-1.2.0/filetype.egg-info/SOURCES.txt
--- old/filetype-1.0.10/filetype.egg-info/SOURCES.txt   2022-02-03 
20:35:45.000000000 +0100
+++ new/filetype-1.2.0/filetype.egg-info/SOURCES.txt    2022-11-02 
18:33:56.000000000 +0100
@@ -25,6 +25,7 @@
 filetype/types/archive.py
 filetype/types/audio.py
 filetype/types/base.py
+filetype/types/document.py
 filetype/types/font.py
 filetype/types/image.py
 filetype/types/isobmff.py
@@ -37,11 +38,28 @@
 tests/test_types.py
 tests/test_utils.py
 tests/fixtures/LICENSE
+tests/fixtures/sample.avif
+tests/fixtures/sample.doc
+tests/fixtures/sample.docx
 tests/fixtures/sample.gif
 tests/fixtures/sample.heic
 tests/fixtures/sample.jpg
 tests/fixtures/sample.jpx
+tests/fixtures/sample.m4a
 tests/fixtures/sample.mov
 tests/fixtures/sample.mp4
+tests/fixtures/sample.odp
+tests/fixtures/sample.ods
+tests/fixtures/sample.odt
 tests/fixtures/sample.png
-tests/fixtures/sample.tif
\ No newline at end of file
+tests/fixtures/sample.ppt
+tests/fixtures/sample.pptx
+tests/fixtures/sample.tar
+tests/fixtures/sample.tif
+tests/fixtures/sample.xls
+tests/fixtures/sample.xlsx
+tests/fixtures/sample.zip
+tests/fixtures/sample.zst
+tests/fixtures/sample_1.doc
+tests/fixtures/sample_1.docx
+tests/fixtures/sample_skippable.zst
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/setup.py new/filetype-1.2.0/setup.py
--- old/filetype-1.0.10/setup.py        2022-02-03 20:33:54.000000000 +0100
+++ new/filetype-1.2.0/setup.py 2022-11-02 18:30:43.000000000 +0100
@@ -6,7 +6,7 @@
 
 setup(
     name='filetype',
-    version='1.0.10',
+    version='1.2.0',
     description='Infer file type and MIME type of any file/buffer. '
                 'No external dependencies.',
     long_description=codecs.open('README.rst', 'r',
Binary files old/filetype-1.0.10/tests/fixtures/sample.avif and 
new/filetype-1.2.0/tests/fixtures/sample.avif differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.doc and 
new/filetype-1.2.0/tests/fixtures/sample.doc differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.docx and 
new/filetype-1.2.0/tests/fixtures/sample.docx differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.m4a and 
new/filetype-1.2.0/tests/fixtures/sample.m4a differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.odp and 
new/filetype-1.2.0/tests/fixtures/sample.odp differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.ods and 
new/filetype-1.2.0/tests/fixtures/sample.ods differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.odt and 
new/filetype-1.2.0/tests/fixtures/sample.odt differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.ppt and 
new/filetype-1.2.0/tests/fixtures/sample.ppt differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.pptx and 
new/filetype-1.2.0/tests/fixtures/sample.pptx differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.tar and 
new/filetype-1.2.0/tests/fixtures/sample.tar differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.xls and 
new/filetype-1.2.0/tests/fixtures/sample.xls differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.xlsx and 
new/filetype-1.2.0/tests/fixtures/sample.xlsx differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.zip and 
new/filetype-1.2.0/tests/fixtures/sample.zip differ
Binary files old/filetype-1.0.10/tests/fixtures/sample.zst and 
new/filetype-1.2.0/tests/fixtures/sample.zst differ
Binary files old/filetype-1.0.10/tests/fixtures/sample_1.doc and 
new/filetype-1.2.0/tests/fixtures/sample_1.doc differ
Binary files old/filetype-1.0.10/tests/fixtures/sample_1.docx and 
new/filetype-1.2.0/tests/fixtures/sample_1.docx differ
Binary files old/filetype-1.0.10/tests/fixtures/sample_skippable.zst and 
new/filetype-1.2.0/tests/fixtures/sample_skippable.zst differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/tests/test_filetype.py 
new/filetype-1.2.0/tests/test_filetype.py
--- old/filetype-1.0.10/tests/test_filetype.py  2020-01-18 17:45:56.000000000 
+0100
+++ new/filetype-1.2.0/tests/test_filetype.py   2022-07-12 16:48:24.000000000 
+0200
@@ -84,3 +84,13 @@
         mime = filetype.guess_mime(buf)
         self.assertTrue(mime is not None)
         self.assertEqual(mime, 'image/jpeg')
+
+    def test_guess_video_invalid(self):
+        buf = bytearray([0x0, 0x0, 0x0, 0x0, 0x66, 0x74, 0x79, 0x70, 0xf2, 
0xf2, 0xf2, 0xf2, 0xf6, 0xf2, 0xf2, 0x90])
+        mime = filetype.guess_mime(buf)
+        self.assertTrue(mime is None)
+
+    def test_guess_image_invalid(self):
+        buf = bytearray([0x49, 0x49, 0x2a, 0x0])
+        mime = filetype.guess_mime(buf)
+        self.assertTrue(mime is None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/filetype-1.0.10/tests/test_types.py 
new/filetype-1.2.0/tests/test_types.py
--- old/filetype-1.0.10/tests/test_types.py     2020-01-18 17:45:56.000000000 
+0100
+++ new/filetype-1.2.0/tests/test_types.py      2022-11-02 18:30:43.000000000 
+0100
@@ -13,10 +13,18 @@
 
 class TestFileType(unittest.TestCase):
     def test_guess_jpeg(self):
-        kind = filetype.guess(FIXTURES + '/sample.jpg')
-        self.assertTrue(kind is not None)
-        self.assertEqual(kind.mime, 'image/jpeg')
-        self.assertEqual(kind.extension, 'jpg')
+        img_path = FIXTURES + '/sample.jpg'
+        with open(img_path, 'rb') as fp:
+            for obj in (img_path, fp):
+                kind = filetype.guess(obj)
+                self.assertTrue(kind is not None)
+                self.assertEqual(kind.mime, 'image/jpeg')
+                self.assertEqual(kind.extension, 'jpg')
+            # reset reader position test
+            kind = filetype.guess(fp)
+            self.assertTrue(kind is not None)
+            self.assertEqual(kind.mime, 'image/jpeg')
+            self.assertEqual(kind.extension, 'jpg')
 
     def test_guess_jpx(self):
         kind = filetype.guess(FIXTURES + '/sample.jpx')
@@ -36,6 +44,19 @@
         self.assertEqual(kind.mime, 'image/heic')
         self.assertEqual(kind.extension, 'heic')
 
+    def test_guess_avif(self):
+        kind = filetype.guess(FIXTURES + '/sample.avif')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 'image/avif')
+        self.assertEqual(kind.extension, 'avif')
+
+    def test_guess_m4a(self):
+        kind = filetype.guess(FIXTURES + '/sample.m4a')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 'audio/mp4')
+        self.assertEqual(kind.extension, 'm4a')
+
+
     def test_guess_mp4(self):
         kind = filetype.guess(FIXTURES + '/sample.mp4')
         self.assertTrue(kind is not None)
@@ -59,3 +80,66 @@
         self.assertTrue(kind is not None)
         self.assertEqual(kind.mime, 'video/quicktime')
         self.assertEqual(kind.extension, 'mov')
+
+    def test_guess_zstd(self):
+        for name in 'sample.zst', 'sample_skippable.zst':
+            kind = filetype.guess(FIXTURES + '/' + name)
+            self.assertTrue(kind is not None)
+            self.assertEqual(kind.mime, 'application/zstd')
+            self.assertEqual(kind.extension, 'zst')
+
+    def test_guess_doc(self):
+        for name in 'sample.doc', 'sample_1.doc':
+            kind = filetype.guess(os.path.join(FIXTURES, name))
+            self.assertIsNotNone(kind)
+            self.assertEqual(kind.mime, 'application/msword')
+            self.assertEqual(kind.extension, 'doc')
+
+    def test_guess_docx(self):
+        for name in 'sample.docx', 'sample_1.docx':
+            kind = filetype.guess(os.path.join(FIXTURES, name))
+            self.assertTrue(kind is not None)
+            self.assertEqual(kind.mime, 
'application/vnd.openxmlformats-officedocument.wordprocessingml.document')
+            self.assertEqual(kind.extension, 'docx')
+
+    def test_guess_odt(self):
+        kind = filetype.guess(FIXTURES + '/sample.odt')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 'application/vnd.oasis.opendocument.text')
+        self.assertEqual(kind.extension, 'odt')
+
+    def test_guess_xls(self):
+        kind = filetype.guess(FIXTURES + '/sample.xls')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 'application/vnd.ms-excel')
+        self.assertEqual(kind.extension, 'xls')
+
+    def test_guess_xlsx(self):
+        kind = filetype.guess(FIXTURES + '/sample.xlsx')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
+        self.assertEqual(kind.extension, 'xlsx')
+
+    def test_guess_ods(self):
+        kind = filetype.guess(FIXTURES + '/sample.ods')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 
'application/vnd.oasis.opendocument.spreadsheet')
+        self.assertEqual(kind.extension, 'ods')
+
+    def test_guess_ppt(self):
+        kind = filetype.guess(FIXTURES + '/sample.ppt')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 'application/vnd.ms-powerpoint')
+        self.assertEqual(kind.extension, 'ppt')
+
+    def test_guess_pptx(self):
+        kind = filetype.guess(FIXTURES + '/sample.pptx')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 
'application/vnd.openxmlformats-officedocument.presentationml.presentation')
+        self.assertEqual(kind.extension, 'pptx')
+
+    def test_guess_odp(self):
+        kind = filetype.guess(FIXTURES + '/sample.odp')
+        self.assertTrue(kind is not None)
+        self.assertEqual(kind.mime, 
'application/vnd.oasis.opendocument.presentation')
+        self.assertEqual(kind.extension, 'odp')

Reply via email to