update typing_extensions check for changes in 4.0.0

This commit is contained in:
Eric Froemling 2021-11-15 11:26:59 -06:00
parent 0cb0fa772b
commit 172bd3b50f
No known key found for this signature in database
GPG Key ID: 89C93F0F8D6D5A98
9 changed files with 199 additions and 50 deletions

View File

@ -3966,50 +3966,50 @@
"assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e",
"assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/72/82/86956fae909ac2fe2a1abd84a361", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/72/82/86956fae909ac2fe2a1abd84a361",
"ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a",
"build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/0d/3f/92b3e229a7211ffeb5cd6b777364", "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/88/d6/2de73f757e3bdbfeaec03f563c8a",
"build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/74/1d/fc9e33e565475daaac80da5252f0", "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/74/1d/fc9e33e565475daaac80da5252f0",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/40/6b/8200d88decb9480bf873df2daefe", "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/09/93/182c306fdfe104a925794984a763",
"build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/86/fc/149d346aa7fb17c9d176d5c71b5a", "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c1/43/f37d6f9200d7c72d06ad158e6a6b",
"build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/89/9e/8411e30418cac89810c8bd5e422a", "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/db/dd/51cd186c11c6399c8e39c306652b",
"build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/9c/7b/ac1a200be0f37078af0991faca3b", "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/9c/7b/ac1a200be0f37078af0991faca3b",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/4b/dd/52fdcf376bf5a577ec4548a34c27", "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/94/5f/f596a1c6ec46b059997038b2ad98",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/2c/3c/f386b9c98d2e3b7cc69c5aa5bac0", "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/36/4b/54a3508504842e449bc4632facc7",
"build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/14/8e/e2f299fde04604aa7a727b6d7526", "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ad/6a/39489935b6d36077d0180d365f65",
"build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/58/6d/afb3a95d0774e7ca227f77202866", "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/1c/30/37cb8de37563ece076f3df06407e",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d2/ee/e4bcb96a463516e1068714c39c4d", "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/61/d5/8d839aa2b10e2c267c661f22f131",
"build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/28/a9/ba7d4be38d707695d942173c2380", "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/92/db/36e17bb4062382cd0d07818415d1",
"build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/1a/3b/f9fe01cf3a776cceecd078c99f92", "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f1/39/d44269765fa93903c0b8896b4f62",
"build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/42/53/07d28b98ff2ffc857438d07268ea", "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/f2/e3/64b2d15ae4c8f2d060f0ac782512",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e2/2c/4ec233e815eadc0b427391fe3867", "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/48/10/c493cee7128f6c5caa0c450df55d",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a4/dc/a8f17a3c35c6ead2580ab32157c0", "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/68/2c/c65363cd1d7dd78f425fd9586258",
"build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/49/21/b2ca5e3af03446536329a8307ebd", "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/b5/7c/ccec2d40ddafa91261b086d1173c",
"build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/d0/fe/5ee21da4a647e55e3b3b57f7af66", "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/78/f4/3356065ce9b87d87fbd29acd8cac",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/91/0b/d758e25cd70756a0654a368f3c6c", "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/b7/9b/e3f766f96f89650642a5ddc6a4ea",
"build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/51/d7/05324adaa59b8f5be699a34d9df3", "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/20/13/4b60da93efe23ac4c7cf9a350bc7",
"build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/00/bc/3cbd2cc3820bb81bbd972a7ceb5a", "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/5f/7c/427e8a1af1c95bf40211adb1a10e",
"build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d3/5c/969e1b4c0958ae64db139742be65", "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/5e/fe/0366d7ace626419f14c2bd80e266",
"build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/29/ce/80de999ebf7f31e4711c4fbcd567", "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9b/2c/7be9dce2d9aff8cf04508d07dff0",
"build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/65/e6/694cceb311b14db0e7e2a7d222e3", "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/0e/c3/b9d0325bee5ee116a1311a87dd11",
"build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ff/5f/63148f1884e1d54a18f6628cf6d7", "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/8b/ff/1345a0a9d07ea8b7164ec2a97234",
"build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/16/c7/eef151836539d51fe613de96a628", "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d7/2c/9fa96710e25f6242c42ff3efd309",
"build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/41/62/a68605fc59816419ef378cf111df", "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/89/45/43b51cddf1b4655d31018158b344",
"build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/65/9a/fb4eead17d1f0443868ae4a3dcba", "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/8c/6d/c3f165109101ae65f3ecbc556492",
"build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2a/30/2e7ca4dbacd3067e8194180b4a2d", "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/44/f1/1cfd8a4bc54d87f86bbfdd9fa439",
"build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/94/65/197a50a86aacc67f1a2e274febb8", "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d9/c2/15a504dbea88fe4eda1c57f67c76",
"build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ca/55/af7c67cb2fc965a260b85c55a26a", "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3f/1e/3e78487f4d70a2c5974ec0198fb1",
"build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/11/ef/73f5bd0b9fbab59ebf66f3ced62b", "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/18/4a/48fd42b279a165b41c43c7973f5b",
"build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/01/85/7a8bc2e018eb9c74c456a94c53c0", "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ae/61/8f2ab7f636f09ff8cabf7e5d8d37",
"build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ab/6e/a567ec80b534bc904f5abca70191", "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/66/bb/3f0591d11d845c285ceb0e322121",
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1f/88/26cc23cc420b9ee4484604d83f3b", "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/81/a4/21f0084dde2fc524b4683b5efed0",
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/02/62/6c4447768c7dc1b347d74f8bbb64", "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9f/03/dbe0091c812e01eb84b66de55b36",
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/0d/49/4e44dc53764b5024d38c5754ff04", "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/6a/c2/6784b83d7cc684260cf162fbee4c",
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/51/a4/836e5731f71d26ee8c768ac40dc9", "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/28/1e/781487d4d6464f27a43b3bb1c2f4",
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/41/ed/0d46c0017ebe8cfd9b335e03775f", "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/38/1a/a53ba81dd431860600bc5c21e0fa",
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/bd/38/2ebf14bb77f34100636c7f98b7ed", "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/f8/6f/0d0cf942205991c889722a116aab",
"build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/19/0e/aecf6e368c3142bab74abe064c59", "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/65/c8/47bc70c1b14593f5928d5d2c2b90",
"build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/94/9c/ca0b324101aca56c4b22a0134bfd", "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/ef/01/0bd5c7939ae809ddf0334927d24e",
"build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/9c/6f/0ddd22e0c4a14e1cce1d8371e7b3", "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/90/dc/491604fafce64d74578ab8f49f7b",
"build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/01/ea/cece952515d0ba6811fd03f7b7d7", "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/12/2d/96d202ba712d4efdcb61591e6e40",
"src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/f2/6c/5a0a4695dcc2a11e7941b8777e80", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/f2/6c/5a0a4695dcc2a11e7941b8777e80",
"src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/65/ac/d5c4162a71028c1bfa73ebc1f881" "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/65/ac/d5c4162a71028c1bfa73ebc1f881"
} }

View File

@ -1545,6 +1545,7 @@
<w>nowtickets</w> <w>nowtickets</w>
<w>npos</w> <w>npos</w>
<w>nprocessors</w> <w>nprocessors</w>
<w>nsworkspace</w>
<w>ntpath</w> <w>ntpath</w>
<w>ntriple</w> <w>ntriple</w>
<w>nturl</w> <w>nturl</w>
@ -1905,6 +1906,7 @@
<w>realpath</w> <w>realpath</w>
<w>realsies</w> <w>realsies</w>
<w>recache</w> <w>recache</w>
<w>recursed</w>
<w>recv</w> <w>recv</w>
<w>redist</w> <w>redist</w>
<w>redistributables</w> <w>redistributables</w>

View File

@ -726,6 +726,7 @@
<w>nowtickets</w> <w>nowtickets</w>
<w>nptr</w> <w>nptr</w>
<w>nsize</w> <w>nsize</w>
<w>nsworkspace</w>
<w>ntoa</w> <w>ntoa</w>
<w>ntohl</w> <w>ntohl</w>
<w>numargs</w> <w>numargs</w>
@ -894,6 +895,7 @@
<w>reallocations</w> <w>reallocations</w>
<w>realtimers</w> <w>realtimers</w>
<w>recalc</w> <w>recalc</w>
<w>recursed</w>
<w>recv</w> <w>recv</w>
<w>recvfrom</w> <w>recvfrom</w>
<w>redundants</w> <w>redundants</w>

View File

@ -32,7 +32,8 @@
"typing_extensions", "typing_extensions",
"cpplint", "cpplint",
"ansiwrap", "ansiwrap",
"filelock" "filelock",
"Cocoa"
], ],
"python_paths": [ "python_paths": [
"assets/src/ba_data/python", "assets/src/ba_data/python",

View File

@ -16,6 +16,9 @@ no_implicit_reexport = False
[mypy-ba.deprecated] [mypy-ba.deprecated]
no_implicit_reexport = False no_implicit_reexport = False
[mypy-Cocoa.*]
ignore_missing_imports = True
[mypy-pylint.*] [mypy-pylint.*]
ignore_missing_imports = True ignore_missing_imports = True

View File

@ -21,7 +21,7 @@
namespace ballistica { namespace ballistica {
// These are set automatically via script; don't modify them here. // These are set automatically via script; don't modify them here.
const int kAppBuildNumber = 20406; const int kAppBuildNumber = 20408;
const char* kAppVersion = "1.6.6"; const char* kAppVersion = "1.6.6";
// Our standalone globals. // Our standalone globals.

View File

@ -30,8 +30,7 @@ VERSION = 1
TOOL_NAME = 'bacloud' TOOL_NAME = 'bacloud'
# Set BACLOUD_SERVER env var to LOCAL to talk to a locally-run master-server. # Server we talk to (can override via env var).
# Set it to TEST to talk to the 'test' app-engine service.
MASTER_SERVER_URL = os.getenv('BACLOUD_SERVER_URL', MASTER_SERVER_URL = os.getenv('BACLOUD_SERVER_URL',
'https://bamaster.appspot.com') 'https://bamaster.appspot.com')
@ -55,11 +54,11 @@ class Response:
with subsequent commands. with subsequent commands.
logout: If True, any existing client-side token should be discarded. logout: If True, any existing client-side token should be discarded.
dir_manifest: If present, client should generate a manifest of this dir. dir_manifest: If present, client should generate a manifest of this dir.
It should be added to endcommand args as 'manifest'. It should be added to end_command args as 'manifest'.
uploads: If present, client should upload the requested files (arg1) uploads: If present, client should upload the requested files (arg1)
individually to a server command (arg2) with provided args (arg3). individually to a server command (arg2) with provided args (arg3).
uploads_inline: If present, a list of pathnames that should be base64 uploads_inline: If present, a list of pathnames that should be base64
gzipped and uploaded to an 'uploads_inline' dict in endcommand args. gzipped and uploaded to an 'uploads_inline' dict in end_command args.
This should be limited to relatively small files. This should be limited to relatively small files.
downloads_inline: If present, pathnames mapped to base64 gzipped data to downloads_inline: If present, pathnames mapped to base64 gzipped data to
be written to the client. This should only be used for relatively be written to the client. This should only be used for relatively
@ -69,7 +68,7 @@ class Response:
removed. removed.
open_url: If present, url to display to the user. open_url: If present, url to display to the user.
input_prompt: If present, a line of input is read and placed into input_prompt: If present, a line of input is read and placed into
endcommand args as 'input'. The first value is the prompt printed end_command args as 'input'. The first value is the prompt printed
before reading and the second is whether it should be read as a before reading and the second is whether it should be read as a
password (without echoing to the terminal). password (without echoing to the terminal).
end_message: If present, a message that should be printed after all other end_message: If present, a message that should be printed after all other

View File

@ -40,7 +40,7 @@ PIP_REQUIREMENTS = [
PipRequirement(modulename='ansiwrap'), PipRequirement(modulename='ansiwrap'),
PipRequirement(modulename='yaml', pipname='PyYAML'), PipRequirement(modulename='yaml', pipname='PyYAML'),
PipRequirement(modulename='requests'), PipRequirement(modulename='requests'),
PipRequirement(pipname='typing-extensions', minversion=[3, 10, 0, 0]), PipRequirement(pipname='typing_extensions', minversion=[4, 0, 0]),
PipRequirement(pipname='types-filelock', minversion=[0, 1, 5]), PipRequirement(pipname='types-filelock', minversion=[0, 1, 5]),
PipRequirement(pipname='types-requests', minversion=[2, 25, 6]), PipRequirement(pipname='types-requests', minversion=[2, 25, 6]),
PipRequirement(pipname='types-pytz', minversion=[2021, 1, 2]), PipRequirement(pipname='types-pytz', minversion=[2021, 1, 2]),

View File

@ -0,0 +1,142 @@
# Released under the MIT License. See LICENSE for details.
#
"""Operate on large sets of files efficiently."""
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from threading import Condition, Thread
import os
if TYPE_CHECKING:
from typing import Generator, Optional, Callable
class _FileBatchesRun:
def __init__(self,
paths: list[str],
batch_size: int,
file_filter: Optional[Callable[[str], bool]],
include_mac_packages: bool = False) -> None:
self.condition = Condition()
self.paths = paths
self.batches: list[list[str]] = []
self.batch_size = batch_size
self.done = False
self.errored = False
self.file_filter = file_filter
self.batch_buffer_size = 5
self._pending_batch: list[str] = []
self._include_mac_packages = include_mac_packages
if self._include_mac_packages:
# pylint: disable=no-name-in-module
from Cocoa import NSWorkspace
self._shared_nsworkspace = NSWorkspace.sharedWorkspace()
else:
self._shared_nsworkspace = None
def _submit_pending_batch(self) -> None:
assert self._pending_batch
# Wait until there's room on the list (or we've been marked done),
# stuff our new results in, and inform any listeners that it has
# changed.
with self.condition:
self.condition.wait_for(lambda: len(self.batches) < self.
batch_buffer_size or self.done)
self.batches.append(self._pending_batch)
self._pending_batch = []
self.condition.notify()
def _possibly_add_to_pending_batch(self, path: str) -> None:
try:
if self.file_filter is None or self.file_filter(path):
self._pending_batch.append(path)
if len(self._pending_batch) >= self.batch_size:
self._submit_pending_batch()
except Exception:
# FIXME: we should translate this into failing overall...
logging.exception('Error in file_filter')
def bg_thread(self) -> None:
"""Add batches in the bg thread."""
# pylint: disable=too-many-nested-blocks
# Build batches and push them when they're big enough.
for path in self.paths:
if os.path.isfile(path):
self._possibly_add_to_pending_batch(path)
elif os.path.isdir(path):
# From os.walk docs: we can prune dirs in-place when
# running in top-down mode. We can use this to skip
# diving into mac packages.
for root, dirs, fnames in os.walk(path, topdown=True):
# If we find dirs that are actually mac packages, pull
# them out of the dir list we'll dive into and pass
# them directly to our batch for processing.
if self._include_mac_packages:
for dirname in list(dirs):
fullpath = os.path.join(root, dirname)
if (self._shared_nsworkspace.isFilePackageAtPath_(
fullpath)):
dirs.remove(dirname)
self._possibly_add_to_pending_batch(fullpath)
for fname in fnames:
fullpath = os.path.join(root, fname)
self._possibly_add_to_pending_batch(fullpath)
if self._pending_batch:
self._submit_pending_batch()
# Tell the world we're done.
with self.condition:
self.done = True
self.condition.notify()
def file_batches(
paths: list[str],
batch_size: int = 1,
file_filter: Optional[Callable[[str], bool]] = None,
include_mac_packages: bool = False,
) -> Generator[list[str], None, None]:
"""Efficiently yield batches of files to operate on.
Accepts a list of paths which can be files or directories to be recursed.
The batch lists are buffered in a background thread so time-consuming
synchronous operations on the returned batches will not slow the gather.
"""
run = _FileBatchesRun(paths=paths,
batch_size=batch_size,
file_filter=file_filter,
include_mac_packages=include_mac_packages)
# Spin up a bg thread to feed us batches.
thread = Thread(target=run.bg_thread)
thread.start()
# Now spin waiting for new batches to come in or completion/errors.
while True:
with run.condition:
run.condition.wait_for(lambda: run.done or run.errored or run.
batches)
try:
if run.errored:
raise RuntimeError('BG batch run errored.')
while run.batches:
yield run.batches.pop(0)
if run.done:
break
except GeneratorExit:
# Lets the bg thread know to abort.
run.done = True
raise
finally:
run.condition.notify()