patchright 1.48.0__py3-none-win32.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.
Files changed (406) hide show
  1. patchright/__init__.py +5 -0
  2. patchright/__main__.py +18 -0
  3. patchright/_impl/__init__.py +0 -0
  4. patchright/_impl/__pyinstaller/__init__.py +20 -0
  5. patchright/_impl/__pyinstaller/hook-playwright.async_api.py +17 -0
  6. patchright/_impl/__pyinstaller/hook-playwright.sync_api.py +17 -0
  7. patchright/_impl/_accessibility.py +50 -0
  8. patchright/_impl/_api_structures.py +271 -0
  9. patchright/_impl/_artifact.py +45 -0
  10. patchright/_impl/_assertions.py +779 -0
  11. patchright/_impl/_async_base.py +92 -0
  12. patchright/_impl/_browser.py +243 -0
  13. patchright/_impl/_browser_context.py +724 -0
  14. patchright/_impl/_browser_type.py +264 -0
  15. patchright/_impl/_cdp_session.py +21 -0
  16. patchright/_impl/_clock.py +57 -0
  17. patchright/_impl/_connection.py +554 -0
  18. patchright/_impl/_console_message.py +45 -0
  19. patchright/_impl/_dialog.py +40 -0
  20. patchright/_impl/_download.py +50 -0
  21. patchright/_impl/_driver.py +26 -0
  22. patchright/_impl/_element_handle.py +376 -0
  23. patchright/_impl/_errors.py +44 -0
  24. patchright/_impl/_event_context_manager.py +20 -0
  25. patchright/_impl/_fetch.py +511 -0
  26. patchright/_impl/_file_chooser.py +43 -0
  27. patchright/_impl/_frame.py +755 -0
  28. patchright/_impl/_glob.py +51 -0
  29. patchright/_impl/_greenlets.py +39 -0
  30. patchright/_impl/_har_router.py +99 -0
  31. patchright/_impl/_helper.py +421 -0
  32. patchright/_impl/_impl_to_api_mapping.py +123 -0
  33. patchright/_impl/_input.py +71 -0
  34. patchright/_impl/_js_handle.py +234 -0
  35. patchright/_impl/_json_pipe.py +56 -0
  36. patchright/_impl/_local_utils.py +73 -0
  37. patchright/_impl/_locator.py +784 -0
  38. patchright/_impl/_map.py +19 -0
  39. patchright/_impl/_network.py +934 -0
  40. patchright/_impl/_object_factory.py +91 -0
  41. patchright/_impl/_page.py +1446 -0
  42. patchright/_impl/_path_utils.py +11 -0
  43. patchright/_impl/_playwright.py +51 -0
  44. patchright/_impl/_selectors.py +62 -0
  45. patchright/_impl/_set_input_files_helpers.py +135 -0
  46. patchright/_impl/_str_utils.py +57 -0
  47. patchright/_impl/_stream.py +32 -0
  48. patchright/_impl/_sync_base.py +134 -0
  49. patchright/_impl/_tracing.py +103 -0
  50. patchright/_impl/_transport.py +150 -0
  51. patchright/_impl/_video.py +57 -0
  52. patchright/_impl/_waiter.py +142 -0
  53. patchright/_impl/_web_error.py +22 -0
  54. patchright/_impl/_writable_stream.py +27 -0
  55. patchright/_repo_version.py +12 -0
  56. patchright/async_api/__init__.py +177 -0
  57. patchright/async_api/_context_manager.py +39 -0
  58. patchright/async_api/_generated.py +19960 -0
  59. patchright/driver/LICENSE +2174 -0
  60. patchright/driver/README.md +1 -0
  61. patchright/driver/node.exe +0 -0
  62. patchright/driver/package/README.md +3 -0
  63. patchright/driver/package/ThirdPartyNotices.txt +1548 -0
  64. patchright/driver/package/api.json +1 -0
  65. patchright/driver/package/bin/PrintDeps.exe +0 -0
  66. patchright/driver/package/bin/README.md +2 -0
  67. patchright/driver/package/bin/install_media_pack.ps1 +5 -0
  68. patchright/driver/package/bin/reinstall_chrome_beta_linux.sh +40 -0
  69. patchright/driver/package/bin/reinstall_chrome_beta_mac.sh +13 -0
  70. patchright/driver/package/bin/reinstall_chrome_beta_win.ps1 +24 -0
  71. patchright/driver/package/bin/reinstall_chrome_stable_linux.sh +40 -0
  72. patchright/driver/package/bin/reinstall_chrome_stable_mac.sh +12 -0
  73. patchright/driver/package/bin/reinstall_chrome_stable_win.ps1 +24 -0
  74. patchright/driver/package/bin/reinstall_msedge_beta_linux.sh +40 -0
  75. patchright/driver/package/bin/reinstall_msedge_beta_mac.sh +11 -0
  76. patchright/driver/package/bin/reinstall_msedge_beta_win.ps1 +23 -0
  77. patchright/driver/package/bin/reinstall_msedge_dev_linux.sh +40 -0
  78. patchright/driver/package/bin/reinstall_msedge_dev_mac.sh +11 -0
  79. patchright/driver/package/bin/reinstall_msedge_dev_win.ps1 +23 -0
  80. patchright/driver/package/bin/reinstall_msedge_stable_linux.sh +40 -0
  81. patchright/driver/package/bin/reinstall_msedge_stable_mac.sh +11 -0
  82. patchright/driver/package/bin/reinstall_msedge_stable_win.ps1 +24 -0
  83. patchright/driver/package/browsers.json +57 -0
  84. patchright/driver/package/cli.js +18 -0
  85. patchright/driver/package/index.d.ts +17 -0
  86. patchright/driver/package/index.js +33 -0
  87. patchright/driver/package/index.mjs +28 -0
  88. patchright/driver/package/lib/androidServerImpl.js +69 -0
  89. patchright/driver/package/lib/browserServerImpl.js +92 -0
  90. patchright/driver/package/lib/cli/driver.js +95 -0
  91. patchright/driver/package/lib/cli/program.js +587 -0
  92. patchright/driver/package/lib/cli/programWithTestStub.js +67 -0
  93. patchright/driver/package/lib/client/accessibility.js +50 -0
  94. patchright/driver/package/lib/client/android.js +473 -0
  95. patchright/driver/package/lib/client/api.js +285 -0
  96. patchright/driver/package/lib/client/artifact.js +79 -0
  97. patchright/driver/package/lib/client/browser.js +145 -0
  98. patchright/driver/package/lib/client/browserContext.js +559 -0
  99. patchright/driver/package/lib/client/browserType.js +241 -0
  100. patchright/driver/package/lib/client/cdpSession.js +53 -0
  101. patchright/driver/package/lib/client/channelOwner.js +235 -0
  102. patchright/driver/package/lib/client/clientHelper.js +57 -0
  103. patchright/driver/package/lib/client/clientInstrumentation.js +50 -0
  104. patchright/driver/package/lib/client/clock.js +68 -0
  105. patchright/driver/package/lib/client/connection.js +333 -0
  106. patchright/driver/package/lib/client/consoleMessage.js +55 -0
  107. patchright/driver/package/lib/client/coverage.js +41 -0
  108. patchright/driver/package/lib/client/dialog.js +57 -0
  109. patchright/driver/package/lib/client/download.js +62 -0
  110. patchright/driver/package/lib/client/electron.js +135 -0
  111. patchright/driver/package/lib/client/elementHandle.js +321 -0
  112. patchright/driver/package/lib/client/errors.js +77 -0
  113. patchright/driver/package/lib/client/eventEmitter.js +314 -0
  114. patchright/driver/package/lib/client/events.js +94 -0
  115. patchright/driver/package/lib/client/fetch.js +391 -0
  116. patchright/driver/package/lib/client/fileChooser.js +45 -0
  117. patchright/driver/package/lib/client/frame.js +504 -0
  118. patchright/driver/package/lib/client/harRouter.js +99 -0
  119. patchright/driver/package/lib/client/input.js +111 -0
  120. patchright/driver/package/lib/client/jsHandle.js +121 -0
  121. patchright/driver/package/lib/client/jsonPipe.js +35 -0
  122. patchright/driver/package/lib/client/localUtils.js +36 -0
  123. patchright/driver/package/lib/client/locator.js +441 -0
  124. patchright/driver/package/lib/client/network.js +762 -0
  125. patchright/driver/package/lib/client/page.js +746 -0
  126. patchright/driver/package/lib/client/playwright.js +80 -0
  127. patchright/driver/package/lib/client/selectors.js +67 -0
  128. patchright/driver/package/lib/client/stream.js +54 -0
  129. patchright/driver/package/lib/client/tracing.js +134 -0
  130. patchright/driver/package/lib/client/types.js +24 -0
  131. patchright/driver/package/lib/client/video.js +51 -0
  132. patchright/driver/package/lib/client/waiter.js +158 -0
  133. patchright/driver/package/lib/client/webError.js +37 -0
  134. patchright/driver/package/lib/client/worker.js +71 -0
  135. patchright/driver/package/lib/client/writableStream.js +54 -0
  136. patchright/driver/package/lib/common/socksProxy.js +569 -0
  137. patchright/driver/package/lib/common/timeoutSettings.js +73 -0
  138. patchright/driver/package/lib/common/types.js +5 -0
  139. patchright/driver/package/lib/generated/clockSource.js +7 -0
  140. patchright/driver/package/lib/generated/consoleApiSource.js +7 -0
  141. patchright/driver/package/lib/generated/injectedScriptSource.js +7 -0
  142. patchright/driver/package/lib/generated/pollingRecorderSource.js +7 -0
  143. patchright/driver/package/lib/generated/utilityScriptSource.js +7 -0
  144. patchright/driver/package/lib/generated/webSocketMockSource.js +7 -0
  145. patchright/driver/package/lib/image_tools/colorUtils.js +98 -0
  146. patchright/driver/package/lib/image_tools/compare.js +108 -0
  147. patchright/driver/package/lib/image_tools/imageChannel.js +70 -0
  148. patchright/driver/package/lib/image_tools/stats.js +102 -0
  149. patchright/driver/package/lib/inProcessFactory.js +54 -0
  150. patchright/driver/package/lib/inprocess.js +20 -0
  151. patchright/driver/package/lib/outofprocess.js +67 -0
  152. patchright/driver/package/lib/protocol/debug.js +27 -0
  153. patchright/driver/package/lib/protocol/serializers.js +173 -0
  154. patchright/driver/package/lib/protocol/transport.js +82 -0
  155. patchright/driver/package/lib/protocol/validator.js +2759 -0
  156. patchright/driver/package/lib/protocol/validatorPrimitives.js +139 -0
  157. patchright/driver/package/lib/remote/playwrightConnection.js +274 -0
  158. patchright/driver/package/lib/remote/playwrightServer.js +110 -0
  159. patchright/driver/package/lib/server/accessibility.js +62 -0
  160. patchright/driver/package/lib/server/android/android.js +441 -0
  161. patchright/driver/package/lib/server/android/backendAdb.js +172 -0
  162. patchright/driver/package/lib/server/artifact.js +104 -0
  163. patchright/driver/package/lib/server/bidi/bidiBrowser.js +311 -0
  164. patchright/driver/package/lib/server/bidi/bidiChromium.js +124 -0
  165. patchright/driver/package/lib/server/bidi/bidiConnection.js +206 -0
  166. patchright/driver/package/lib/server/bidi/bidiExecutionContext.js +159 -0
  167. patchright/driver/package/lib/server/bidi/bidiFirefox.js +104 -0
  168. patchright/driver/package/lib/server/bidi/bidiInput.js +158 -0
  169. patchright/driver/package/lib/server/bidi/bidiNetworkManager.js +338 -0
  170. patchright/driver/package/lib/server/bidi/bidiOverCdp.js +103 -0
  171. patchright/driver/package/lib/server/bidi/bidiPage.js +529 -0
  172. patchright/driver/package/lib/server/bidi/bidiPdf.js +140 -0
  173. patchright/driver/package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
  174. patchright/driver/package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
  175. patchright/driver/package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
  176. patchright/driver/package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
  177. patchright/driver/package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
  178. patchright/driver/package/lib/server/browser.js +148 -0
  179. patchright/driver/package/lib/server/browserContext.js +666 -0
  180. patchright/driver/package/lib/server/browserType.js +335 -0
  181. patchright/driver/package/lib/server/chromium/appIcon.png +0 -0
  182. patchright/driver/package/lib/server/chromium/chromium.js +350 -0
  183. patchright/driver/package/lib/server/chromium/chromiumSwitches.js +36 -0
  184. patchright/driver/package/lib/server/chromium/crAccessibility.js +237 -0
  185. patchright/driver/package/lib/server/chromium/crBrowser.js +522 -0
  186. patchright/driver/package/lib/server/chromium/crConnection.js +228 -0
  187. patchright/driver/package/lib/server/chromium/crCoverage.js +246 -0
  188. patchright/driver/package/lib/server/chromium/crDevTools.js +104 -0
  189. patchright/driver/package/lib/server/chromium/crDragDrop.js +143 -0
  190. patchright/driver/package/lib/server/chromium/crExecutionContext.js +149 -0
  191. patchright/driver/package/lib/server/chromium/crInput.js +171 -0
  192. patchright/driver/package/lib/server/chromium/crNetworkManager.js +809 -0
  193. patchright/driver/package/lib/server/chromium/crPage.js +1235 -0
  194. patchright/driver/package/lib/server/chromium/crPdf.js +153 -0
  195. patchright/driver/package/lib/server/chromium/crProtocolHelper.js +133 -0
  196. patchright/driver/package/lib/server/chromium/crServiceWorker.js +111 -0
  197. patchright/driver/package/lib/server/chromium/defaultFontFamilies.js +145 -0
  198. patchright/driver/package/lib/server/chromium/videoRecorder.js +155 -0
  199. patchright/driver/package/lib/server/clock.js +133 -0
  200. patchright/driver/package/lib/server/codegen/csharp.js +299 -0
  201. patchright/driver/package/lib/server/codegen/java.js +235 -0
  202. patchright/driver/package/lib/server/codegen/javascript.js +223 -0
  203. patchright/driver/package/lib/server/codegen/jsonl.js +47 -0
  204. patchright/driver/package/lib/server/codegen/language.js +88 -0
  205. patchright/driver/package/lib/server/codegen/languages.js +30 -0
  206. patchright/driver/package/lib/server/codegen/python.js +265 -0
  207. patchright/driver/package/lib/server/codegen/types.js +5 -0
  208. patchright/driver/package/lib/server/console.js +57 -0
  209. patchright/driver/package/lib/server/cookieStore.js +185 -0
  210. patchright/driver/package/lib/server/debugController.js +234 -0
  211. patchright/driver/package/lib/server/debugger.js +132 -0
  212. patchright/driver/package/lib/server/deviceDescriptors.js +26 -0
  213. patchright/driver/package/lib/server/deviceDescriptorsSource.json +1669 -0
  214. patchright/driver/package/lib/server/dialog.js +71 -0
  215. patchright/driver/package/lib/server/dispatchers/androidDispatcher.js +193 -0
  216. patchright/driver/package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  217. patchright/driver/package/lib/server/dispatchers/browserContextDispatcher.js +368 -0
  218. patchright/driver/package/lib/server/dispatchers/browserDispatcher.js +170 -0
  219. patchright/driver/package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
  220. patchright/driver/package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
  221. patchright/driver/package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
  222. patchright/driver/package/lib/server/dispatchers/dialogDispatcher.js +44 -0
  223. patchright/driver/package/lib/server/dispatchers/dispatcher.js +395 -0
  224. patchright/driver/package/lib/server/dispatchers/electronDispatcher.js +93 -0
  225. patchright/driver/package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
  226. patchright/driver/package/lib/server/dispatchers/frameDispatcher.js +286 -0
  227. patchright/driver/package/lib/server/dispatchers/jsHandleDispatcher.js +97 -0
  228. patchright/driver/package/lib/server/dispatchers/jsonPipeDispatcher.js +59 -0
  229. patchright/driver/package/lib/server/dispatchers/localUtilsDispatcher.js +413 -0
  230. patchright/driver/package/lib/server/dispatchers/networkDispatchers.js +221 -0
  231. patchright/driver/package/lib/server/dispatchers/pageDispatcher.js +367 -0
  232. patchright/driver/package/lib/server/dispatchers/playwrightDispatcher.js +107 -0
  233. patchright/driver/package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
  234. patchright/driver/package/lib/server/dispatchers/streamDispatcher.js +62 -0
  235. patchright/driver/package/lib/server/dispatchers/tracingDispatcher.js +54 -0
  236. patchright/driver/package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
  237. patchright/driver/package/lib/server/dispatchers/writableStreamDispatcher.js +58 -0
  238. patchright/driver/package/lib/server/dom.js +845 -0
  239. patchright/driver/package/lib/server/download.js +60 -0
  240. patchright/driver/package/lib/server/electron/electron.js +296 -0
  241. patchright/driver/package/lib/server/electron/loader.js +57 -0
  242. patchright/driver/package/lib/server/errors.js +68 -0
  243. patchright/driver/package/lib/server/fetch.js +656 -0
  244. patchright/driver/package/lib/server/fileChooser.js +42 -0
  245. patchright/driver/package/lib/server/fileUploadUtils.js +75 -0
  246. patchright/driver/package/lib/server/firefox/ffAccessibility.js +216 -0
  247. patchright/driver/package/lib/server/firefox/ffBrowser.js +460 -0
  248. patchright/driver/package/lib/server/firefox/ffConnection.js +168 -0
  249. patchright/driver/package/lib/server/firefox/ffExecutionContext.js +135 -0
  250. patchright/driver/package/lib/server/firefox/ffInput.js +150 -0
  251. patchright/driver/package/lib/server/firefox/ffNetworkManager.js +233 -0
  252. patchright/driver/package/lib/server/firefox/ffPage.js +559 -0
  253. patchright/driver/package/lib/server/firefox/firefox.js +99 -0
  254. patchright/driver/package/lib/server/formData.js +75 -0
  255. patchright/driver/package/lib/server/frameSelectors.js +171 -0
  256. patchright/driver/package/lib/server/frames.js +1808 -0
  257. patchright/driver/package/lib/server/har/harRecorder.js +139 -0
  258. patchright/driver/package/lib/server/har/harTracer.js +542 -0
  259. patchright/driver/package/lib/server/helper.js +103 -0
  260. patchright/driver/package/lib/server/index.js +114 -0
  261. patchright/driver/package/lib/server/input.js +310 -0
  262. patchright/driver/package/lib/server/instrumentation.js +70 -0
  263. patchright/driver/package/lib/server/isomorphic/utilityScriptSerializers.js +226 -0
  264. patchright/driver/package/lib/server/javascript.js +299 -0
  265. patchright/driver/package/lib/server/launchApp.js +91 -0
  266. patchright/driver/package/lib/server/macEditingCommands.js +139 -0
  267. patchright/driver/package/lib/server/network.js +617 -0
  268. patchright/driver/package/lib/server/page.js +819 -0
  269. patchright/driver/package/lib/server/pipeTransport.js +85 -0
  270. patchright/driver/package/lib/server/playwright.js +88 -0
  271. patchright/driver/package/lib/server/progress.js +102 -0
  272. patchright/driver/package/lib/server/protocolError.js +49 -0
  273. patchright/driver/package/lib/server/recorder/contextRecorder.js +299 -0
  274. patchright/driver/package/lib/server/recorder/recorderApp.js +196 -0
  275. patchright/driver/package/lib/server/recorder/recorderCollection.js +116 -0
  276. patchright/driver/package/lib/server/recorder/recorderFrontend.js +5 -0
  277. patchright/driver/package/lib/server/recorder/recorderInTraceViewer.js +144 -0
  278. patchright/driver/package/lib/server/recorder/recorderRunner.js +155 -0
  279. patchright/driver/package/lib/server/recorder/recorderUtils.js +112 -0
  280. patchright/driver/package/lib/server/recorder/throttledFile.js +46 -0
  281. patchright/driver/package/lib/server/recorder.js +327 -0
  282. patchright/driver/package/lib/server/registry/browserFetcher.js +168 -0
  283. patchright/driver/package/lib/server/registry/dependencies.js +322 -0
  284. patchright/driver/package/lib/server/registry/index.js +1005 -0
  285. patchright/driver/package/lib/server/registry/nativeDeps.js +490 -0
  286. patchright/driver/package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
  287. patchright/driver/package/lib/server/screenshotter.js +348 -0
  288. patchright/driver/package/lib/server/selectors.js +73 -0
  289. patchright/driver/package/lib/server/socksClientCertificatesInterceptor.js +340 -0
  290. patchright/driver/package/lib/server/socksInterceptor.js +100 -0
  291. patchright/driver/package/lib/server/trace/recorder/snapshotter.js +172 -0
  292. patchright/driver/package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
  293. patchright/driver/package/lib/server/trace/recorder/tracing.js +542 -0
  294. patchright/driver/package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
  295. patchright/driver/package/lib/server/trace/viewer/traceViewer.js +213 -0
  296. patchright/driver/package/lib/server/transport.js +191 -0
  297. patchright/driver/package/lib/server/types.js +24 -0
  298. patchright/driver/package/lib/server/usKeyboardLayout.js +555 -0
  299. patchright/driver/package/lib/server/webkit/webkit.js +87 -0
  300. patchright/driver/package/lib/server/webkit/wkAccessibility.js +194 -0
  301. patchright/driver/package/lib/server/webkit/wkBrowser.js +329 -0
  302. patchright/driver/package/lib/server/webkit/wkConnection.js +173 -0
  303. patchright/driver/package/lib/server/webkit/wkExecutionContext.js +143 -0
  304. patchright/driver/package/lib/server/webkit/wkInput.js +169 -0
  305. patchright/driver/package/lib/server/webkit/wkInterceptableRequest.js +162 -0
  306. patchright/driver/package/lib/server/webkit/wkPage.js +1219 -0
  307. patchright/driver/package/lib/server/webkit/wkProvisionalPage.js +94 -0
  308. patchright/driver/package/lib/server/webkit/wkWorkers.js +104 -0
  309. patchright/driver/package/lib/third_party/diff_match_patch.js +2222 -0
  310. patchright/driver/package/lib/third_party/pixelmatch.js +255 -0
  311. patchright/driver/package/lib/utils/ascii.js +31 -0
  312. patchright/driver/package/lib/utils/comparators.js +171 -0
  313. patchright/driver/package/lib/utils/crypto.js +174 -0
  314. patchright/driver/package/lib/utils/debug.js +46 -0
  315. patchright/driver/package/lib/utils/debugLogger.js +91 -0
  316. patchright/driver/package/lib/utils/env.js +49 -0
  317. patchright/driver/package/lib/utils/eventsHelper.js +38 -0
  318. patchright/driver/package/lib/utils/expectUtils.js +33 -0
  319. patchright/driver/package/lib/utils/fileUtils.js +205 -0
  320. patchright/driver/package/lib/utils/happy-eyeballs.js +194 -0
  321. patchright/driver/package/lib/utils/headers.js +52 -0
  322. patchright/driver/package/lib/utils/hostPlatform.js +133 -0
  323. patchright/driver/package/lib/utils/httpServer.js +237 -0
  324. patchright/driver/package/lib/utils/index.js +368 -0
  325. patchright/driver/package/lib/utils/isomorphic/cssParser.js +250 -0
  326. patchright/driver/package/lib/utils/isomorphic/cssTokenizer.js +979 -0
  327. patchright/driver/package/lib/utils/isomorphic/locatorGenerators.js +642 -0
  328. patchright/driver/package/lib/utils/isomorphic/locatorParser.js +179 -0
  329. patchright/driver/package/lib/utils/isomorphic/locatorUtils.js +62 -0
  330. patchright/driver/package/lib/utils/isomorphic/mimeType.js +29 -0
  331. patchright/driver/package/lib/utils/isomorphic/recorderUtils.js +195 -0
  332. patchright/driver/package/lib/utils/isomorphic/selectorParser.js +397 -0
  333. patchright/driver/package/lib/utils/isomorphic/stringUtils.js +139 -0
  334. patchright/driver/package/lib/utils/isomorphic/traceUtils.js +39 -0
  335. patchright/driver/package/lib/utils/isomorphic/urlMatch.js +120 -0
  336. patchright/driver/package/lib/utils/linuxUtils.js +78 -0
  337. patchright/driver/package/lib/utils/manualPromise.js +109 -0
  338. patchright/driver/package/lib/utils/multimap.js +75 -0
  339. patchright/driver/package/lib/utils/network.js +160 -0
  340. patchright/driver/package/lib/utils/processLauncher.js +248 -0
  341. patchright/driver/package/lib/utils/profiler.js +53 -0
  342. patchright/driver/package/lib/utils/rtti.js +44 -0
  343. patchright/driver/package/lib/utils/semaphore.js +51 -0
  344. patchright/driver/package/lib/utils/spawnAsync.js +45 -0
  345. patchright/driver/package/lib/utils/stackTrace.js +121 -0
  346. patchright/driver/package/lib/utils/task.js +58 -0
  347. patchright/driver/package/lib/utils/time.js +37 -0
  348. patchright/driver/package/lib/utils/timeoutRunner.js +66 -0
  349. patchright/driver/package/lib/utils/traceUtils.js +44 -0
  350. patchright/driver/package/lib/utils/userAgent.js +105 -0
  351. patchright/driver/package/lib/utils/wsServer.js +127 -0
  352. patchright/driver/package/lib/utils/zipFile.js +75 -0
  353. patchright/driver/package/lib/utils/zones.js +62 -0
  354. patchright/driver/package/lib/utilsBundle.js +82 -0
  355. patchright/driver/package/lib/utilsBundleImpl/index.js +53 -0
  356. patchright/driver/package/lib/utilsBundleImpl/xdg-open +1066 -0
  357. patchright/driver/package/lib/vite/htmlReport/index.html +66 -0
  358. patchright/driver/package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +24 -0
  359. patchright/driver/package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +1 -0
  360. patchright/driver/package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  361. patchright/driver/package/lib/vite/recorder/assets/index-BW-aOBcL.css +1 -0
  362. patchright/driver/package/lib/vite/recorder/assets/index-Bxxcmxlu.js +42 -0
  363. patchright/driver/package/lib/vite/recorder/index.html +29 -0
  364. patchright/driver/package/lib/vite/recorder/playwright-logo.svg +9 -0
  365. patchright/driver/package/lib/vite/traceViewer/assets/codeMirrorModule-CZTtn9l8.js +24 -0
  366. patchright/driver/package/lib/vite/traceViewer/assets/inspectorTab-DTusvprx.js +64 -0
  367. patchright/driver/package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
  368. patchright/driver/package/lib/vite/traceViewer/assets/workbench-DIEjrm3Z.js +9 -0
  369. patchright/driver/package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +9 -0
  370. patchright/driver/package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +1 -0
  371. patchright/driver/package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  372. patchright/driver/package/lib/vite/traceViewer/embedded.Do_J5Hgs.js +2 -0
  373. patchright/driver/package/lib/vite/traceViewer/embedded.html +18 -0
  374. patchright/driver/package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
  375. patchright/driver/package/lib/vite/traceViewer/index.B21BXreT.js +2 -0
  376. patchright/driver/package/lib/vite/traceViewer/index.CrbWWHbf.css +1 -0
  377. patchright/driver/package/lib/vite/traceViewer/index.html +29 -0
  378. patchright/driver/package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
  379. patchright/driver/package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  380. patchright/driver/package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  381. patchright/driver/package/lib/vite/traceViewer/recorder.Bfh_9UGt.js +2 -0
  382. patchright/driver/package/lib/vite/traceViewer/recorder.html +17 -0
  383. patchright/driver/package/lib/vite/traceViewer/snapshot.html +21 -0
  384. patchright/driver/package/lib/vite/traceViewer/sw.bundle.js +3 -0
  385. patchright/driver/package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
  386. patchright/driver/package/lib/vite/traceViewer/uiMode.DloKQa-h.js +5 -0
  387. patchright/driver/package/lib/vite/traceViewer/uiMode.html +20 -0
  388. patchright/driver/package/lib/vite/traceViewer/workbench.D3JVcA9K.css +1 -0
  389. patchright/driver/package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +32 -0
  390. patchright/driver/package/lib/zipBundle.js +25 -0
  391. patchright/driver/package/lib/zipBundleImpl.js +5 -0
  392. patchright/driver/package/package.json +44 -0
  393. patchright/driver/package/protocol.yml +3720 -0
  394. patchright/driver/package/types/protocol.d.ts +21571 -0
  395. patchright/driver/package/types/structs.d.ts +45 -0
  396. patchright/driver/package/types/types.d.ts +22519 -0
  397. patchright/py.typed +0 -0
  398. patchright/sync_api/__init__.py +177 -0
  399. patchright/sync_api/_context_manager.py +74 -0
  400. patchright/sync_api/_generated.py +20155 -0
  401. patchright-1.48.0.dist-info/LICENSE +202 -0
  402. patchright-1.48.0.dist-info/METADATA +83 -0
  403. patchright-1.48.0.dist-info/RECORD +406 -0
  404. patchright-1.48.0.dist-info/WHEEL +5 -0
  405. patchright-1.48.0.dist-info/entry_points.txt +5 -0
  406. patchright-1.48.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,51 @@
1
+ import re
2
+
3
+ escaped_chars = {"$", "^", "+", ".", "*", "(", ")", "|", "\\", "?", "{", "}", "[", "]"}
4
+
5
+
6
+ def glob_to_regex(glob: str) -> "re.Pattern[str]":
7
+ tokens = ["^"]
8
+ in_group = False
9
+ i = 0
10
+ while i < len(glob):
11
+ c = glob[i]
12
+ if c == "\\" and i + 1 < len(glob):
13
+ char = glob[i + 1]
14
+ tokens.append("\\" + char if char in escaped_chars else char)
15
+ i += 1
16
+ elif c == "*":
17
+ before_deep = glob[i - 1] if i > 0 else None
18
+ star_count = 1
19
+ while i + 1 < len(glob) and glob[i + 1] == "*":
20
+ star_count += 1
21
+ i += 1
22
+ after_deep = glob[i + 1] if i + 1 < len(glob) else None
23
+ is_deep = (
24
+ star_count > 1
25
+ and (before_deep == "/" or before_deep is None)
26
+ and (after_deep == "/" or after_deep is None)
27
+ )
28
+ if is_deep:
29
+ tokens.append("((?:[^/]*(?:/|$))*)")
30
+ i += 1
31
+ else:
32
+ tokens.append("([^/]*)")
33
+ elif c == "?":
34
+ tokens.append(".")
35
+ elif c == "[":
36
+ tokens.append("[")
37
+ elif c == "]":
38
+ tokens.append("]")
39
+ elif c == "{":
40
+ in_group = True
41
+ tokens.append("(")
42
+ elif c == "}":
43
+ in_group = False
44
+ tokens.append(")")
45
+ elif c == "," and in_group:
46
+ tokens.append("|")
47
+ else:
48
+ tokens.append("\\" + c if c in escaped_chars else c)
49
+ i += 1
50
+ tokens.append("$")
51
+ return re.compile("".join(tokens))
@@ -0,0 +1,39 @@
1
+ import os
2
+ from typing import Tuple
3
+ import greenlet
4
+
5
+
6
+ def _greenlet_trace_callback(
7
+ event: str, args: Tuple[greenlet.greenlet, greenlet.greenlet]
8
+ ) -> None:
9
+ if event in ("switch", "throw"):
10
+ origin, target = args
11
+ print(f"Transfer from {origin} to {target} with {event}")
12
+
13
+
14
+ if os.environ.get("INTERNAL_PW_GREENLET_DEBUG"):
15
+ greenlet.settrace(_greenlet_trace_callback)
16
+
17
+
18
+ class MainGreenlet(greenlet.greenlet):
19
+
20
+ def __str__(self) -> str:
21
+ return "<MainGreenlet>"
22
+
23
+
24
+ class RouteGreenlet(greenlet.greenlet):
25
+
26
+ def __str__(self) -> str:
27
+ return "<RouteGreenlet>"
28
+
29
+
30
+ class LocatorHandlerGreenlet(greenlet.greenlet):
31
+
32
+ def __str__(self) -> str:
33
+ return "<LocatorHandlerGreenlet>"
34
+
35
+
36
+ class EventGreenlet(greenlet.greenlet):
37
+
38
+ def __str__(self) -> str:
39
+ return "<EventGreenlet>"
@@ -0,0 +1,99 @@
1
+ import asyncio
2
+ import base64
3
+ from typing import TYPE_CHECKING, Optional, cast
4
+ from patchright._impl._api_structures import HeadersArray
5
+ from patchright._impl._helper import (
6
+ HarLookupResult,
7
+ RouteFromHarNotFoundPolicy,
8
+ URLMatch,
9
+ )
10
+ from patchright._impl._local_utils import LocalUtils
11
+
12
+ if TYPE_CHECKING:
13
+ from patchright._impl._browser_context import BrowserContext
14
+ from patchright._impl._network import Route
15
+ from patchright._impl._page import Page
16
+
17
+
18
+ class HarRouter:
19
+
20
+ def __init__(
21
+ self,
22
+ local_utils: LocalUtils,
23
+ har_id: str,
24
+ not_found_action: RouteFromHarNotFoundPolicy,
25
+ url_matcher: Optional[URLMatch] = None,
26
+ ) -> None:
27
+ self._local_utils: LocalUtils = local_utils
28
+ self._har_id: str = har_id
29
+ self._not_found_action: RouteFromHarNotFoundPolicy = not_found_action
30
+ self._options_url_match: Optional[URLMatch] = url_matcher
31
+
32
+ @staticmethod
33
+ async def create(
34
+ local_utils: LocalUtils,
35
+ file: str,
36
+ not_found_action: RouteFromHarNotFoundPolicy,
37
+ url_matcher: Optional[URLMatch] = None,
38
+ ) -> "HarRouter":
39
+ har_id = await local_utils._channel.send("harOpen", {"file": file})
40
+ return HarRouter(
41
+ local_utils=local_utils,
42
+ har_id=har_id,
43
+ not_found_action=not_found_action,
44
+ url_matcher=url_matcher,
45
+ )
46
+
47
+ async def _handle(self, route: "Route") -> None:
48
+ request = route.request
49
+ response: HarLookupResult = await self._local_utils.har_lookup(
50
+ harId=self._har_id,
51
+ url=request.url,
52
+ method=request.method,
53
+ headers=await request.headers_array(),
54
+ postData=request.post_data_buffer,
55
+ isNavigationRequest=request.is_navigation_request(),
56
+ )
57
+ action = response["action"]
58
+ if action == "redirect":
59
+ redirect_url = response["redirectURL"]
60
+ assert redirect_url
61
+ await route._redirected_navigation_request(redirect_url)
62
+ return
63
+ if action == "fulfill":
64
+ if response.get("status") == -1:
65
+ return
66
+ body = response["body"]
67
+ assert body is not None
68
+ await route.fulfill(
69
+ status=response.get("status"),
70
+ headers={
71
+ v["name"]: v["value"]
72
+ for v in cast(HeadersArray, response.get("headers", []))
73
+ },
74
+ body=base64.b64decode(body),
75
+ )
76
+ return
77
+ if action == "error":
78
+ pass
79
+ if self._not_found_action == "abort":
80
+ await route.abort()
81
+ return
82
+ await route.fallback()
83
+
84
+ async def add_context_route(self, context: "BrowserContext") -> None:
85
+ await context.route(
86
+ url=self._options_url_match or "**/*",
87
+ handler=lambda route, _: asyncio.create_task(self._handle(route)),
88
+ )
89
+
90
+ async def add_page_route(self, page: "Page") -> None:
91
+ await page.route(
92
+ url=self._options_url_match or "**/*",
93
+ handler=lambda route, _: asyncio.create_task(self._handle(route)),
94
+ )
95
+
96
+ def dispose(self) -> None:
97
+ asyncio.create_task(
98
+ self._local_utils._channel.send("harClose", {"harId": self._har_id})
99
+ )
@@ -0,0 +1,421 @@
1
+ import asyncio
2
+ import math
3
+ import os
4
+ import re
5
+ import time
6
+ import traceback
7
+ from pathlib import Path
8
+ from types import TracebackType
9
+ from typing import (
10
+ TYPE_CHECKING,
11
+ Any,
12
+ Callable,
13
+ Dict,
14
+ List,
15
+ Literal,
16
+ Optional,
17
+ Pattern,
18
+ Set,
19
+ TypedDict,
20
+ TypeVar,
21
+ Union,
22
+ cast,
23
+ )
24
+ from urllib.parse import urljoin
25
+ from patchright._impl._api_structures import NameValue
26
+ from patchright._impl._errors import (
27
+ Error,
28
+ TargetClosedError,
29
+ TimeoutError,
30
+ is_target_closed_error,
31
+ rewrite_error,
32
+ )
33
+ from patchright._impl._glob import glob_to_regex
34
+ from patchright._impl._greenlets import RouteGreenlet
35
+ from patchright._impl._str_utils import escape_regex_flags
36
+
37
+ if TYPE_CHECKING:
38
+ from patchright._impl._api_structures import HeadersArray
39
+ from patchright._impl._network import Request, Response, Route, WebSocketRoute
40
+ URLMatch = Union[str, Pattern[str], Callable[[str], bool]]
41
+ URLMatchRequest = Union[str, Pattern[str], Callable[["Request"], bool]]
42
+ URLMatchResponse = Union[str, Pattern[str], Callable[["Response"], bool]]
43
+ RouteHandlerCallback = Union[
44
+ Callable[["Route"], Any], Callable[["Route", "Request"], Any]
45
+ ]
46
+ WebSocketRouteHandlerCallback = Callable[["WebSocketRoute"], Any]
47
+ ColorScheme = Literal["dark", "light", "no-preference", "null"]
48
+ ForcedColors = Literal["active", "none", "null"]
49
+ ReducedMotion = Literal["no-preference", "null", "reduce"]
50
+ DocumentLoadState = Literal["commit", "domcontentloaded", "load", "networkidle"]
51
+ KeyboardModifier = Literal["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]
52
+ MouseButton = Literal["left", "middle", "right"]
53
+ ServiceWorkersPolicy = Literal["allow", "block"]
54
+ HarMode = Literal["full", "minimal"]
55
+ HarContentPolicy = Literal["attach", "embed", "omit"]
56
+ RouteFromHarNotFoundPolicy = Literal["abort", "fallback"]
57
+
58
+
59
+ class ErrorPayload(TypedDict, total=False):
60
+ message: str
61
+ name: str
62
+ stack: str
63
+ value: Optional[Any]
64
+
65
+
66
+ class HarRecordingMetadata(TypedDict, total=False):
67
+ path: str
68
+ content: Optional[HarContentPolicy]
69
+
70
+
71
+ def prepare_record_har_options(params: Dict) -> Dict[str, Any]:
72
+ out_params: Dict[str, Any] = {"path": str(params["recordHarPath"])}
73
+ if "recordHarUrlFilter" in params:
74
+ opt = params["recordHarUrlFilter"]
75
+ if isinstance(opt, str):
76
+ out_params["urlGlob"] = opt
77
+ if isinstance(opt, Pattern):
78
+ out_params["urlRegexSource"] = opt.pattern
79
+ out_params["urlRegexFlags"] = escape_regex_flags(opt)
80
+ del params["recordHarUrlFilter"]
81
+ if "recordHarMode" in params:
82
+ out_params["mode"] = params["recordHarMode"]
83
+ del params["recordHarMode"]
84
+ new_content_api = None
85
+ old_content_api = None
86
+ if "recordHarContent" in params:
87
+ new_content_api = params["recordHarContent"]
88
+ del params["recordHarContent"]
89
+ if "recordHarOmitContent" in params:
90
+ old_content_api = params["recordHarOmitContent"]
91
+ del params["recordHarOmitContent"]
92
+ content = new_content_api or ("omit" if old_content_api else None)
93
+ if content:
94
+ out_params["content"] = content
95
+ return out_params
96
+
97
+
98
+ class ParsedMessageParams(TypedDict):
99
+ type: str
100
+ guid: str
101
+ initializer: Dict
102
+
103
+
104
+ class ParsedMessagePayload(TypedDict, total=False):
105
+ id: int
106
+ guid: str
107
+ method: str
108
+ params: ParsedMessageParams
109
+ result: Any
110
+ error: ErrorPayload
111
+
112
+
113
+ class Document(TypedDict):
114
+ request: Optional[Any]
115
+
116
+
117
+ class FrameNavigatedEvent(TypedDict):
118
+ url: str
119
+ name: str
120
+ newDocument: Optional[Document]
121
+ error: Optional[str]
122
+
123
+
124
+ Env = Dict[str, Union[str, float, bool]]
125
+
126
+
127
+ class URLMatcher:
128
+
129
+ def __init__(self, base_url: Union[str, None], match: URLMatch) -> None:
130
+ self._callback: Optional[Callable[[str], bool]] = None
131
+ self._regex_obj: Optional[Pattern[str]] = None
132
+ if isinstance(match, str):
133
+ if base_url and (not match.startswith("*")):
134
+ match = urljoin(base_url, match)
135
+ regex = glob_to_regex(match)
136
+ self._regex_obj = re.compile(regex)
137
+ elif isinstance(match, Pattern):
138
+ self._regex_obj = match
139
+ else:
140
+ self._callback = match
141
+ self.match = match
142
+
143
+ def matches(self, url: str) -> bool:
144
+ if self._callback:
145
+ return self._callback(url)
146
+ if self._regex_obj:
147
+ return cast(bool, self._regex_obj.search(url))
148
+ return False
149
+
150
+
151
+ class HarLookupResult(TypedDict, total=False):
152
+ action: Literal["error", "redirect", "fulfill", "noentry"]
153
+ message: Optional[str]
154
+ redirectURL: Optional[str]
155
+ status: Optional[int]
156
+ headers: Optional["HeadersArray"]
157
+ body: Optional[str]
158
+
159
+
160
+ class TimeoutSettings:
161
+
162
+ def __init__(self, parent: Optional["TimeoutSettings"]) -> None:
163
+ self._parent = parent
164
+ self._default_timeout: Optional[float] = None
165
+ self._default_navigation_timeout: Optional[float] = None
166
+
167
+ def set_default_timeout(self, timeout: Optional[float]) -> None:
168
+ self._default_timeout = timeout
169
+
170
+ def timeout(self, timeout: float = None) -> float:
171
+ if timeout is not None:
172
+ return timeout
173
+ if self._default_timeout is not None:
174
+ return self._default_timeout
175
+ if self._parent:
176
+ return self._parent.timeout()
177
+ return 30000
178
+
179
+ def set_default_navigation_timeout(
180
+ self, navigation_timeout: Optional[float]
181
+ ) -> None:
182
+ self._default_navigation_timeout = navigation_timeout
183
+
184
+ def default_navigation_timeout(self) -> Optional[float]:
185
+ return self._default_navigation_timeout
186
+
187
+ def default_timeout(self) -> Optional[float]:
188
+ return self._default_timeout
189
+
190
+ def navigation_timeout(self) -> float:
191
+ if self._default_navigation_timeout is not None:
192
+ return self._default_navigation_timeout
193
+ if self._parent:
194
+ return self._parent.navigation_timeout()
195
+ return 30000
196
+
197
+
198
+ def serialize_error(ex: Exception, tb: Optional[TracebackType]) -> ErrorPayload:
199
+ return ErrorPayload(
200
+ message=str(ex), name="Error", stack="".join(traceback.format_tb(tb))
201
+ )
202
+
203
+
204
+ def parse_error(error: ErrorPayload, log: Optional[str] = None) -> Error:
205
+ base_error_class = Error
206
+ if error.get("name") == "TimeoutError":
207
+ base_error_class = TimeoutError
208
+ if error.get("name") == "TargetClosedError":
209
+ base_error_class = TargetClosedError
210
+ if not log:
211
+ log = ""
212
+ exc = base_error_class(patch_error_message(error["message"]) + log)
213
+ exc._name = error["name"]
214
+ exc._stack = error["stack"]
215
+ return exc
216
+
217
+
218
+ def patch_error_message(message: str) -> str:
219
+ match = re.match("(\\w+)(: expected .*)", message)
220
+ if match:
221
+ message = to_snake_case(match.group(1)) + match.group(2)
222
+ message = message.replace(
223
+ "Pass { acceptDownloads: true }", "Pass 'accept_downloads=True'"
224
+ )
225
+ return message
226
+
227
+
228
+ def locals_to_params(args: Dict) -> Dict:
229
+ copy = {}
230
+ for key in args:
231
+ if key == "self":
232
+ continue
233
+ if args[key] is not None:
234
+ copy[key] = (
235
+ args[key]
236
+ if not isinstance(args[key], Dict)
237
+ else locals_to_params(args[key])
238
+ )
239
+ return copy
240
+
241
+
242
+ def monotonic_time() -> int:
243
+ return math.floor(time.monotonic() * 1000)
244
+
245
+
246
+ class RouteHandlerInvocation:
247
+ complete: "asyncio.Future"
248
+ route: "Route"
249
+
250
+ def __init__(self, complete: "asyncio.Future", route: "Route") -> None:
251
+ self.complete = complete
252
+ self.route = route
253
+
254
+
255
+ class RouteHandler:
256
+
257
+ def __init__(
258
+ self,
259
+ matcher: URLMatcher,
260
+ handler: RouteHandlerCallback,
261
+ is_sync: bool,
262
+ times: Optional[int] = None,
263
+ ):
264
+ self.matcher = matcher
265
+ self.handler = handler
266
+ self._times = times if times else math.inf
267
+ self._handled_count = 0
268
+ self._is_sync = is_sync
269
+ self._ignore_exception = False
270
+ self._active_invocations: Set[RouteHandlerInvocation] = set()
271
+
272
+ def matches(self, request_url: str) -> bool:
273
+ return self.matcher.matches(request_url)
274
+
275
+ async def handle(self, route: "Route") -> bool:
276
+ handler_invocation = RouteHandlerInvocation(
277
+ asyncio.get_running_loop().create_future(), route
278
+ )
279
+ self._active_invocations.add(handler_invocation)
280
+ try:
281
+ return await self._handle_internal(route)
282
+ except Exception as e:
283
+ if self._ignore_exception:
284
+ return False
285
+ if is_target_closed_error(e):
286
+ optional_async_prefix = "await " if not self._is_sync else ""
287
+ raise rewrite_error(
288
+ e,
289
+ f""""{str(e)}" while running route callback.\nConsider awaiting `{optional_async_prefix}page.unroute_all(behavior='ignoreErrors')`\nbefore the end of the test to ignore remaining routes in flight.""",
290
+ )
291
+ raise e
292
+ finally:
293
+ handler_invocation.complete.set_result(None)
294
+ self._active_invocations.remove(handler_invocation)
295
+
296
+ async def _handle_internal(self, route: "Route") -> bool:
297
+ handled_future = route._start_handling()
298
+ self._handled_count += 1
299
+ if self._is_sync:
300
+ handler_finished_future = route._loop.create_future()
301
+
302
+ def _handler() -> None:
303
+ try:
304
+ self.handler(route, route.request)
305
+ handler_finished_future.set_result(None)
306
+ except Exception as e:
307
+ handler_finished_future.set_exception(e)
308
+
309
+ g = RouteGreenlet(_handler)
310
+ g.switch()
311
+ await handler_finished_future
312
+ else:
313
+ coro_or_future = self.handler(route, route.request)
314
+ if coro_or_future:
315
+ await asyncio.ensure_future(coro_or_future)
316
+ return await handled_future
317
+
318
+ async def stop(self, behavior: Literal["ignoreErrors", "wait"]) -> None:
319
+ if behavior == "ignoreErrors":
320
+ self._ignore_exception = True
321
+ else:
322
+ tasks = []
323
+ for activation in self._active_invocations:
324
+ if not activation.route._did_throw:
325
+ tasks.append(activation.complete)
326
+ await asyncio.gather(*tasks)
327
+
328
+ @property
329
+ def will_expire(self) -> bool:
330
+ return self._handled_count + 1 >= self._times
331
+
332
+ @staticmethod
333
+ def prepare_interception_patterns(
334
+ handlers: List["RouteHandler"],
335
+ ) -> List[Dict[str, str]]:
336
+ patterns = []
337
+ all = False
338
+ for handler in handlers:
339
+ if isinstance(handler.matcher.match, str):
340
+ patterns.append({"glob": handler.matcher.match})
341
+ elif isinstance(handler.matcher._regex_obj, re.Pattern):
342
+ patterns.append(
343
+ {
344
+ "regexSource": handler.matcher._regex_obj.pattern,
345
+ "regexFlags": escape_regex_flags(handler.matcher._regex_obj),
346
+ }
347
+ )
348
+ else:
349
+ all = True
350
+ if all:
351
+ return [{"glob": "**/*"}]
352
+ return patterns
353
+
354
+
355
+ to_snake_case_regex = re.compile("((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))")
356
+
357
+
358
+ def to_snake_case(name: str) -> str:
359
+ return to_snake_case_regex.sub("_\\1", name).lower()
360
+
361
+
362
+ def make_dirs_for_file(path: Union[Path, str]) -> None:
363
+ if not os.path.isabs(path):
364
+ path = Path.cwd() / path
365
+ os.makedirs(os.path.dirname(path), exist_ok=True)
366
+
367
+
368
+ async def async_writefile(file: Union[str, Path], data: Union[str, bytes]) -> None:
369
+
370
+ def inner() -> None:
371
+ with open(file, "w" if isinstance(data, str) else "wb") as fh:
372
+ fh.write(data)
373
+
374
+ loop = asyncio.get_running_loop()
375
+ await loop.run_in_executor(None, inner)
376
+
377
+
378
+ async def async_readfile(file: Union[str, Path]) -> bytes:
379
+
380
+ def inner() -> bytes:
381
+ with open(file, "rb") as fh:
382
+ return fh.read()
383
+
384
+ loop = asyncio.get_running_loop()
385
+ return await loop.run_in_executor(None, inner)
386
+
387
+
388
+ T = TypeVar("T")
389
+
390
+
391
+ def to_impl(obj: T) -> T:
392
+ if hasattr(obj, "_impl_obj"):
393
+ return cast(Any, obj)._impl_obj
394
+ return obj
395
+
396
+
397
+ def object_to_array(obj: Optional[Dict]) -> Optional[List[NameValue]]:
398
+ if not obj:
399
+ return None
400
+ result = []
401
+ for key, value in obj.items():
402
+ result.append(NameValue(name=key, value=str(value)))
403
+ return result
404
+
405
+
406
+ def is_file_payload(value: Optional[Any]) -> bool:
407
+ return (
408
+ isinstance(value, dict)
409
+ and "name" in value
410
+ and ("mimeType" in value)
411
+ and ("buffer" in value)
412
+ )
413
+
414
+
415
+ TEXTUAL_MIME_TYPE = re.compile(
416
+ "^(text\\/.*?|application\\/(json|(x-)?javascript|xml.*?|ecmascript|graphql|x-www-form-urlencoded)|image\\/svg(\\+xml)?|application\\/.*?(\\+json|\\+xml))(;\\s*charset=.*)?$"
417
+ )
418
+
419
+
420
+ def is_textual_mime_type(mime_type: str) -> bool:
421
+ return bool(TEXTUAL_MIME_TYPE.match(mime_type))