cdpify 0.4.0__tar.gz → 0.5.0__tar.gz
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.
- cdpify-0.5.0/CHANGELOG.md +214 -0
- cdpify-0.5.0/MANIFEST.in +2 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/PKG-INFO +174 -18
- {cdpify-0.4.0 → cdpify-0.5.0}/README.md +173 -17
- cdpify-0.5.0/RELEASING.md +76 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/__init__.py +11 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/client.py +63 -12
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/codec.py +43 -4
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/commands.py +65 -5
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/domain.py +94 -41
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/events.py +9 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/types.py +95 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/ads/types.py +46 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/commands.py +46 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/domain.py +59 -28
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/events.py +12 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/types.py +97 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/commands.py +22 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/domain.py +16 -10
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/types.py +154 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/commands.py +14 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/domain.py +22 -10
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/events.py +7 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/types.py +53 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/domain.py +16 -13
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/types.py +24 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/commands.py +18 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/domain.py +70 -60
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/types.py +18 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/browser/commands.py +156 -13
- cdpify-0.5.0/cdpify/domains/browser/domain.py +519 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/browser/events.py +34 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/browser/types.py +79 -6
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cachestorage/commands.py +53 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cachestorage/domain.py +57 -28
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cachestorage/types.py +42 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/domain.py +18 -16
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/types.py +4 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/events.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/types.py +18 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/crashreportcontext/types.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/css/commands.py +242 -11
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/css/domain.py +234 -152
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/css/events.py +16 -0
- cdpify-0.5.0/cdpify/domains/css/types.py +1293 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/commands.py +313 -7
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/domain.py +334 -144
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/events.py +162 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/types.py +102 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/domain.py +10 -7
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/types.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceorientation/commands.py +9 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceorientation/domain.py +12 -4
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/digitalcredentials/commands.py +14 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/digitalcredentials/domain.py +18 -6
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/commands.py +474 -19
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/domain.py +540 -249
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/events.py +126 -10
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/types.py +171 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domdebugger/commands.py +61 -3
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domdebugger/domain.py +93 -42
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domdebugger/types.py +31 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domsnapshot/commands.py +52 -1
- cdpify-0.5.0/cdpify/domains/domsnapshot/domain.py +134 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domsnapshot/types.py +288 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/domain.py +18 -13
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/types.py +9 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/emulation/commands.py +352 -23
- cdpify-0.5.0/cdpify/domains/emulation/domain.py +1238 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/emulation/events.py +9 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/emulation/types.py +174 -6
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/eventbreakpoints/commands.py +6 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/eventbreakpoints/domain.py +14 -7
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/extensions/commands.py +51 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/extensions/domain.py +63 -22
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/extensions/types.py +15 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/commands.py +5 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/domain.py +32 -24
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/events.py +4 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/types.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fetch/commands.py +96 -1
- cdpify-0.5.0/cdpify/domains/fetch/domain.py +298 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fetch/events.py +49 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fetch/types.py +35 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/filesystem/commands.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/filesystem/domain.py +6 -6
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/filesystem/types.py +19 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/findinpage/domain.py +5 -4
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/headlessexperimental/commands.py +29 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/headlessexperimental/domain.py +32 -11
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/headlessexperimental/types.py +9 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/heapprofiler/commands.py +74 -0
- cdpify-0.5.0/cdpify/domains/heapprofiler/domain.py +262 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/heapprofiler/events.py +5 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/heapprofiler/types.py +23 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/indexeddb/commands.py +128 -0
- cdpify-0.5.0/cdpify/domains/indexeddb/domain.py +311 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/indexeddb/types.py +79 -0
- cdpify-0.5.0/cdpify/domains/input/commands.py +518 -0
- cdpify-0.5.0/cdpify/domains/input/domain.py +573 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/input/events.py +2 -1
- cdpify-0.5.0/cdpify/domains/input/types.py +138 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/inspector/events.py +4 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/io/commands.py +30 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/io/domain.py +31 -12
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/commands.py +60 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/domain.py +67 -31
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/events.py +9 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/types.py +76 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/commands.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/domain.py +9 -4
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/events.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/types.py +36 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/types.py +23 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/memory/commands.py +15 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/memory/domain.py +25 -12
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/memory/types.py +29 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/network/commands.py +315 -15
- cdpify-0.5.0/cdpify/domains/network/domain.py +939 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/network/events.py +441 -21
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/network/types.py +1002 -35
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/commands.py +157 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/domain.py +261 -133
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/events.py +12 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/types.py +314 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/page/commands.py +520 -24
- cdpify-0.5.0/cdpify/domains/page/domain.py +1583 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/page/events.py +223 -14
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/page/types.py +472 -19
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/commands.py +11 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/domain.py +18 -9
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/events.py +6 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/types.py +6 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/commands.py +7 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/domain.py +13 -4
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/types.py +29 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/events.py +11 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/types.py +30 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/commands.py +29 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/domain.py +24 -11
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/events.py +23 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/types.py +68 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/pwa/commands.py +21 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/pwa/domain.py +52 -28
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/pwa/types.py +4 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/runtime/commands.py +297 -1
- cdpify-0.5.0/cdpify/domains/runtime/domain.py +697 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/runtime/events.py +51 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/runtime/types.py +268 -7
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/schema/commands.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/schema/types.py +6 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/commands.py +15 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/domain.py +26 -12
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/events.py +37 -3
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/types.py +131 -3
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/domain.py +37 -39
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/types.py +21 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/domain.py +47 -45
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/events.py +3 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/commands.py +95 -7
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/domain.py +158 -85
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/events.py +47 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/types.py +44 -3
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/systeminfo/commands.py +18 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/systeminfo/domain.py +6 -4
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/systeminfo/types.py +77 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/target/commands.py +191 -4
- cdpify-0.5.0/cdpify/domains/target/domain.py +569 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/target/events.py +23 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/target/types.py +53 -3
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tethering/commands.py +6 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tethering/domain.py +14 -7
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tethering/events.py +6 -0
- cdpify-0.5.0/cdpify/domains/tracing/commands.py +169 -0
- cdpify-0.5.0/cdpify/domains/tracing/domain.py +194 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tracing/events.py +29 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tracing/types.py +41 -4
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/domain.py +6 -4
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/types.py +23 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webauthn/commands.py +23 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webauthn/domain.py +85 -60
- cdpify-0.5.0/cdpify/domains/webauthn/types.py +214 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/commands.py +15 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/domain.py +17 -7
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/events.py +38 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/types.py +45 -0
- cdpify-0.4.0/cdpify/exceptions.py → cdpify-0.5.0/cdpify/error.py +36 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/event_queue.py +87 -57
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/events/dispatcher.py +1 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/events/router.py +40 -6
- cdpify-0.5.0/cdpify/events/source.py +65 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/events/subscription.py +109 -106
- cdpify-0.5.0/cdpify/executor.py +74 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/commands.py +107 -96
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/domain.py +98 -106
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/events.py +126 -113
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/types.py +135 -125
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/utils.py +60 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/views.py +148 -111
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/schemas.py +5 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/commands.py.jinja2 +47 -38
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/domain.py.jinja2 +76 -65
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/events.py.jinja2 +10 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/types.py.jinja2 +52 -43
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/session.py +7 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/shared/enums.py +19 -17
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/transport.py +9 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/transports/websocket.py +37 -25
- cdpify-0.5.0/cdpify/unset.py +13 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/PKG-INFO +174 -18
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/SOURCES.txt +9 -2
- {cdpify-0.4.0 → cdpify-0.5.0}/pyproject.toml +11 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_client.py +1 -1
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_codec.py +222 -177
- cdpify-0.4.0/tests/test_decorators_and_exceptions.py → cdpify-0.5.0/tests/test_decorators_and_errors.py +4 -4
- cdpify-0.5.0/tests/test_event_overflow_and_raw.py +109 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_event_subscription.py +2 -2
- cdpify-0.5.0/tests/test_executor.py +74 -0
- cdpify-0.5.0/tests/test_generated_params.py +40 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_websocket_client.py +173 -168
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_websocket_transport.py +412 -379
- cdpify-0.4.0/cdpify/domains/browser/domain.py +0 -409
- cdpify-0.4.0/cdpify/domains/css/types.py +0 -673
- cdpify-0.4.0/cdpify/domains/domsnapshot/domain.py +0 -101
- cdpify-0.4.0/cdpify/domains/emulation/domain.py +0 -960
- cdpify-0.4.0/cdpify/domains/fetch/domain.py +0 -229
- cdpify-0.4.0/cdpify/domains/heapprofiler/domain.py +0 -195
- cdpify-0.4.0/cdpify/domains/indexeddb/domain.py +0 -239
- cdpify-0.4.0/cdpify/domains/input/commands.py +0 -250
- cdpify-0.4.0/cdpify/domains/input/domain.py +0 -385
- cdpify-0.4.0/cdpify/domains/input/types.py +0 -64
- cdpify-0.4.0/cdpify/domains/network/domain.py +0 -718
- cdpify-0.4.0/cdpify/domains/page/domain.py +0 -1252
- cdpify-0.4.0/cdpify/domains/runtime/domain.py +0 -494
- cdpify-0.4.0/cdpify/domains/target/domain.py +0 -429
- cdpify-0.4.0/cdpify/domains/tracing/commands.py +0 -100
- cdpify-0.4.0/cdpify/domains/tracing/domain.py +0 -138
- cdpify-0.4.0/cdpify/domains/webauthn/types.py +0 -108
- cdpify-0.4.0/cdpify/events/source.py +0 -36
- cdpify-0.4.0/cdpify/executor.py +0 -39
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessors.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/ads/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/ads/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/ads/domain.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/browser/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cachestorage/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/domain.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/crashreportcontext/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/crashreportcontext/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/crashreportcontext/domain.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/css/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceorientation/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/digitalcredentials/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/digitalcredentials/types.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domdebugger/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domsnapshot/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/emulation/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/eventbreakpoints/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/extensions/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fetch/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/filesystem/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/findinpage/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/findinpage/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/headlessexperimental/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/heapprofiler/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/indexeddb/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/input/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/inspector/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/inspector/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/inspector/domain.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/io/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/io/types.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/domain.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/memory/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/network/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/page/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/domain.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/pwa/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/runtime/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/schema/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/schema/domain.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/types.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/systeminfo/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/target/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tethering/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tracing/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/commands.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webauthn/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webauthn/events.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/events/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/__main__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/downloader.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/formatting.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generator.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/accessors.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/constants.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/context.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/init.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/rendering.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/accessors.py.jinja2 +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/domain_init.py.jinja2 +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/root_init.py.jinja2 +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/py.typed +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/shared/decorators.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/shared/lazy.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/shared/naming.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/transports/__init__.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/dependency_links.txt +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/requires.txt +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/top_level.txt +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/setup.cfg +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_dependency_boundaries.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_enums.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_event_dispatcher.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_lazy_imports.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_models.py +0 -0
- {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_session.py +0 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here.
|
|
4
|
+
Breaking changes are listed first in each release.
|
|
5
|
+
|
|
6
|
+
## [0.5.0] - Unreleased
|
|
7
|
+
|
|
8
|
+
Release preparation; the publication date will be recorded when 0.5.0 ships.
|
|
9
|
+
See the [migration guide](README.md#upgrading-from-040) before upgrading.
|
|
10
|
+
|
|
11
|
+
### Breaking changes
|
|
12
|
+
|
|
13
|
+
- Renamed the error module from `cdpify.exceptions` to `cdpify.error`.
|
|
14
|
+
Update imports such as `from cdpify.exceptions import CDPCommandError` to
|
|
15
|
+
`from cdpify.error import CDPCommandError`. The old module is removed;
|
|
16
|
+
error classes remain available from the root package (`from cdpify import
|
|
17
|
+
CDPCommandError`) with the same behavior and inheritance.
|
|
18
|
+
- Optional `any` fields now default to `UNSET`, distinguishing omission from
|
|
19
|
+
JSON `null`. For example, `CallArgument()` omits `value`, while
|
|
20
|
+
`CallArgument(value=None)` sends `{"value": null}`. Ordinary optional scalar
|
|
21
|
+
fields still use `None` to mean omitted. `UNSET` and `UnsetType` are public.
|
|
22
|
+
- `decode_cdp` now raises `CDPDecodeError` for missing required fields, including
|
|
23
|
+
nested models. Unknown fields and future enum values remain supported. Use
|
|
24
|
+
`decode_cdp(Model, payload, strict=False)` for the previous tolerant behavior
|
|
25
|
+
that logs a warning and fills missing required fields with `None`.
|
|
26
|
+
- Command timeouts now cover sending and receiving. The
|
|
27
|
+
`CdpClient(default_timeout=...)` setting is enforced for every transport and
|
|
28
|
+
inherited by session views. Omit the raw `execute(timeout=...)` argument to
|
|
29
|
+
inherit the default; pass `None` to disable it. Set `default_timeout=None` to
|
|
30
|
+
disable the client default entirely.
|
|
31
|
+
- `WebSocketTransport` no longer accepts `default_timeout`; configure it on
|
|
32
|
+
`CdpClient` instead. Standalone transport calls have no deadline unless
|
|
33
|
+
`execute(timeout=seconds)` is specified. Generated methods retain only CDP's
|
|
34
|
+
own parameters; use `asyncio.timeout(seconds)` for an individual caller budget.
|
|
35
|
+
- WebSocket compression is disabled by default for lower local latency. Pass
|
|
36
|
+
`compression="deflate"` to `CdpClient` or `WebSocketTransport` to opt into
|
|
37
|
+
compression when bandwidth matters more.
|
|
38
|
+
- Bounded event buffers now default to `overflow="error"`: overflow terminates
|
|
39
|
+
only the affected stream and raises `CDPEventOverflowError` on its next read.
|
|
40
|
+
Pass `overflow="drop_oldest"` on the client, transport or subscription to keep
|
|
41
|
+
the old lossy behavior. The default queue size remains unlimited (`0`).
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- Generated method docstrings include parameter descriptions, units and defaults
|
|
46
|
+
from the spec. Model fields retain their attribute documentation. Experimental
|
|
47
|
+
and deprecated markers are preserved on types, events and fields as well as
|
|
48
|
+
commands.
|
|
49
|
+
- `listen_raw(method=None)` on clients and sessions, and `listen_all_raw()` on
|
|
50
|
+
clients, return `TransportEvent` values with wire names, parameter dictionaries
|
|
51
|
+
and session IDs. None matches every method in the selected scope.
|
|
52
|
+
- Per-subscription overflow overrides and structured `CDPEventOverflowError`
|
|
53
|
+
details (`max_queue_size`, `dropped_events`). Overflow never blocks responses
|
|
54
|
+
or other subscriptions; failed listeners unregister immediately.
|
|
55
|
+
- `compression`, `open_timeout` and `close_timeout` options for URL-based clients
|
|
56
|
+
and the standalone WebSocket transport. Connection timeouts are in seconds.
|
|
57
|
+
- Reproducible codec, dispatch and optional Chrome round-trip benchmarks in
|
|
58
|
+
`benchmarks/runtime.py`; offline regeneration and generated-code drift checks
|
|
59
|
+
in `scripts/check_generated.py`.
|
|
60
|
+
- CI checks the library and public API with Pyright and runs isolated headless
|
|
61
|
+
Chrome tests. Run those locally with `pytest -m integration` and optionally
|
|
62
|
+
`CHROME_PATH`; they are excluded from the default unit-test run.
|
|
63
|
+
|
|
64
|
+
### Performance
|
|
65
|
+
|
|
66
|
+
- Generated command methods build wire dictionaries directly, avoiding an
|
|
67
|
+
intermediate Params dataclass and reflective field traversal. Public Params
|
|
68
|
+
models and keyword-only command signatures are retained. Nested models still
|
|
69
|
+
serialize through the shared codec.
|
|
70
|
+
- The orjson transport sends UTF-8 bytes directly as text frames and receives
|
|
71
|
+
bytes without first decoding to a Python string. This removes redundant
|
|
72
|
+
UTF-8 conversions while preserving the CDP wire format.
|
|
73
|
+
|
|
74
|
+
## [0.4.0] - 2026-10-25
|
|
75
|
+
|
|
76
|
+
### Breaking changes
|
|
77
|
+
|
|
78
|
+
- Named protocol enums are now `StrEnum` subclasses instead of `Literal`
|
|
79
|
+
aliases. Use constants such as `ResourceType.FETCH` and
|
|
80
|
+
`CookieOperation.SET_COOKIE` in typed code. `decode_cdp` returns enum members,
|
|
81
|
+
including in nested models and collections. Unknown strings from newer CDP
|
|
82
|
+
versions remain instances of the corresponding enum with their original
|
|
83
|
+
`.value`; they are not added to its declared members. Inline enums remain
|
|
84
|
+
`Literal` annotations.
|
|
85
|
+
- Matching event listeners now share one decoded model per incoming event and
|
|
86
|
+
event class, including `listen_all()`'s `ReceivedEvent.value`. Mutations are
|
|
87
|
+
visible to other listeners. Treat event data as read-only or make a
|
|
88
|
+
`copy.deepcopy(event)` before changing it privately.
|
|
89
|
+
- All generated type aliases use `type` statements, including primitives and
|
|
90
|
+
arrays, e.g. `type FrameId = str` and `type Quad = list[float]`. Use them in
|
|
91
|
+
annotations; pass plain values such as `frame_id: FrameId = "F1"` instead of
|
|
92
|
+
calling `FrameId("F1")`. For runtime checks use `isinstance(value, str)` rather
|
|
93
|
+
than `isinstance(value, FrameId)`.
|
|
94
|
+
- `Client` and `CDPSession` are renamed to `CdpClient` and `CdpSession`.
|
|
95
|
+
Update imports to `from cdpify import CdpClient, CdpSession` and calls to
|
|
96
|
+
`CdpClient(...)`. `client.session(...)` now returns `CdpSession`.
|
|
97
|
+
- Exceptions follow Python naming: `CDPException` → `CDPError`,
|
|
98
|
+
`CDPConnectionException` → `CDPConnectionError`, `CDPCommandException` →
|
|
99
|
+
`CDPCommandError`, `CDPTimeoutException` → `CDPTimeoutError`. The old names
|
|
100
|
+
still work but emit a `DeprecationWarning` and will be removed in a future
|
|
101
|
+
release.
|
|
102
|
+
- `CDPCommandError` takes `(method, code, message, data=None)` instead of the
|
|
103
|
+
raw error dict. Use `CDPCommandError.from_response(method, error)` to build
|
|
104
|
+
one from a CDP error payload. The message now names the failed method, e.g.
|
|
105
|
+
`Page.navigate failed with CDP error -32000: Cannot navigate to invalid URL`.
|
|
106
|
+
- `listen()`, `listen_all()` and `CdpSession.listen()` are now regular methods
|
|
107
|
+
that return an `EventSubscription` instead of async generators. `async for`
|
|
108
|
+
and `aclose()` keep working. Code that relied on the generator type itself
|
|
109
|
+
(e.g. `inspect.isasyncgen`) or on `asend()`/`athrow()` must be updated.
|
|
110
|
+
- `listen()`, `listen_all()` and `CdpSession.listen()` take the event class
|
|
111
|
+
instead of an event name plus class, and `timeout` is keyword-only:
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
# Before
|
|
115
|
+
client.listen(NetworkEvent.REQUEST_WILL_BE_SENT, RequestWillBeSentEvent)
|
|
116
|
+
client.listen(
|
|
117
|
+
event_name=NetworkEvent.REQUEST_WILL_BE_SENT,
|
|
118
|
+
event_type=RequestWillBeSentEvent,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# After
|
|
122
|
+
client.listen(RequestWillBeSentEvent)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The CDP name comes from the new `__cdp_event__` class variable on generated
|
|
126
|
+
event classes. For custom dataclasses pass `event_name="Domain.event"`.
|
|
127
|
+
- Calling a deprecated CDP command emits a `DeprecationWarning` instead of
|
|
128
|
+
logging a warning on every call. Python's default filters show it once per
|
|
129
|
+
call site; use `warnings.filterwarnings` or `-W` to change that. The
|
|
130
|
+
decorator is now `warnings.deprecated` (PEP 702) on Python 3.13+, so IDEs and
|
|
131
|
+
type checkers mark deprecated commands. `cdpify.shared.decorators.deprecated`
|
|
132
|
+
requires a message: `@deprecated("...")` instead of `@deprecated()`.
|
|
133
|
+
|
|
134
|
+
### Added
|
|
135
|
+
|
|
136
|
+
- Optional `max_queue_size` on `CdpClient`, `WebSocketTransport`, `listen()`,
|
|
137
|
+
`listen_all()`, and `CdpSession.listen()`. Zero keeps unlimited buffering;
|
|
138
|
+
bounded queues drop their oldest event instead of blocking command responses.
|
|
139
|
+
Subscriptions inherit the client limit unless overridden. Both subscriptions
|
|
140
|
+
and the standalone WebSocket transport expose `dropped_events` counters.
|
|
141
|
+
- `cdpify[orjson]` enables optional `orjson` encoding and decoding in the WebSocket
|
|
142
|
+
transport, with automatic fallback to `json` and outgoing text frames.
|
|
143
|
+
- Optional `CallbackTransport` protocol in `cdpify.transport` for direct event
|
|
144
|
+
delivery without a transport queue. Existing `Transport` implementations work
|
|
145
|
+
through their event iterator.
|
|
146
|
+
- `EventSubscription` registers its handler as soon as `listen()` is called, so
|
|
147
|
+
events emitted before the first read are no longer lost. It supports
|
|
148
|
+
`async with` for deterministic cleanup and `await events.next(timeout=...)`
|
|
149
|
+
for waiting on a single event. `next()` raises `CDPStreamClosedError` once
|
|
150
|
+
the stream has ended.
|
|
151
|
+
- Generated event classes expose their CDP method name as `__cdp_event__`,
|
|
152
|
+
e.g. `LoadEventFiredEvent.__cdp_event__ == "Page.loadEventFired"`.
|
|
153
|
+
- `FindInPage` domain (`client.find_in_page`) from the latest CDP spec.
|
|
154
|
+
|
|
155
|
+
### Changed
|
|
156
|
+
|
|
157
|
+
- Generated `__cdp_event__` class variables refer to the domain's event enum,
|
|
158
|
+
e.g. `LoadingFailedEvent.__cdp_event__ is NetworkEvent.LOADING_FAILED`.
|
|
159
|
+
- The root client and session views share the implementation of `listen()`.
|
|
160
|
+
- CI runs tests on Ubuntu, Windows, and macOS with Python 3.12, 3.13, and 3.14,
|
|
161
|
+
including both JSON backends.
|
|
162
|
+
- `CDPTimeoutError` also inherits from the built-in `TimeoutError`, so
|
|
163
|
+
`except TimeoutError` catches command timeouts.
|
|
164
|
+
- Docstrings of generated type aliases follow the alias, so IDEs and Sphinx
|
|
165
|
+
show them on hover.
|
|
166
|
+
- Generated fields only carry `metadata={"cdp_name": ...}` when the CDP name
|
|
167
|
+
differs from the Python name. Code that reads `field.metadata["cdp_name"]`
|
|
168
|
+
directly should fall back to `field.name`.
|
|
169
|
+
|
|
170
|
+
### Fixed
|
|
171
|
+
|
|
172
|
+
- Distributions include the `py.typed` marker so type checkers recognize the
|
|
173
|
+
installed package's inline annotations.
|
|
174
|
+
- A connection closing while a command is being sent now raises
|
|
175
|
+
`CDPConnectionError` and does not leave an unobserved response-future exception.
|
|
176
|
+
Commands submitted after shutdown starts are rejected immediately.
|
|
177
|
+
- Concurrent disconnects and browser-initiated closure now wait for the same
|
|
178
|
+
cleanup. Cancelling a disconnect waiter no longer interrupts socket cleanup
|
|
179
|
+
or masks cancellation with an error when detaching the event callback.
|
|
180
|
+
- Bounded event streams close even when their buffers are full, preserving
|
|
181
|
+
buffered events on disconnect. Explicit subscription closure releases pending
|
|
182
|
+
events immediately. Subscriptions from an earlier connection stay closed
|
|
183
|
+
after reconnecting.
|
|
184
|
+
- `decode_cdp` now decodes nested models behind `type X = ...` aliases instead
|
|
185
|
+
of leaving them as plain dicts.
|
|
186
|
+
- `decode_cdp` logs a warning when a field annotation cannot be resolved,
|
|
187
|
+
instead of silently leaving nested values as plain dicts.
|
|
188
|
+
- A malformed message from the browser no longer closes the WebSocket
|
|
189
|
+
connection. The message is logged and skipped.
|
|
190
|
+
- Events sent with `"params": null` are delivered with empty params instead of
|
|
191
|
+
being dropped as malformed.
|
|
192
|
+
- Event listeners (`listen()`, `listen_all()`, `CdpSession.listen()`) now end
|
|
193
|
+
when the transport event stream ends or the client disconnects. Previously
|
|
194
|
+
they waited forever unless a `timeout` was set. Events that were already
|
|
195
|
+
received are still delivered before the stream ends.
|
|
196
|
+
- Array type aliases keep their element type instead of `list[Any]`, e.g.
|
|
197
|
+
`DOM.Quad = list[float]` and `Target.TargetFilter = list[FilterEntry]`.
|
|
198
|
+
Fields typed as `TargetFilter` now decode to `FilterEntry` objects instead
|
|
199
|
+
of plain dicts.
|
|
200
|
+
- Generated fields and parameters whose CDP name is a Python keyword get a
|
|
201
|
+
trailing underscore (`or` → `or_`), so the generated code is valid again.
|
|
202
|
+
|
|
203
|
+
### Performance
|
|
204
|
+
|
|
205
|
+
- The default WebSocket transport delivers events directly to the router,
|
|
206
|
+
removing the intermediate queue and client event-loop task.
|
|
207
|
+
- Event models are decoded lazily once per incoming event and target class,
|
|
208
|
+
then reused by matching listeners. Unread events are not decoded; caches are
|
|
209
|
+
released together with the buffered event instead of being retained globally.
|
|
210
|
+
- `decode_cdp` builds a converter per field once per model instead of
|
|
211
|
+
inspecting type annotations for every value. Decoding typical Network
|
|
212
|
+
events is 4–7× faster (`ResponseReceivedEvent`: 56 µs → 7 µs).
|
|
213
|
+
- `import cdpify` loads CDP domains lazily on first access. Import time drops
|
|
214
|
+
from ~790 ms to ~85 ms.
|
cdpify-0.5.0/MANIFEST.in
ADDED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cdpify
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: A Python client for the Chrome DevTools Protocol (CDP) optimized for DX.
|
|
5
5
|
Classifier: Programming Language :: Python :: 3
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -30,12 +30,14 @@ without working with raw JSON messages.
|
|
|
30
30
|
|
|
31
31
|
- [Why cdpify?](#why-cdpify)
|
|
32
32
|
- [Installation](#installation)
|
|
33
|
+
- [Upgrading from 0.4.0](#upgrading-from-040)
|
|
33
34
|
- [Quick start](#quick-start)
|
|
34
35
|
- [Supported domains](#supported-domains)
|
|
35
36
|
- [Listening for events](#listening-for-events)
|
|
36
37
|
- [Working with target sessions](#working-with-target-sessions)
|
|
37
38
|
- [Configuration](#configuration)
|
|
38
39
|
- [Development](#development)
|
|
40
|
+
- [Releasing](RELEASING.md)
|
|
39
41
|
- [Resources](#resources)
|
|
40
42
|
|
|
41
43
|
## Why cdpify?
|
|
@@ -71,16 +73,45 @@ pip install "cdpify[websocket,orjson]"
|
|
|
71
73
|
The transport automatically uses `orjson` when available and otherwise uses
|
|
72
74
|
Python's standard `json` module. Outgoing WebSocket messages remain text frames.
|
|
73
75
|
|
|
76
|
+
Generated methods expose only CDP parameters. Parameter docstrings preserve
|
|
77
|
+
the spec's units, defaults and experimental/deprecated markers.
|
|
78
|
+
|
|
74
79
|
Install the generator dependencies only when regenerating protocol modules:
|
|
75
80
|
|
|
76
81
|
```bash
|
|
77
82
|
pip install "cdpify[generator]"
|
|
78
83
|
```
|
|
79
84
|
|
|
85
|
+
## Upgrading from 0.4.0
|
|
86
|
+
|
|
87
|
+
Version 0.5.0 includes breaking changes. Review these before updating:
|
|
88
|
+
|
|
89
|
+
| Area | Update for 0.5.0 |
|
|
90
|
+
| --- | --- |
|
|
91
|
+
| Error imports | Replace `cdpify.exceptions` with `cdpify.error`, or import errors from `cdpify`. The old module is removed. |
|
|
92
|
+
| Optional `Any` values | Use `UNSET` to omit a value. `None` now sends JSON `null`; ordinary optional scalar fields still omit `None`. |
|
|
93
|
+
| Required response fields | Generated responses and typed events now raise `CDPDecodeError` when required fields are missing. For tolerant manual decoding, use `decode_cdp(Model, payload, strict=False)`. |
|
|
94
|
+
| Command deadlines | Configure `default_timeout` on `CdpClient`, including for custom transports. The budget covers sending and receiving. `WebSocketTransport` no longer accepts `default_timeout`. |
|
|
95
|
+
| Bounded event buffers | Overflow now raises `CDPEventOverflowError`. Set `overflow="drop_oldest"` to keep lossy buffering. The default buffer remains unlimited. |
|
|
96
|
+
| WebSocket compression | Compression now defaults to `None`. Set `compression="deflate"` to enable it. |
|
|
97
|
+
|
|
98
|
+
Generated methods accept only CDP parameters. For an individual caller deadline,
|
|
99
|
+
wrap the call in `asyncio.timeout(seconds)`; a CDP parameter named `timeout`
|
|
100
|
+
keeps the units and meaning defined by the protocol. The raw `execute()` method
|
|
101
|
+
accepts a client timeout in seconds: omit it to inherit the client default or
|
|
102
|
+
pass `None` to disable that deadline for the call.
|
|
103
|
+
|
|
104
|
+
See the [0.5.0 changelog](CHANGELOG.md#050---unreleased) for the complete release
|
|
105
|
+
notes, including raw event streams and performance changes.
|
|
106
|
+
|
|
80
107
|
## Quick start
|
|
81
108
|
|
|
82
109
|
Start Chrome or Chromium with remote debugging enabled, then obtain a page's
|
|
83
|
-
`webSocketDebuggerUrl` from `http://localhost:9222/json`.
|
|
110
|
+
`webSocketDebuggerUrl` from `http://localhost:9222/json`. Launch with
|
|
111
|
+
`--remote-debugging-port=9222 --user-data-dir=<dedicated-profile-directory>`
|
|
112
|
+
and open a tab first. The scripts in [examples](examples) can launch Chrome
|
|
113
|
+
with these options for you, for example `uv run python examples/navigate.py`
|
|
114
|
+
from a development checkout.
|
|
84
115
|
|
|
85
116
|
```python
|
|
86
117
|
import asyncio
|
|
@@ -88,18 +119,28 @@ import json
|
|
|
88
119
|
from urllib.request import urlopen
|
|
89
120
|
|
|
90
121
|
from cdpify import CdpClient
|
|
122
|
+
from cdpify.domains.page import LoadEventFiredEvent
|
|
91
123
|
|
|
92
124
|
|
|
93
125
|
def get_websocket_url() -> str:
|
|
94
126
|
with urlopen("http://localhost:9222/json", timeout=5) as response:
|
|
95
|
-
return
|
|
127
|
+
return next(
|
|
128
|
+
target["webSocketDebuggerUrl"]
|
|
129
|
+
for target in json.load(response)
|
|
130
|
+
if target.get("type") == "page"
|
|
131
|
+
)
|
|
96
132
|
|
|
97
133
|
|
|
98
134
|
async def main() -> None:
|
|
99
135
|
ws_url = get_websocket_url()
|
|
100
136
|
|
|
101
137
|
async with CdpClient(ws_url) as client:
|
|
102
|
-
await client.page.
|
|
138
|
+
await client.page.enable()
|
|
139
|
+
async with client.listen(LoadEventFiredEvent) as loaded:
|
|
140
|
+
navigation = await client.page.navigate(url="https://example.com")
|
|
141
|
+
if navigation.error_text:
|
|
142
|
+
raise RuntimeError(navigation.error_text)
|
|
143
|
+
await loaded.next(timeout=10)
|
|
103
144
|
|
|
104
145
|
result = await client.runtime.evaluate(
|
|
105
146
|
expression="document.title",
|
|
@@ -196,6 +237,7 @@ triggers, subscribe first and then send the command:
|
|
|
196
237
|
from cdpify.domains.page.events import LoadEventFiredEvent
|
|
197
238
|
|
|
198
239
|
|
|
240
|
+
await client.page.enable()
|
|
199
241
|
async with client.listen(LoadEventFiredEvent) as events:
|
|
200
242
|
await client.page.navigate(url="https://example.com")
|
|
201
243
|
await events.next(timeout=10)
|
|
@@ -250,11 +292,15 @@ subscription has read or discarded the incoming event.
|
|
|
250
292
|
### Limiting buffered events
|
|
251
293
|
|
|
252
294
|
Set `max_queue_size` on `CdpClient` to limit each listener's buffer. The default,
|
|
253
|
-
`0`, is unlimited. A
|
|
254
|
-
|
|
295
|
+
`0`, is unlimited. A bounded buffer defaults to `overflow="error"`: if it fills,
|
|
296
|
+
that subscription ends and its next read raises `CDPEventOverflowError`. Other
|
|
297
|
+
subscriptions and command responses continue normally. This makes event loss
|
|
298
|
+
explicit for protocols such as `Fetch.requestPaused` that require a response.
|
|
299
|
+
|
|
300
|
+
For a stream where loss is acceptable, select `overflow="drop_oldest"`:
|
|
255
301
|
|
|
256
302
|
```python
|
|
257
|
-
client = CdpClient(ws_url, max_queue_size=256)
|
|
303
|
+
client = CdpClient(ws_url, max_queue_size=256, overflow="drop_oldest")
|
|
258
304
|
|
|
259
305
|
async with client:
|
|
260
306
|
async with client.listen(RequestWillBeSentEvent, max_queue_size=32) as events:
|
|
@@ -262,10 +308,26 @@ async with client:
|
|
|
262
308
|
print(events.dropped_events)
|
|
263
309
|
```
|
|
264
310
|
|
|
265
|
-
The same options apply to `listen_all()
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
311
|
+
The same options apply to `listen_all()`, `CdpSession.listen()` and raw streams.
|
|
312
|
+
Each listener can override both the limit and overflow policy. Passing `0`
|
|
313
|
+
disables its limit. `events.dropped_events` counts discarded events. Disconnect
|
|
314
|
+
drains healthy buffers; explicit closure and overflow errors release them.
|
|
315
|
+
|
|
316
|
+
### Raw events
|
|
317
|
+
|
|
318
|
+
Use raw subscriptions for events outside the generated spec, or to inspect wire
|
|
319
|
+
parameter dictionaries without constructing typed models:
|
|
320
|
+
|
|
321
|
+
```python
|
|
322
|
+
async with tab.listen_raw("Future.event") as events:
|
|
323
|
+
event = await events.next(timeout=5)
|
|
324
|
+
print(event.method, event.session_id, event.params)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
`client.listen_raw()` covers the root, `tab.listen_raw()` one session, and
|
|
328
|
+
`client.listen_all_raw()` every scope. Omitting the method matches every event
|
|
329
|
+
in that scope. Subscriptions register immediately and share the same lifetime,
|
|
330
|
+
buffering and read-only data rules as typed streams.
|
|
269
331
|
|
|
270
332
|
## Working with target sessions
|
|
271
333
|
|
|
@@ -324,9 +386,43 @@ client = CdpClient(
|
|
|
324
386
|
max_frame_size=100 * 1024 * 1024,
|
|
325
387
|
default_timeout=30.0,
|
|
326
388
|
max_queue_size=256,
|
|
389
|
+
overflow="error",
|
|
390
|
+
compression=None,
|
|
391
|
+
open_timeout=10.0,
|
|
392
|
+
close_timeout=10.0,
|
|
327
393
|
)
|
|
328
394
|
```
|
|
329
395
|
|
|
396
|
+
WebSocket compression is off by default to reduce local CPU work and latency.
|
|
397
|
+
Set `compression="deflate"` when saving network bandwidth is preferable.
|
|
398
|
+
`additional_headers`, `max_frame_size`, `compression`, `open_timeout` and
|
|
399
|
+
`close_timeout` configure the URL-based WebSocket transport. Supplied custom
|
|
400
|
+
transports own their connection settings.
|
|
401
|
+
|
|
402
|
+
### Timeouts
|
|
403
|
+
|
|
404
|
+
`default_timeout` is a total command budget in seconds, including sending and
|
|
405
|
+
waiting for the response. It applies to root commands and session commands,
|
|
406
|
+
including custom transports. `None` disables the default.
|
|
407
|
+
|
|
408
|
+
For one call, or a group of calls, use Python's normal timeout context:
|
|
409
|
+
|
|
410
|
+
```python
|
|
411
|
+
async with asyncio.timeout(2):
|
|
412
|
+
result = await client.runtime.evaluate(expression="1 + 1")
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
A client deadline raises `CDPTimeoutError`; a shorter outer `asyncio.timeout()`
|
|
416
|
+
raises the built-in `TimeoutError`. Both release the pending local request.
|
|
417
|
+
Cancelling the wait does not automatically cancel work in Chrome.
|
|
418
|
+
|
|
419
|
+
CDP parameters retain the spec's units. For example, `Runtime.evaluate(timeout=...)`
|
|
420
|
+
limits execution inside Chrome in **milliseconds**; it is not the client budget.
|
|
421
|
+
The raw `execute()` escape hatch also accepts `timeout=seconds`: omit it to
|
|
422
|
+
inherit the client default or pass `None` to disable the deadline for that call.
|
|
423
|
+
|
|
424
|
+
### Custom transports
|
|
425
|
+
|
|
330
426
|
For another transport protocol, implement the exported `Transport` protocol
|
|
331
427
|
and inject it directly:
|
|
332
428
|
|
|
@@ -342,8 +438,11 @@ WebSocket transport uses this path to avoid an intermediate event queue.
|
|
|
342
438
|
Transports that implement only `Transport.events()` continue to work.
|
|
343
439
|
|
|
344
440
|
When using `WebSocketTransport.events()` directly, its `max_queue_size` option
|
|
345
|
-
sets the
|
|
346
|
-
|
|
441
|
+
sets the limit on its transport buffer with the same overflow policies. A
|
|
442
|
+
client-supplied custom transport manages its own transport buffer limits.
|
|
443
|
+
`WebSocketTransport` has no default command timeout; standalone calls can pass
|
|
444
|
+
`execute(timeout=seconds)`. In the `Transport` contract, `timeout=None` means no
|
|
445
|
+
deadline and cancellation releases resources associated with that request.
|
|
347
446
|
|
|
348
447
|
For methods not covered by the generated API, use the low-level escape hatch:
|
|
349
448
|
|
|
@@ -370,10 +469,35 @@ than `FrameId("F1")`, and `isinstance(frame_id, str)` for a runtime check.
|
|
|
370
469
|
|
|
371
470
|
### When Chrome deviates from the spec
|
|
372
471
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
472
|
+
Library error classes are available from `cdpify.error` and the root package:
|
|
473
|
+
|
|
474
|
+
```python
|
|
475
|
+
from cdpify.error import CDPCommandError, CDPDecodeError
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
Missing required fields raise `CDPDecodeError` with `model_type`,
|
|
479
|
+
`missing_fields` and the enclosing wire-field `path`. Unknown fields are ignored
|
|
480
|
+
and future enum values remain supported. Decoding checks required field
|
|
481
|
+
presence; it does not perform full schema validation of primitive values.
|
|
482
|
+
|
|
483
|
+
For a deliberately tolerant decode, use `decode_cdp(Model, payload, strict=False)`.
|
|
484
|
+
This fills missing required fields with `None` and logs a warning, including
|
|
485
|
+
nested models. When necessary, fetch the raw result with `execute()` and decode
|
|
486
|
+
it explicitly with this policy.
|
|
487
|
+
|
|
488
|
+
### Omitted values and JSON null
|
|
489
|
+
|
|
490
|
+
Optional scalar parameters still use `None` to mean omitted. Optional `Any`
|
|
491
|
+
fields use `UNSET` because JSON null is itself a valid value:
|
|
492
|
+
|
|
493
|
+
```python
|
|
494
|
+
from cdpify import UNSET, encode_cdp
|
|
495
|
+
from cdpify.domains.runtime import CallArgument
|
|
496
|
+
|
|
497
|
+
assert encode_cdp(CallArgument()) == {}
|
|
498
|
+
assert encode_cdp(CallArgument(value=None)) == {"value": None}
|
|
499
|
+
assert CallArgument().value is UNSET
|
|
500
|
+
```
|
|
377
501
|
|
|
378
502
|
Deprecated CDP commands still work but emit a `DeprecationWarning`. Use
|
|
379
503
|
Python's warning filters to silence them or turn them into errors:
|
|
@@ -395,12 +519,38 @@ Install the project and its development dependencies with
|
|
|
395
519
|
uv sync --dev
|
|
396
520
|
uv run pytest
|
|
397
521
|
uv run ruff check . --exclude cdpify/domains
|
|
522
|
+
uv run ruff format --check . --exclude cdpify/domains
|
|
523
|
+
uv run pyright
|
|
524
|
+
uv run python scripts/check_generated.py
|
|
398
525
|
```
|
|
399
526
|
|
|
400
527
|
Use `uv sync --dev --extra orjson` and `uv run --extra orjson pytest` to include
|
|
401
528
|
the optional backend. CI installs this extra and tests both JSON backends on
|
|
402
529
|
Ubuntu, Windows, and macOS with Python 3.12, 3.13, and 3.14.
|
|
403
530
|
|
|
531
|
+
Run real Chrome coverage with `uv run --extra orjson pytest -m integration`.
|
|
532
|
+
These tests launch an isolated headless browser. Set `CHROME_PATH` to select its
|
|
533
|
+
executable. Integration tests are excluded from the default unit-test run.
|
|
534
|
+
|
|
535
|
+
CI also checks the complete library and a public API sample with Pyright,
|
|
536
|
+
verifies generated-code drift, and runs the integration suite against Chrome.
|
|
537
|
+
Regenerate from the bundled specs with `uv run python scripts/check_generated.py --write`.
|
|
538
|
+
|
|
539
|
+
Run reproducible microbenchmarks with:
|
|
540
|
+
|
|
541
|
+
```bash
|
|
542
|
+
uv run python benchmarks/runtime.py
|
|
543
|
+
uv run --extra orjson python benchmarks/runtime.py --page-url ws://localhost:9222/devtools/page/...
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
Output is JSON with environment metadata and timings for encoding, decoding,
|
|
547
|
+
typed calls and dispatch to several listener counts. An optional page endpoint
|
|
548
|
+
adds real small-message and 1-MiB round trips, including p50 and p95 latency.
|
|
549
|
+
The large case sends and receives a seeded Base64 payload. Add
|
|
550
|
+
`--compression deflate` to compare compression on the same machine; installing
|
|
551
|
+
or omitting the `orjson` extra selects the JSON backend. Timings are diagnostic
|
|
552
|
+
and are not used as flaky CI pass/fail thresholds.
|
|
553
|
+
|
|
404
554
|
To download the latest protocol definitions and regenerate all domain clients:
|
|
405
555
|
|
|
406
556
|
```bash
|
|
@@ -410,9 +560,13 @@ uv run python -m cdpify.generator
|
|
|
410
560
|
Generate only selected domains by repeating `--domain`:
|
|
411
561
|
|
|
412
562
|
```bash
|
|
413
|
-
uv run python -m cdpify.generator --domain Page --domain Runtime
|
|
563
|
+
uv run python -m cdpify.generator --domain Page --domain Runtime --output-dir build/selected-domains
|
|
414
564
|
```
|
|
415
565
|
|
|
566
|
+
Generation replaces the entire output directory, including for selected domains.
|
|
567
|
+
Use a separate `--output-dir` for partial generation to keep the full bundled
|
|
568
|
+
client intact. Selected domains may also reference types from other domains.
|
|
569
|
+
|
|
416
570
|
Use `--spec-dir` and `--output-dir` to override where downloaded specifications
|
|
417
571
|
and generated modules are written.
|
|
418
572
|
|
|
@@ -425,6 +579,8 @@ once a week and opens a pull request when generated code changes.
|
|
|
425
579
|
- [Chrome DevTools Protocol documentation](https://chromedevtools.github.io/devtools-protocol/)
|
|
426
580
|
- [Chrome DevTools Protocol repository](https://github.com/ChromeDevTools/devtools-protocol)
|
|
427
581
|
- [Examples](examples)
|
|
582
|
+
- [Changelog and migration notes](CHANGELOG.md)
|
|
583
|
+
- [Release checklist](RELEASING.md)
|
|
428
584
|
|
|
429
585
|
The code-generation approach was inspired by
|
|
430
586
|
[`cdp-use`](https://github.com/browser-use/cdp-use).
|