Nuitka-winsvc 1.8__cp311-cp311-win_amd64.whl → 2.5.1__cp311-cp311-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Nuitka-winsvc might be problematic. Click here for more details.

Files changed (728) hide show
  1. Nuitka_winsvc-1.8.data/scripts/nuitka-run.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka-run.cmd +9 -9
  2. Nuitka_winsvc-1.8.data/scripts/nuitka.bat → Nuitka_winsvc-2.5.1.data/scripts/nuitka.cmd +15 -15
  3. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/METADATA +5 -3
  4. Nuitka_winsvc-2.5.1.dist-info/RECORD +977 -0
  5. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/WHEEL +1 -1
  6. nuitka/Builtins.py +49 -17
  7. nuitka/BytecodeCaching.py +24 -20
  8. nuitka/Bytecodes.py +23 -19
  9. nuitka/CacheCleanup.py +28 -23
  10. nuitka/Constants.py +19 -17
  11. nuitka/Errors.py +23 -17
  12. nuitka/HardImportRegistry.py +408 -0
  13. nuitka/MainControl.py +209 -116
  14. nuitka/ModuleRegistry.py +83 -20
  15. nuitka/OptionParsing.py +467 -221
  16. nuitka/Options.py +701 -225
  17. nuitka/OutputDirectories.py +47 -23
  18. nuitka/PostProcessing.py +133 -79
  19. nuitka/Progress.py +73 -24
  20. nuitka/PythonFlavors.py +141 -32
  21. nuitka/PythonOperators.py +18 -17
  22. nuitka/PythonVersions.py +107 -19
  23. nuitka/Serialization.py +70 -55
  24. nuitka/SourceCodeReferences.py +19 -17
  25. nuitka/Tracing.py +176 -70
  26. nuitka/TreeXML.py +31 -26
  27. nuitka/Variables.py +39 -41
  28. nuitka/Version.py +22 -8
  29. nuitka/__init__.py +5 -4
  30. nuitka/__main__.py +95 -29
  31. nuitka/__past__.py +44 -34
  32. nuitka/build/Backend.scons +243 -141
  33. nuitka/build/CCompilerVersion.scons +45 -31
  34. nuitka/build/DataComposerInterface.py +20 -17
  35. nuitka/build/Onefile.scons +56 -54
  36. nuitka/build/SconsCaching.py +105 -92
  37. nuitka/build/SconsCompilerSettings.py +167 -68
  38. nuitka/build/SconsHacks.py +25 -19
  39. nuitka/build/SconsInterface.py +155 -54
  40. nuitka/build/SconsProgress.py +19 -18
  41. nuitka/build/SconsSpawn.py +62 -33
  42. nuitka/build/SconsUtils.py +152 -55
  43. nuitka/build/__init__.py +5 -4
  44. nuitka/build/include/nuitka/allocator.h +228 -22
  45. nuitka/build/include/nuitka/builtins.h +17 -17
  46. nuitka/build/include/nuitka/calling.h +24 -24
  47. nuitka/build/include/nuitka/checkers.h +17 -18
  48. nuitka/build/include/nuitka/checksum_tools.h +14 -19
  49. nuitka/build/include/nuitka/compiled_asyncgen.h +28 -25
  50. nuitka/build/include/nuitka/compiled_cell.h +33 -18
  51. nuitka/build/include/nuitka/compiled_coroutine.h +18 -18
  52. nuitka/build/include/nuitka/compiled_frame.h +93 -54
  53. nuitka/build/include/nuitka/compiled_function.h +42 -20
  54. nuitka/build/include/nuitka/compiled_generator.h +24 -18
  55. nuitka/build/include/nuitka/compiled_method.h +17 -18
  56. nuitka/build/include/nuitka/constants.h +35 -18
  57. nuitka/build/include/nuitka/constants_blob.h +17 -17
  58. nuitka/build/include/nuitka/debug_settings.h +60 -0
  59. nuitka/build/include/nuitka/environment_variables.h +30 -0
  60. nuitka/build/include/nuitka/environment_variables_system.h +45 -0
  61. nuitka/build/include/nuitka/exception_groups.h +23 -26
  62. nuitka/build/include/nuitka/exceptions.h +717 -171
  63. nuitka/build/include/nuitka/filesystem_paths.h +26 -20
  64. nuitka/build/include/nuitka/freelists.h +38 -18
  65. nuitka/build/include/nuitka/helper/attributes.h +24 -22
  66. nuitka/build/include/nuitka/helper/boolean.h +17 -17
  67. nuitka/build/include/nuitka/helper/bytearrays.h +17 -17
  68. nuitka/build/include/nuitka/helper/bytes.h +14 -15
  69. nuitka/build/include/nuitka/helper/calling_generated.h +69 -69
  70. nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
  71. nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
  72. nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
  73. nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
  74. nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
  75. nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
  76. nuitka/build/include/nuitka/helper/comparisons_eq.h +17 -17
  77. nuitka/build/include/nuitka/helper/comparisons_ge.h +17 -17
  78. nuitka/build/include/nuitka/helper/comparisons_gt.h +17 -17
  79. nuitka/build/include/nuitka/helper/comparisons_le.h +17 -17
  80. nuitka/build/include/nuitka/helper/comparisons_lt.h +17 -17
  81. nuitka/build/include/nuitka/helper/comparisons_ne.h +17 -17
  82. nuitka/build/include/nuitka/helper/complex.h +17 -17
  83. nuitka/build/include/nuitka/helper/dictionaries.h +89 -51
  84. nuitka/build/include/nuitka/helper/floats.h +17 -18
  85. nuitka/build/include/nuitka/helper/import_hard.h +25 -17
  86. nuitka/build/include/nuitka/helper/indexes.h +17 -18
  87. nuitka/build/include/nuitka/helper/ints.h +115 -54
  88. nuitka/build/include/nuitka/helper/iterators.h +99 -51
  89. nuitka/build/include/nuitka/helper/lists.h +26 -24
  90. nuitka/build/include/nuitka/helper/lists_generated.h +22 -22
  91. nuitka/build/include/nuitka/helper/mappings.h +17 -18
  92. nuitka/build/include/nuitka/helper/operations.h +20 -17
  93. nuitka/build/include/nuitka/helper/operations_binary_add.h +23 -17
  94. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +17 -17
  95. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +17 -17
  96. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +17 -17
  97. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +17 -17
  98. nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
  99. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +17 -17
  100. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +17 -17
  101. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +17 -17
  102. nuitka/build/include/nuitka/helper/operations_binary_mod.h +17 -17
  103. nuitka/build/include/nuitka/helper/operations_binary_mult.h +17 -17
  104. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +17 -17
  105. nuitka/build/include/nuitka/helper/operations_binary_pow.h +17 -17
  106. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +17 -17
  107. nuitka/build/include/nuitka/helper/operations_binary_sub.h +23 -17
  108. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +17 -17
  109. nuitka/build/include/nuitka/helper/operations_builtin_types.h +17 -17
  110. nuitka/build/include/nuitka/helper/operations_inplace_add.h +20 -17
  111. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +17 -17
  112. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +17 -17
  113. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +17 -17
  114. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +17 -17
  115. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +17 -17
  116. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +17 -17
  117. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +17 -17
  118. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +17 -17
  119. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +17 -17
  120. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +17 -17
  121. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +17 -17
  122. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +20 -17
  123. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +17 -17
  124. nuitka/build/include/nuitka/helper/raising.h +68 -37
  125. nuitka/build/include/nuitka/helper/rangeobjects.h +17 -17
  126. nuitka/build/include/nuitka/helper/richcomparisons.h +21 -14
  127. nuitka/build/include/nuitka/helper/sequences.h +19 -13
  128. nuitka/build/include/nuitka/helper/sets.h +11 -12
  129. nuitka/build/include/nuitka/helper/slices.h +31 -25
  130. nuitka/build/include/nuitka/helper/strings.h +16 -17
  131. nuitka/build/include/nuitka/helper/subscripts.h +18 -201
  132. nuitka/build/include/nuitka/helper/tuples.h +64 -52
  133. nuitka/build/include/nuitka/helpers.h +50 -22
  134. nuitka/build/include/nuitka/importing.h +28 -21
  135. nuitka/build/include/nuitka/jit_sources.h +25 -0
  136. nuitka/build/include/nuitka/prelude.h +163 -71
  137. nuitka/build/include/nuitka/printing.h +29 -22
  138. nuitka/build/include/nuitka/python_pgo.h +19 -18
  139. nuitka/build/include/nuitka/safe_string_ops.h +20 -18
  140. nuitka/build/include/nuitka/threading.h +45 -32
  141. nuitka/build/include/nuitka/tracing.h +28 -18
  142. nuitka/build/include/nuitka/type_aliases.h +30 -0
  143. nuitka/build/include/nuitka/unfreezing.h +29 -23
  144. nuitka/build/inline_copy/bin/scons.py +14 -0
  145. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +6 -6
  146. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +0 -3
  147. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  148. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  149. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  150. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  151. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  152. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  153. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  154. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  155. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  156. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  157. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  158. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  159. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  160. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  161. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  162. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  163. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  164. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  165. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  166. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  167. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  168. nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
  169. nuitka/build/inline_copy/stubgen/six.py +998 -0
  170. nuitka/build/inline_copy/stubgen/stubgen.py +307 -0
  171. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
  172. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +4 -1
  173. nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
  174. nuitka/build/inline_copy/tqdm/tqdm/version.py +1 -8
  175. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  176. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  177. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  178. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  179. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  180. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  181. nuitka/build/static_src/CompiledAsyncgenType.c +221 -221
  182. nuitka/build/static_src/CompiledCellType.c +69 -44
  183. nuitka/build/static_src/CompiledCodeHelpers.c +276 -159
  184. nuitka/build/static_src/CompiledCoroutineType.c +229 -226
  185. nuitka/build/static_src/CompiledFrameType.c +323 -138
  186. nuitka/build/static_src/CompiledFunctionType.c +547 -231
  187. nuitka/build/static_src/CompiledGeneratorType.c +416 -290
  188. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +593 -228
  189. nuitka/build/static_src/CompiledMethodType.c +91 -82
  190. nuitka/build/static_src/HelpersAllocator.c +352 -45
  191. nuitka/build/static_src/HelpersAttributes.c +30 -72
  192. nuitka/build/static_src/HelpersBuiltin.c +65 -46
  193. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +17 -17
  194. nuitka/build/static_src/HelpersBytes.c +19 -20
  195. nuitka/build/static_src/HelpersCalling.c +40 -37
  196. nuitka/build/static_src/HelpersCallingGenerated.c +1061 -242
  197. nuitka/build/static_src/HelpersChecksumTools.c +35 -21
  198. nuitka/build/static_src/HelpersClasses.c +17 -17
  199. nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
  200. nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
  201. nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
  202. nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
  203. nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
  204. nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
  205. nuitka/build/static_src/HelpersComparisonEq.c +536 -496
  206. nuitka/build/static_src/HelpersComparisonEqUtils.c +22 -19
  207. nuitka/build/static_src/HelpersComparisonGe.c +531 -501
  208. nuitka/build/static_src/HelpersComparisonGt.c +530 -500
  209. nuitka/build/static_src/HelpersComparisonLe.c +531 -501
  210. nuitka/build/static_src/HelpersComparisonLt.c +530 -500
  211. nuitka/build/static_src/HelpersComparisonNe.c +538 -496
  212. nuitka/build/static_src/HelpersConsole.c +122 -0
  213. nuitka/build/static_src/HelpersConstantsBlob.c +550 -521
  214. nuitka/build/static_src/HelpersDeepcopy.c +33 -33
  215. nuitka/build/static_src/HelpersDictionaries.c +232 -63
  216. nuitka/build/static_src/HelpersDictionariesGenerated.c +130 -127
  217. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  218. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  219. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +93 -0
  220. nuitka/build/static_src/HelpersExceptions.c +147 -62
  221. nuitka/build/static_src/HelpersFiles.c +116 -22
  222. nuitka/build/static_src/HelpersFilesystemPaths.c +292 -181
  223. nuitka/build/static_src/HelpersFloats.c +37 -31
  224. nuitka/build/static_src/HelpersHeapStorage.c +21 -17
  225. nuitka/build/static_src/HelpersImport.c +61 -29
  226. nuitka/build/static_src/HelpersImportHard.c +74 -61
  227. nuitka/build/static_src/HelpersJitSources.c +46 -0
  228. nuitka/build/static_src/HelpersLists.c +237 -58
  229. nuitka/build/static_src/HelpersListsGenerated.c +41 -41
  230. nuitka/build/static_src/HelpersMappings.c +17 -17
  231. nuitka/build/static_src/HelpersMatching.c +137 -51
  232. nuitka/build/static_src/HelpersOperationBinaryAdd.c +397 -152
  233. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +102 -52
  234. nuitka/build/static_src/HelpersOperationBinaryBitand.c +55 -55
  235. nuitka/build/static_src/HelpersOperationBinaryBitor.c +55 -55
  236. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +55 -55
  237. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +49 -43
  238. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +17 -17
  239. nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
  240. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +55 -49
  241. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +20 -21
  242. nuitka/build/static_src/HelpersOperationBinaryLshift.c +83 -83
  243. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +25 -24
  244. nuitka/build/static_src/HelpersOperationBinaryMod.c +129 -117
  245. nuitka/build/static_src/HelpersOperationBinaryMult.c +98 -82
  246. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +33 -30
  247. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +55 -49
  248. nuitka/build/static_src/HelpersOperationBinaryPow.c +68 -68
  249. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +12 -12
  250. nuitka/build/static_src/HelpersOperationBinaryRshift.c +51 -51
  251. nuitka/build/static_src/HelpersOperationBinarySub.c +309 -88
  252. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +49 -43
  253. nuitka/build/static_src/HelpersOperationInplaceAdd.c +333 -163
  254. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +24 -22
  255. nuitka/build/static_src/HelpersOperationInplaceBitand.c +58 -58
  256. nuitka/build/static_src/HelpersOperationInplaceBitor.c +58 -58
  257. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +58 -58
  258. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +73 -68
  259. nuitka/build/static_src/HelpersOperationInplaceLshift.c +64 -64
  260. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +38 -37
  261. nuitka/build/static_src/HelpersOperationInplaceMod.c +145 -140
  262. nuitka/build/static_src/HelpersOperationInplaceMult.c +89 -84
  263. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +73 -68
  264. nuitka/build/static_src/HelpersOperationInplacePow.c +82 -82
  265. nuitka/build/static_src/HelpersOperationInplaceRshift.c +48 -48
  266. nuitka/build/static_src/HelpersOperationInplaceSub.c +275 -122
  267. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +68 -63
  268. nuitka/build/static_src/HelpersProfiling.c +25 -24
  269. nuitka/build/static_src/HelpersPythonPgo.c +22 -22
  270. nuitka/build/static_src/HelpersRaising.c +296 -283
  271. nuitka/build/static_src/HelpersSafeStrings.c +34 -22
  272. nuitka/build/static_src/HelpersSequences.c +18 -19
  273. nuitka/build/static_src/HelpersSlices.c +29 -23
  274. nuitka/build/static_src/HelpersStrings.c +235 -38
  275. nuitka/build/static_src/HelpersTuples.c +46 -34
  276. nuitka/build/static_src/HelpersTypes.c +166 -25
  277. nuitka/build/static_src/InspectPatcher.c +108 -27
  278. nuitka/build/static_src/MainProgram.c +464 -280
  279. nuitka/build/static_src/MetaPathBasedLoader.c +381 -257
  280. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +39 -26
  281. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +17 -18
  282. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +227 -29
  283. nuitka/build/static_src/OnefileBootstrap.c +281 -164
  284. nuitka/build/static_src/OnefileSplashScreen.cpp +51 -27
  285. nuitka/code_generation/AsyncgenCodes.py +21 -23
  286. nuitka/code_generation/AttributeCodes.py +31 -27
  287. nuitka/code_generation/BinaryOperationHelperDefinitions.py +290 -184
  288. nuitka/code_generation/BranchCodes.py +19 -17
  289. nuitka/code_generation/BuiltinCodes.py +29 -18
  290. nuitka/code_generation/CallCodes.py +35 -33
  291. nuitka/code_generation/ClassCodes.py +19 -17
  292. nuitka/code_generation/CodeGeneration.py +61 -28
  293. nuitka/code_generation/CodeHelperSelection.py +20 -18
  294. nuitka/code_generation/CodeHelpers.py +28 -21
  295. nuitka/code_generation/CodeObjectCodes.py +36 -26
  296. nuitka/code_generation/ComparisonCodes.py +51 -22
  297. nuitka/code_generation/ComparisonHelperDefinitions.py +42 -25
  298. nuitka/code_generation/ConditionalCodes.py +19 -17
  299. nuitka/code_generation/ConstantCodes.py +82 -28
  300. nuitka/code_generation/Contexts.py +180 -42
  301. nuitka/code_generation/CoroutineCodes.py +21 -23
  302. nuitka/code_generation/CtypesCodes.py +19 -17
  303. nuitka/code_generation/DictCodes.py +28 -26
  304. nuitka/code_generation/Emission.py +21 -18
  305. nuitka/code_generation/ErrorCodes.py +57 -79
  306. nuitka/code_generation/EvalCodes.py +24 -20
  307. nuitka/code_generation/ExceptionCodes.py +182 -104
  308. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +45 -27
  309. nuitka/code_generation/ExpressionCodes.py +19 -17
  310. nuitka/code_generation/FrameCodes.py +28 -31
  311. nuitka/code_generation/FunctionCodes.py +26 -27
  312. nuitka/code_generation/GeneratorCodes.py +25 -26
  313. nuitka/code_generation/GlobalConstants.py +51 -25
  314. nuitka/code_generation/GlobalsLocalsCodes.py +23 -21
  315. nuitka/code_generation/IdCodes.py +19 -17
  316. nuitka/code_generation/ImportCodes.py +90 -50
  317. nuitka/code_generation/Indentation.py +23 -22
  318. nuitka/code_generation/IndexCodes.py +19 -17
  319. nuitka/code_generation/InjectCCodes.py +14 -12
  320. nuitka/code_generation/IntegerCodes.py +19 -17
  321. nuitka/code_generation/IteratorCodes.py +86 -71
  322. nuitka/code_generation/JitCodes.py +44 -0
  323. nuitka/code_generation/LabelCodes.py +19 -17
  324. nuitka/code_generation/LineNumberCodes.py +20 -20
  325. nuitka/code_generation/ListCodes.py +32 -36
  326. nuitka/code_generation/LoaderCodes.py +22 -17
  327. nuitka/code_generation/LocalsDictCodes.py +56 -32
  328. nuitka/code_generation/LoopCodes.py +19 -17
  329. nuitka/code_generation/MatchCodes.py +42 -22
  330. nuitka/code_generation/ModuleCodes.py +71 -29
  331. nuitka/code_generation/Namify.py +27 -23
  332. nuitka/code_generation/NetworkxCodes.py +51 -0
  333. nuitka/code_generation/OperationCodes.py +80 -51
  334. nuitka/code_generation/PackageResourceCodes.py +96 -23
  335. nuitka/code_generation/PrintCodes.py +19 -17
  336. nuitka/code_generation/PythonAPICodes.py +19 -17
  337. nuitka/code_generation/RaisingCodes.py +183 -107
  338. nuitka/code_generation/Reports.py +32 -22
  339. nuitka/code_generation/ReturnCodes.py +20 -32
  340. nuitka/code_generation/SetCodes.py +19 -17
  341. nuitka/code_generation/SliceCodes.py +22 -20
  342. nuitka/code_generation/StringCodes.py +19 -17
  343. nuitka/code_generation/SubscriptCodes.py +24 -30
  344. nuitka/code_generation/TensorflowCodes.py +54 -0
  345. nuitka/code_generation/TryCodes.py +31 -41
  346. nuitka/code_generation/TupleCodes.py +20 -18
  347. nuitka/code_generation/TypeAliasCodes.py +119 -0
  348. nuitka/code_generation/VariableCodes.py +118 -55
  349. nuitka/code_generation/VariableDeclarations.py +28 -25
  350. nuitka/code_generation/YieldCodes.py +23 -21
  351. nuitka/code_generation/__init__.py +5 -4
  352. nuitka/code_generation/c_types/CTypeBases.py +29 -19
  353. nuitka/code_generation/c_types/CTypeBooleans.py +19 -17
  354. nuitka/code_generation/c_types/CTypeCFloats.py +19 -17
  355. nuitka/code_generation/c_types/CTypeCLongs.py +19 -18
  356. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +22 -17
  357. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +22 -21
  358. nuitka/code_generation/c_types/CTypeNuitkaInts.py +89 -43
  359. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +20 -18
  360. nuitka/code_generation/c_types/CTypePyObjectPointers.py +43 -31
  361. nuitka/code_generation/c_types/CTypeVoids.py +20 -17
  362. nuitka/code_generation/c_types/__init__.py +5 -4
  363. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +20 -19
  364. nuitka/code_generation/templates/CodeTemplatesConstants.py +143 -39
  365. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +20 -19
  366. nuitka/code_generation/templates/CodeTemplatesExceptions.py +33 -33
  367. nuitka/code_generation/templates/CodeTemplatesFrames.py +36 -27
  368. nuitka/code_generation/templates/CodeTemplatesFunction.py +20 -19
  369. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +21 -19
  370. nuitka/code_generation/templates/CodeTemplatesIterators.py +19 -53
  371. nuitka/code_generation/templates/CodeTemplatesLoader.py +25 -19
  372. nuitka/code_generation/templates/CodeTemplatesModules.py +278 -169
  373. nuitka/code_generation/templates/CodeTemplatesVariables.py +115 -27
  374. nuitka/code_generation/templates/TemplateDebugWrapper.py +19 -18
  375. nuitka/code_generation/templates/__init__.py +5 -4
  376. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +19 -19
  377. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +21 -21
  378. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +79 -28
  379. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +22 -22
  380. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +19 -19
  381. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +19 -19
  382. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +17 -17
  383. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +74 -106
  384. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +19 -20
  385. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +19 -19
  386. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +6 -6
  387. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +23 -23
  388. nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
  389. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +35 -35
  390. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +37 -37
  391. nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
  392. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +17 -17
  393. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +18 -18
  394. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +50 -38
  395. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +27 -27
  396. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +37 -37
  397. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +31 -31
  398. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +35 -31
  399. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +20 -20
  400. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +28 -28
  401. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +17 -17
  402. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +17 -17
  403. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +17 -17
  404. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +48 -48
  405. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +21 -18
  406. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +27 -25
  407. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +17 -17
  408. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +17 -17
  409. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +21 -18
  410. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +17 -17
  411. nuitka/containers/Namedtuples.py +25 -18
  412. nuitka/containers/OrderedSets.py +105 -5
  413. nuitka/containers/OrderedSetsFallback.py +19 -17
  414. nuitka/containers/__init__.py +5 -4
  415. nuitka/distutils/Build.py +33 -18
  416. nuitka/distutils/DistutilCommands.py +84 -33
  417. nuitka/distutils/__init__.py +5 -4
  418. nuitka/finalizations/Finalization.py +21 -18
  419. nuitka/finalizations/FinalizeMarkups.py +31 -55
  420. nuitka/finalizations/__init__.py +5 -4
  421. nuitka/freezer/DependsExe.py +60 -30
  422. nuitka/freezer/DllDependenciesCommon.py +47 -20
  423. nuitka/freezer/DllDependenciesMacOS.py +165 -58
  424. nuitka/freezer/DllDependenciesPosix.py +29 -19
  425. nuitka/freezer/DllDependenciesWin32.py +55 -33
  426. nuitka/freezer/ImportDetection.py +23 -17
  427. nuitka/freezer/IncludedDataFiles.py +142 -48
  428. nuitka/freezer/IncludedEntryPoints.py +104 -39
  429. nuitka/freezer/Onefile.py +32 -22
  430. nuitka/freezer/Standalone.py +166 -53
  431. nuitka/freezer/__init__.py +5 -4
  432. nuitka/importing/IgnoreListing.py +19 -17
  433. nuitka/importing/ImportCache.py +24 -21
  434. nuitka/importing/ImportResolving.py +103 -95
  435. nuitka/importing/Importing.py +319 -98
  436. nuitka/importing/PreloadedPackages.py +21 -18
  437. nuitka/importing/Recursion.py +142 -47
  438. nuitka/importing/StandardLibrary.py +96 -80
  439. nuitka/importing/__init__.py +5 -4
  440. nuitka/nodes/AsyncgenNodes.py +22 -23
  441. nuitka/nodes/AttributeLookupNodes.py +19 -17
  442. nuitka/nodes/AttributeNodes.py +19 -17
  443. nuitka/nodes/AttributeNodesGenerated.py +49 -24
  444. nuitka/nodes/BuiltinAllNodes.py +19 -17
  445. nuitka/nodes/BuiltinAnyNodes.py +19 -17
  446. nuitka/nodes/BuiltinComplexNodes.py +20 -17
  447. nuitka/nodes/BuiltinDecodingNodes.py +19 -17
  448. nuitka/nodes/BuiltinDecoratorNodes.py +19 -17
  449. nuitka/nodes/BuiltinDictNodes.py +19 -17
  450. nuitka/nodes/BuiltinFormatNodes.py +20 -17
  451. nuitka/nodes/BuiltinHashNodes.py +19 -17
  452. nuitka/nodes/BuiltinInputNodes.py +19 -17
  453. nuitka/nodes/BuiltinIntegerNodes.py +19 -17
  454. nuitka/nodes/BuiltinIteratorNodes.py +25 -21
  455. nuitka/nodes/BuiltinLenNodes.py +19 -17
  456. nuitka/nodes/BuiltinNextNodes.py +19 -17
  457. nuitka/nodes/BuiltinOpenNodes.py +52 -18
  458. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +40 -23
  459. nuitka/nodes/BuiltinRangeNodes.py +21 -19
  460. nuitka/nodes/BuiltinRefNodes.py +73 -40
  461. nuitka/nodes/BuiltinSumNodes.py +20 -18
  462. nuitka/nodes/BuiltinTypeNodes.py +19 -17
  463. nuitka/nodes/BuiltinVarsNodes.py +19 -18
  464. nuitka/nodes/BytesNodes.py +19 -17
  465. nuitka/nodes/CallNodes.py +19 -17
  466. nuitka/nodes/Checkers.py +19 -17
  467. nuitka/nodes/ChildrenHavingMixins.py +1624 -283
  468. nuitka/nodes/ClassNodes.py +49 -29
  469. nuitka/nodes/CodeObjectSpecs.py +29 -18
  470. nuitka/nodes/ComparisonNodes.py +19 -17
  471. nuitka/nodes/ConditionalNodes.py +24 -25
  472. nuitka/nodes/ConstantRefNodes.py +57 -17
  473. nuitka/nodes/ContainerMakingNodes.py +19 -17
  474. nuitka/nodes/ContainerOperationNodes.py +19 -17
  475. nuitka/nodes/CoroutineNodes.py +22 -23
  476. nuitka/nodes/CtypesNodes.py +19 -18
  477. nuitka/nodes/DictionaryNodes.py +19 -18
  478. nuitka/nodes/ExceptionNodes.py +131 -43
  479. nuitka/nodes/ExecEvalNodes.py +19 -17
  480. nuitka/nodes/ExpressionBases.py +34 -26
  481. nuitka/nodes/ExpressionBasesGenerated.py +341 -35
  482. nuitka/nodes/ExpressionShapeMixins.py +19 -17
  483. nuitka/nodes/FrameNodes.py +41 -28
  484. nuitka/nodes/FunctionAttributeNodes.py +19 -17
  485. nuitka/nodes/FunctionNodes.py +84 -38
  486. nuitka/nodes/FutureSpecs.py +35 -20
  487. nuitka/nodes/GeneratorNodes.py +24 -25
  488. nuitka/nodes/GlobalsLocalsNodes.py +22 -17
  489. nuitka/nodes/HardImportNodesGenerated.py +746 -148
  490. nuitka/nodes/ImportHardNodes.py +46 -38
  491. nuitka/nodes/ImportNodes.py +438 -448
  492. nuitka/nodes/IndicatorMixins.py +19 -17
  493. nuitka/nodes/InjectCNodes.py +19 -18
  494. nuitka/nodes/IterationHandles.py +55 -34
  495. nuitka/nodes/KeyValuePairNodes.py +19 -17
  496. nuitka/nodes/ListOperationNodes.py +33 -21
  497. nuitka/nodes/LocalsDictNodes.py +19 -17
  498. nuitka/nodes/LocalsScopes.py +41 -41
  499. nuitka/nodes/LoopNodes.py +28 -17
  500. nuitka/nodes/MatchNodes.py +37 -24
  501. nuitka/nodes/ModuleAttributeNodes.py +18 -35
  502. nuitka/nodes/ModuleNodes.py +90 -31
  503. nuitka/nodes/NetworkxNodes.py +45 -0
  504. nuitka/nodes/NodeBases.py +73 -44
  505. nuitka/nodes/NodeMakingHelpers.py +92 -69
  506. nuitka/nodes/NodeMetaClasses.py +45 -28
  507. nuitka/nodes/OperatorNodes.py +28 -26
  508. nuitka/nodes/OperatorNodesUnary.py +148 -20
  509. nuitka/nodes/OsSysNodes.py +97 -18
  510. nuitka/nodes/OutlineNodes.py +24 -22
  511. nuitka/nodes/PackageMetadataNodes.py +37 -27
  512. nuitka/nodes/PackageResourceNodes.py +29 -23
  513. nuitka/nodes/PrintNodes.py +19 -17
  514. nuitka/nodes/ReturnNodes.py +20 -18
  515. nuitka/nodes/SideEffectNodes.py +19 -17
  516. nuitka/nodes/SliceNodes.py +20 -18
  517. nuitka/nodes/StatementBasesGenerated.py +125 -79
  518. nuitka/nodes/StatementNodes.py +27 -24
  519. nuitka/nodes/StrNodes.py +19 -17
  520. nuitka/nodes/StringConcatenationNodes.py +20 -17
  521. nuitka/nodes/SubscriptNodes.py +27 -25
  522. nuitka/nodes/TensorflowNodes.py +38 -0
  523. nuitka/nodes/TryNodes.py +19 -17
  524. nuitka/nodes/TypeMatchNodes.py +19 -17
  525. nuitka/nodes/TypeNodes.py +68 -18
  526. nuitka/nodes/VariableAssignNodes.py +122 -64
  527. nuitka/nodes/VariableDelNodes.py +19 -17
  528. nuitka/nodes/VariableNameNodes.py +19 -17
  529. nuitka/nodes/VariableRefNodes.py +63 -26
  530. nuitka/nodes/VariableReleaseNodes.py +19 -17
  531. nuitka/nodes/YieldNodes.py +21 -19
  532. nuitka/nodes/__init__.py +5 -4
  533. nuitka/nodes/shapes/BuiltinTypeShapes.py +169 -46
  534. nuitka/nodes/shapes/ControlFlowDescriptions.py +19 -17
  535. nuitka/nodes/shapes/ShapeMixins.py +57 -17
  536. nuitka/nodes/shapes/StandardShapes.py +80 -21
  537. nuitka/nodes/shapes/__init__.py +5 -4
  538. nuitka/optimizations/BytecodeDemotion.py +21 -18
  539. nuitka/optimizations/FunctionInlining.py +22 -23
  540. nuitka/optimizations/Graphs.py +19 -17
  541. nuitka/optimizations/Optimization.py +39 -35
  542. nuitka/optimizations/OptimizeBuiltinCalls.py +31 -27
  543. nuitka/optimizations/Tags.py +19 -18
  544. nuitka/optimizations/TraceCollections.py +67 -24
  545. nuitka/optimizations/ValueTraces.py +92 -25
  546. nuitka/optimizations/__init__.py +5 -4
  547. nuitka/pgo/PGO.py +33 -23
  548. nuitka/pgo/__init__.py +5 -4
  549. nuitka/plugins/PluginBase.py +655 -112
  550. nuitka/plugins/Plugins.py +247 -61
  551. nuitka/plugins/YamlPluginBase.py +121 -0
  552. nuitka/plugins/__init__.py +5 -4
  553. nuitka/plugins/standard/AntiBloatPlugin.py +374 -135
  554. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +20 -19
  555. nuitka/plugins/standard/DataFilesPlugin.py +65 -29
  556. nuitka/plugins/standard/DelvewheelPlugin.py +32 -24
  557. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  558. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +256 -0
  559. nuitka/plugins/standard/DillPlugin.py +42 -134
  560. nuitka/plugins/standard/DllFilesPlugin.py +125 -42
  561. nuitka/plugins/standard/EnumPlugin.py +19 -17
  562. nuitka/plugins/standard/EventletPlugin.py +19 -17
  563. nuitka/plugins/standard/GeventPlugin.py +19 -17
  564. nuitka/plugins/standard/GiPlugin.py +44 -28
  565. nuitka/plugins/standard/GlfwPlugin.py +20 -17
  566. nuitka/plugins/standard/ImplicitImports.py +403 -54
  567. nuitka/plugins/standard/KivyPlugin.py +24 -20
  568. nuitka/plugins/standard/MatplotlibPlugin.py +99 -42
  569. nuitka/plugins/standard/MultiprocessingPlugin.py +35 -39
  570. nuitka/plugins/standard/NumpyPlugin.py +19 -17
  571. nuitka/plugins/standard/OptionsNannyPlugin.py +48 -76
  572. nuitka/plugins/standard/PbrPlugin.py +21 -19
  573. nuitka/plugins/standard/PkgResourcesPlugin.py +34 -23
  574. nuitka/plugins/standard/PlaywrightPlugin.py +184 -0
  575. nuitka/plugins/standard/PmwPlugin.py +30 -27
  576. nuitka/plugins/standard/PySidePyQtPlugin.py +82 -80
  577. nuitka/plugins/standard/PywebViewPlugin.py +19 -17
  578. nuitka/plugins/standard/SpacyPlugin.py +136 -0
  579. nuitka/plugins/standard/TensorflowPlugin.py +20 -17
  580. nuitka/plugins/standard/TkinterPlugin.py +102 -108
  581. nuitka/plugins/standard/TorchPlugin.py +20 -17
  582. nuitka/plugins/standard/TransformersPlugin.py +90 -231
  583. nuitka/plugins/standard/TrioPlugin.py +18 -15
  584. nuitka/plugins/standard/UpxPlugin.py +21 -19
  585. nuitka/plugins/standard/__init__.py +5 -4
  586. nuitka/plugins/standard/standard.nuitka-package.config.yml +3925 -1293
  587. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +14 -14
  588. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +154 -66
  589. nuitka/reports/CompilationReportReader.py +79 -0
  590. nuitka/reports/LicenseReport.rst.j2 +21 -21
  591. nuitka/reports/Reports.py +363 -76
  592. nuitka/reports/__init__.py +5 -4
  593. nuitka/specs/BuiltinBytesOperationSpecs.py +18 -17
  594. nuitka/specs/BuiltinDictOperationSpecs.py +18 -17
  595. nuitka/specs/BuiltinListOperationSpecs.py +18 -17
  596. nuitka/specs/BuiltinParameterSpecs.py +35 -21
  597. nuitka/specs/BuiltinStrOperationSpecs.py +19 -18
  598. nuitka/specs/BuiltinTypeOperationSpecs.py +18 -18
  599. nuitka/specs/BuiltinUnicodeOperationSpecs.py +18 -17
  600. nuitka/specs/HardImportSpecs.py +74 -22
  601. nuitka/specs/ParameterSpecs.py +60 -45
  602. nuitka/specs/__init__.py +5 -4
  603. nuitka/tools/Basics.py +20 -18
  604. nuitka/tools/__init__.py +5 -4
  605. nuitka/tools/commercial/__init__.py +7 -6
  606. nuitka/tools/data_composer/DataComposer.py +78 -62
  607. nuitka/tools/data_composer/__init__.py +5 -4
  608. nuitka/tools/data_composer/__main__.py +18 -17
  609. nuitka/tools/environments/CreateEnvironment.py +20 -17
  610. nuitka/tools/environments/Virtualenv.py +60 -32
  611. nuitka/tools/environments/__init__.py +5 -4
  612. nuitka/tools/general/__init__.py +5 -4
  613. nuitka/tools/general/dll_report/__init__.py +5 -4
  614. nuitka/tools/general/dll_report/__main__.py +29 -22
  615. nuitka/tools/general/find_module/FindModuleCode.py +35 -22
  616. nuitka/tools/general/find_module/__init__.py +5 -4
  617. nuitka/tools/onefile_compressor/OnefileCompressor.py +213 -131
  618. nuitka/tools/onefile_compressor/__init__.py +5 -4
  619. nuitka/tools/onefile_compressor/__main__.py +18 -17
  620. nuitka/tools/podman/Podman.py +19 -17
  621. nuitka/tools/podman/__init__.py +5 -4
  622. nuitka/tools/podman/__main__.py +35 -19
  623. nuitka/tools/profiler/__init__.py +5 -4
  624. nuitka/tools/profiler/__main__.py +18 -17
  625. nuitka/tools/scanning/DisplayPackageDLLs.py +47 -22
  626. nuitka/tools/scanning/DisplayPackageData.py +31 -19
  627. nuitka/tools/scanning/__init__.py +5 -4
  628. nuitka/tools/specialize/CTypeDescriptions.py +251 -80
  629. nuitka/tools/specialize/Common.py +18 -17
  630. nuitka/tools/specialize/SpecializeC.py +248 -82
  631. nuitka/tools/specialize/SpecializePython.py +108 -45
  632. nuitka/tools/specialize/__init__.py +5 -4
  633. nuitka/tools/testing/Common.py +175 -114
  634. nuitka/tools/testing/Constructs.py +19 -17
  635. nuitka/tools/testing/OutputComparison.py +54 -18
  636. nuitka/tools/testing/Pythons.py +19 -18
  637. nuitka/tools/testing/RuntimeTracing.py +20 -19
  638. nuitka/tools/testing/SearchModes.py +26 -20
  639. nuitka/tools/testing/Valgrind.py +19 -17
  640. nuitka/tools/testing/__init__.py +5 -4
  641. nuitka/tools/testing/check_reference_counts/__init__.py +5 -4
  642. nuitka/tools/testing/check_reference_counts/__main__.py +18 -18
  643. nuitka/tools/testing/compare_with_cpython/__init__.py +5 -4
  644. nuitka/tools/testing/compare_with_cpython/__main__.py +39 -30
  645. nuitka/tools/testing/find_sxs_modules/__init__.py +5 -4
  646. nuitka/tools/testing/find_sxs_modules/__main__.py +17 -17
  647. nuitka/tools/testing/measure_construct_performance/__init__.py +5 -4
  648. nuitka/tools/testing/measure_construct_performance/__main__.py +23 -33
  649. nuitka/tools/testing/run_nuitka_tests/__init__.py +5 -4
  650. nuitka/tools/testing/run_nuitka_tests/__main__.py +134 -51
  651. nuitka/tools/watch/AutoStage.py +145 -0
  652. nuitka/tools/watch/GitHub.py +113 -0
  653. nuitka/tools/watch/__init__.py +5 -4
  654. nuitka/tools/watch/__main__.py +322 -91
  655. nuitka/tree/Building.py +184 -182
  656. nuitka/tree/ComplexCallHelperFunctions.py +84 -58
  657. nuitka/tree/Extractions.py +19 -17
  658. nuitka/tree/InternalModule.py +29 -20
  659. nuitka/tree/Operations.py +19 -17
  660. nuitka/tree/ReformulationAssertStatements.py +51 -31
  661. nuitka/tree/ReformulationAssignmentStatements.py +96 -91
  662. nuitka/tree/ReformulationBooleanExpressions.py +19 -17
  663. nuitka/tree/ReformulationCallExpressions.py +20 -18
  664. nuitka/tree/ReformulationClasses.py +45 -39
  665. nuitka/tree/ReformulationClasses3.py +239 -116
  666. nuitka/tree/ReformulationComparisonExpressions.py +29 -35
  667. nuitka/tree/ReformulationContractionExpressions.py +58 -55
  668. nuitka/tree/ReformulationDictionaryCreation.py +41 -35
  669. nuitka/tree/ReformulationExecStatements.py +42 -39
  670. nuitka/tree/ReformulationForLoopStatements.py +30 -34
  671. nuitka/tree/ReformulationFunctionStatements.py +59 -55
  672. nuitka/tree/ReformulationImportStatements.py +34 -29
  673. nuitka/tree/ReformulationLambdaExpressions.py +23 -24
  674. nuitka/tree/ReformulationMatchStatements.py +246 -92
  675. nuitka/tree/ReformulationMultidist.py +22 -18
  676. nuitka/tree/ReformulationNamespacePackages.py +55 -46
  677. nuitka/tree/ReformulationPrintStatements.py +23 -24
  678. nuitka/tree/ReformulationSequenceCreation.py +50 -49
  679. nuitka/tree/ReformulationSubscriptExpressions.py +19 -17
  680. nuitka/tree/ReformulationTryExceptStatements.py +19 -17
  681. nuitka/tree/ReformulationTryFinallyStatements.py +34 -17
  682. nuitka/tree/ReformulationWhileLoopStatements.py +19 -17
  683. nuitka/tree/ReformulationWithStatements.py +39 -41
  684. nuitka/tree/ReformulationYieldExpressions.py +44 -24
  685. nuitka/tree/SourceHandling.py +76 -31
  686. nuitka/tree/SyntaxErrors.py +19 -17
  687. nuitka/tree/TreeHelpers.py +33 -20
  688. nuitka/tree/VariableClosure.py +35 -39
  689. nuitka/tree/__init__.py +5 -4
  690. nuitka/utils/AppDirs.py +41 -20
  691. nuitka/utils/CStrings.py +66 -21
  692. nuitka/utils/CommandLineOptions.py +111 -22
  693. nuitka/utils/Distributions.py +445 -54
  694. nuitka/utils/Download.py +89 -57
  695. nuitka/utils/Execution.py +102 -58
  696. nuitka/utils/FileOperations.py +357 -128
  697. nuitka/utils/Hashing.py +55 -33
  698. nuitka/utils/Images.py +26 -19
  699. nuitka/utils/Importing.py +119 -37
  700. nuitka/utils/InlineCopies.py +52 -0
  701. nuitka/utils/InstalledPythons.py +85 -75
  702. nuitka/utils/InstanceCounters.py +20 -17
  703. nuitka/utils/Jinja2.py +30 -22
  704. nuitka/utils/Json.py +21 -19
  705. nuitka/utils/MacOSApp.py +26 -18
  706. nuitka/utils/MemoryUsage.py +20 -18
  707. nuitka/utils/ModuleNames.py +42 -26
  708. nuitka/utils/PackageResources.py +44 -0
  709. nuitka/utils/ReExecute.py +50 -28
  710. nuitka/utils/Rest.py +20 -17
  711. nuitka/utils/SharedLibraries.py +161 -75
  712. nuitka/utils/Shebang.py +20 -17
  713. nuitka/utils/Signing.py +63 -18
  714. nuitka/utils/SlotMetaClasses.py +57 -0
  715. nuitka/utils/StaticLibraries.py +83 -56
  716. nuitka/utils/ThreadedExecutor.py +18 -17
  717. nuitka/utils/Timing.py +22 -20
  718. nuitka/utils/Utils.py +132 -25
  719. nuitka/utils/WindowsFileUsage.py +22 -20
  720. nuitka/utils/WindowsResources.py +25 -18
  721. nuitka/utils/Yaml.py +62 -24
  722. nuitka/utils/__init__.py +5 -4
  723. Nuitka_winsvc-1.8.dist-info/RECORD +0 -905
  724. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
  725. nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
  726. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/LICENSE.txt +0 -0
  727. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/entry_points.txt +0 -0
  728. {Nuitka_winsvc-1.8.dist-info → Nuitka_winsvc-2.5.1.dist-info}/top_level.txt +0 -0
@@ -1,20 +1,6 @@
1
- # Copyright 2023, Kay Hayen, mailto:kay.hayen@gmail.com
2
- #
3
- # Part of "Nuitka", an optimizing Python compiler that is compatible and
4
- # integrates with CPython, but also works on its own.
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
1
+ # Copyright 2024, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
2
+
3
+
18
4
  """ Utils for file and directory operations.
19
5
 
20
6
  This provides enhanced and more error resilient forms of standard
@@ -24,34 +10,39 @@ stuff. It will also frequently add sorting for determinism.
24
10
 
25
11
  from __future__ import print_function
26
12
 
13
+ import codecs
27
14
  import errno
28
15
  import fnmatch
29
16
  import glob
30
17
  import os
18
+ import pickle
31
19
  import shutil
32
20
  import stat
21
+ import sys
33
22
  import tempfile
34
23
  import time
24
+ import unicodedata
35
25
  from contextlib import contextmanager
36
26
 
37
27
  from nuitka.__past__ import ( # pylint: disable=redefined-builtin
28
+ FileNotFoundError,
38
29
  PermissionError,
39
- WindowsError,
40
30
  basestring,
41
- raw_input,
31
+ unicode,
42
32
  )
43
33
  from nuitka.PythonVersions import python_version
44
- from nuitka.Tracing import (
45
- flushStandardOutputs,
46
- general,
47
- my_print,
48
- options_logger,
49
- printLine,
50
- )
34
+ from nuitka.Tracing import general, my_print, options_logger, queryUser
51
35
 
52
36
  from .Importing import importFromInlineCopy
53
37
  from .ThreadedExecutor import RLock, getThreadIdent
54
- from .Utils import isLinux, isMacOS, isWin32OrPosixWindows, isWin32Windows
38
+ from .Utils import (
39
+ decoratorRetries,
40
+ isLinux,
41
+ isMacOS,
42
+ isWin32OrPosixWindows,
43
+ isWin32Windows,
44
+ raiseWindowsError,
45
+ )
55
46
 
56
47
  # Locking seems to be only required for Windows mostly, but we can keep
57
48
  # it for all.
@@ -101,8 +92,11 @@ def areSamePaths(path1, path2):
101
92
  even short paths, it then becomes a mere string compare after that.
102
93
  """
103
94
 
104
- path1 = os.path.abspath(os.path.normpath(path1))
105
- path2 = os.path.abspath(os.path.normpath(path2))
95
+ if path1 == path2:
96
+ return True
97
+
98
+ path1 = os.path.abspath(getNormalizedPath(path1))
99
+ path2 = os.path.abspath(getNormalizedPath(path2))
106
100
 
107
101
  if os.path.exists(path1) and os.path.exists(path2):
108
102
  path1 = getExternalUsePath(path1)
@@ -190,7 +184,11 @@ def makePath(path):
190
184
 
191
185
  with withFileLock("creating directory %s" % path):
192
186
  if not os.path.isdir(path):
193
- os.makedirs(path)
187
+ try:
188
+ os.makedirs(path)
189
+ except OSError:
190
+ if not os.path.exists(path):
191
+ raise
194
192
 
195
193
 
196
194
  def makeContainingPath(filename):
@@ -240,9 +238,14 @@ def _getRealPathWindows(path):
240
238
  if str is not bytes:
241
239
  result = result.decode("utf8")
242
240
 
243
- _real_path_windows_cache[path] = os.path.join(
244
- os.path.dirname(path), result.rstrip("\r\n")
245
- )
241
+ if result.startswith("UNC\\"):
242
+ # Avoid network mounts being converted to UNC shared paths by newer
243
+ # Python versions, many tools won't work with those.
244
+ _real_path_windows_cache[path] = path
245
+ else:
246
+ _real_path_windows_cache[path] = os.path.join(
247
+ os.path.dirname(path), result.rstrip("\r\n")
248
+ )
246
249
  else:
247
250
  _real_path_windows_cache[path] = path
248
251
 
@@ -259,7 +262,9 @@ def getDirectoryRealPath(path):
259
262
  path with symlinks resolved
260
263
 
261
264
  Notes:
262
- Workaround for Windows symlink is applied.
265
+ Workaround for Windows symlink is applied. This function is not recursive
266
+ at all with older Python, i.e. only the last part, the directory itself
267
+ is being resolved there.
263
268
 
264
269
  """
265
270
  path = os.path.realpath(path)
@@ -272,6 +277,62 @@ def getDirectoryRealPath(path):
272
277
  return path
273
278
 
274
279
 
280
+ def _restoreWindowsPath(orig_path, path):
281
+ if path.startswith("\\\\"):
282
+ drive, _remaining_path = os.path.splitdrive(orig_path)
283
+
284
+ if drive and not drive.startswith("\\\\"):
285
+ drive_real_path = os.path.realpath(drive + "\\")
286
+ assert path.startswith(drive_real_path)
287
+
288
+ path = drive + "\\" + path[len(drive_real_path) :]
289
+ else:
290
+ path = path.strip(os.path.sep)
291
+
292
+ if os.path.sep in path:
293
+ dirname = os.path.dirname(path)
294
+ filename = os.path.basename(path)
295
+
296
+ if dirname:
297
+ dirname = getDirectoryRealPath(dirname)
298
+
299
+ # Drive letters do not get slashes from "os.path.join", so
300
+ # we inject this here and normalize the path afterwards to
301
+ # remove any duplication added.
302
+ if os.path.sep not in dirname:
303
+ dirname = dirname + os.path.sep
304
+
305
+ path = os.path.normpath(os.path.join(dirname, filename))
306
+
307
+ return path
308
+
309
+
310
+ def getFilenameRealPath(path):
311
+ """Get os.path.realpath with Python2 and Windows symlink workaround applied.
312
+
313
+ Args:
314
+ path: path to get realpath of
315
+
316
+ Returns:
317
+ path with symlinks resolved
318
+
319
+ Notes:
320
+ Workaround for Windows symlinks are applied, this works recursive and
321
+ assumes that the path given itself is a file and not a directory, and
322
+ doesn't handle file symlinks at the end on older Python currently, but
323
+ we shouldn't deal with those.
324
+ """
325
+ orig_path = path
326
+ path = os.path.realpath(path)
327
+
328
+ # Avoid network mounts being converted to UNC shared paths by newer
329
+ # Python versions, many tools won't work with those.
330
+ if os.name == "nt":
331
+ path = _restoreWindowsPath(orig_path=orig_path, path=path)
332
+
333
+ return path
334
+
335
+
275
336
  def listDir(path):
276
337
  """Give a sorted listing of a path.
277
338
 
@@ -293,8 +354,28 @@ def listDir(path):
293
354
  """
294
355
  real_path = getDirectoryRealPath(path)
295
356
 
357
+ # The "os.listdir" output needs to be unicode paths, or else it can be unusable
358
+ # for Python2 on Windows at least. We try to go back on the result.
359
+ if str is bytes and type(real_path) is str:
360
+ real_path = unicode(real_path)
361
+
362
+ def _tryDecodeToStr(value):
363
+ if str is bytes:
364
+ if type(value) is unicode:
365
+ # File system paths, that should be usable for names of modules,
366
+ # as Python2 code objects will e.g. hate unicode values.
367
+
368
+ # spell-checker: ignore getfilesystemencoding
369
+ try:
370
+ return value.decode(sys.getfilesystemencoding())
371
+ except UnicodeDecodeError:
372
+ return value
373
+ else:
374
+ return value
375
+
296
376
  return sorted(
297
- [(os.path.join(path, filename), filename) for filename in os.listdir(real_path)]
377
+ (_tryDecodeToStr(os.path.join(path, filename)), _tryDecodeToStr(filename))
378
+ for filename in os.listdir(real_path)
298
379
  )
299
380
 
300
381
 
@@ -359,7 +440,7 @@ def getFileList(
359
440
  fullname = os.path.join(root, filename)
360
441
 
361
442
  if normalize:
362
- fullname = os.path.normpath(fullname)
443
+ fullname = getNormalizedPath(fullname)
363
444
 
364
445
  result.append(fullname)
365
446
 
@@ -409,9 +490,9 @@ def getDllBasename(path):
409
490
  if compare_path.endswith(suffix):
410
491
  return path[: -len(suffix)]
411
492
 
412
- # Linux us not case sensitive, but lets still do it properly,
413
- # sometimes, it is done on non-Linux too. So we split on the
414
- # normcase, but only to find out what is going on there.
493
+ # Linux is not case sensitive, but lets still do it properly, sometimes, it
494
+ # is done macOS too. So we split on the normcase, but only to find out what
495
+ # is going on there.
415
496
  if ".so." in compare_path:
416
497
  return path[: len(compare_path.split(".so.")[0])]
417
498
 
@@ -473,7 +554,7 @@ def listExeFilesFromDirectory(path, prefix=None, suffixes=None):
473
554
 
474
555
  # On Windows, we check exe suffixes, on other platforms we shell all filenames,
475
556
  # matching the prefix, but they have to the executable bit set.
476
- if suffixes is None and isWin32OrPosixWindows():
557
+ if not suffixes and isWin32OrPosixWindows():
477
558
  suffixes = "exe", "bin"
478
559
 
479
560
  if suffixes:
@@ -577,11 +658,19 @@ def deleteFile(path, must_exist):
577
658
  raise OSError("Does not exist", path)
578
659
 
579
660
 
580
- def splitPath(path):
581
- """Split path, skipping empty elements."""
582
- return tuple(
583
- element for element in os.path.split(path.rstrip(os.path.sep)) if element
584
- )
661
+ def searchPrefixPath(path, element):
662
+ """Search element and return prefix in path, if any."""
663
+
664
+ while path:
665
+ if os.path.normcase(os.path.basename(path)) == os.path.normcase(element):
666
+ return path
667
+
668
+ new_path = os.path.dirname(path)
669
+ if new_path == path:
670
+ break
671
+ path = new_path
672
+
673
+ return None
585
674
 
586
675
 
587
676
  def getFilenameExtension(path):
@@ -605,7 +694,8 @@ def hasFilenameExtension(path, extensions):
605
694
  """Has a filename one of the given extensions.
606
695
 
607
696
  Note: The extensions should be normalized, i.e. lower case and will match other
608
- cases where the file system does that on a platform.
697
+ cases where the file system does that on a platform. Also they include a dot,
698
+ e.g. ".qml" is a good value.
609
699
  """
610
700
 
611
701
  extension = getFilenameExtension(path)
@@ -616,7 +706,14 @@ def hasFilenameExtension(path, extensions):
616
706
  return extension in extensions
617
707
 
618
708
 
619
- def removeDirectory(path, ignore_errors):
709
+ def addFilenameExtension(path, extension):
710
+ if not hasFilenameExtension(path, extension):
711
+ path += extension
712
+
713
+ return path
714
+
715
+
716
+ def removeDirectory(path, logger, ignore_errors, extra_recommendation):
620
717
  """Remove a directory recursively.
621
718
 
622
719
  On Windows, it happens that operations fail, and succeed when retried,
@@ -627,28 +724,52 @@ def removeDirectory(path, ignore_errors):
627
724
  it hopefully only briefly.
628
725
  """
629
726
 
630
- def onError(func, path, exc_info):
631
- # Try again immediately, ignore what happened, pylint: disable=unused-argument
632
- try:
633
- func(path)
634
- except OSError:
635
- time.sleep(0.1)
636
-
637
- func(path)
638
-
639
727
  with withFileLock("removing directory %s" % path):
640
728
  if os.path.exists(path):
641
- try:
642
- shutil.rmtree(path, ignore_errors=False, onerror=onError)
643
- except OSError:
644
- if ignore_errors:
645
- shutil.rmtree(path, ignore_errors=ignore_errors)
646
- else:
647
- raise
648
729
 
649
-
650
- def resetDirectory(path, ignore_errors):
651
- removeDirectory(path=path, ignore_errors=ignore_errors)
730
+ @decoratorRetries(
731
+ logger=logger,
732
+ purpose="delete '%s'" % path,
733
+ consequence="the path is not fully removed",
734
+ extra_recommendation=extra_recommendation,
735
+ )
736
+ def _removeDirectory():
737
+ def onError(func, path, exc_info):
738
+ # Record what happened what happened, pylint: disable=unused-argument
739
+ last_error.append((func, path))
740
+
741
+ previous_error = []
742
+
743
+ # Try deleting while ignoring errors first.
744
+ while True:
745
+ last_error = []
746
+ shutil.rmtree(path, ignore_errors=False, onerror=onError)
747
+
748
+ # onError as a side effect, modifies last_error
749
+ if previous_error == last_error:
750
+ break
751
+
752
+ previous_error = list(last_error)
753
+ time.sleep(0.2)
754
+
755
+ # If it still exists, try one more time, this time not ignoring errors.
756
+ if os.path.exists(path):
757
+ try:
758
+ shutil.rmtree(path, ignore_errors=ignore_errors)
759
+ except OSError:
760
+ if not ignore_errors:
761
+ raise
762
+
763
+ _removeDirectory()
764
+
765
+
766
+ def resetDirectory(path, logger, ignore_errors, extra_recommendation):
767
+ removeDirectory(
768
+ path=path,
769
+ logger=logger,
770
+ ignore_errors=ignore_errors,
771
+ extra_recommendation=extra_recommendation,
772
+ )
652
773
  makePath(path)
653
774
 
654
775
 
@@ -660,19 +781,22 @@ def withTemporaryFile(suffix="", mode="w", delete=True, temp_path=None):
660
781
  yield temp_file
661
782
 
662
783
 
663
- def getFileContentByLine(filename, mode="r", encoding=None):
784
+ def getFileContentByLine(filename, mode="r", encoding=None, errors=None):
664
785
  # We read the whole, to keep lock times minimal. We only deal with small
665
786
  # files like this normally.
666
- return getFileContents(filename, mode, encoding=encoding).splitlines()
787
+ return getFileContents(
788
+ filename, mode, encoding=encoding, errors=errors
789
+ ).splitlines()
667
790
 
668
791
 
669
- def getFileContents(filename, mode="r", encoding=None):
792
+ def getFileContents(filename, mode="r", encoding=None, errors=None):
670
793
  """Get the contents of a file.
671
794
 
672
795
  Args:
673
796
  filename: str with the file to be read
674
797
  mode: "r" for str, "rb" for bytes result
675
798
  encoding: optional encoding to used when reading the file, e.g. "utf8"
799
+ errors: optional error handler decoding the content, as defined in `codecs`
676
800
 
677
801
  Returns:
678
802
  str or bytes - depending on mode.
@@ -680,7 +804,7 @@ def getFileContents(filename, mode="r", encoding=None):
680
804
  """
681
805
 
682
806
  with withFileLock("reading file %s" % filename):
683
- with openTextFile(filename, mode, encoding=encoding) as f:
807
+ with openTextFile(filename, mode, encoding=encoding, errors=errors) as f:
684
808
  return f.read()
685
809
 
686
810
 
@@ -702,18 +826,11 @@ def getFileFirstLine(filename, mode="r", encoding=None):
702
826
  return f.readline()
703
827
 
704
828
 
705
- def openTextFile(filename, mode, encoding=None):
706
- if encoding is not None:
707
- import codecs
708
-
709
- return codecs.open(filename, mode, encoding=encoding)
710
- else:
711
- # Avoid deprecation warning, is now the default.
712
- if python_version >= 0x370:
713
- mode = mode.replace("U", "")
829
+ def openTextFile(filename, mode, encoding=None, errors=None):
830
+ if python_version >= 0x370:
831
+ mode = mode.replace("U", "")
714
832
 
715
- # Encoding was checked to be not needed.
716
- return open(filename, mode) # pylint: disable=unspecified-encoding
833
+ return codecs.open(filename, mode, encoding=encoding, errors=errors)
717
834
 
718
835
 
719
836
  def putTextFileContents(filename, contents, encoding=None):
@@ -740,6 +857,22 @@ def putTextFileContents(filename, contents, encoding=None):
740
857
  _writeContents(output_file)
741
858
 
742
859
 
860
+ def putBinaryFileContents(filename, contents):
861
+ """Write a binary file from given contents.
862
+
863
+ Args:
864
+ filename: str with the file to be created
865
+ contents: bytes that should be written into the file
866
+
867
+ Returns:
868
+ None
869
+ """
870
+
871
+ with withFileLock("writing file %s" % filename):
872
+ with openTextFile(filename, "wb") as output_file:
873
+ output_file.write(contents)
874
+
875
+
743
876
  def changeTextFileContents(filename, contents, encoding=None, compare_only=False):
744
877
  """Write a text file from given contents.
745
878
 
@@ -766,7 +899,7 @@ def changeTextFileContents(filename, contents, encoding=None, compare_only=False
766
899
 
767
900
  @contextmanager
768
901
  def withPreserveFileMode(filenames):
769
- if type(filenames) is str:
902
+ if isinstance(filenames, basestring):
770
903
  filenames = [filenames]
771
904
 
772
905
  old_modes = {}
@@ -781,7 +914,7 @@ def withPreserveFileMode(filenames):
781
914
 
782
915
  @contextmanager
783
916
  def withMadeWritableFileMode(filenames):
784
- if type(filenames) is str:
917
+ if isinstance(filenames, basestring):
785
918
  filenames = [filenames]
786
919
 
787
920
  with withPreserveFileMode(filenames):
@@ -839,10 +972,13 @@ def copyTree(source_path, dest_path):
839
972
  if python_version >= 0x380:
840
973
  # Python 3.8+ has dirs_exist_ok
841
974
  return shutil.copytree(source_path, dest_path, dirs_exist_ok=True)
975
+ else:
842
976
 
843
- from distutils.dir_util import copy_tree
977
+ from distutils.dir_util import ( # Older Python only, pylint: disable=I0021,import-error
978
+ copy_tree,
979
+ )
844
980
 
845
- return copy_tree(source_path, dest_path)
981
+ return copy_tree(source_path, dest_path)
846
982
 
847
983
 
848
984
  def copyFileWithPermissions(source_path, dest_path, dist_dir):
@@ -881,33 +1017,6 @@ def copyFileWithPermissions(source_path, dest_path, dist_dir):
881
1017
  os.chmod(dest_path, source_mode)
882
1018
 
883
1019
 
884
- def queryUser(question, choices, default, default_non_interactive):
885
- assert default in choices, (default, choices)
886
- assert default_non_interactive in choices, (default, choices)
887
-
888
- prompt = "%s? %s : " % (
889
- question,
890
- "/".join(
891
- "[%s]" % choice.title() if choice == default else choice.title()
892
- for choice in choices
893
- ),
894
- )
895
-
896
- # Integrates with progress bar by closing it.
897
- printLine(prompt, end="")
898
- flushStandardOutputs()
899
-
900
- try:
901
- reply = raw_input() or default
902
- except EOFError:
903
- reply = default_non_interactive
904
-
905
- if reply == "y":
906
- reply = "yes"
907
-
908
- return reply.lower()
909
-
910
-
911
1020
  def copyFile(source_path, dest_path):
912
1021
  """Improved version of shutil.copy
913
1022
 
@@ -977,6 +1086,10 @@ def isFilenameBelowPath(path, filename, consider_short=True):
977
1086
  filename = getExternalUsePath(filename)
978
1087
  path = getExternalUsePath(path)
979
1088
 
1089
+ if isWin32Windows():
1090
+ if getWindowsDrive(path) != getWindowsDrive(filename):
1091
+ return False
1092
+
980
1093
  result = os.path.relpath(filename, path).split(os.path.sep)[0] != ".."
981
1094
 
982
1095
  return result
@@ -1021,10 +1134,7 @@ def getWindowsShortPathName(filename):
1021
1134
  if ctypes.GetLastError() == 5:
1022
1135
  return filename
1023
1136
 
1024
- raise WindowsError(
1025
- ctypes.GetLastError(), ctypes.FormatError(ctypes.GetLastError())
1026
- )
1027
-
1137
+ raiseWindowsError("getWindowsShortPathName for %s" % filename)
1028
1138
  if output_buf_size >= needed:
1029
1139
  # Short paths should be ASCII. Don't return unicode without a need,
1030
1140
  # as e.g. Scons hates that in environment variables.
@@ -1058,7 +1168,7 @@ def getWindowsLongPathName(filename):
1058
1168
  while True:
1059
1169
  output_buf = ctypes.create_unicode_buffer(output_buf_size)
1060
1170
  needed = GetLongPathNameW(
1061
- os.path.abspath(filename), output_buf, output_buf_size
1171
+ getNormalizedPath(os.path.abspath(filename)), output_buf, output_buf_size
1062
1172
  )
1063
1173
 
1064
1174
  if needed == 0:
@@ -1068,10 +1178,7 @@ def getWindowsLongPathName(filename):
1068
1178
  if ctypes.GetLastError() == 5:
1069
1179
  return filename
1070
1180
 
1071
- raise WindowsError(
1072
- ctypes.GetLastError(), ctypes.FormatError(ctypes.GetLastError())
1073
- )
1074
-
1181
+ raiseWindowsError("getWindowsLongPathName for %s" % filename)
1075
1182
  if output_buf_size >= needed:
1076
1183
  return output_buf.value
1077
1184
  else:
@@ -1096,8 +1203,10 @@ def getExternalUsePath(filename, only_dirname=False):
1096
1203
  filename = os.path.abspath(filename)
1097
1204
 
1098
1205
  if os.name == "nt":
1206
+ key = filename, only_dirname
1207
+
1099
1208
  if filename not in _external_use_path_cache:
1100
- asked_filename = filename
1209
+ filename = getFilenameRealPath(filename)
1101
1210
 
1102
1211
  if only_dirname:
1103
1212
  dirname = getWindowsShortPathName(os.path.dirname(filename))
@@ -1106,10 +1215,13 @@ def getExternalUsePath(filename, only_dirname=False):
1106
1215
  else:
1107
1216
  filename = getWindowsShortPathName(filename)
1108
1217
 
1109
- _external_use_path_cache[asked_filename] = filename
1110
- _external_use_path_cache[filename] = filename
1218
+ _external_use_path_cache[key] = filename
1219
+
1220
+ # Looking up again should give same result immediately.
1221
+ key = filename, only_dirname
1222
+ _external_use_path_cache[key] = filename
1111
1223
 
1112
- return _external_use_path_cache[filename]
1224
+ return _external_use_path_cache[key]
1113
1225
  else:
1114
1226
  return filename
1115
1227
 
@@ -1202,6 +1314,10 @@ def getLinkTarget(filename):
1202
1314
  return is_link, filename
1203
1315
 
1204
1316
 
1317
+ # Late import and optional to be there.
1318
+ atomicwrites = None
1319
+
1320
+
1205
1321
  def replaceFileAtomic(source_path, dest_path):
1206
1322
  """
1207
1323
  Move ``src`` to ``dst``. If ``dst`` exists, it will be silently
@@ -1216,9 +1332,12 @@ def replaceFileAtomic(source_path, dest_path):
1216
1332
  if python_version >= 0x300:
1217
1333
  os.replace(source_path, dest_path)
1218
1334
  else:
1219
- importFromInlineCopy("atomicwrites", must_exist=True).replace_atomic(
1220
- source_path, dest_path
1221
- )
1335
+ global atomicwrites # singleton, pylint: disable=global-statement
1336
+
1337
+ if atomicwrites is None:
1338
+ atomicwrites = importFromInlineCopy("atomicwrites", must_exist=True)
1339
+
1340
+ atomicwrites.replace_atomic(source_path, dest_path)
1222
1341
 
1223
1342
 
1224
1343
  def resolveShellPatternToFilenames(pattern):
@@ -1303,3 +1422,113 @@ def syncFileOutput(file_handle):
1303
1422
  except AttributeError:
1304
1423
  # Too old to have "syncfs" available.
1305
1424
  return
1425
+
1426
+
1427
+ def isFilesystemEncodable(filename):
1428
+ """Decide if a filename is safe for use as a file system path with tools."""
1429
+ if os.name == "nt" and type(filename) is unicode:
1430
+ value = (
1431
+ unicodedata.normalize("NFKD", filename)
1432
+ .encode("ascii", "ignore")
1433
+ .decode("ascii")
1434
+ )
1435
+
1436
+ return value == filename
1437
+ else:
1438
+ return True
1439
+
1440
+
1441
+ def makeFilesystemEncodable(filename):
1442
+ if not os.path.isabs(filename):
1443
+ filename = os.path.abspath(filename)
1444
+
1445
+ if not isFilesystemEncodable(filename):
1446
+ filename = getExternalUsePath(filename)
1447
+
1448
+ return filename
1449
+
1450
+
1451
+ def openPickleFile(filename, mode, protocol=-1):
1452
+ file_handle = openTextFile(filename, mode)
1453
+
1454
+ if python_version < 0x300:
1455
+ return file_handle, pickle.Pickler(file_handle, protocol)
1456
+ else:
1457
+ return file_handle, pickle._Pickler( # pylint: disable=protected-access
1458
+ file_handle, protocol
1459
+ )
1460
+
1461
+
1462
+ def isLegalPath(path):
1463
+ illegal_suffixes = "/\\"
1464
+ illegal_chars = "\0"
1465
+
1466
+ if isWin32Windows():
1467
+ illegal_chars += r'*"/<>:|?'
1468
+
1469
+ illegal_chars += "".join(chr(x) for x in range(1, 32))
1470
+ illegal_suffixes += " ."
1471
+
1472
+ if isMacOS():
1473
+ illegal_chars += ":"
1474
+
1475
+ for c in path:
1476
+ if c in illegal_chars:
1477
+ return False, "contains illegal character %r" % c
1478
+
1479
+ for illegal_suffix in illegal_suffixes:
1480
+ if path.endswith(illegal_suffix):
1481
+ return False, "contains illegal suffix %r" % illegal_suffix
1482
+
1483
+ for part in path.split(os.path.sep):
1484
+ if part == ".":
1485
+ continue
1486
+
1487
+ if part.endswith(illegal_suffix):
1488
+ return False, "contains illegal suffix %r in path part %r" % (
1489
+ part,
1490
+ illegal_suffix,
1491
+ )
1492
+
1493
+ return True, None
1494
+
1495
+
1496
+ def getParentDirectories(path):
1497
+ """Get all parent directories of a path in descending order."""
1498
+
1499
+ while 1:
1500
+ old_path = path
1501
+ path = os.path.dirname(path)
1502
+
1503
+ if not path or path == old_path:
1504
+ return
1505
+
1506
+ yield path
1507
+
1508
+
1509
+ def getNormalizedPath(path):
1510
+ """Return normalized path that is also a native path, i.e. only legal characters.
1511
+
1512
+ Needed, because MSYS2 likes to keep "/" in normalized paths.
1513
+ """
1514
+ path = os.path.normpath(path)
1515
+ if isWin32Windows():
1516
+ path = path.replace("/", "\\")
1517
+
1518
+ return path
1519
+
1520
+
1521
+ # Part of "Nuitka", an optimizing Python compiler that is compatible and
1522
+ # integrates with CPython, but also works on its own.
1523
+ #
1524
+ # Licensed under the Apache License, Version 2.0 (the "License");
1525
+ # you may not use this file except in compliance with the License.
1526
+ # You may obtain a copy of the License at
1527
+ #
1528
+ # http://www.apache.org/licenses/LICENSE-2.0
1529
+ #
1530
+ # Unless required by applicable law or agreed to in writing, software
1531
+ # distributed under the License is distributed on an "AS IS" BASIS,
1532
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1533
+ # See the License for the specific language governing permissions and
1534
+ # limitations under the License.