Merge branch 'master' into blender2.8

This commit is contained in:
2018-07-03 06:58:34 +02:00
56 changed files with 757 additions and 622 deletions

View File

@@ -34,6 +34,7 @@ log = logging.getLogger("BlendFileReader")
# module global routines # module global routines
###################################################### ######################################################
def ReadString(handle, length): def ReadString(handle, length):
''' '''
ReadString reads a String of given length or a zero terminating String ReadString reads a String of given length or a zero terminating String
@@ -338,7 +339,7 @@ class DNAName:
return result return result
def ShortName(self): def ShortName(self):
result = self.Name; result = self.Name
result = result.replace("*", "") result = result.replace("*", "")
result = result.replace("(", "") result = result.replace("(", "")
result = result.replace(")", "") result = result.replace(")", "")
@@ -398,7 +399,7 @@ class DNAStructure:
splitted = path.partition(".") splitted = path.partition(".")
name = splitted[0] name = splitted[0]
rest = splitted[2] rest = splitted[2]
offset = 0; offset = 0
for field in self.Fields: for field in self.Fields:
if field.Name.ShortName() == name: if field.Name.ShortName() == name:
log.debug("found " + name + "@" + str(offset)) log.debug("found " + name + "@" + str(offset))
@@ -443,4 +444,3 @@ class DNAField:
return ReadString(handle, self.Name.ArraySize()) return ReadString(handle, self.Name.ArraySize())
else: else:
return self.Type.Structure.GetField(header, handle, path) return self.Type.Structure.GetField(header, handle, path)

View File

@@ -42,6 +42,7 @@ def man_format(data):
data = data.replace("\t", " ") data = data.replace("\t", " ")
return data return data
if len(sys.argv) != 3: if len(sys.argv) != 3:
import getopt import getopt
raise getopt.GetoptError("Usage: %s <path-to-blender> <output-filename>" % sys.argv[0]) raise getopt.GetoptError("Usage: %s <path-to-blender> <output-filename>" % sys.argv[0])

View File

@@ -73,6 +73,8 @@ def rna_info_BuildRNAInfo_cache():
if rna_info_BuildRNAInfo_cache.ret is None: if rna_info_BuildRNAInfo_cache.ret is None:
rna_info_BuildRNAInfo_cache.ret = rna_info.BuildRNAInfo() rna_info_BuildRNAInfo_cache.ret = rna_info.BuildRNAInfo()
return rna_info_BuildRNAInfo_cache.ret return rna_info_BuildRNAInfo_cache.ret
rna_info_BuildRNAInfo_cache.ret = None rna_info_BuildRNAInfo_cache.ret = None
# --- end rna_info cache # --- end rna_info cache
@@ -516,6 +518,8 @@ def escape_rst(text):
""" Escape plain text which may contain characters used by RST. """ Escape plain text which may contain characters used by RST.
""" """
return text.translate(escape_rst.trans) return text.translate(escape_rst.trans)
escape_rst.trans = str.maketrans({ escape_rst.trans = str.maketrans({
"`": "\\`", "`": "\\`",
"|": "\\|", "|": "\\|",
@@ -1018,6 +1022,7 @@ def pymodule2sphinx(basepath, module_name, module, title):
file.close() file.close()
# Changes in Blender will force errors here # Changes in Blender will force errors here
context_type_map = { context_type_map = {
"active_base": ("ObjectBase", False), "active_base": ("ObjectBase", False),

View File

@@ -209,6 +209,8 @@ def modules(module_cache=addons_fake_modules, *, refresh=True):
) )
) )
return mod_list return mod_list
modules._is_first = True modules._is_first = True

View File

@@ -172,6 +172,7 @@ def ui_draw_filter_register(
class Wrapper(cls_real): class Wrapper(cls_real):
__slots__ = () __slots__ = ()
def __getattribute__(self, attr): def __getattribute__(self, attr):
if attr == "layout": if attr == "layout":
return UILayout_Fake(self_real.layout) return UILayout_Fake(self_real.layout)

View File

@@ -43,14 +43,17 @@ else:
# XXX This is a quick hack to make it work with new I18n... objects! To be reworked! # XXX This is a quick hack to make it work with new I18n... objects! To be reworked!
def main(): def main():
import argparse import argparse
parser = argparse.ArgumentParser(description= parser = argparse.ArgumentParser(
description=(
"Merge one or more .po files into the first dest one.\n" "Merge one or more .po files into the first dest one.\n"
"If a msgkey (msgctxt, msgid) is present in more than one merged po, the one in the first file " "If a msgkey (msgctxt, msgid) is present in more than one merged po, the one in the first file "
"wins, unless its marked as fuzzy and one later is not.\n" "wins, unless its marked as fuzzy and one later is not.\n"
"The fuzzy flag is removed if necessary.\n" "The fuzzy flag is removed if necessary.\n"
"All other comments are never modified.\n" "All other comments are never modified.\n"
"Commented messages in dst will always remain commented, and commented messages are never merged " "Commented messages in dst will always remain commented, and commented messages are never merged "
"from sources.") "from sources."
),
)
parser.add_argument('-s', '--stats', action="store_true", help="Show statistics info.") parser.add_argument('-s', '--stats', action="store_true", help="Show statistics info.")
parser.add_argument('-r', '--replace', action="store_true", parser.add_argument('-r', '--replace', action="store_true",
help="Replace existing messages of same \"level\" already in dest po.") help="Replace existing messages of same \"level\" already in dest po.")

View File

@@ -98,5 +98,6 @@ def main():
for value in read_blend_rend_chunk(arg): for value in read_blend_rend_chunk(arg):
print("%d %d %s" % value) print("%d %d %s" % value)
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View File

@@ -228,4 +228,5 @@ class BPyOpsSubModOp:
return ("<function bpy.ops.%s.%s at 0x%x'>" % return ("<function bpy.ops.%s.%s at 0x%x'>" %
(self._module, self._func, id(self))) (self._module, self._func, id(self)))
ops_fake_module = BPyOps() ops_fake_module = BPyOps()

View File

@@ -183,6 +183,8 @@ def clean_name(name, replace="_"):
trans = maketrans_init() trans = maketrans_init()
return name.translate(trans) return name.translate(trans)
clean_name._trans_cache = {} clean_name._trans_cache = {}
@@ -223,6 +225,7 @@ def display_name(name):
name = _clean_utf8(name) name = _clean_utf8(name)
return name return name
def display_name_to_filepath(name): def display_name_to_filepath(name):
""" """
Performs the reverse of display_name using literal versions of characters Performs the reverse of display_name using literal versions of characters

View File

@@ -142,7 +142,8 @@ def orientation_helper_factory(name, axis_forward='Y', axis_up='Z'):
members['axis_forward'] = EnumProperty( members['axis_forward'] = EnumProperty(
name="Forward", name="Forward",
items=(('X', "X Forward", ""), items=(
('X', "X Forward", ""),
('Y', "Y Forward", ""), ('Y', "Y Forward", ""),
('Z', "Z Forward", ""), ('Z', "Z Forward", ""),
('-X', "-X Forward", ""), ('-X', "-X Forward", ""),
@@ -160,7 +161,8 @@ def orientation_helper_factory(name, axis_forward='Y', axis_up='Z'):
members['axis_up'] = EnumProperty( members['axis_up'] = EnumProperty(
name="Up", name="Up",
items=(('X', "X Up", ""), items=(
('X', "X Up", ""),
('Y', "Y Up", ""), ('Y', "Y Up", ""),
('Z', "Z Up", ""), ('Z', "Z Up", ""),
('-X', "-X Up", ""), ('-X', "-X Up", ""),
@@ -394,7 +396,8 @@ def unpack_face_list(list_of_tuples):
path_reference_mode = EnumProperty( path_reference_mode = EnumProperty(
name="Path Mode", name="Path Mode",
description="Method used to reference paths", description="Method used to reference paths",
items=(('AUTO', "Auto", "Use Relative paths with subdirectories only"), items=(
('AUTO', "Auto", "Use Relative paths with subdirectories only"),
('ABSOLUTE', "Absolute", "Always write absolute paths"), ('ABSOLUTE', "Absolute", "Always write absolute paths"),
('RELATIVE', "Relative", "Always write relative paths " ('RELATIVE', "Relative", "Always write relative paths "
"(where possible)"), "(where possible)"),

View File

@@ -153,6 +153,7 @@ def topretty_py(py_data, indent=" "):
return "\n".join(lines) return "\n".join(lines)
if __name__ == "__main__": if __name__ == "__main__":
# testing code. # testing code.

View File

@@ -19,12 +19,12 @@
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
# Original copyright (see docstring): # Original copyright (see docstring):
#***************************************************************************** # ****************************************************************************
# Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu> # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
# #
# Distributed under the terms of the BSD License. The full license is in # Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software. # the file COPYING, distributed as part of this software.
#***************************************************************************** # ****************************************************************************
# <pep8 compliant> # <pep8 compliant>

View File

@@ -224,6 +224,7 @@ def execute(context, is_interactive):
return {'FINISHED'} return {'FINISHED'}
execute.hooks = [] execute.hooks = []

View File

@@ -40,6 +40,7 @@ def shell_run(text):
add_scrollback(output, style) add_scrollback(output, style)
PROMPT = "$ " PROMPT = "$ "
@@ -64,7 +65,7 @@ def execute(context, is_interactive):
def autocomplete(context): def autocomplete(context):
#~ sc = context.space_data # sc = context.space_data
# TODO # TODO
return {'CANCELLED'} return {'CANCELLED'}

View File

@@ -179,6 +179,7 @@ def graph_armature(obj, filepath, FAKE_PARENT=True, CONSTRAINTS=True, DRIVERS=Tr
print("\nSaved:", filepath) print("\nSaved:", filepath)
return True return True
if __name__ == "__main__": if __name__ == "__main__":
import os import os
tmppath = "/tmp/test.dot" tmppath = "/tmp/test.dot"

View File

@@ -221,6 +221,7 @@ def RKS_GEN_scaling(ksi, context, ks, data):
# ------ # ------
# Property identifiers for Bendy Bones # Property identifiers for Bendy Bones
bbone_property_ids = ( bbone_property_ids = (
"bbone_curveinx", "bbone_curveinx",

View File

@@ -174,7 +174,7 @@ def draw_kmi(display_keymaps, kc, km, kmi, layout, level):
sub.prop(kmi, "propvalue", text="") sub.prop(kmi, "propvalue", text="")
else: else:
# One day... # One day...
#~ sub.prop_search(kmi, "idname", bpy.context.window_manager, "operators_all", text="") # sub.prop_search(kmi, "idname", bpy.context.window_manager, "operators_all", text="")
sub.prop(kmi, "idname", text="") sub.prop(kmi, "idname", text="")
if map_type not in {'TEXTINPUT', 'TIMER'}: if map_type not in {'TEXTINPUT', 'TIMER'}:
@@ -207,6 +207,7 @@ def draw_kmi(display_keymaps, kc, km, kmi, layout, level):
draw_km(display_keymaps, kc, kmm, None, layout, level + 1) draw_km(display_keymaps, kc, kmm, None, layout, level + 1)
layout.context_pointer_set("keymap", km) layout.context_pointer_set("keymap", km)
_EVENT_TYPES = set() _EVENT_TYPES = set()
_EVENT_TYPE_MAP = {} _EVENT_TYPE_MAP = {}
_EVENT_TYPE_MAP_EXTRA = {} _EVENT_TYPE_MAP_EXTRA = {}
@@ -260,8 +261,8 @@ def draw_filtered(display_keymaps, filter_type, filter_text, layout):
kmi_test_type = [] kmi_test_type = []
# initialize? - so if a if a kmi has a MOD assigned it wont show up. # initialize? - so if a if a kmi has a MOD assigned it wont show up.
#~ for kv in key_mod.values(): # for kv in key_mod.values():
#~ kmi_test_dict[kv] = {False} # kmi_test_dict[kv] = {False}
# altname: attr # altname: attr
for kk, kv in key_mod.items(): for kk, kv in key_mod.items():
@@ -374,7 +375,7 @@ def draw_keymaps(context, layout):
row = subcol.row(align=True) row = subcol.row(align=True)
#~ row.prop_search(wm.keyconfigs, "active", wm, "keyconfigs", text="Key Config") # row.prop_search(wm.keyconfigs, "active", wm, "keyconfigs", text="Key Config")
text = bpy.path.display_name(wm.keyconfigs.active.name) text = bpy.path.display_name(wm.keyconfigs.active.name)
if not text: if not text:
text = "Blender (default)" text = "Blender (default)"
@@ -382,8 +383,8 @@ def draw_keymaps(context, layout):
row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMIN') row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMIN')
row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMOUT').remove_active = True row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMOUT').remove_active = True
#~ layout.context_pointer_set("keyconfig", wm.keyconfigs.active) # layout.context_pointer_set("keyconfig", wm.keyconfigs.active)
#~ row.operator("wm.keyconfig_remove", text="", icon='X') # row.operator("wm.keyconfig_remove", text="", icon='X')
row.separator() row.separator()
rowsub = row.split(align=True, percentage=0.33) rowsub = row.split(align=True, percentage=0.33)
# postpone drawing into rowsub, so we can set alert! # postpone drawing into rowsub, so we can set alert!

View File

@@ -304,7 +304,8 @@ def select_next(bm, report):
uuid_cmp_test = fn(uuid_cmp) uuid_cmp_test = fn(uuid_cmp)
ele_pair_next_uuid_test = [ ele_pair_next_uuid_test = [
(ele, uuid) for (ele, uuid) in ele_pair_next_uuid (ele, uuid) for (ele, uuid) in ele_pair_next_uuid
if uuid_cmp_test == fn(uuid)] if uuid_cmp_test == fn(uuid)
]
if len(ele_pair_next_uuid_test) > 1: if len(ele_pair_next_uuid_test) > 1:
ele_pair_next_uuid = ele_pair_next_uuid_test ele_pair_next_uuid = ele_pair_next_uuid_test
elif len(ele_pair_next_uuid_test) == 1: elif len(ele_pair_next_uuid_test) == 1:

View File

@@ -527,6 +527,8 @@ class BUILTIN_KSI_WholeCharacter(KeyingSetInfo):
ksi.addProp(ks, bone, prop) ksi.addProp(ks, bone, prop)
# All properties that are likely to get animated in a character rig, only selected bones. # All properties that are likely to get animated in a character rig, only selected bones.
class BUILTIN_KSI_WholeCharacterSelected(KeyingSetInfo): class BUILTIN_KSI_WholeCharacterSelected(KeyingSetInfo):
"""Insert a keyframe for all properties that are likely to get animated in a character rig """ """Insert a keyframe for all properties that are likely to get animated in a character rig """
"""(only selected bones)""" """(only selected bones)"""
@@ -557,6 +559,8 @@ class BUILTIN_KSI_WholeCharacterSelected(KeyingSetInfo):
############################### ###############################
# Delta Location # Delta Location
class BUILTIN_KSI_DeltaLocation(KeyingSetInfo): class BUILTIN_KSI_DeltaLocation(KeyingSetInfo):
"""Insert keyframes for additional location offset""" """Insert keyframes for additional location offset"""
bl_label = "Delta Location" bl_label = "Delta Location"
@@ -643,6 +647,7 @@ class BUILTIN_KSI_DeltaScale(KeyingSetInfo):
############################### ###############################
# Note that this controls order of options in 'insert keyframe' menu. # Note that this controls order of options in 'insert keyframe' menu.
# Better try to keep some logical order here beyond mere alphabetical one, also because of menu entries shortcut. # Better try to keep some logical order here beyond mere alphabetical one, also because of menu entries shortcut.
# See also T51867. # See also T51867.

View File

@@ -61,6 +61,7 @@ def group_tools_draw(self, layout, context):
layout.operator("node.group_ungroup") layout.operator("node.group_ungroup")
layout.separator() layout.separator()
# maps node tree type to group node type # maps node tree type to group node type
node_tree_group_type = { node_tree_group_type = {
'CompositorNodeTree': 'CompositorNodeGroup', 'CompositorNodeTree': 'CompositorNodeGroup',

View File

@@ -95,7 +95,9 @@ def write_subimage(sub_x, sub_y, sub_w, sub_h,
with open(filepath, 'wb') as f: with open(filepath, 'wb') as f:
f.write(struct.pack('<6I', f.write(
struct.pack(
'<6I',
sub_w, sub_h, sub_w, sub_h,
sub_x, sub_y, sub_x, sub_y,
# redundant but including to maintain consistency # redundant but including to maintain consistency
@@ -113,7 +115,8 @@ def write_subimage(sub_x, sub_y, sub_w, sub_h,
_dice_icon_name_cache = {} _dice_icon_name_cache = {}
def dice_icon_name(x, y, parts_x, parts_y, def dice_icon_name(
x, y, parts_x, parts_y,
name_style=None, prefix=""): name_style=None, prefix=""):
""" """
How to name icons, this is mainly for what name we get in git, How to name icons, this is mainly for what name we get in git,
@@ -158,14 +161,16 @@ def dice_icon_name(x, y, parts_x, parts_y,
return id_str return id_str
def dice(filepath, output, output_prefix, name_style, def dice(
filepath, output, output_prefix, name_style,
parts_x, parts_y, parts_x, parts_y,
minx, miny, maxx, maxy, minx, miny, maxx, maxy,
minx_icon, miny_icon, maxx_icon, maxy_icon, minx_icon, miny_icon, maxx_icon, maxy_icon,
spacex_icon, spacey_icon, spacex_icon, spacey_icon,
): ):
is_simple = (max(minx, miny, maxx, maxy, is_simple = (max(
minx, miny, maxx, maxy,
minx_icon, miny_icon, maxx_icon, maxy_icon, minx_icon, miny_icon, maxx_icon, maxy_icon,
spacex_icon, spacey_icon) == 0) spacex_icon, spacey_icon) == 0)
@@ -199,9 +204,11 @@ def dice(filepath, output, output_prefix, name_style,
for x in range(parts_x): for x in range(parts_x):
for y in range(parts_y): for y in range(parts_y):
id_str = dice_icon_name(x, y, id_str = dice_icon_name(
x, y,
parts_x, parts_y, parts_x, parts_y,
name_style=name_style, prefix=output_prefix) name_style=name_style, prefix=output_prefix
)
filepath = os.path.join(output, id_str) filepath = os.path.join(output, id_str)
if VERBOSE: if VERBOSE:
print(" writing:", filepath) print(" writing:", filepath)
@@ -235,25 +242,35 @@ def main():
parser = argparse.ArgumentParser(description=__doc__, epilog=epilog) parser = argparse.ArgumentParser(description=__doc__, epilog=epilog)
# File path options # File path options
parser.add_argument("--image", dest="image", metavar='FILE', parser.add_argument(
help="Image file") "--image", dest="image", metavar='FILE',
help="Image file",
parser.add_argument("--output", dest="output", metavar='DIR', )
help="Output directory") parser.add_argument(
"--output", dest="output", metavar='DIR',
parser.add_argument("--output_prefix", dest="output_prefix", metavar='STRING', help="Output directory",
help="Output prefix") )
parser.add_argument(
"--output_prefix", dest="output_prefix", metavar='STRING',
help="Output prefix",
)
# Icon naming option # Icon naming option
parser.add_argument("--name_style", dest="name_style", metavar='ENUM', type=str, parser.add_argument(
"--name_style", dest="name_style", metavar='ENUM', type=str,
choices=('', 'UI_ICONS'), choices=('', 'UI_ICONS'),
help="The metod used for naming output data") help="The metod used for naming output data",
)
# Options for dicing up the image # Options for dicing up the image
parser.add_argument("--parts_x", dest="parts_x", metavar='INT', type=int, parser.add_argument(
help="Grid X parts") "--parts_x", dest="parts_x", metavar='INT', type=int,
parser.add_argument("--parts_y", dest="parts_y", metavar='INT', type=int, help="Grid X parts",
help="Grid Y parts") )
parser.add_argument(
"--parts_y", dest="parts_y", metavar='INT', type=int,
help="Grid Y parts",
)
_help = "Inset from the outer edge (in pixels)" _help = "Inset from the outer edge (in pixels)"
parser.add_argument("--minx", dest="minx", metavar='INT', type=int, help=_help) parser.add_argument("--minx", dest="minx", metavar='INT', type=int, help=_help)
@@ -287,5 +304,6 @@ def main():
args.spacex_icon, args.spacey_icon, args.spacex_icon, args.spacey_icon,
) )
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -67,5 +67,6 @@ def main():
icondata_to_png(file_src, file_dst) icondata_to_png(file_src, file_dst)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -94,8 +94,10 @@ def check_prefix(prop, btype):
def check_if_changed(a, b): def check_if_changed(a, b):
if a != b: return 'changed' if a != b:
else: return 'same' return 'changed'
else:
return 'same'
def get_props_from_txt(input_filename): def get_props_from_txt(input_filename):
@@ -262,14 +264,19 @@ def write_files(basename, props_list, props_length_max):
# txt # txt
# quick way we can tell if it changed # quick way we can tell if it changed
if props[3] == props[4]: txt += "#" if props[3] == props[4]:
else: txt += " " txt += "#"
else:
txt += " "
if props[0] != '': txt += '%s * ' % props[0] # comment if props[0] != '':
txt += '%s * ' % props[0] # comment
txt += '%s.%s -> %s: %s "%s"\n' % tuple(props[2:5] + props[6:]) # skipping keyword-check txt += '%s.%s -> %s: %s "%s"\n' % tuple(props[2:5] + props[6:]) # skipping keyword-check
# rna_api # rna_api
if props[0] == 'NOTE': indent = '# ' if props[0] == 'NOTE':
else: indent = ' ' indent = '# '
else:
indent = ' '
rna += indent + '("%s", "%s", "%s", "%s", "%s"),\n' % tuple(props[2:5] + props[6:]) # description is already string formatted rna += indent + '("%s", "%s", "%s", "%s", "%s"),\n' % tuple(props[2:5] + props[6:]) # description is already string formatted
# py # py
blanks = [' ' * (x[0] - x[1]) for x in zip(props_length_max, list(map(len, props)))] blanks = [' ' * (x[0] - x[1]) for x in zip(props_length_max, list(map(len, props)))]
@@ -300,7 +307,7 @@ def main():
sort_choices = ['note', 'changed', 'class', 'from', 'to', 'kw', 'class.to'] sort_choices = ['note', 'changed', 'class', 'from', 'to', 'kw', 'class.to']
default_sort_choice = sort_choices[-1] default_sort_choice = sort_choices[-1]
kw_prefixes = [ 'active','apply','bl','exclude','has','invert','is','lock', \ kw_prefixes = ['active', 'apply', 'bl', 'exclude', 'has', 'invert', 'is', 'lock',
'pressed', 'show', 'show_only', 'use', 'use_only', 'layers', 'states', 'select'] 'pressed', 'show', 'show_only', 'use', 'use_only', 'layers', 'states', 'select']
kw = ['active', 'hide', 'invert', 'select', 'layers', 'mute', 'states', 'use', 'lock'] kw = ['active', 'hide', 'invert', 'select', 'layers', 'mute', 'states', 'use', 'lock']

View File

@@ -6,12 +6,13 @@ import sys
Example usage: Example usage:
python3 rna_cleaner_merge.py out_work.py rna_booleans_work.py python3 rna_cleaner_merge.py out_work.py rna_booleans_work.py
''' '''
def main(): def main():
def work_line_id(line): def work_line_id(line):
return line[2].split("|")[-1], line[3] # class/from return line[2].split("|")[-1], line[3] # class/from
if not (sys.argv[-1].endswith(".py") and sys.argv[-2].endswith(".py")): if not (sys.argv[-1].endswith(".py") and sys.argv[-2].endswith(".py")):
print("Only accepts 2 py files as arguments.") print("Only accepts 2 py files as arguments.")
@@ -57,5 +58,6 @@ def main():
write_work_file(file_path, list(mod_from_dict.values())) write_work_file(file_path, list(mod_from_dict.values()))
print("Warning '%s' contains lost %d items from module %s.py" % (file_path, len(mod_from_dict), mod_from.__name__)) print("Warning '%s' contains lost %d items from module %s.py" % (file_path, len(mod_from_dict), mod_from.__name__))
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -129,6 +129,7 @@ def seek(r, txt, recurs):
newtxt = txt + '[' + str(i) + ']' newtxt = txt + '[' + str(i) + ']'
seek(r[i], newtxt, recurs + 1) seek(r[i], newtxt, recurs + 1)
seek(bpy.data, 'bpy.data', 0) seek(bpy.data, 'bpy.data', 0)
# seek(bpy.types, 'bpy.types', 0) # seek(bpy.types, 'bpy.types', 0)
''' '''

View File

@@ -50,8 +50,10 @@ for d in defs.split('\n'):
if not w: if not w:
continue continue
try: w.remove("#define") try:
except: pass w.remove("#define")
except:
pass
# print w # print w

View File

@@ -142,5 +142,6 @@ def main():
else: else:
print("\nnone found!") print("\nnone found!")
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View File

@@ -33,7 +33,6 @@ from modules.test_utils import (with_tempdir,
) )
class AbcPropError(Exception): class AbcPropError(Exception):
"""Raised when AbstractAlembicTest.abcprop() finds an error.""" """Raised when AbstractAlembicTest.abcprop() finds an error."""

View File

@@ -109,7 +109,6 @@ class SimpleImportTest(AbstractAlembicTest):
self.assertAlmostEqual(0, y) self.assertAlmostEqual(0, y)
self.assertAlmostEqual(2, z) self.assertAlmostEqual(2, z)
def test_select_after_import(self): def test_select_after_import(self):
# Add a sphere, so that there is something in the scene, selected, and active, # Add a sphere, so that there is something in the scene, selected, and active,
# before we do the Alembic import. # before we do the Alembic import.

View File

@@ -56,7 +56,8 @@ def addon_modules_sorted():
modules[:] = [ modules[:] = [
mod for mod in modules mod for mod in modules
if not (mod.__file__.startswith(BLACKLIST_DIRS)) if not (mod.__file__.startswith(BLACKLIST_DIRS))
if not (mod.__name__ in BLACKLIST_ADDONS)] if not (mod.__name__ in BLACKLIST_ADDONS)
]
modules.sort(key=lambda mod: mod.__name__) modules.sort(key=lambda mod: mod.__name__)
return modules return modules

View File

@@ -248,6 +248,7 @@ def main():
load_addons() load_addons()
load_modules() load_modules()
if __name__ == "__main__": if __name__ == "__main__":
# So a python error exits(1) # So a python error exits(1)
try: try:

View File

@@ -61,11 +61,11 @@ def render_gl(context, filepath, shade):
ctx_shading_type(context, shade) ctx_shading_type(context, shade)
#~ # stop to inspect! # stop to inspect!
#~ if filepath == "test_cube_shell_solidify_subsurf_wp_wire": # if filepath == "test_cube_shell_solidify_subsurf_wp_wire":
#~ assert(0) # assert(0)
#~ else: # else:
#~ return # return
bpy.ops.render.opengl(write_still=True, bpy.ops.render.opengl(write_still=True,
view_context=True) view_context=True)
@@ -219,6 +219,7 @@ def mesh_bmesh_poly_elems(poly, elems):
vert_total = poly.loop_total vert_total = poly.loop_total
return elems[vert_start:vert_start + vert_total] return elems[vert_start:vert_start + vert_total]
def mesh_bmesh_poly_vertices(poly): def mesh_bmesh_poly_vertices(poly):
return [loop.vertex_index return [loop.vertex_index
for loop in mesh_bmesh_poly_elems(poly, poly.id_data.loops)] for loop in mesh_bmesh_poly_elems(poly, poly.id_data.loops)]
@@ -678,55 +679,73 @@ def make_monkey_extra(scene):
global_tests = [] global_tests = []
global_tests.append(("none", global_tests.append(
("none",
(), (),
)) )
)
# single # single
global_tests.append(("subsurf_single", global_tests.append(
("subsurf_single",
((modifier_subsurf_add, dict(levels=2)), ), ((modifier_subsurf_add, dict(levels=2)), ),
)) )
)
global_tests.append(
global_tests.append(("armature_single", ("armature_single",
((modifier_armature_add, dict()), ), ((modifier_armature_add, dict()), ),
)) )
)
global_tests.append(
global_tests.append(("mirror_single", ("mirror_single",
((modifier_mirror_add, dict()), ), ((modifier_mirror_add, dict()), ),
)) )
)
global_tests.append(("hook_single", global_tests.append(
("hook_single",
((modifier_hook_add, dict()), ), ((modifier_hook_add, dict()), ),
)) )
)
global_tests.append(("decimate_single", global_tests.append(
("decimate_single",
((modifier_decimate_add, dict()), ), ((modifier_decimate_add, dict()), ),
)) )
)
global_tests.append(("build_single", global_tests.append(
("build_single",
((modifier_build_add, dict()), ), ((modifier_build_add, dict()), ),
)) )
)
global_tests.append(("mask_single", global_tests.append(
("mask_single",
((modifier_mask_add, dict()), ), ((modifier_mask_add, dict()), ),
)) )
)
# combinations # combinations
global_tests.append(("mirror_subsurf", global_tests.append(
("mirror_subsurf",
((modifier_mirror_add, dict()), ((modifier_mirror_add, dict()),
(modifier_subsurf_add, dict(levels=2))), (modifier_subsurf_add, dict(levels=2))),
)) )
)
global_tests.append(("solidify_subsurf", global_tests.append(
("solidify_subsurf",
((modifier_solidify_add, dict()), ((modifier_solidify_add, dict()),
(modifier_subsurf_add, dict(levels=2))), (modifier_subsurf_add, dict(levels=2))),
)) )
)
def apply_test(test, scene, obj, def apply_test(
test, scene, obj,
render_func=None, render_func=None,
render_args=None, render_args=None,
render_kwargs=None, render_kwargs=None,
@@ -756,10 +775,12 @@ def test_cube(context, test):
obj = make_cube_extra(scene) obj = make_cube_extra(scene)
ctx_camera_setup(context, location=(3, 3, 3)) ctx_camera_setup(context, location=(3, 3, 3))
apply_test(test, scene, obj, apply_test(
test, scene, obj,
render_func=render_gl_all_modes, render_func=render_gl_all_modes,
render_args=(context, obj), render_args=(context, obj),
render_kwargs=dict(filepath=whoami())) render_kwargs=dict(filepath=whoami())
)
def test_cube_like(context, test): def test_cube_like(context, test):
@@ -767,10 +788,12 @@ def test_cube_like(context, test):
obj = make_cube_like_extra(scene) obj = make_cube_like_extra(scene)
ctx_camera_setup(context, location=(5, 5, 5)) ctx_camera_setup(context, location=(5, 5, 5))
apply_test(test, scene, obj, apply_test(
test, scene, obj,
render_func=render_gl_all_modes, render_func=render_gl_all_modes,
render_args=(context, obj), render_args=(context, obj),
render_kwargs=dict(filepath=whoami())) render_kwargs=dict(filepath=whoami())
)
def test_cube_shell(context, test): def test_cube_shell(context, test):
@@ -778,10 +801,12 @@ def test_cube_shell(context, test):
obj = make_cube_shell_extra(scene) obj = make_cube_shell_extra(scene)
ctx_camera_setup(context, location=(4, 4, 4)) ctx_camera_setup(context, location=(4, 4, 4))
apply_test(test, scene, obj, apply_test(
test, scene, obj,
render_func=render_gl_all_modes, render_func=render_gl_all_modes,
render_args=(context, obj), render_args=(context, obj),
render_kwargs=dict(filepath=whoami())) render_kwargs=dict(filepath=whoami())
)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------

View File

@@ -5,11 +5,12 @@ import unittest
from bpy.utils import units from bpy.utils import units
class UnitsTesting(unittest.TestCase): class UnitsTesting(unittest.TestCase):
# From user typing to 'internal' Blender value. # From user typing to 'internal' Blender value.
INPUT_TESTS = ( INPUT_TESTS = (
# system, type, ref, input, value # system, type, ref, input, value
##### LENGTH # LENGTH
('IMPERIAL', 'LENGTH', "", "1ft", 0.3048), ('IMPERIAL', 'LENGTH', "", "1ft", 0.3048),
('IMPERIAL', 'LENGTH', "", "(1+1)ft", 0.3048 * 2), ('IMPERIAL', 'LENGTH', "", "(1+1)ft", 0.3048 * 2),
('IMPERIAL', 'LENGTH', "", "1mi4\"", 1609.344 + 0.0254 * 4), ('IMPERIAL', 'LENGTH', "", "1mi4\"", 1609.344 + 0.0254 * 4),
@@ -31,7 +32,7 @@ class UnitsTesting(unittest.TestCase):
# From 'internal' Blender value to user-friendly printing # From 'internal' Blender value to user-friendly printing
OUTPUT_TESTS = ( OUTPUT_TESTS = (
# system, type, prec, sep, compat, value, output # system, type, prec, sep, compat, value, output
##### LENGTH # LENGTH
# Note: precision handling is a bit complicated when using multi-units... # Note: precision handling is a bit complicated when using multi-units...
('IMPERIAL', 'LENGTH', 3, False, False, 0.3048, "1'"), ('IMPERIAL', 'LENGTH', 3, False, False, 0.3048, "1'"),
('IMPERIAL', 'LENGTH', 3, False, True, 0.3048, "1ft"), ('IMPERIAL', 'LENGTH', 3, False, True, 0.3048, "1ft"),
@@ -63,9 +64,13 @@ class UnitsTesting(unittest.TestCase):
def test_units_outputs(self): def test_units_outputs(self):
for usys, utype, prec, sep, compat, val, output in self.OUTPUT_TESTS: for usys, utype, prec, sep, compat, val, output in self.OUTPUT_TESTS:
opt_str = units.to_string(usys, utype, val, prec, sep, compat) opt_str = units.to_string(usys, utype, val, prec, sep, compat)
self.assertEqual(opt_str, output, self.assertEqual(
msg="%s, %s: %f (precision: %d, separate units: %d, compat units: %d) => " opt_str, output,
"\"%s\", expected \"%s\"" % (usys, utype, val, prec, sep, compat, opt_str, output)) msg=(
"%s, %s: %f (precision: %d, separate units: %d, compat units: %d) => "
"\"%s\", expected \"%s\""
) % (usys, utype, val, prec, sep, compat, opt_str, output)
)
if __name__ == '__main__': if __name__ == '__main__':

View File

@@ -198,6 +198,7 @@ class TestBufferProtocol(TestHelper, unittest.TestCase):
self.assertEqual(list(view1), list(view2)) self.assertEqual(list(view1), list(view2))
self.assertEqual(view1.tobytes(), view2.tobytes()) self.assertEqual(view1.tobytes(), view2.tobytes())
if __name__ == '__main__': if __name__ == '__main__':
import sys import sys
sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []) sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [])

View File

@@ -61,8 +61,10 @@ class TestClass(bpy.types.PropertyGroup):
def get_scene(lib_name, sce_name): def get_scene(lib_name, sce_name):
for s in bpy.data.scenes: for s in bpy.data.scenes:
if s.name == sce_name: if s.name == sce_name:
if (s.library and s.library.name == lib_name) or \ if (
(lib_name == None and s.library == None): (s.library and s.library.name == lib_name) or
(lib_name is None and s.library is None)
):
return s return s
@@ -309,6 +311,7 @@ def test_restrictions2():
class TestUIList(UIList): class TestUIList(UIList):
test = bpy.props.PointerProperty(type=bpy.types.Object) test = bpy.props.PointerProperty(type=bpy.types.Object)
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
layout.prop(item, "name", text="", emboss=False, icon_value=icon) layout.prop(item, "name", text="", emboss=False, icon_value=icon)

View File

@@ -372,7 +372,6 @@ class KDTreeTesting(unittest.TestCase):
ret_filter = k_all.find(co, lambda i: (i % 2) == 0) ret_filter = k_all.find(co, lambda i: (i % 2) == 0)
self.assertAlmostEqualVector(ret_regular, ret_filter) self.assertAlmostEqualVector(ret_regular, ret_filter)
# filter out all values (search odd tree for even values and the reverse) # filter out all values (search odd tree for even values and the reverse)
co = (0,) * 3 co = (0,) * 3
ret_filter = k_odd.find(co, lambda i: (i % 2) == 0) ret_filter = k_odd.find(co, lambda i: (i % 2) == 0)

View File

@@ -142,5 +142,6 @@ def main():
print("Error (total): %d" % GLOBALS["error_num"]) print("Error (total): %d" % GLOBALS["error_num"])
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -155,5 +155,6 @@ def main():
test_language_coverage() test_language_coverage()
test_urls() test_urls()
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -114,6 +114,7 @@ def blend_list(mainpath):
return list(sorted(file_list(mainpath, is_blend))) return list(sorted(file_list(mainpath, is_blend)))
if USE_FILES: if USE_FILES:
USE_FILES_LS = blend_list(USE_FILES) USE_FILES_LS = blend_list(USE_FILES)
# print(USE_FILES_LS) # print(USE_FILES_LS)
@@ -480,6 +481,7 @@ def main():
print("Finished %r" % __file__) print("Finished %r" % __file__)
if __name__ == "__main__": if __name__ == "__main__":
# ~ for i in range(200): # ~ for i in range(200):
# ~ RANDOM_SEED[0] += 1 # ~ RANDOM_SEED[0] += 1

View File

@@ -31,6 +31,7 @@ import difflib
import pathlib import pathlib
from pathlib import Path from pathlib import Path
def with_tempdir(wrapped): def with_tempdir(wrapped):
"""Creates a temporary directory for the function, cleaning up after it returns normally. """Creates a temporary directory for the function, cleaning up after it returns normally.
@@ -56,8 +57,10 @@ def with_tempdir(wrapped):
return decorator return decorator
LINE = "+----------------------------------------------------------------" LINE = "+----------------------------------------------------------------"
class AbstractColladaTest(unittest.TestCase): class AbstractColladaTest(unittest.TestCase):
@classmethod @classmethod
@@ -75,7 +78,7 @@ class AbstractColladaTest(unittest.TestCase):
ref.close() ref.close()
exp.close() exp.close()
diff_count = 0; diff_count = 0
for line in diff: for line in diff:
error = True error = True
for prefix in ('---', '+++', '@@'): for prefix in ('---', '+++', '@@'):
@@ -107,6 +110,7 @@ class AbstractColladaTest(unittest.TestCase):
return diff_count == 0 return diff_count == 0
class MeshExportTest4(AbstractColladaTest): class MeshExportTest4(AbstractColladaTest):
@with_tempdir @with_tempdir
def test_export_animation_suzannes_sample_matrix(self, tempdir: pathlib.Path): def test_export_animation_suzannes_sample_matrix(self, tempdir: pathlib.Path):
@@ -114,7 +118,8 @@ class MeshExportTest4(AbstractColladaTest):
reference_dae = self.testdir / Path("%s.dae" % test) reference_dae = self.testdir / Path("%s.dae" % test)
outfile = tempdir / Path("%s_out.dae" % test) outfile = tempdir / Path("%s_out.dae" % test)
bpy.ops.wm.collada_export(filepath="%s" % str(outfile), bpy.ops.wm.collada_export(
filepath="%s" % str(outfile),
check_existing=True, check_existing=True,
filemode=8, filemode=8,
display_type='DEFAULT', display_type='DEFAULT',
@@ -142,12 +147,14 @@ class MeshExportTest4(AbstractColladaTest):
export_texture_type_selection='mat', export_texture_type_selection='mat',
open_sim=False, open_sim=False,
limit_precision=True, limit_precision=True,
keep_bind_info=False) keep_bind_info=False,
)
# Now check the resulting Collada file. # Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile): if not self.checkdae(reference_dae, outfile):
self.fail() self.fail()
class MeshExportTest3(AbstractColladaTest): class MeshExportTest3(AbstractColladaTest):
@with_tempdir @with_tempdir
def test_export_animation_suzannes_sample_locrotscale(self, tempdir: pathlib.Path): def test_export_animation_suzannes_sample_locrotscale(self, tempdir: pathlib.Path):
@@ -155,7 +162,8 @@ class MeshExportTest3(AbstractColladaTest):
reference_dae = self.testdir / Path("%s.dae" % test) reference_dae = self.testdir / Path("%s.dae" % test)
outfile = tempdir / Path("%s_out.dae" % test) outfile = tempdir / Path("%s_out.dae" % test)
bpy.ops.wm.collada_export(filepath="%s" % str(outfile), bpy.ops.wm.collada_export(
filepath="%s" % str(outfile),
check_existing=True, check_existing=True,
filemode=8, filemode=8,
display_type='DEFAULT', display_type='DEFAULT',
@@ -183,12 +191,14 @@ class MeshExportTest3(AbstractColladaTest):
export_texture_type_selection='mat', export_texture_type_selection='mat',
open_sim=False, open_sim=False,
limit_precision=True, limit_precision=True,
keep_bind_info=False) keep_bind_info=False,
)
# Now check the resulting Collada file. # Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile): if not self.checkdae(reference_dae, outfile):
self.fail() self.fail()
class MeshExportTest2(AbstractColladaTest): class MeshExportTest2(AbstractColladaTest):
@with_tempdir @with_tempdir
def test_export_animation_suzannes_keyframe_matrix(self, tempdir: pathlib.Path): def test_export_animation_suzannes_keyframe_matrix(self, tempdir: pathlib.Path):
@@ -196,7 +206,8 @@ class MeshExportTest2(AbstractColladaTest):
reference_dae = self.testdir / Path("%s.dae" % test) reference_dae = self.testdir / Path("%s.dae" % test)
outfile = tempdir / Path("%s_out.dae" % test) outfile = tempdir / Path("%s_out.dae" % test)
bpy.ops.wm.collada_export(filepath="%s" % str(outfile), bpy.ops.wm.collada_export(
filepath="%s" % str(outfile),
check_existing=True, check_existing=True,
filemode=8, filemode=8,
display_type='DEFAULT', display_type='DEFAULT',
@@ -224,12 +235,14 @@ class MeshExportTest2(AbstractColladaTest):
export_texture_type_selection='mat', export_texture_type_selection='mat',
open_sim=False, open_sim=False,
limit_precision=True, limit_precision=True,
keep_bind_info=False) keep_bind_info=False,
)
# Now check the resulting Collada file. # Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile): if not self.checkdae(reference_dae, outfile):
self.fail() self.fail()
class MeshExportTest1(AbstractColladaTest): class MeshExportTest1(AbstractColladaTest):
@with_tempdir @with_tempdir
def test_export_animation_suzannes_keyframe_locrotscale(self, tempdir: pathlib.Path): def test_export_animation_suzannes_keyframe_locrotscale(self, tempdir: pathlib.Path):
@@ -237,7 +250,8 @@ class MeshExportTest1(AbstractColladaTest):
reference_dae = self.testdir / Path("%s.dae" % test) reference_dae = self.testdir / Path("%s.dae" % test)
outfile = tempdir / Path("%s_out.dae" % test) outfile = tempdir / Path("%s_out.dae" % test)
bpy.ops.wm.collada_export(filepath="%s" % str(outfile), bpy.ops.wm.collada_export(
filepath="%s" % str(outfile),
check_existing=True, check_existing=True,
filemode=8, filemode=8,
display_type='DEFAULT', display_type='DEFAULT',
@@ -265,7 +279,8 @@ class MeshExportTest1(AbstractColladaTest):
export_texture_type_selection='mat', export_texture_type_selection='mat',
open_sim=False, open_sim=False,
limit_precision=True, limit_precision=True,
keep_bind_info=False) keep_bind_info=False,
)
# Now check the resulting Collada file. # Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile): if not self.checkdae(reference_dae, outfile):

View File

@@ -31,6 +31,7 @@ import difflib
import pathlib import pathlib
from pathlib import Path from pathlib import Path
def with_tempdir(wrapped): def with_tempdir(wrapped):
"""Creates a temporary directory for the function, cleaning up after it returns normally. """Creates a temporary directory for the function, cleaning up after it returns normally.
@@ -56,8 +57,10 @@ def with_tempdir(wrapped):
return decorator return decorator
LINE = "+----------------------------------------------------------------" LINE = "+----------------------------------------------------------------"
class AbstractColladaTest(unittest.TestCase): class AbstractColladaTest(unittest.TestCase):
@classmethod @classmethod
@@ -75,7 +78,7 @@ class AbstractColladaTest(unittest.TestCase):
ref.close() ref.close()
exp.close() exp.close()
diff_count = 0; diff_count = 0
for line in diff: for line in diff:
error = True error = True
for prefix in ('---', '+++', '@@'): for prefix in ('---', '+++', '@@'):
@@ -107,6 +110,7 @@ class AbstractColladaTest(unittest.TestCase):
return diff_count == 0 return diff_count == 0
class MeshExportTest(AbstractColladaTest): class MeshExportTest(AbstractColladaTest):
@with_tempdir @with_tempdir
def test_export_single_mesh(self, tempdir: pathlib.Path): def test_export_single_mesh(self, tempdir: pathlib.Path):
@@ -114,7 +118,8 @@ class MeshExportTest(AbstractColladaTest):
reference_dae = self.testdir / Path("%s.dae" % test) reference_dae = self.testdir / Path("%s.dae" % test)
outfile = tempdir / Path("%s_out.dae" % test) outfile = tempdir / Path("%s_out.dae" % test)
bpy.ops.wm.collada_export(filepath="%s" % str(outfile), bpy.ops.wm.collada_export(
filepath="%s" % str(outfile),
check_existing=True, check_existing=True,
filemode=8, filemode=8,
display_type="DEFAULT", display_type="DEFAULT",
@@ -140,12 +145,14 @@ class MeshExportTest(AbstractColladaTest):
export_texture_type_selection="mat", export_texture_type_selection="mat",
open_sim=False, open_sim=False,
limit_precision=False, limit_precision=False,
keep_bind_info=False) keep_bind_info=False,
)
# Now check the resulting Collada file. # Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile): if not self.checkdae(reference_dae, outfile):
self.fail() self.fail()
if __name__ == '__main__': if __name__ == '__main__':
sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []) sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [])
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()

View File

@@ -23,6 +23,7 @@ class COLORS_DUMMY:
GREEN = '' GREEN = ''
ENDC = '' ENDC = ''
COLORS = COLORS_DUMMY COLORS = COLORS_DUMMY
@@ -55,10 +56,12 @@ def blend_list(dirpath):
filepath = os.path.join(dirpath, filename) filepath = os.path.join(dirpath, filename)
yield filepath yield filepath
def test_get_name(filepath): def test_get_name(filepath):
filename = os.path.basename(filepath) filename = os.path.basename(filepath)
return os.path.splitext(filename)[0] return os.path.splitext(filename)[0]
def test_get_images(output_dir, filepath, reference_dir): def test_get_images(output_dir, filepath, reference_dir):
testname = test_get_name(filepath) testname = test_get_name(filepath)
dirpath = os.path.dirname(filepath) dirpath = os.path.dirname(filepath)
@@ -307,7 +310,6 @@ class Report:
self.compare_tests += test_html self.compare_tests += test_html
def _diff_output(self, filepath, tmp_filepath): def _diff_output(self, filepath, tmp_filepath):
old_img, ref_img, new_img, diff_img = test_get_images(self.output_dir, filepath, self.reference_dir) old_img, ref_img, new_img, diff_img = test_get_images(self.output_dir, filepath, self.reference_dir)
@@ -367,7 +369,6 @@ class Report:
return not failed return not failed
def _run_test(self, filepath, render_cb): def _run_test(self, filepath, render_cb):
testname = test_get_name(filepath) testname = test_get_name(filepath)
print_message(testname, 'SUCCESS', 'RUN') print_message(testname, 'SUCCESS', 'RUN')
@@ -404,7 +405,6 @@ class Report:
'FAILURE', 'FAILED') 'FAILURE', 'FAILED')
return error return error
def _run_all_tests(self, dirname, dirpath, render_cb): def _run_all_tests(self, dirname, dirpath, render_cb):
passed_tests = [] passed_tests = []
failed_tests = [] failed_tests = []

View File

@@ -62,7 +62,6 @@ class AbstractBlenderRunnerTest(unittest.TestCase):
blender: pathlib.Path = None blender: pathlib.Path = None
testdir: pathlib.Path = None testdir: pathlib.Path = None
def run_blender(self, filepath: str, python_script: str, timeout: int=300) -> str: def run_blender(self, filepath: str, python_script: str, timeout: int=300) -> str:
"""Runs Blender by opening a blendfile and executing a script. """Runs Blender by opening a blendfile and executing a script.

View File

@@ -8,6 +8,7 @@ import shutil
import subprocess import subprocess
import sys import sys
def screenshot(): def screenshot():
import bpy import bpy
@@ -19,6 +20,7 @@ def screenshot():
bpy.ops.wm.quit_blender() bpy.ops.wm.quit_blender()
# When run from inside Blender, take screenshot and exit. # When run from inside Blender, take screenshot and exit.
try: try:
import bpy import bpy
@@ -93,5 +95,6 @@ def main():
sys.exit(not ok) sys.exit(not ok)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -204,6 +204,5 @@ def main():
print("Skipping pylint checks (command not found)") print("Skipping pylint checks (command not found)")
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -12,6 +12,7 @@ test= bpy.data.test
# same as above for other types except that the first letter is "i" for int and "b" for bool # same as above for other types except that the first letter is "i" for int and "b" for bool
class TestArray(unittest.TestCase): class TestArray(unittest.TestCase):
# test that assignment works by: assign -> test value # test that assignment works by: assign -> test value
# - rvalue = list of float # - rvalue = list of float
@@ -181,7 +182,6 @@ class TestMArray(unittest.TestCase):
arr[i][j] = rval arr[i][j] = rval
self.assertEqual(prop_to_list(arr[i][j]), rval) self.assertEqual(prop_to_list(arr[i][j]), rval)
def test_assign_item_fail(self): def test_assign_item_fail(self):
def assign_wrong_size(arr, i, rval): def assign_wrong_size(arr, i, rval):
getattr(test, arr)[i] = rval getattr(test, arr)[i] = rval
@@ -212,8 +212,8 @@ class TestMArray(unittest.TestCase):
setattr(test, arr, rval) setattr(test, arr, rval)
self.assertEqual(prop_to_list(getattr(test, arr)), rval) self.assertEqual(prop_to_list(getattr(test, arr)), rval)
# test access # test access
def test_access(self): def test_access(self):
pass pass
@@ -221,17 +221,22 @@ class TestMArray(unittest.TestCase):
def test_access_fail(self): def test_access_fail(self):
pass pass
random.seed() random.seed()
def rand_int(): def rand_int():
return random.randint(-1000, 1000) return random.randint(-1000, 1000)
def rand_float(): def rand_float():
return float(rand_int()) return float(rand_int())
def rand_bool(): def rand_bool():
return bool(random.randint(0, 1)) return bool(random.randint(0, 1))
def make_random_array(len, rand_func): def make_random_array(len, rand_func):
arr = [] arr = []
for i in range(len): for i in range(len):
@@ -239,6 +244,7 @@ def make_random_array(len, rand_func):
return arr return arr
def make_random_2d_array(dimsize, rand_func): def make_random_2d_array(dimsize, rand_func):
marr = [] marr = []
for i in range(dimsize[0]): for i in range(dimsize[0]):
@@ -249,6 +255,7 @@ def make_random_2d_array(dimsize, rand_func):
return marr return marr
def make_random_3d_array(dimsize, rand_func): def make_random_3d_array(dimsize, rand_func):
marr = [] marr = []
for i in range(dimsize[0]): for i in range(dimsize[0]):
@@ -262,6 +269,7 @@ def make_random_3d_array(dimsize, rand_func):
return marr return marr
def prop_to_list(prop): def prop_to_list(prop):
ret = [] ret = []
@@ -273,8 +281,10 @@ def prop_to_list(prop):
return ret return ret
def suite(): def suite():
return unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(TestArray), unittest.TestLoader().loadTestsFromTestCase(TestMArray)]) return unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(TestArray), unittest.TestLoader().loadTestsFromTestCase(TestMArray)])
if __name__ == "__main__": if __name__ == "__main__":
unittest.TextTestRunner(verbosity=2).run(suite()) unittest.TextTestRunner(verbosity=2).run(suite())