コード例 #1
0
ファイル: makemake.py プロジェクト: bruceg/spac
def recurse_dep(dep):
	global autofiles
	global srcfiles
	global missing
	if dep in ruleset:
		return None
	if dep in srcfiles or dep in autofiles:
		return None
	debug("Looking for dependancy '%(dep)s'" % locals())
	# Is the dependancy matched by a rule?
	rule = rules.match(dep)
	if rule:
		( targets, deplist, commands ) = rule
		add_rule(targets, deplist, commands)
		debug("Found '%(dep)s' as rule %(targets)s => %(deplist)s" % locals())
		return deplist
	# Is the dependancy an automatic file?
	if files.copy(dep):
		# If so, add it to the automatic files list.
		debug("Found '%(dep)s' as an automatic file" % locals())
		autofiles.append(dep)
		return
	# Is the dependancy a source file?
	# If so, add it to the source files list.
	try:
		os.stat(dep)
		debug("Found '%(dep)s' as source" % locals())
		srcfiles.append(dep)
		return
	except OSError:
		print("Missing dependancy: '%s'" % dep)
		missing.append(dep)
コード例 #2
0
ファイル: stdexec.py プロジェクト: bruceg/spac
def scan_cpp(filename, already=None):
    if not already:
        already = {}
    if filename in already:
        return
    if files.copy(filename) or rules.match(filename):
        return [filename]
    already[filename] = None
    path = os.path.split(filename)[0]
    file = read(filename)
    if file is None:
        raise IOError
    deps = [filename]
    match = rx_include.search(file)
    build_incpaths = files.readlines("build-includes") or []
    incpaths = ["", path] + build_incpaths
    while match:
        inctype, inc = match.groups()
        incs = [] if inctype == "<" else [inc]
        for incpath in incpaths:
            try:
                incs = scan_cpp(os.path.join(incpath, inc), already)
            except IOError:
                continue
            if incs is not None:
                break
        deps.extend(incs or [])
        match = rx_include.search(file, match.end())
    return deps
コード例 #3
0
ファイル: image.py プロジェクト: weykent/weasyl
def resize(filename, width, height, destination=None, animate=False):
    in_place = False
    if not destination:
        destination = filename + '.new'
        in_place = True

    im = read(filename)
    if not image_extension(im):
        raise WeasylError("FileType")

    files.ensure_file_directory(filename)
    im = correct_image_and_call(_resize, im, width, height)
    if im is not None:
        im.write(destination)
        if in_place:
            os.rename(destination, filename)

    # if there's no need to resize, in-place resize is a no-op. otherwise copy
    # the source to the destination.
    elif not in_place:
        files.copy(filename, destination)
コード例 #4
0
ファイル: image.py プロジェクト: hyena/weasyl
def resize(filename, width, height, destination=None, animate=False):
    in_place = False
    if not destination:
        destination = filename + '.new'
        in_place = True

    im = read(filename)
    if not image_extension(im):
        raise WeasylError("FileType")

    files.ensure_file_directory(filename)
    im = correct_image_and_call(_resize, im, width, height)
    if im is not None:
        im.write(destination)
        if in_place:
            os.rename(destination, filename)

    # if there's no need to resize, in-place resize is a no-op. otherwise copy
    # the source to the destination.
    elif not in_place:
        files.copy(filename, destination)
コード例 #5
0
def copy_tamarin_headers(target):

    print ">> core"
    files.copy("../tamarin/core/*.h", target + "/caspin/tamarin/core/")
    print ">> vmpi"
    files.copy("../tamarin/vmpi/*.h", target + "/caspin/tamarin/vmpi/")
    print ">> platform"
    files.copy("../tamarin/platform/*.h", target + "/caspin/tamarin/platform/")
    files.copy("../tamarin/platform/win32/*.h", target + "/caspin/tamarin/platform/win32/")
    print ">> mmgc"
    files.copy("../tamarin/mmgc/*.h", target + "/caspin/tamarin/mmgc/")
    print ">> nanojit"
    files.copy("../tamarin/nanojit/*.h", target + "/caspin/tamarin/nanojit/")
    print ">> eval"
    files.copy("../tamarin/eval/*.h", target + "/caspin/tamarin/eval/")
    print ">> extensions"
    files.copy("../tamarin/extensions/*.h", target + "/caspin/tamarin/extensions/")

    shutil.copy("../tamarin/core/builtin.abc", target + "/caspin/tamarin/core/")
    shutil.copy("../tamarin/shell/avmshell-features.h", target + "/caspin/tamarin/shell/")
    shutil.copy("../tamarin/utils/asc.jar", target + "/caspin/tamarin/utils/")
    shutil.copy("../tamarin/utils/nativegen.py", target + "/caspin/tamarin/utils/")
コード例 #6
0
    shutil.copy(obj_dir + "Release_Debugger/avm.lib", lib_release + "avm_debugger.lib")
    shutil.copy(obj_dir + "Debug_Debugger/avm.lib", lib_debug + "avm_debugger.lib")


# --------------------------------------
# ---------------- MAIN ----------------
# --------------------------------------

if target != "vc9" and target != "vc10":
    print "Error: invalid target specified: '" + target + "'"
    exit()

create_dirs(target)

print "copying caspin headers"
files.copy("../include/*.h", target + "/caspin/include/")

print "copying caspin libraries"
files.copy("../lib/Release/*.lib", target + "/caspin/lib/Release/")
files.copy("../lib/Debug/*.lib", target + "/caspin/lib/Debug/")

print "copying caspin tools"
shutil.copy("../tools/cspcompile.py", target + "/caspin/tools/")
shutil.copy("../tools/cspgenerate.py", target + "/caspin/tools/")

print "copying tamarin headers"
copy_tamarin_headers(target)

print "copying tamarin libraries"
if target == "vc9":
    copy_tamarin_libs_vc9()
コード例 #7
0
ファイル: main.py プロジェクト: rechner/Taxidi-volunteer
	f.close()
except IOError:
	f = open(logFile, 'w')
	f.write('"ID","Name","Services served","Ministries served","Date","Time"\n')
	f.close()
f = open(logFile, 'rb')
reader = csv.reader(f)
readerTmp = []
for row in reader:
	readerTmp.append(row)
f.close()
print "Debug: latest write to CSV was '" + readerTmp[0][4]+"'"
if readerTmp[0][4] != datetime.datetime.now().strftime("%a %d %B, %Y") and readerTmp[0][4] != 'Date':
	#copy to archive file and clear the old file.
	print "Debug: lastest write older than today; archiving data."
	files.copy(logFile, archiveFolder+
		datetime.datetime.now().strftime("%Y-%m-%d.csv"))
	f = open(logFile, 'w')
	f.write('"ID","Name","Services served","Ministries served","Date","Time"\n')
	f.close()
	print "Debug: CSV data reset."


global database
database = 'database/users.db'

handler = sql.Database(database)

global displayCentre
global resultList
global querySelection
resultList = []
コード例 #8
0
ファイル: stdexec.py プロジェクト: bruceg/spac
def read(filename):
    tmp = files.read(filename)
    if tmp is None and files.copy(filename):
        tmp = files.read(filename)
    return tmp
コード例 #9
0
ファイル: character.py プロジェクト: BaxterOttoman/weasyl
def create(userid, character, friends, tags, thumbfile, submitfile):
    # Make temporary filenames
    tempthumb = files.get_temporary(userid, "thumb")
    tempsubmit = files.get_temporary(userid, "char")

    # Determine filesizes
    thumbsize = len(thumbfile)
    submitsize = len(submitfile)

    # Check invalid title or rating
    if not character.char_name:
        raise WeasylError("characterNameInvalid")
    elif not character.rating:
        raise WeasylError("ratingInvalid")
    profile.check_user_rating_allowed(userid, character.rating)

    # Write temporary thumbnail file
    if thumbsize:
        files.easyupload(tempthumb, thumbfile, "image")
        thumbextension = files.get_extension_for_category(
            thumbfile, m.ART_SUBMISSION_CATEGORY)
    else:
        thumbextension = None

    # Write temporary submission file
    if submitsize:
        files.easyupload(tempsubmit, submitfile, "image")
        submitextension = files.get_extension_for_category(
            submitfile, m.ART_SUBMISSION_CATEGORY)
    else:
        submitextension = None

    # Check invalid file data
    if not submitsize:
        files.clear_temporary(userid)
        raise WeasylError("submitSizeZero")
    elif submitsize > 10 * _MEGABYTE:
        files.clear_temporary(userid)
        raise WeasylError("submitSizeExceedsLimit")
    elif thumbsize > 10 * _MEGABYTE:
        files.clear_temporary(userid)
        raise WeasylError("thumbSizeExceedsLimit")
    elif submitextension not in [".jpg", ".png", ".gif"]:
        files.clear_temporary(userid)
        raise WeasylError("submitType")
    elif thumbsize and thumbextension not in [".jpg", ".png", ".gif"]:
        files.clear_temporary(userid)
        raise WeasylError("thumbType")

    # Assign settings
    settings = []
    settings.append("f" if friends else "")
    settings.append(files.typeflag("submit", submitextension))
    settings.append(files.typeflag("cover", submitextension))
    settings = "".join(settings)

    # Insert submission data
    ch = define.meta.tables["character"]

    try:
        charid = define.engine.execute(ch.insert().returning(ch.c.charid), {
            "userid": userid,
            "unixtime": arrow.now(),
            "char_name": character.char_name,
            "age": character.age,
            "gender": character.gender,
            "height": character.height,
            "weight": character.weight,
            "species": character.species,
            "content": character.content,
            "rating": character.rating.code,
            "settings": settings,
        }).scalar()
    except PostgresError:
        files.clear_temporary(userid)
        raise

    # Assign search tags
    searchtag.associate(userid, tags, charid=charid)

    # Make submission file
    files.make_path(charid, "char")
    files.copy(tempsubmit, files.make_resource(userid, charid, "char/submit", submitextension))

    # Make cover file
    image.make_cover(tempsubmit, files.make_resource(userid, charid, "char/cover", submitextension))

    # Make thumbnail selection file
    if thumbsize:
        image.make_cover(
            tempthumb, files.make_resource(userid, charid, "char/.thumb"))

    thumbnail.create(userid, 0, 0, 0, 0, charid=charid, remove=False)

    # Create notifications
    welcome.character_insert(userid, charid, rating=character.rating.code,
                             settings=settings)

    # Clear temporary files
    files.clear_temporary(userid)

    define.metric('increment', 'characters')

    return charid
コード例 #10
0
def create(userid, character, friends, tags, thumbfile, submitfile):
    # Make temporary filenames
    tempthumb = files.get_temporary(userid, "thumb")
    tempsubmit = files.get_temporary(userid, "char")

    # Determine filesizes
    thumbsize = len(thumbfile)
    submitsize = len(submitfile)

    # Check invalid title or rating
    if not character.char_name:
        raise WeasylError("characterNameInvalid")
    elif not character.rating:
        raise WeasylError("ratingInvalid")
    profile.check_user_rating_allowed(userid, character.rating)

    # Write temporary thumbnail file
    if thumbsize:
        files.easyupload(tempthumb, thumbfile, "image")
        thumbextension = files.get_extension_for_category(
            thumbfile, m.ART_SUBMISSION_CATEGORY)
    else:
        thumbextension = None

    # Write temporary submission file
    if submitsize:
        files.easyupload(tempsubmit, submitfile, "image")
        submitextension = files.get_extension_for_category(
            submitfile, m.ART_SUBMISSION_CATEGORY)
    else:
        submitextension = None

    # Check invalid file data
    if not submitsize:
        files.clear_temporary(userid)
        raise WeasylError("submitSizeZero")
    elif submitsize > 10 * _MEGABYTE:
        files.clear_temporary(userid)
        raise WeasylError("submitSizeExceedsLimit")
    elif thumbsize > 10 * _MEGABYTE:
        files.clear_temporary(userid)
        raise WeasylError("thumbSizeExceedsLimit")
    elif submitextension not in [".jpg", ".png", ".gif"]:
        files.clear_temporary(userid)
        raise WeasylError("submitType")
    elif thumbsize and thumbextension not in [".jpg", ".png", ".gif"]:
        files.clear_temporary(userid)
        raise WeasylError("thumbType")

    # Assign settings
    settings = []
    settings.append("f" if friends else "")
    settings.append(files.typeflag("submit", submitextension))
    settings.append(files.typeflag("cover", submitextension))
    settings = "".join(settings)

    # Insert submission data
    ch = define.meta.tables["character"]

    try:
        charid = define.engine.execute(ch.insert().returning(ch.c.charid), {
            "userid": userid,
            "unixtime": arrow.now(),
            "char_name": character.char_name,
            "age": character.age,
            "gender": character.gender,
            "height": character.height,
            "weight": character.weight,
            "species": character.species,
            "content": character.content,
            "rating": character.rating.code,
            "settings": settings,
        }).scalar()
    except PostgresError:
        files.clear_temporary(userid)
        raise

    # Assign search tags
    searchtag.associate(userid, tags, charid=charid)

    # Make submission file
    files.make_path(charid, "char")
    files.copy(tempsubmit, files.make_resource(userid, charid, "char/submit", submitextension))

    # Make cover file
    image.make_cover(tempsubmit, files.make_resource(userid, charid, "char/cover", submitextension))

    # Make thumbnail selection file
    if thumbsize:
        image.make_cover(
            tempthumb, files.make_resource(userid, charid, "char/.thumb"))

    thumbnail.create(userid, 0, 0, 0, 0, charid=charid, remove=False)

    # Create notifications
    welcome.character_insert(userid, charid, rating=character.rating.code,
                             settings=settings)

    # Clear temporary files
    files.clear_temporary(userid)

    define.metric('increment', 'characters')

    return charid
コード例 #11
0
def main():
    found_ffmpeg = ffmpeg.find_ffmpeg()
    if not found_ffmpeg:
        exit(1)
    im_command = imagemagick.find_imagemagick()
    if im_command is None:
        exit(1)
    videos, images, reg_files = files.enumerate_files(sys.argv[1], sys.argv[2])
    imagemagick.process_images(im_command, images)
    ffmpeg.process_videos(videos)
    files.copy(reg_files)

    video_sizes = [(os.stat(i).st_size, os.stat(o).st_size) for i, o in videos]
    image_sizes = [(os.stat(i).st_size, os.stat(o).st_size) for i, o in images]
    file_sizes = [(os.stat(i).st_size, os.stat(o).st_size)
                  for i, o in reg_files]

    video_ratios = [i_s / o_s for i_s, o_s in video_sizes]
    image_ratios = [i_s / o_s for i_s, o_s in image_sizes]

    max_video, max_video_ratio, max_video_size = max(zip(
        videos, video_ratios, video_sizes),
                                                     key=lambda v: v[1])
    min_video, min_video_ratio, min_video_size = min(zip(
        videos, video_ratios, video_sizes),
                                                     key=lambda v: v[1])

    max_image, max_image_ratio, max_image_size = max(zip(
        images, image_ratios, image_sizes),
                                                     key=lambda v: v[1])
    min_image, min_image_ratio, min_image_size = min(zip(
        images, image_ratios, image_sizes),
                                                     key=lambda v: v[1])

    print(
        f" Most compressed video @ {max_video_ratio:6.2f}x - {files.sizeof_fmt(max_video_size[0])} -> {files.sizeof_fmt(max_video_size[1])}: {max_video[1]}"
    )
    print(
        f"Least compressed video @ {min_video_ratio:6.2f}x - {files.sizeof_fmt(min_video_size[0])} -> {files.sizeof_fmt(min_video_size[1])}: {min_video[1]}"
    )
    print(
        f" Most compressed image @ {max_image_ratio:6.2f}x - {files.sizeof_fmt(max_image_size[0])} -> {files.sizeof_fmt(max_image_size[1])}: {max_image[1]}"
    )
    print(
        f"Least compressed image @ {min_image_ratio:6.2f}x - {files.sizeof_fmt(min_image_size[0])} -> {files.sizeof_fmt(min_image_size[1])}: {min_image[1]}"
    )

    print()

    total_video_in = sum((in_size for in_size, _ in video_sizes))
    total_video_out = sum((out_size for _, out_size in video_sizes))

    total_image_in = sum((in_size for in_size, _ in image_sizes))
    total_image_out = sum((out_size for _, out_size in image_sizes))

    total_file_out = sum((out_size for _, out_size in file_sizes))

    all_in = total_video_in + total_image_in + total_file_out
    all_out = total_video_out + total_image_out + total_file_out

    print(
        f"Video Compression @ {files.sizeof_fmt(total_video_in)} -> {files.sizeof_fmt(total_video_out)} {total_video_in / total_video_out:6.2f}x"
    )
    print(
        f"Image Compression @ {files.sizeof_fmt(total_image_in)} -> {files.sizeof_fmt(total_image_out)} {total_image_in / total_image_out:6.2f}x"
    )
    print(f"  Unchanged Files @ {files.sizeof_fmt(total_file_out)}")
    print(
        f" Total Difference @ {files.sizeof_fmt(all_in)} -> {files.sizeof_fmt(all_out)} {all_in / all_out:6.2f}x"
    )
コード例 #12
0
def files_tests():
    from files import (readall, writeall, exists, copy, move, sep, run, isemptydir, listchildren, makedir,
        getname, listfiles, recursedirs, recursefiles, delete, runWithoutWaitUnicode)
    import tempfile
    import os
    import shutil
    tmpdir = tempfile.gettempdir() + sep + 'pytest'
    tmpdirsl = tmpdir + sep
    if not os.path.exists(tmpdir):
        os.mkdir(tmpdir)

    def cleardirectoryfiles(d):
        shutil.rmtree(d)
        os.mkdir(d)
        assertTrue(isemptydir(d))
    
    # test copy_overwrite, source not exist
    cleardirectoryfiles(tmpdir)
    assertException(lambda: copy(tmpdirsl + 'src.txt', tmpdirsl + 'srccopy.txt', True), IOError)
    
    # test copy_overwrite, simple copy
    cleardirectoryfiles(tmpdir)
    writeall(tmpdirsl + 'src.txt', 'src')
    copy(tmpdirsl + 'src.txt', tmpdirsl + 'srccopy.txt', True)
    assertEq('src', readall(tmpdirsl + 'srccopy.txt'))
    assertTrue(exists(tmpdirsl + 'src.txt'))
    
    # test copy_overwrite, overwrite
    cleardirectoryfiles(tmpdir)
    writeall(tmpdirsl + 'src.txt', 'src')
    assertEq('src', readall(tmpdirsl + 'src.txt'))
    writeall(tmpdirsl + 'dest.txt', 'dest')
    assertEq('dest', readall(tmpdirsl + 'dest.txt'))
    copy(tmpdirsl + 'src.txt', tmpdirsl + 'dest.txt', True)
    assertEq('src', readall(tmpdirsl + 'dest.txt'))
    assertTrue(exists(tmpdirsl + 'src.txt'))
    
    # test copy_nooverwrite, source not exist
    cleardirectoryfiles(tmpdir)
    assertException(lambda: copy(tmpdirsl + 'src.txt', tmpdirsl + 'srccopy.txt', False), IOError)
    
    # test copy_nooverwrite, simple copy
    cleardirectoryfiles(tmpdir)
    writeall(tmpdirsl + 'src.txt', 'src')
    copy(tmpdirsl + 'src.txt', tmpdirsl + 'srccopy.txt', False)
    assertEq('src', readall(tmpdirsl + 'srccopy.txt'))
    
    # test copy_nooverwrite, simple overwrite should fail
    cleardirectoryfiles(tmpdir)
    writeall(tmpdirsl + 'src.txt', 'src')
    assertEq('src', readall(tmpdirsl + 'src.txt'))
    writeall(tmpdirsl + 'dest.txt', 'dest')
    assertEq('dest', readall(tmpdirsl + 'dest.txt'))
    if sys.platform == 'win32':
        assertException(lambda: copy(tmpdirsl + 'src.txt', tmpdirsl + 'dest.txt', False), IOError, 'CopyFileW failed')
    else:
        assertException(lambda: copy(tmpdirsl + 'src.txt', tmpdirsl + 'dest.txt', False), OSError, 'File exists')
    assertEq('dest', readall(tmpdirsl + 'dest.txt'))
    
    # test move_overwrite, source not exist
    cleardirectoryfiles(tmpdir)
    assertException(lambda: move(tmpdirsl + 'src.txt', tmpdirsl + 'srcmove.txt', True), IOError)
    assertTrue(not exists(tmpdirsl + 'src.txt'))
    
    # test move_overwrite, simple move
    cleardirectoryfiles(tmpdir)
    writeall(tmpdirsl + 'src.txt', 'src')
    move(tmpdirsl + 'src.txt', tmpdirsl + 'srcmove.txt', True)
    assertEq('src', readall(tmpdirsl + 'srcmove.txt'))
    assertTrue(not exists(tmpdirsl + 'src.txt'))
    
    # test move_overwrite, overwrite
    cleardirectoryfiles(tmpdir)
    writeall(tmpdirsl + 'src.txt', 'src')
    assertEq('src', readall(tmpdirsl + 'src.txt'))
    writeall(tmpdirsl + 'dest.txt', 'dest')
    assertEq('dest', readall(tmpdirsl + 'dest.txt'))
    move(tmpdirsl + 'src.txt', tmpdirsl + 'dest.txt', True)
    assertEq('src', readall(tmpdirsl + 'dest.txt'))
    assertTrue(not exists(tmpdirsl + 'src.txt'))
    
    # test move_nooverwrite, source not exist
    cleardirectoryfiles(tmpdir)
    assertException(lambda: move(tmpdirsl + 'src.txt', tmpdirsl + 'srcmove.txt', False), IOError)
    assertTrue(not exists(tmpdirsl + 'src.txt'))
    
    # test move_nooverwrite, simple move
    cleardirectoryfiles(tmpdir)
    writeall(tmpdirsl + 'src.txt', 'src')
    move(tmpdirsl + 'src.txt', tmpdirsl + 'srcmove.txt', False)
    assertEq('src', readall(tmpdirsl + 'srcmove.txt'))
    assertTrue(not exists(tmpdirsl + 'src.txt'))
    
    # test move_nooverwrite, simple overwrite should fail
    cleardirectoryfiles(tmpdir)
    writeall(tmpdirsl + 'src.txt', 'src')
    assertEq('src', readall(tmpdirsl + 'src.txt'))
    writeall(tmpdirsl + 'dest.txt', 'dest')
    assertEq('dest', readall(tmpdirsl + 'dest.txt'))
    if sys.platform == 'win32':
        assertException(lambda: move(tmpdirsl + 'src.txt', tmpdirsl + 'dest.txt', False), IOError, 'MoveFileExW failed')
    else:
        assertException(lambda: move(tmpdirsl + 'src.txt', tmpdirsl + 'dest.txt', False), OSError, 'File exists')
    assertEq('dest', readall(tmpdirsl + 'dest.txt'))
    assertTrue(exists(tmpdirsl + 'src.txt'))
    
    # test _checkNamedParameters
    assertException(lambda: list(listchildren(tmpdir, True)), ValueError, 'please name parameters')
    
    # tmpdir has files, dirs
    # tmpdir/s1 has no files, dirs
    # tmpdir/s1/ss1 has files, no dirs
    # tmpdir/s1/ss2 has no files, dirs
    cleardirectoryfiles(tmpdir)
    dirstomake = [tmpdir, tmpdirsl + 's1', tmpdirsl + 's1' + sep + 'ss1', tmpdirsl + 's1' + sep + 'ss2', tmpdirsl + 's2']
    filestomake = [tmpdirsl + 'P1.PNG', tmpdirsl + 'a1.txt', tmpdirsl + 'a2png',
        tmpdirsl + 's1' + sep + 'ss1' + sep + 'file.txt', tmpdirsl + 's2' + sep + 'other.txt']
    for dir in dirstomake:
        if dir != tmpdir:
            makedir(dir)
    for file in filestomake:
        writeall(file, 'content')
    
    # test listchildren
    expected = ['P1.PNG', 'a1.txt', 'a2png', 's1', 's2']
    assertEq([(tmpdirsl + s, s) for s in expected], sorted(list(listchildren(tmpdir))))
    assertEq(expected, sorted(list(listchildren(tmpdir, filenamesOnly=True))))
    assertEq(['P1.PNG', 'a1.txt'], sorted(list(listchildren(tmpdir, filenamesOnly=True, allowedexts=['png', 'txt']))))
    
    # test listfiles
    expected = ['P1.PNG', 'a1.txt', 'a2png']
    assertEq([(tmpdirsl + s, s) for s in expected], sorted(list(listfiles(tmpdir))))
    assertEq(expected, sorted(list(listfiles(tmpdir, filenamesOnly=True))))
    assertEq(['P1.PNG', 'a1.txt'], sorted(list(listfiles(tmpdir, filenamesOnly=True, allowedexts=['png', 'txt']))))
    
    # test recursefiles
    assertEq([(s, getname(s)) for s in filestomake],
        sorted(list(recursefiles(tmpdir))))
    assertEq([getname(s) for s in filestomake],
        sorted(list(recursefiles(tmpdir, filenamesOnly=True))))
    assertEq(['a1.txt', 'file.txt', 'other.txt'],
        sorted(list(recursefiles(tmpdir, filenamesOnly=True, allowedexts=['txt']))))
    assertEq(['a1.txt', 'file.txt', 'other.txt'],
        sorted(list(recursefiles(tmpdir, filenamesOnly=True, allowedexts=['txt'], fnFilterDirs=lambda d: True))))
    assertEq(['a1.txt'],
        sorted(list(recursefiles(tmpdir, filenamesOnly=True, allowedexts=['txt'], fnFilterDirs=lambda d: False))))
    assertEq(['a1.txt', 'other.txt'],
        sorted(list(recursefiles(tmpdir, filenamesOnly=True, allowedexts=['txt'], fnFilterDirs=lambda dir: getname(dir) != 's1'))))
    assertEq(['a1.txt', 'file.txt'],
        sorted(list(recursefiles(tmpdir, filenamesOnly=True, allowedexts=['txt'], fnFilterDirs=lambda dir: getname(dir) != 's2'))))
    
    # test recursedirs
    assertEq(sorted([(s, getname(s)) for s in dirstomake]), sorted(list(recursedirs(tmpdir))))
    assertEq(sorted([getname(s) for s in dirstomake]), sorted(list(recursedirs(tmpdir, filenamesOnly=True))))
    assertEq(['pytest', 's2'], sorted(list(recursedirs(tmpdir, filenamesOnly=True, fnFilterDirs=lambda dir: getname(dir) != 's1'))))
    
    # test run process, simple batch script
    if sys.platform == 'win32':
        cleardirectoryfiles(tmpdir)
        writeall(tmpdirsl + 'src.txt', 'src')
        writeall(tmpdirsl + 'script.bat', 'copy "%ssrc.txt" "%sdest.txt"'%(tmpdirsl, tmpdirsl))
        assertTrue(not exists(tmpdirsl + 'dest.txt'))
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat'])
        assertEq(0, returncode)
        assertTrue(exists(tmpdirsl + 'dest.txt'))
        
        # specify no capture and run again
        delete(tmpdirsl + 'dest.txt')
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat'], captureoutput=False)
        assertEq(0, returncode)
        assertTrue(exists(tmpdirsl + 'dest.txt'))
        
        # run process with unicode characters
        delete(tmpdirsl + 'dest.txt')
        unicodepath = tmpdirsl + u'scr#1pt#2.bat'.replace('#1', u'\u012B').replace('#2', u'\u013C')
        writeall(unicodepath, 'copy "%ssrc.txt" "%sdest.txt"'%(tmpdirsl, tmpdirsl))
        try:
            import time
            runWithoutWaitUnicode([unicodepath])
            time.sleep(0.5)
            assertTrue(exists(tmpdirsl + 'dest.txt'))
        finally:
            delete(unicodepath)
        
        # test run process, batch script returns failure
        cleardirectoryfiles(tmpdir)
        writeall(tmpdirsl + 'script.bat', '\nexit /b 123')
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat'], throwOnFailure=False)
        assertEq(123, returncode)
        # specify no capture and run again
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat'], throwOnFailure=False, captureoutput=False)
        assertEq(123, returncode)
        # except exception
        assertException(lambda: run([tmpdirsl + 'script.bat']), RuntimeError, 'retcode is not 0')
        # specify no capture, except exception
        assertException(lambda: run([tmpdirsl + 'script.bat'], captureoutput=False), RuntimeError, 'retcode is not 0')
        
        # test run process, get stdout
        writeall(tmpdirsl + 'script.bat', '\n@echo off\necho testecho')
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat'])
        assertEq(0, returncode)
        assertEq('testecho', stdout)
        assertEq('', stderr)
        
        # test run process, get stderr
        writeall(tmpdirsl + 'script.bat', '\n@echo off\necho testechoerr 1>&2')
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat'])
        assertEq(0, returncode)
        assertEq('', stdout)
        assertEq('testechoerr', stderr)
        
        # test run process, get both. (this deadlocks if done naively, but it looks like subprocess correctly uses 2 threads.)
        writeall(tmpdirsl + 'script.bat', '\n@echo off\necho testecho\necho testechoerr 1>&2')
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat'])
        assertEq(0, returncode)
        assertEq('testecho', stdout)
        assertEq('testechoerr', stderr)
        
        # test run process, send argument without spaces
        writeall(tmpdirsl + 'script.bat', '\n@echo off\necho %1')
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat', 'testarg'])
        assertEq(0, returncode)
        assertEq('testarg', stdout)
        
        # test run process, send argument with spaces (subprocess will quote the args)
        writeall(tmpdirsl + 'script.bat', '\n@echo off\necho %1')
        returncode, stdout, stderr = run([tmpdirsl + 'script.bat', 'test arg'])
        assertEq(0, returncode)
        assertEq('"test arg"', stdout)
        
        # test run process, run without shell
        cleardirectoryfiles(tmpdir)
        writeall(tmpdirsl + 'src.txt', 'src')
        # won't work without the shell:
        assertException(lambda: run(['copy', tmpdirsl + 'src.txt', tmpdirsl + 'dest.txt']), OSError)
        assertTrue(not exists(tmpdirsl + 'dest.txt'))
        # will work with the shell
        returncode, stdout, stderr = run(['copy', tmpdirsl + 'src.txt', tmpdirsl + 'dest.txt'], shell=True)
        assertEq(0, returncode)
        assertTrue(exists(tmpdirsl + 'dest.txt'))