summaryrefslogtreecommitdiff
path: root/src/mesh/assimp-master/test/regression/gen_db.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesh/assimp-master/test/regression/gen_db.py')
-rw-r--r--src/mesh/assimp-master/test/regression/gen_db.py225
1 files changed, 225 insertions, 0 deletions
diff --git a/src/mesh/assimp-master/test/regression/gen_db.py b/src/mesh/assimp-master/test/regression/gen_db.py
new file mode 100644
index 0000000..a704c3a
--- /dev/null
+++ b/src/mesh/assimp-master/test/regression/gen_db.py
@@ -0,0 +1,225 @@
+#!/usr/bin/env python3
+# -*- Coding: UTF-8 -*-
+
+# ---------------------------------------------------------------------------
+# Open Asset Import Library (ASSIMP)
+# ---------------------------------------------------------------------------
+#
+# Copyright (c) 2006-2020, ASSIMP Development Team
+#
+# All rights reserved.
+#
+# Redistribution and use of this software in source and binary forms,
+# with or without modification, are permitted provided that the following
+# conditions are met:
+#
+# * Redistributions of source code must retain the above
+# copyright notice, this list of conditions and the
+# following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the
+# following disclaimer in the documentation and/or other
+# materials provided with the distribution.
+#
+# * Neither the name of the ASSIMP team, nor the names of its
+# contributors may be used to endorse or promote products
+# derived from this software without specific prior
+# written permission of the ASSIMP Development Team.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# ---------------------------------------------------------------------------
+
+"""
+Generate the regression database db.zip from the files in the <root>/test/models
+directory. Older databases are overwritten with no prompt but can be restored
+using Git as needed.
+
+Use --help for usage.
+
+On Windows, use ``py run.py <arguments>`` to make sure command line parameters
+are forwarded to the script.
+"""
+
+import sys
+import os
+import subprocess
+import zipfile
+
+import settings
+import utils
+
+usage = """gen_db [assimp_binary] [-i=...] [-e=...] [-p] [-n]
+
+The assimp_cmd (or assimp) binary to use is specified by the first
+command line argument and defaults to ``assimp``.
+
+To build, set ``ASSIMP_BUILD_ASSIMP_TOOLS=ON`` in CMake. If generating
+configs for an IDE, make sure to build the assimp_cmd project.
+
+-i,--include: List of file extensions to update dumps for. If omitted,
+ all file extensions are updated except those in `exclude`.
+ Example: -ixyz,abc
+ -i.xyz,.abc
+ --include=xyz,abc
+
+-e,--exclude: Merged with settings.exclude_extensions to produce a
+ list of all file extensions to ignore. If dumps exist,
+ they are not altered. If not, theu are not created.
+
+-p,--preview: Preview list of file extensions touched by the update.
+ Dont' change anything.
+
+-n,--nozip: Don't pack to ZIP archive. Keep all dumps in individual files.
+"""
+
+# -------------------------------------------------------------------------------
+def process_dir(d, outfile, file_filter):
+ """ Generate small dump records for all files in 'd' """
+ print("Processing directory " + d)
+
+ num = 0
+ for f in os.listdir(d):
+ fullp = os.path.join(d, f)
+ if os.path.isdir(fullp) and not f == ".svn":
+ num += process_dir(fullp, outfile, file_filter)
+ continue
+
+ if file_filter(f):
+ for pp in settings.pp_configs_to_test:
+ num += 1
+ print("DUMP " + fullp + "\n post-processing: " + pp)
+ outf = os.path.join(os.getcwd(), settings.database_name,
+ utils.hashing(fullp, pp))
+
+ cmd = [ assimp_bin_path, "dump", fullp, outf, "-b", "-s", "-l" ] + pp.split()
+ outfile.write("assimp dump "+"-"*80+"\n")
+ outfile.flush()
+ if subprocess.call(cmd, stdout=outfile, stderr=outfile, shell=False):
+ print("Failure processing " + fullp)
+
+ # spit out an empty file to indicate that this failure is expected
+ with open(outf,'wb') as f:
+ pass
+ return num
+
+
+# -------------------------------------------------------------------------------
+def make_zip():
+ """Zip the contents of ./<settings.database_name>
+ to <settings.database_name>.zip using DEFLATE
+ compression to minimize the file size. """
+
+ num = 0
+ zipout = zipfile.ZipFile(settings.database_name + ".zip", "w", zipfile.ZIP_DEFLATED)
+ for f in os.listdir(settings.database_name):
+ p = os.path.join(settings.database_name, f)
+ zipout.write(p, f)
+ if settings.remove_old:
+ os.remove(p)
+
+ num += 1
+
+ if settings.remove_old:
+ os.rmdir(settings.database_name)
+
+ bad = zipout.testzip()
+ assert bad is None
+
+ print("="*60)
+ print("Database contains {0} entries".format(num))
+
+
+# -------------------------------------------------------------------------------
+def extract_zip():
+ """Unzip <settings.database_name>.zip to
+ ./<settings.database_name>"""
+ try:
+ zipout = zipfile.ZipFile(settings.database_name + ".zip", "r", 0)
+ zipout.extractall(path=settings.database_name)
+ except (RuntimeError,IOError) as r:
+ print(r)
+ print("failed to extract previous ZIP contents. "\
+ "DB is generated from scratch.")
+
+
+# -------------------------------------------------------------------------------
+def gen_db(ext_list,outfile):
+ """Generate the crash dump database in
+ ./<settings.database_name>"""
+ try:
+ os.mkdir(settings.database_name)
+ except OSError:
+ pass
+
+ num = 0
+ for tp in settings.model_directories:
+ num += process_dir(tp, outfile,
+ lambda x: os.path.splitext(x)[1].lower() in ext_list and not x in settings.files_to_ignore)
+
+ print("="*60)
+ print("Updated {0} entries".format(num))
+
+
+# -------------------------------------------------------------------------------
+if __name__ == "__main__":
+ def clean(f):
+ f = f.strip("* \'")
+ return "."+f if f[:1] != '.' else f
+
+ if len(sys.argv) <= 1 or sys.argv[1] == "--help" or sys.argv[1] == "-h":
+ print(usage)
+ sys.exit(0)
+
+ assimp_bin_path = sys.argv[1]
+ ext_list, preview, nozip = None, False, False
+ for m in sys.argv[2:]:
+ if m[:10]=="--exclude=":
+ settings.exclude_extensions += map(clean, m[10:].split(","))
+ elif m[:2]=="-e":
+ settings.exclude_extensions += map(clean, m[2:].split(","))
+ elif m[:10]=="--include=":
+ ext_list = m[10:].split(",")
+ elif m[:2]=="-i":
+ ext_list = m[2:].split(",")
+ elif m=="-p" or m == "--preview":
+ preview = True
+ elif m=="-n" or m == "--nozip":
+ nozip = True
+ else:
+ print("Unrecognized parameter: " + m)
+ sys.exit(-1)
+
+ outfile = open(os.path.join("..", "results", "gen_regression_db_output.txt"), "w")
+ if ext_list is None:
+ (ext_list, err) = subprocess.Popen([assimp_bin_path, "listext"],
+ stdout=subprocess.PIPE).communicate()
+ ext_list = str(ext_list.strip()).lower().split(";")
+
+ # todo: Fix for multi dot extensions like .skeleton.xml
+ ext_list = list(filter(lambda f: not f in settings.exclude_extensions,
+ map(clean, ext_list)))
+ print('File extensions processed: ' + ', '.join(ext_list))
+ if preview:
+ sys.exit(1)
+
+ extract_zip()
+ gen_db(ext_list,outfile)
+ make_zip()
+
+ print("="*60)
+ input("Press any key to continue")
+ sys.exit(0)
+
+# vim: ai ts=4 sts=4 et sw=4
+