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

View File

@@ -42,6 +42,7 @@ def man_format(data):
data = data.replace("\t", " ")
return data
if len(sys.argv) != 3:
import getopt
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:
rna_info_BuildRNAInfo_cache.ret = rna_info.BuildRNAInfo()
return rna_info_BuildRNAInfo_cache.ret
rna_info_BuildRNAInfo_cache.ret = None
# --- end rna_info cache
@@ -516,6 +518,8 @@ def escape_rst(text):
""" Escape plain text which may contain characters used by RST.
"""
return text.translate(escape_rst.trans)
escape_rst.trans = str.maketrans({
"`": "\\`",
"|": "\\|",
@@ -1018,6 +1022,7 @@ def pymodule2sphinx(basepath, module_name, module, title):
file.close()
# Changes in Blender will force errors here
context_type_map = {
"active_base": ("ObjectBase", False),

View File

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

View File

@@ -172,6 +172,7 @@ def ui_draw_filter_register(
class Wrapper(cls_real):
__slots__ = ()
def __getattribute__(self, attr):
if attr == "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!
def main():
import argparse
parser = argparse.ArgumentParser(description=
parser = argparse.ArgumentParser(
description=(
"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 "
"wins, unless its marked as fuzzy and one later is not.\n"
"The fuzzy flag is removed if necessary.\n"
"All other comments are never modified.\n"
"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('-r', '--replace', action="store_true",
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):
print("%d %d %s" % value)
if __name__ == '__main__':
main()

View File

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

View File

@@ -183,6 +183,8 @@ def clean_name(name, replace="_"):
trans = maketrans_init()
return name.translate(trans)
clean_name._trans_cache = {}
@@ -223,6 +225,7 @@ def display_name(name):
name = _clean_utf8(name)
return name
def display_name_to_filepath(name):
"""
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(
name="Forward",
items=(('X', "X Forward", ""),
items=(
('X', "X Forward", ""),
('Y', "Y Forward", ""),
('Z', "Z Forward", ""),
('-X', "-X Forward", ""),
@@ -160,7 +161,8 @@ def orientation_helper_factory(name, axis_forward='Y', axis_up='Z'):
members['axis_up'] = EnumProperty(
name="Up",
items=(('X', "X Up", ""),
items=(
('X', "X Up", ""),
('Y', "Y Up", ""),
('Z', "Z Up", ""),
('-X', "-X Up", ""),
@@ -394,7 +396,8 @@ def unpack_face_list(list_of_tuples):
path_reference_mode = EnumProperty(
name="Path Mode",
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"),
('RELATIVE', "Relative", "Always write relative paths "
"(where possible)"),

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -174,7 +174,7 @@ def draw_kmi(display_keymaps, kc, km, kmi, layout, level):
sub.prop(kmi, "propvalue", text="")
else:
# 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="")
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)
layout.context_pointer_set("keymap", km)
_EVENT_TYPES = set()
_EVENT_TYPE_MAP = {}
_EVENT_TYPE_MAP_EXTRA = {}
@@ -260,8 +261,8 @@ def draw_filtered(display_keymaps, filter_type, filter_text, layout):
kmi_test_type = []
# initialize? - so if a if a kmi has a MOD assigned it wont show up.
#~ for kv in key_mod.values():
#~ kmi_test_dict[kv] = {False}
# for kv in key_mod.values():
# kmi_test_dict[kv] = {False}
# altname: attr
for kk, kv in key_mod.items():
@@ -374,7 +375,7 @@ def draw_keymaps(context, layout):
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)
if not text:
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='ZOOMOUT').remove_active = True
#~ layout.context_pointer_set("keyconfig", wm.keyconfigs.active)
#~ row.operator("wm.keyconfig_remove", text="", icon='X')
# layout.context_pointer_set("keyconfig", wm.keyconfigs.active)
# row.operator("wm.keyconfig_remove", text="", icon='X')
row.separator()
rowsub = row.split(align=True, percentage=0.33)
# 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)
ele_pair_next_uuid_test = [
(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:
ele_pair_next_uuid = ele_pair_next_uuid_test
elif len(ele_pair_next_uuid_test) == 1:

View File

@@ -527,6 +527,8 @@ class BUILTIN_KSI_WholeCharacter(KeyingSetInfo):
ksi.addProp(ks, bone, prop)
# All properties that are likely to get animated in a character rig, only selected bones.
class BUILTIN_KSI_WholeCharacterSelected(KeyingSetInfo):
"""Insert a keyframe for all properties that are likely to get animated in a character rig """
"""(only selected bones)"""
@@ -557,6 +559,8 @@ class BUILTIN_KSI_WholeCharacterSelected(KeyingSetInfo):
###############################
# Delta Location
class BUILTIN_KSI_DeltaLocation(KeyingSetInfo):
"""Insert keyframes for additional location offset"""
bl_label = "Delta Location"
@@ -643,6 +647,7 @@ class BUILTIN_KSI_DeltaScale(KeyingSetInfo):
###############################
# 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.
# See also T51867.

View File

@@ -61,6 +61,7 @@ def group_tools_draw(self, layout, context):
layout.operator("node.group_ungroup")
layout.separator()
# maps node tree type to group node type
node_tree_group_type = {
'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:
f.write(struct.pack('<6I',
f.write(
struct.pack(
'<6I',
sub_w, sub_h,
sub_x, sub_y,
# 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 = {}
def dice_icon_name(x, y, parts_x, parts_y,
def dice_icon_name(
x, y, parts_x, parts_y,
name_style=None, prefix=""):
"""
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
def dice(filepath, output, output_prefix, name_style,
def dice(
filepath, output, output_prefix, name_style,
parts_x, parts_y,
minx, miny, maxx, maxy,
minx_icon, miny_icon, maxx_icon, maxy_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,
spacex_icon, spacey_icon) == 0)
@@ -199,9 +204,11 @@ def dice(filepath, output, output_prefix, name_style,
for x in range(parts_x):
for y in range(parts_y):
id_str = dice_icon_name(x, y,
id_str = dice_icon_name(
x, 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)
if VERBOSE:
print(" writing:", filepath)
@@ -235,25 +242,35 @@ def main():
parser = argparse.ArgumentParser(description=__doc__, epilog=epilog)
# File path options
parser.add_argument("--image", dest="image", metavar='FILE',
help="Image file")
parser.add_argument("--output", dest="output", metavar='DIR',
help="Output directory")
parser.add_argument("--output_prefix", dest="output_prefix", metavar='STRING',
help="Output prefix")
parser.add_argument(
"--image", dest="image", metavar='FILE',
help="Image file",
)
parser.add_argument(
"--output", dest="output", metavar='DIR',
help="Output directory",
)
parser.add_argument(
"--output_prefix", dest="output_prefix", metavar='STRING',
help="Output prefix",
)
# 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'),
help="The metod used for naming output data")
help="The metod used for naming output data",
)
# Options for dicing up the image
parser.add_argument("--parts_x", dest="parts_x", metavar='INT', type=int,
help="Grid X parts")
parser.add_argument("--parts_y", dest="parts_y", metavar='INT', type=int,
help="Grid Y parts")
parser.add_argument(
"--parts_x", dest="parts_x", metavar='INT', type=int,
help="Grid X 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)"
parser.add_argument("--minx", dest="minx", metavar='INT', type=int, help=_help)
@@ -287,5 +304,6 @@ def main():
args.spacex_icon, args.spacey_icon,
)
if __name__ == "__main__":
main()

View File

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

View File

@@ -94,8 +94,10 @@ def check_prefix(prop, btype):
def check_if_changed(a, b):
if a != b: return 'changed'
else: return 'same'
if a != b:
return 'changed'
else:
return 'same'
def get_props_from_txt(input_filename):
@@ -262,14 +264,19 @@ def write_files(basename, props_list, props_length_max):
# txt
# quick way we can tell if it changed
if props[3] == props[4]: txt += "#"
else: txt += " "
if props[3] == props[4]:
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
# rna_api
if props[0] == 'NOTE': indent = '# '
else: indent = ' '
if props[0] == 'NOTE':
indent = '# '
else:
indent = ' '
rna += indent + '("%s", "%s", "%s", "%s", "%s"),\n' % tuple(props[2:5] + props[6:]) # description is already string formatted
# py
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']
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']
kw = ['active', 'hide', 'invert', 'select', 'layers', 'mute', 'states', 'use', 'lock']

View File

@@ -6,12 +6,13 @@ import sys
Example usage:
python3 rna_cleaner_merge.py out_work.py rna_booleans_work.py
'''
def main():
def work_line_id(line):
return line[2].split("|")[-1], line[3] # class/from
if not (sys.argv[-1].endswith(".py") and sys.argv[-2].endswith(".py")):
print("Only accepts 2 py files as arguments.")
@@ -57,5 +58,6 @@ def main():
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__))
if __name__ == "__main__":
main()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -56,7 +56,8 @@ def addon_modules_sorted():
modules[:] = [
mod for mod in modules
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__)
return modules

View File

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

View File

@@ -61,11 +61,11 @@ def render_gl(context, filepath, shade):
ctx_shading_type(context, shade)
#~ # stop to inspect!
#~ if filepath == "test_cube_shell_solidify_subsurf_wp_wire":
#~ assert(0)
#~ else:
#~ return
# stop to inspect!
# if filepath == "test_cube_shell_solidify_subsurf_wp_wire":
# assert(0)
# else:
# return
bpy.ops.render.opengl(write_still=True,
view_context=True)
@@ -219,6 +219,7 @@ def mesh_bmesh_poly_elems(poly, elems):
vert_total = poly.loop_total
return elems[vert_start:vert_start + vert_total]
def mesh_bmesh_poly_vertices(poly):
return [loop.vertex_index
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.append(("none",
global_tests.append(
("none",
(),
))
)
)
# single
global_tests.append(("subsurf_single",
global_tests.append(
("subsurf_single",
((modifier_subsurf_add, dict(levels=2)), ),
))
)
)
global_tests.append(("armature_single",
global_tests.append(
("armature_single",
((modifier_armature_add, dict()), ),
))
)
)
global_tests.append(("mirror_single",
global_tests.append(
("mirror_single",
((modifier_mirror_add, dict()), ),
))
)
)
global_tests.append(("hook_single",
global_tests.append(
("hook_single",
((modifier_hook_add, dict()), ),
))
)
)
global_tests.append(("decimate_single",
global_tests.append(
("decimate_single",
((modifier_decimate_add, dict()), ),
))
)
)
global_tests.append(("build_single",
global_tests.append(
("build_single",
((modifier_build_add, dict()), ),
))
)
)
global_tests.append(("mask_single",
global_tests.append(
("mask_single",
((modifier_mask_add, dict()), ),
))
)
)
# combinations
global_tests.append(("mirror_subsurf",
global_tests.append(
("mirror_subsurf",
((modifier_mirror_add, dict()),
(modifier_subsurf_add, dict(levels=2))),
))
)
)
global_tests.append(("solidify_subsurf",
global_tests.append(
("solidify_subsurf",
((modifier_solidify_add, dict()),
(modifier_subsurf_add, dict(levels=2))),
))
)
)
def apply_test(test, scene, obj,
def apply_test(
test, scene, obj,
render_func=None,
render_args=None,
render_kwargs=None,
@@ -756,10 +775,12 @@ def test_cube(context, test):
obj = make_cube_extra(scene)
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_args=(context, obj),
render_kwargs=dict(filepath=whoami()))
render_kwargs=dict(filepath=whoami())
)
def test_cube_like(context, test):
@@ -767,10 +788,12 @@ def test_cube_like(context, test):
obj = make_cube_like_extra(scene)
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_args=(context, obj),
render_kwargs=dict(filepath=whoami()))
render_kwargs=dict(filepath=whoami())
)
def test_cube_shell(context, test):
@@ -778,10 +801,12 @@ def test_cube_shell(context, test):
obj = make_cube_shell_extra(scene)
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_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
class UnitsTesting(unittest.TestCase):
# From user typing to 'internal' Blender value.
INPUT_TESTS = (
# system, type, ref, input, value
##### LENGTH
# LENGTH
('IMPERIAL', 'LENGTH', "", "1ft", 0.3048),
('IMPERIAL', 'LENGTH', "", "(1+1)ft", 0.3048 * 2),
('IMPERIAL', 'LENGTH', "", "1mi4\"", 1609.344 + 0.0254 * 4),
@@ -31,7 +32,7 @@ class UnitsTesting(unittest.TestCase):
# From 'internal' Blender value to user-friendly printing
OUTPUT_TESTS = (
# system, type, prec, sep, compat, value, output
##### LENGTH
# LENGTH
# Note: precision handling is a bit complicated when using multi-units...
('IMPERIAL', 'LENGTH', 3, False, False, 0.3048, "1'"),
('IMPERIAL', 'LENGTH', 3, False, True, 0.3048, "1ft"),
@@ -63,9 +64,13 @@ class UnitsTesting(unittest.TestCase):
def test_units_outputs(self):
for usys, utype, prec, sep, compat, val, output in self.OUTPUT_TESTS:
opt_str = units.to_string(usys, utype, val, prec, sep, compat)
self.assertEqual(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))
self.assertEqual(
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__':

View File

@@ -198,6 +198,7 @@ class TestBufferProtocol(TestHelper, unittest.TestCase):
self.assertEqual(list(view1), list(view2))
self.assertEqual(view1.tobytes(), view2.tobytes())
if __name__ == '__main__':
import sys
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):
for s in bpy.data.scenes:
if s.name == sce_name:
if (s.library and s.library.name == lib_name) or \
(lib_name == None and s.library == None):
if (
(s.library and s.library.name == lib_name) or
(lib_name is None and s.library is None)
):
return s
@@ -309,6 +311,7 @@ def test_restrictions2():
class TestUIList(UIList):
test = bpy.props.PointerProperty(type=bpy.types.Object)
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
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)
self.assertAlmostEqualVector(ret_regular, ret_filter)
# filter out all values (search odd tree for even values and the reverse)
co = (0,) * 3
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"])
if __name__ == "__main__":
main()

View File

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

View File

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

View File

@@ -31,6 +31,7 @@ import difflib
import pathlib
from pathlib import Path
def with_tempdir(wrapped):
"""Creates a temporary directory for the function, cleaning up after it returns normally.
@@ -56,8 +57,10 @@ def with_tempdir(wrapped):
return decorator
LINE = "+----------------------------------------------------------------"
class AbstractColladaTest(unittest.TestCase):
@classmethod
@@ -75,7 +78,7 @@ class AbstractColladaTest(unittest.TestCase):
ref.close()
exp.close()
diff_count = 0;
diff_count = 0
for line in diff:
error = True
for prefix in ('---', '+++', '@@'):
@@ -107,6 +110,7 @@ class AbstractColladaTest(unittest.TestCase):
return diff_count == 0
class MeshExportTest4(AbstractColladaTest):
@with_tempdir
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)
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,
filemode=8,
display_type='DEFAULT',
@@ -142,12 +147,14 @@ class MeshExportTest4(AbstractColladaTest):
export_texture_type_selection='mat',
open_sim=False,
limit_precision=True,
keep_bind_info=False)
keep_bind_info=False,
)
# Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile):
self.fail()
class MeshExportTest3(AbstractColladaTest):
@with_tempdir
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)
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,
filemode=8,
display_type='DEFAULT',
@@ -183,12 +191,14 @@ class MeshExportTest3(AbstractColladaTest):
export_texture_type_selection='mat',
open_sim=False,
limit_precision=True,
keep_bind_info=False)
keep_bind_info=False,
)
# Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile):
self.fail()
class MeshExportTest2(AbstractColladaTest):
@with_tempdir
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)
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,
filemode=8,
display_type='DEFAULT',
@@ -224,12 +235,14 @@ class MeshExportTest2(AbstractColladaTest):
export_texture_type_selection='mat',
open_sim=False,
limit_precision=True,
keep_bind_info=False)
keep_bind_info=False,
)
# Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile):
self.fail()
class MeshExportTest1(AbstractColladaTest):
@with_tempdir
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)
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,
filemode=8,
display_type='DEFAULT',
@@ -265,7 +279,8 @@ class MeshExportTest1(AbstractColladaTest):
export_texture_type_selection='mat',
open_sim=False,
limit_precision=True,
keep_bind_info=False)
keep_bind_info=False,
)
# Now check the resulting Collada file.
if not self.checkdae(reference_dae, outfile):

View File

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

View File

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

View File

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

View File

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

View File

@@ -204,6 +204,5 @@ def main():
print("Skipping pylint checks (command not found)")
if __name__ == "__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
class TestArray(unittest.TestCase):
# test that assignment works by: assign -> test value
# - rvalue = list of float
@@ -181,7 +182,6 @@ class TestMArray(unittest.TestCase):
arr[i][j] = rval
self.assertEqual(prop_to_list(arr[i][j]), rval)
def test_assign_item_fail(self):
def assign_wrong_size(arr, i, rval):
getattr(test, arr)[i] = rval
@@ -212,8 +212,8 @@ class TestMArray(unittest.TestCase):
setattr(test, arr, rval)
self.assertEqual(prop_to_list(getattr(test, arr)), rval)
# test access
def test_access(self):
pass
@@ -221,17 +221,22 @@ class TestMArray(unittest.TestCase):
def test_access_fail(self):
pass
random.seed()
def rand_int():
return random.randint(-1000, 1000)
def rand_float():
return float(rand_int())
def rand_bool():
return bool(random.randint(0, 1))
def make_random_array(len, rand_func):
arr = []
for i in range(len):
@@ -239,6 +244,7 @@ def make_random_array(len, rand_func):
return arr
def make_random_2d_array(dimsize, rand_func):
marr = []
for i in range(dimsize[0]):
@@ -249,6 +255,7 @@ def make_random_2d_array(dimsize, rand_func):
return marr
def make_random_3d_array(dimsize, rand_func):
marr = []
for i in range(dimsize[0]):
@@ -262,6 +269,7 @@ def make_random_3d_array(dimsize, rand_func):
return marr
def prop_to_list(prop):
ret = []
@@ -273,8 +281,10 @@ def prop_to_list(prop):
return ret
def suite():
return unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(TestArray), unittest.TestLoader().loadTestsFromTestCase(TestMArray)])
if __name__ == "__main__":
unittest.TextTestRunner(verbosity=2).run(suite())